Skip to content

Invoice by Ouroboros Apps

by LAHutchins91 · remote · no sign-in to list tools · v1.0.3 · published by GitHub user LAHutchins91

Freelance invoice line items, rates, due dates, and late terms for AI assistants

Deletes · 9Changes · 2

13 tools: 9 can delete or cancel things, 2 change things and 2 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http invoice https://invoice-continuity2.vercel.app/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "describe_line" destructive (destructiveHint: true), and its name says "describe", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}; The name "describe_line" says "describe": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

13 tools

Deletes or cancels 9Claude Code: deny
  • accept_invoice_changeApply one suggested invoice change after the freelancer explicitly approves that change.No findings

    Why it is in this group

    • The description's first verb is "apply": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Apply one suggested invoice change after the freelancer explicitly approves that change. Pass confirmed true only then. This is the path that may add a line, change a rate, apply a discount, or move the due date. Calling it is not a substitute for the freelancer's approval.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • describe_lineCorrect a line description while the invoice is still a draft.1 finding

    Why it is in this group

    • The name "describe_line" says "describe": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The server marks "describe_line" destructive (destructiveHint: true), and its name says "describe", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}; The name "describe_line" says "describe": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Correct a line description while the invoice is still a draft. After approval, a different description is refused. Use suggest_invoice_change with add_line for a different line.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • offer_discountRecord a discount the freelancer is putting on the invoice.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Record a discount the freelancer is putting on the invoice. kind none uses value 0. kind percent takes a whole number from 1 to 100. kind fixed takes a whole number of minor units. After the invoice is sealed, a different discount is refused until accept_invoice_change applies an apply_discount suggestion. Do not invent a discount.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • place_lineAdd one line: description, quantity, rate in whole minor units, and unit hour, each, or day.No findings

    Why it is in this group

    • The description's first verb is "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Add one line: description, quantity, rate in whole minor units, and unit hour, each, or day. After the invoice is sealed, a new line is refused until accept_invoice_change applies an add_line suggestion.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • quote_line_rateSet the rate already chosen for one line, as a whole number of minor units in the invoice currency.No findings

    Why it is in this group

    • The description's first verb is "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Set the rate already chosen for one line, as a whole number of minor units in the invoice currency. After the invoice is sealed, a different rate is refused until accept_invoice_change applies a change_rate suggestion.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • seal_invoiceMark the current draft as the approved invoice.No findings

    Why it is in this group

    • The description's first verb is "mark": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Mark the current draft as the approved invoice. Pass confirmed true only after the freelancer explicitly approves the lines, quantities, rates, due date, late terms, and any discount already on the draft.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • set_invoice_dueSet the due date as a calendar day in YYYY-MM-DD form.No findings

    Why it is in this group

    • The name "set_invoice_due" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Set the due date as a calendar day in YYYY-MM-DD form. After the invoice is sealed, a different date is refused until accept_invoice_change applies a move_due_date suggestion.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • set_line_quantitySet the quantity on one line.No findings

    Why it is in this group

    • The name "set_line_quantity" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Set the quantity on one line. After the invoice is sealed, a different quantity is refused until accept_invoice_change applies an adjust_quantity suggestion.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • write_late_termsRecord late terms: grace days, and a basis of none, flat_fee, or percent_per_period.No findings

    Why it is in this group

    • The name "write_late_terms" says "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Record late terms: grace days, and a basis of none, flat_fee, or percent_per_period. flat_fee uses feeMinor and a percent of 0. percent_per_period uses percent and a fee of 0. After approval, a different basis, grace, fee, or percent is refused until an accepted revise_late_terms suggestion.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
Changes things 2Claude Code: ask
  • begin_invoiceStart a draft invoice.No findings

    Why it is in this group

    • The description's first verb is "start": a word for a change.
    Description, as the server wrote it
    Start a draft invoice. Draft figures are not an approved commitment until seal_invoice. Currency is a three-letter code. Amounts later are minor units of that currency and are the freelancer's figures.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • suggest_invoice_changeRecord a suggested change.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Record a suggested change. This does not change the invoice. kind add_line requires description, quantity, rateMinor, and unit. kind change_rate requires lineId and rateMinor. kind apply_discount requires discountKind, discountValue, and discountNote. kind move_due_date requires dueOn. kind adjust_quantity requires lineId and quantity. kind revise_late_terms requires graceDays, lateBasis, feeMinor, latePercent, and lateNote.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Only reads 2Claude Code: allow
  • list_invoicesList the signed-in freelancer's invoices.No findings

    Why it is in this group

    • The name "list_invoices" says "list": a word for reading.
    Description, as the server wrote it
    List the signed-in freelancer's invoices. Use a returned id with read_invoice. Do not guess an invoice.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • read_invoiceRead the invoice before answering.No findings

    Why it is in this group

    • The name "read_invoice" says "read": a word for reading.
    Description, as the server wrote it
    Read the invoice before answering. Quote only this record. Draft status is not an approved commitment. Proposed changes do not authorize a new line, a different rate, a discount, or a new due date.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http invoice https://invoice-continuity2.vercel.app/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__invoice__list_invoices",
      "mcp__invoice__read_invoice"
    ],
    "ask": [
      "mcp__invoice__begin_invoice",
      "mcp__invoice__suggest_invoice_change"
    ],
    "deny": [
      "mcp__invoice__place_line",
      "mcp__invoice__describe_line",
      "mcp__invoice__quote_line_rate",
      "mcp__invoice__set_line_quantity",
      "mcp__invoice__set_invoice_due",
      "mcp__invoice__write_late_terms",
      "mcp__invoice__offer_discount",
      "mcp__invoice__seal_invoice",
      "mcp__invoice__accept_invoice_change"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as invoice. Review it before you use it.