Skip to main content
Glama
klodr

mercury-invoicing-mcp

🏦 mercury-invoicing-mcp

Mercury Banking MCP server with full Invoicing API support — first MCP to expose Mercury's accounts receivable endpoints.

CI CodeQL Tested with Vitest codecov OpenSSF Scorecard OpenSSF Best Practices Socket Security CodeRabbit Pull Request Reviews

npm version npm downloads Node.js Version MCP MCP Server PRs Welcome

Sponsor on GitHub Patreon Ko-fi

A Model Context Protocol (MCP) server giving AI assistants (Claude, Cursor, Continue, etc.) full programmatic access to your Mercury business banking account, including the Invoicing API (one-shot + recurring) which is missing from every other Mercury MCP.

✨ Why this MCP?

Capability

Official Mercury MCP

dragonkhoi/mercury-mcp

mercury-invoicing-mcp

Banking read (accounts, transactions, statements)

✅

✅

✅

Banking write (send_money, recipients)

❌

✅

✅

Internal transfers between your own Mercury accounts

❌

❌

✅

Invoicing API (create, update, cancel, attachments)

❌

❌

✅

Customers AR + recurring invoices

❌

❌

✅

Webhooks full CRUD (incl. update_webhook)

❌

❌

✅

Built-in safeguards (rate limit, dry-run, redacted audit log)

❌

❌

✅

Stable token (no frequent re-auth, IP-allowlistable)

❌

✅

✅

Open source (MIT)

❌

✅

✅

Node.js floor

N/A (hosted)

❌ from Node 14 EOL (2023)

✅ LTS (>=24.18.1), tested on 24 and 26

Total tools exposed

~10

~11

39

For pure read-only consultation, prefer the official Mercury MCP. Use this one when you need to automate invoicing, write to Mercury, or expose Mercury to LLM agents safely.

Related MCP server: faxdrop-mcp

📦 Installation

npm install -g mercury-invoicing-mcp

Or use directly with npx:

npx mercury-invoicing-mcp

⚙️ Configuration

The server reads MERCURY_API_KEY from the environment. Get your API key at Mercury Settings → API Tokens.

🔑 Right-sizing the token

Mercury exposes fine-grained per-resource scopes at token creation — not a single read/write toggle. Pick exactly what your use case needs and Mercury enforces the rest server-side: a tool called without the right scope returns 403, which the MCP surfaces as a clean isError: true response (with a Mercury Plus hint when relevant).

When you create the token, you choose:

  • Which accounts the token can see (one, several, or all).

  • Read or Write per resource family: Accounts, Transactions, Recipients, Send Money, Cards, Statements, Treasury, Invoicing (AR), Webhooks.

Common scope recipes for this MCP:

Use case

Scopes to grant

Read-only consultation (dashboards, chat-channel bots)

Read on accounts, transactions, statements, cards, treasury — nothing else

Bookkeeping (categorise transactions)

Read everywhere + Write on transactions (for update_transaction)

Invoicing automation

Read on accounts + Write on invoices, customers (Mercury Plus required)

Recipients management

+ Write on recipients

Internal transfers between your own accounts

+ Write on send_money (used for create_internal_transfer)

Outbound send-money requests

+ Write on send_money (creates the request — see safety note below)

Webhooks-only ops

Write on webhooks only

⚠️ Important: outbound payments depend on YOUR Mercury approval policy

Whether an outbound payment created via this MCP executes immediately or waits for human approval is not controlled by the MCP — it is enforced by your Mercury workspace's approval policy (Settings → Approvals on app.mercury.com). The MCP can only ever create the API call; what Mercury does with it is up to your workspace configuration.

The three money tools behave differently:

  • mercury_request_send_money — always creates a pending approval request in Mercury, regardless of workspace policy. Designed for the "submit, then wait for an approver" workflow.

  • mercury_send_money — submits a payment. It executes immediately or gets queued for approval, depending on your workspace's approval rules (amount thresholds, account-specific rules, required approvers). On a workspace configured with a $0 approval threshold, every outbound payment waits for human sign-off in the Mercury web/mobile app. On a more permissive workspace, smaller payments may settle without re-prompting.

  • mercury_create_internal_transfer — moves money between two accounts you already own inside the same Mercury organisation. No external recipient, no approval workflow.

→ Set a strict approval policy in Mercury (e.g. require approval for any outbound payment, regardless of amount) if you intend to expose write tools to an agent. The MCP's per-call rate limits and dry-run mode are useful belt-and-braces, but the authoritative gate is Mercury's approval policy. If a prompt-injected agent calls send_money, the safety of that call depends entirely on what Mercury would have done if the same payload arrived from any other API caller.

🧪 Sandbox mode

To test against Mercury's sandbox environment (no real money, pre-populated dummy data), just use a sandbox token:

MERCURY_API_KEY=secret-token:mercury_sandbox_xxxxxxxxxxxxxxxx

The MCP auto-detects sandbox tokens (those starting with mercury_sandbox_) and points to https://api-sandbox.mercury.com/api/v1 automatically.

To override the base URL explicitly (e.g. for a self-hosted proxy):

MERCURY_API_BASE_URL=https://your-proxy.example.com/api/v1

🤖 Claude Desktop / Claude Code

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (or ~/.claude.json for Claude Code):

{
  "mcpServers": {
    "mercury-invoicing": {
      "command": "npx",
      "args": ["-y", "mercury-invoicing-mcp"],
      "env": {
        "MERCURY_API_KEY": "secret-token:mercury_production_xxxxxxxxxxxxxxxx"
      }
    }
  }
}

🖱️ Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "mercury-invoicing": {
      "command": "npx",
      "args": ["-y", "mercury-invoicing-mcp"],
      "env": {
        "MERCURY_API_KEY": "secret-token:..."
      }
    }
  }
}

🦀 OpenClaw

OpenClaw is an open-source self-hosted agent platform that supports MCP via @modelcontextprotocol/sdk. Add to ~/.openclaw/openclaw.json:

{
  "mcpServers": {
    "mercury-invoicing": {
      "command": "npx",
      "args": ["-y", "mercury-invoicing-mcp"],
      "env": {
        "MERCURY_API_KEY": "secret-token:..."
      }
    }
  }
}

Restart the gateway (docker restart openclaw-openclaw-gateway-1 or your equivalent). All tools become available to all your OpenClaw agents.

Tip: For agents exposed to untrusted channels (WhatsApp, Telegram, Slack, incoming email…), grant the token only the scopes the channel actually needs. Outbound payments still require explicit human approval in the Mercury app — but minimising scopes avoids noise (spurious pending requests) and reduces what an attacker could exfiltrate via reads. See Right-sizing the token for recipe per use case.

🛠️ Tools (39 total)

🏦 Banking — Accounts

  • mercury_list_accounts, mercury_get_account

  • mercury_list_cards

  • mercury_get_organization

  • mercury_list_categories

💳 Banking — IO Credit

  • mercury_list_credit_accounts — wraps GET /credit, documented under Credit › List all credit accounts in the Mercury API reference. Returns IO Credit card accounts, which mercury_list_accounts filters out server-side.

  • mercury_list_credit_transactions — wraps GET /account/{id}/transactions (SINGULAR path), the path used for IO Credit transactions including pending card authorisations. Note: distinct from the plural /accounts/{id}/transactions used for deposit accounts.

  • mercury_list_credit_statements — wraps GET /api/v2/account/{id}/statements. IO Credit statements are served by the v2 endpoint only: the v1 statements path answers 404 for credit accounts.

💸 Banking — Transactions

  • mercury_list_transactions, mercury_get_transaction

  • mercury_get_transaction_attachment — the only tool that returns a receipt's download URL

  • mercury_update_transaction (note, category)

  • mercury_send_money, mercury_request_send_money

  • mercury_create_internal_transfer (between your own Mercury accounts)

Transaction lists return a compact projection by default: identifying fields plus hasAttachment, so you can spot which transactions still lack a receipt. Measured on a real account, this cuts the payload to ~20% of Mercury's raw response. Pass detail: "full" for every field except the attachment URLs, which no mode returns.

Receipt URLs are never included in a transaction payload, in either mode. Mercury's are pre-signed S3 links — ~2.4 kB each, and a bearer credential granting unauthenticated access to the document for ~12 hours. Returning one on every read would both dominate the payload and scatter short-lived credentials through logs and model context. Ask for one deliberately, per transaction, via mercury_get_transaction_attachment.

👥 Banking — Recipients

  • mercury_list_recipients, mercury_add_recipient, mercury_update_recipient

📊 Banking — Statements

  • mercury_list_statements

🏛️ Treasury

  • mercury_get_treasury

  • mercury_list_treasury_transactions

  • mercury_list_treasury_statements

🧾 Invoicing (Accounts Receivable)

⚠️ Mercury Plus plan required. The Invoicing & Customers (AR) APIs are only available on Mercury's Plus plan (or higher). Calls to these tools return 403 Forbidden on Free or Standard plans. The other tools (banking, treasury, webhooks) work on every plan.

  • mercury_list_invoices, mercury_get_invoice

  • mercury_create_invoice, mercury_update_invoice

  • mercury_cancel_invoice

  • mercury_list_invoice_attachments

  • mercury_get_invoice_pdf — returns the download URL of the invoice's PDF via Mercury's documented getinvoicepdf endpoint ({baseUrl}/ar/invoices/{id}/pdf, authenticated, sandbox/proxy-safe). Distinct from mercury_list_invoice_attachments, which only lists manually-uploaded files.

👤 Customers (AR) — also requires Mercury Plus

  • mercury_list_customers, mercury_get_customer

  • mercury_create_customer, mercury_update_customer, mercury_delete_customer

🔗 Webhooks

  • mercury_list_webhooks, mercury_get_webhook

  • mercury_create_webhook, mercury_update_webhook, mercury_delete_webhook

Endpoints not yet wrapped — Mercury exposes ~22 additional endpoints that this MCP does not yet cover. They will land in upcoming releases. Tracked: statement PDF download (getstatementpdf — the invoice PDF is already covered by mercury_get_invoice_pdf), attachments (uploadtransactionattachment, uploadrecipientattachment, getattachment, listrecipientsattachments), webhook signature verification (verifywebhook), webhook events (getevent, getevents), send-money approvals (listsendmoneyapprovalrequests, getsendmoneyapprovalrequest), users (getuser, getusers), Mercury Raise SAFE (getsaferequest(s), getsaferequestdocument), and OAuth flow (obtainaccesstoken, startoauth2flow).

Mercury does not expose list_send_money_requests, COA Templates or Journal Entries via the public API at all — those features are dashboard-only.

There is no send_invoice endpoint anywhere (API or dashboard). An invoice email is only sent when the invoice is created with sendEmailOption: "SendNow". To send a copy later, get the invoice PDF URL via mercury_get_invoice_pdf, download it, and email it manually.

Tools available depend on your Mercury API token scope. The server registers all 39 tools but Mercury will reject unauthorized operations at the API level.

🗺️ Roadmap

See ROADMAP.md.

🔒 Security

  • Never share your API key. Use environment variables, never CLI args.

  • Use read-only or scoped tokens when you don't need write access.

  • Be aware of prompt injection risks when exposing write tools to LLMs that read untrusted content. See Anthropic's MCP security guidance.

🛡️ Built-in safeguards

This MCP includes three middleware layers that activate automatically on write tools (read tools are unaffected):

1️⃣ Rate limiting (dual-window)

Each write tool is mapped to a bucket. Every bucket enforces two rolling windows simultaneously — a daily cap (24 h) and a monthly cap (30-day rolling). A call is rejected as soon as either window is at its cap, so a runaway agent cannot drain accounts even if it stays under the daily limit by pacing itself over weeks.

Bucket

Tools

Daily

Monthly (30d)

payments

send_money, request_send_money

7

150

internal_transfer

create_internal_transfer

2

40

invoices_write

create_invoice, update_invoice

10

200

invoices_cancel

cancel_invoice

3

30

customers_write

create_customer, update_customer, delete_customer

3

60

recipients_add

add_recipient

3

45

recipients_update

update_recipient

2

15

transactions_update

update_transaction (bookkeeping, tagging, receipts)

50

500

webhooks_create

create_webhook

2

15

webhooks_update

update_webhook

2

15

webhooks_delete

delete_webhook

2

15

Override per bucket (both windows must be supplied):

MERCURY_MCP_RATE_LIMIT_payments=15/day,300/month   # larger supplier batch
MERCURY_MCP_RATE_LIMIT_invoices_write=20/day,400/month  # large monthly billing run
MERCURY_MCP_RATE_LIMIT_DISABLE=true                # disable all rate limiting (not recommended)

When exceeded, the tool returns an isError: true response with a structured JSON payload. The source and error_type prefix make it unambiguous that this is a local MCP safeguard — the call was never sent to Mercury. A genuine Mercury 429 surfaces separately as "Mercury API error 429: ...".

{
  "source": "mcp_safeguard",
  "error_type": "mcp_rate_limit_daily_exceeded",
  "message": "MCP Rate Limit Exceeded — Daily (local safeguard, not a Mercury API error)",
  "hint": "Daily Limit Exceeded: mercury_send_money (bucket: payments) capped at 7 per 24h. Retry in ~180 min. Override with MERCURY_MCP_RATE_LIMIT_payments=D/day,M/month if this is a legitimate batch.",
  "retry_after": "2026-04-22T00:00:00.000Z"
}

error_type is either mcp_rate_limit_daily_exceeded or mcp_rate_limit_monthly_exceeded — the agent learns to back off at the right granularity without confusing the MCP's local cap with a server-side Mercury limit.

The rate-limit window survives process restarts. State is persisted to ~/.mercury-mcp/ratelimit.json (mode 0o600); override the location with MERCURY_MCP_STATE_DIR=/abs/path if you need to share state between hosts or pin it to a specific volume. Without persistence, an MCP host that respawns the server per session would silently bypass the limit.

2️⃣ Dry-run mode

Inspect what an agent would do without actually calling Mercury. Useful for debugging suspected behaviour or staging:

MERCURY_MCP_DRY_RUN=true

Write tools then return a structured payload describing the intended action without hitting the Mercury API.

3️⃣ Audit log (opt-in)

Enable structured JSON logging of every write call:

MERCURY_MCP_AUDIT_LOG=/var/log/mercury-mcp-audit.log

Each line is {ts, tool, result, args} (one JSON object per line). Result is ok, dry-run, or error. The path must be absolute; sensitive fields in args (accountNumber, routingNumber, apiKey, authorization, password, token, secret, ssn) are automatically redacted. The file is created with mode 0600 (owner read/write only).

🔧 Development

git clone https://github.com/klodr/mercury-invoicing-mcp.git
cd mercury-invoicing-mcp
npm install
npm run build
npm test

💡 Inspiration

🌐 Ecosystem

Other MCP servers in the klodr family:

📄 License

MIT — see LICENSE.

🤝 Contributing

Issues and PRs welcome. See CONTRIBUTING.md for the test/build/coverage checklist and release process.

Available Tools

39 tools
mercury_add_recipientA
Idempotent

Add a new payment recipient (a counterparty you can later send money to via ACH/wire/check).

USE WHEN: onboarding a new vendor, contractor, or other payee before sending money. The returned id is what mercury_send_money and mercury_request_send_money expect as recipientId.

DO NOT USE: for AR customers (use mercury_create_customer — recipients receive money, customers pay invoices). Mercury enforces strict KYC/banking validation on bank fields — invalid routing numbers or account numbers are rejected at create time.

SIDE EFFECTS: writes a new recipient to Mercury. Persistent. Idempotent via idempotencyKey — the MCP auto-generates one if not provided, so repeated calls with the same generated key would not duplicate; pass an explicit idempotencyKey to make this stable across retries you control.

RETURNS: { id, name, status, defaultPaymentMethod, ... } — keep id for the send-money tools.

NameRequiredDescriptionDefault
nameYesRecipient legal name
emailsYesList of email addresses
paymentMethodYesPayment method to send to this recipient
idempotencyKeyNoUnique key to prevent duplicates
defaultPaymentMethodNoDefault payment method
electronicRoutingInfoNoBank account info for ACH/wire

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing a persistent write, server-side KYC/banking validation that rejects bad routing/account numbers at create time, and the retry/idempotency contract. The idempotency sentence is awkwardly worded ('repeated calls with the same generated key would not duplicate'), which could lead an agent to assume auto-generated keys make blind retries safe; that nuance is worth tightening but is not a contradiction of idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Sectioned and front-loaded (definition, USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS), so an agent can scan to the relevant block. Slightly long, and the idempotency sentence is the one piece of prose that costs more words than it returns in clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the things that matter for a 6-param, nested-object mutation with no output schema: persistence, validation failure modes, the returned id and its downstream use. The remaining gap is the paymentMethod vs defaultPaymentMethod distinction, which the agent must infer from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds real meaning by warning that electronicRoutingInfo bank fields are validated and rejected at create time, and by explaining the purpose of idempotencyKey across retries. It does not, however, clarify the relationship between the required paymentMethod and the optional defaultPaymentMethod, which is the one genuine ambiguity left in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Add a new payment recipient') and immediately disambiguates with a parenthetical definition ('a counterparty you can later send money to via ACH/wire/check'). It also explicitly contrasts with the nearest confusing sibling, mercury_create_customer, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN (onboarding vendors/contractors before sending money) and explicit DO NOT USE with the named alternative for the AR-customer case. It also names the downstream consumers (mercury_send_money, mercury_request_send_money) and which field they consume, which is exactly the routing information an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_cancel_invoiceA
Destructive

Cancel an outstanding invoice. Mercury sends a cancellation notice to the customer if the invoice was already emailed.

USE WHEN: voiding an invoice that was issued in error, that the customer disputes, or that needs to be re-issued under a corrected line-item set. ALWAYS confirm with the user before calling — the customer-facing notification is automatic.

DO NOT USE: on an invoice already paid (Mercury rejects cancellation). To refund a paid invoice, refund out-of-band via the bank, then optionally update the internal note.

SIDE EFFECTS: marks the invoice as cancelled on Mercury. The customer-facing payment URL stops accepting payments. If the invoice was emailed, Mercury notifies the customer of the cancellation by email — confirm with the user before calling. The action is logged in Mercury's audit trail. Cancellation is final from the API perspective.

RETURNS: { id, status: "cancelled", ... }.

NameRequiredDescriptionDefault
invoiceIdYesInvoice ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects: marks invoice cancelled, stops payment URL, emails customer if previously emailed, logs audit trail, and finality. Complements annotations (destructiveHint=true, openWorldHint=true) with actionable details. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-organized: action, side effects, usage constraints, and return format. Every sentence adds value without redundancy. Front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary context: purpose, prerequisites (invoice must be outstanding), side effects, and expected return. No output schema is needed as description provides sample response. Complete for an experienced user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter 'invoiceId' with minimal description in schema, but schema coverage is 100%. Description adds no additional semantics beyond stating it's an Invoice ID. Baseline score (3) is appropriate as schema fully describes the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool cancels an outstanding invoice, with specific use cases (voiding errors, disputes, re-issuance). Distinct from sibling tools like create or update, and 'DO NOT USE' clause clarifies boundaries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'USE WHEN' and 'DO NOT USE' sections provide clear guidance on appropriate and inappropriate scenarios. Emphasizes user confirmation due to automatic customer notification, which is critical for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_create_customerA

Create a new Accounts Receivable customer (a billable entity you will later invoice).

USE WHEN: onboarding a new customer before issuing them an invoice. The returned id is what mercury_create_invoice expects as customerId.

DO NOT USE: for payment recipients (use mercury_add_recipient — different surface, used for outbound bank transfers, not invoicing).

SIDE EFFECTS: writes a new customer to your Mercury workspace. Persistent. NOT idempotent at the API level — calling twice with the same payload creates two customers; check mercury_list_customers for existing entries before creating to avoid duplicates.

RETURNS: { id, name, email, address, ... } — keep id for the invoicing tools.

NameRequiredDescriptionDefault
nameYesCustomer name
emailYesCustomer email
addressNoCustomer billing address (Mercury requires `name` in the address)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give openWorldHint and destructiveHint=false, so the description carries the real burden: it discloses that this is a persistent write, that it is NOT idempotent at the API level, and that duplicate payloads create two customers. That non-idempotency warning is substantive behavioral context an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Labeled sections (USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS) keep the important constraints front-loaded, and every sentence carries a distinct fact. Length is justified by the duplicate-creation risk it must prevent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by sketching the return shape ({ id, name, email, address, ... }) and telling the agent to retain the id for downstream invoicing tools. With required params, side effects, alternatives, and return value all covered, nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the nested address object and its required fields, so the baseline applies. The description adds no field-level meaning beyond confirming the returned id maps to customerId on mercury_create_invoice; it does not clarify why name/email are required or how address is used.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new Accounts Receivable customer') and immediately disambiguates the confusing sibling by defining the entity as 'a billable entity you will later invoice' versus a payment recipient. An agent can tell this apart from mercury_add_recipient without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN (onboarding a customer before invoicing) and an explicit DO NOT USE that names the alternative tool and explains why the surfaces differ ('outbound bank transfers, not invoicing'). It also prescribes a pre-check against mercury_list_customers to avoid duplicates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_create_internal_transferA
Idempotent

Move money between two of your own Mercury accounts (e.g. Checking → Savings). Funds stay inside your organisation.

USE WHEN: rebalancing cash between your own Mercury accounts — sweeping idle deposits to Treasury, funding a sub-account before issuing cards, etc. Both accounts must belong to your workspace.

DO NOT USE: to send money to an external counterparty (use mercury_send_money). To request approval-gated movement, use mercury_request_send_money (different surface, external only).

SIDE EFFECTS: moves real money between two accounts you own. Settles immediately, no approval workflow because no external recipient is involved. Persistent ledger entries on both sides. Idempotent via idempotencyKey — auto-generated if omitted, but pass an explicit one to make retries safe.

RETURNS: { id, amount, status, ... } — the booked transfer.

NameRequiredDescriptionDefault
noteNoOptional note attached to the transfer
amountYesAmount in USD (>= 0.01)
idempotencyKeyNoUnique key to prevent duplicate transfers. Auto-generated if omitted; pass an explicit one to make retries safe.
sourceAccountIdYesSource Mercury account ID
destinationAccountIdYesDestination Mercury account ID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (non-destructive, idempotent), description adds immediate settlement, no approval workflow, permanent ledger changes, and idempotency details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear headings (USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS). Every sentence adds value, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, side effects, and return shape. Lacks explicit error handling but sufficient for a well-annotated read/write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description does not add parameter details beyond schema, but is not required to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool moves money between two Mercury accounts owned by the same organization, distinguishes from external transfers and approval-gated requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides USE WHEN and DO NOT USE scenarios, names alternative tools (mercury_send_money, mercury_request_send_money), and notes workspace requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_create_invoiceA

Create a new invoice (one-shot or to be sent recurrently). Requires AR write scope.

USE WHEN: billing a customer that already exists in Mercury (customerId from mercury_create_customer or mercury_list_customers). Set sendEmailOption: "SendNow" to email the invoice immediately to the customer's contact email.

DO NOT USE: when the customer does not exist yet (call mercury_create_customer first). To attach a file to the invoice, use the Mercury web app at creation time — the API attachment-upload endpoint is not exposed by this MCP currently.

SIDE EFFECTS: writes a new invoice to Mercury. Persistent. With sendEmailOption: "SendNow" (the default), Mercury also sends a real email with a payment link to the customer — confirm the customer's email and the line items before calling. Mercury Plus tier required for the AR write scope.

RETURNS: { id, status, amount, paymentUrl, ... } — paymentUrl is the Mercury-hosted page where the customer pays.

NameRequiredDescriptionDefault
dueDateYesDue date (YYYY-MM-DD)
ccEmailsNoCC emails for notifications
poNumberNoPurchase order number
lineItemsYesInvoice line items
payerMemoNoMemo shown to payer
customerIdYesCustomer ID (created via mercury_create_customer)
invoiceDateYesInvoice date (YYYY-MM-DD)
internalNoteNoNote visible only to your org
invoiceNumberNoCustomer-facing invoice number (≤255 chars; Mercury rejects 300+ characters on the edit endpoint)
achDebitEnabledNoAllow ACH debit payments. Default: true
sendEmailOptionNoWhether to email the invoice immediately. Default: SendNow
creditCardEnabledNoAllow credit card payments. Default: true
destinationAccountIdYesMercury account ID where invoice payments will be deposited
servicePeriodEndDateNoService period end (YYYY-MM-DD)
useRealAccountNumberNoShow real (vs virtual) account number on the invoice. Default: false
servicePeriodStartDateNoService period start (YYYY-MM-DD)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (openWorldHint, destructiveHint=false): it warns that the write is persistent, that the default SendNow option sends a real email with a payment link (a real-world side effect), and that Mercury Plus / AR write scope is required. It also discloses the API attachment limitation, which annotations do not cover at all.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Sectioned with front-loaded labels (USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS) and every sentence carries actionable information. No filler despite the length, which is justified by a 16-parameter, email-sending mutation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description provides the return shape (id, status, amount, paymentUrl) and explains paymentUrl. Combined with prerequisites, tier requirement and side effects, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: sendEmailOption controls whether a real customer email is sent, and customerId provenance is tied to mercury_create_customer. It doesn't explain destinationAccountId or the other optional fields beyond schema, so not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new invoice') and scopes it ('one-shot or to be sent recurrently'), immediately distinguishing it from mercury_update_invoice, mercury_send_money and the customer tools it references. An agent can identify the tool's role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN and DO NOT USE blocks name the prerequisite (customer must exist, via mercury_create_customer or mercury_list_customers) and route the agent to mercury_create_customer when it does not. It also calls out the attachment workaround, which prevents a failed call attempt.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_create_webhookA

Register a new webhook endpoint. Mercury will POST events as JSON to the provided URL.

USE WHEN: subscribing an external system to Mercury events (transaction.posted, invoice.paid, etc.) so you can react in near real-time without polling.

DO NOT USE: with non-HTTPS URLs, loopback / RFC 1918 / link-local / cloud-metadata IPs — the MCP enforces a defense-in-depth gate on top of Mercury's own validation to block accidental SSRF or exfiltration via prompt injection.

SIDE EFFECTS: writes a new webhook subscription to Mercury. Persistent. Once registered, Mercury immediately starts delivering matching events to your URL — make sure the endpoint is ready to receive (and ideally verify Mercury's signature). NOT idempotent at the API level — calling twice creates two subscriptions firing duplicate events.

RETURNS: { id, url, status, events, ... } — keep id for mercury_update_webhook / mercury_delete_webhook.

NameRequiredDescriptionDefault
urlYesPublicly reachable HTTPS URL that will receive webhook events (POST). Must not be a loopback, private, or link-local address.
eventsYesEvent types to subscribe to. Common values: - transaction.created / transaction.updated - transaction.posted / transaction.pending / transaction.failed - invoice.created / invoice.sent / invoice.paid / invoice.overdue / invoice.cancelled - customer.created / customer.updated - recipient.created / recipient.updated Check https://docs.mercury.com/reference/webhooks for the full list.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes side effects (persistent writes, non-idempotent) beyond annotations. Does not contradict `destructiveHint=false` (create is additive) and provides context for `openWorldHint=true`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with clear sections, front-loads action, and every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description provides return structure (`{ id, url, ... }`) and references sibling tools. Covers all critical aspects for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; description adds constraints for `url` (public HTTPS, block dangerous IPs) and examples for `events`, supplementing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Register a new webhook endpoint') and the resource (webhook). It specifies that Mercury will POST events, differentiating it from other Mercury tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'USE WHEN' section defines appropriate scenarios, while 'DO NOT USE' warns against invalid URLs and SSRF risks. Includes guidance on idempotency and preparation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_delete_customerA
Destructive

Permanently delete an Accounts Receivable customer. DESTRUCTIVE.

USE WHEN: removing a customer that was created by mistake, or that the user explicitly wants to purge. ALWAYS confirm with the user before calling — there is no undo.

DO NOT USE: when the customer has invoices in paid / outstanding status — Mercury rejects deletion in those cases and returns a 409. Cancel outstanding invoices first via mercury_cancel_invoice.

SIDE EFFECTS: permanent deletion on Mercury's side. The customer disappears from the AR list. Past invoices' customerId may dangle (Mercury does not cascade-delete invoices). NOT recoverable from API. ALWAYS confirm with the user.

RETURNS: confirmation payload from Mercury ({ deleted: true, ... } or similar).

NameRequiredDescriptionDefault
customerIdYesCustomer ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description details permanent deletion, loss from AR list, potential dangling customerId on past invoices, and non-recoverability. Annotations already mark destructiveHint and openWorldHint, but description adds concrete repercussions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with labeled sections (USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS) and bold key terms. Every sentence is informative and no extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with no output schema, the description covers usage, limitations, side effects, and return value. No gaps remain for an agent to safely invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (customerId) is fully described in the schema with format and pattern. The description does not add additional semantics beyond what schema provides. With 100% schema coverage, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Permanently delete an Accounts Receivable customer' with a specific verb and resource. It distinguishes from sibling tools like mercury_create_customer and mercury_update_customer by its destructive nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear WHEN to use (removing mistaken or purge-worthy customers) and WHEN NOT to use (if invoices have paid/outstanding status). Also gives an alternative: cancel invoices via mercury_cancel_invoice. Explicitly requires user confirmation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_delete_webhookA
Destructive

Delete a webhook endpoint. DESTRUCTIVE — Mercury stops delivering events to that URL.

USE WHEN: decommissioning a webhook (URL no longer reachable, integration retired, accidental duplicate). ALWAYS confirm with the user — there is no undo, and any downstream system that depended on the events stops being notified.

DO NOT USE: to temporarily silence a webhook (use mercury_update_webhook with status: "paused" instead — reversible).

SIDE EFFECTS: permanent deletion on Mercury's side. Future events that would have fired this webhook are silently dropped — no replay. Past delivery history is also lost from the Mercury dashboard.

RETURNS: confirmation payload ({ deleted: true, ... } or similar).

NameRequiredDescriptionDefault
webhookIdYesThe webhook endpoint ID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set destructiveHint: true, so the description reinforces this with concrete side effects: permanent deletion, lost delivery history, no replay. This adds valuable context beyond the annotation, though the annotation already signals the core destructive trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bold headings and bullet points, front-loading the key purpose and destruction warning. While comprehensive, it is not overly verbose and each section adds value, though slightly longer than minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description appropriately mentions the return payload. It covers purpose, usage side effects, and behavioral expectations comprehensively for a destructive tool with one parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the single parameter (webhookId) with format and description, so the description doesn't add additional semantic value. It mentions the need for user confirmation but that's a usage guideline, not parameter-specific detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Delete a webhook endpoint' and highlights its destructive nature. It distinguishes itself from sibling tools like mercury_update_webhook by emphasizing permanent deletion vs. pausing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (decommissioning webhooks) and when not to (temporary silence), with a clear alternative: use mercury_update_webhook with status 'paused' instead. This provides direct guidance for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_accountA
Read-only

Retrieve details for a specific Mercury deposit account by ID.

USE WHEN: fetching the full detail of a single account whose ID is already known (typically from mercury_list_accounts). Faster than re-listing when you already have the ID.

DO NOT USE: to enumerate accounts (use mercury_list_accounts). For IO Credit accounts (use the mercury_list_credit_accounts endpoint).

RETURNS: { id, name, kind, status, availableBalance, currentBalance, accountNumber, routingNumber, ... }.

NameRequiredDescriptionDefault
accountIdYesThe Mercury account ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description lists return fields and implies read-only, consistent with annotations. Adds expected output structure beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with purpose, then usage, then return shape. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with one parameter and no output schema, the description covers purpose, usage, and return shape completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter with 100% schema coverage; description adds no extra meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool retrieves details for a specific Mercury deposit account by ID, and distinguishes from listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (when ID known) and when not to use (for enumeration, IO Credit accounts), guiding correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_customerA
Read-only

Retrieve a specific Accounts Receivable customer by ID.

USE WHEN: fetching the full detail of one customer whose ID is already known. Faster than relisting + filtering when you have the ID.

DO NOT USE: to enumerate customers (use mercury_list_customers). For payment recipients use mercury_list_recipients (different surface).

RETURNS: { id, name, email, address, ... }.

NameRequiredDescriptionDefault
customerIdYesCustomer ID

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and openWorldHint; the description adds that it returns full customer detail and gives the return shape. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Highly concise with three clear sections: intro, usage guidance, return shape. No unnecessary words; front-loaded with key info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity, the description adequately covers purpose, usage, and return format. Ellipsis indicates more fields, which is acceptable without output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers parameter fully with description; description adds context that the ID is already known and that the tool is for lookup, reinforcing the parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (Retrieve) and resource (a specific Accounts Receivable customer by ID). Differentiates from sibling tools like mercury_list_customers and mercury_list_recipients.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to use (when ID is known, faster than listing) and when not to use (enumerating customers or fetching payment recipients). Provides alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_invoiceA
Read-only

Retrieve a specific invoice by ID, including line items, status, and the payment URL.

USE WHEN: fetching the full detail of one invoice (line items, current status, balance due, payment URL) whose ID is already known.

DO NOT USE: to enumerate invoices (use mercury_list_invoices). For attachments use mercury_list_invoice_attachments.

RETURNS: { id, status, amount, customerId, lineItems, paymentUrl, dueDate, ... }.

NameRequiredDescriptionDefault
invoiceIdYesThe invoice ID (UUID)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and the description adds specific return fields (line items, status, payment URL). No contradictions; the description enriches the behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three clear sections: main purpose, usage guidance, and return format. Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description lists key return fields, covering what the agent needs. Tool is simple with one parameter; description fully addresses usage and expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with description for invoiceId. The tool description does not add further parameter semantics beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve a specific invoice by ID, including line items, status, and the payment URL.' It specifies the verb (retrieve), resource (invoice by ID), and included data, distinguishing from siblings like mercury_list_invoices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit 'USE WHEN' and 'DO NOT USE' sections, directing to use for fetching one invoice with known ID and avoiding for enumeration or attachments, referencing alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_invoice_pdfA
Read-only

Resolve the download URL of an invoice's PDF via Mercury's documented getinvoicepdf endpoint.

USE WHEN: you need the actual invoice PDF — to archive it, or to attach it to an email / bank KYB / compliance reply. mercury_list_invoice_attachments does NOT return it (that lists only files a human manually uploaded, empty on a normal invoice). This tool fetches the invoice (for its number / status / slug) and returns downloadUrl = {baseUrl}/ar/invoices/{id}/pdf, the documented endpoint (https://docs.mercury.com/reference/getinvoicepdf) that returns the PDF with Content-Disposition: attachment.

AUTH: downloadUrl is an authenticated Mercury API URL — fetch it with the same Authorization: Bearer <token> and Accept: application/pdf as every other call (it is NOT a public pre-signed link). Because it is derived from the client's configured base URL, it stays correct under the sandbox / proxy host, not just production.

DO NOT USE: for statement PDFs (use mercury_list_statements); for manually-uploaded attachments (use mercury_list_invoice_attachments). A draft invoice that was never issued may return 404 when the URL is fetched.

RETURNS: { invoiceId, invoiceNumber, status, slug, downloadUrl }.

NameRequiredDescriptionDefault
invoiceIdYesThe invoice ID (UUID)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and openWorldHint, but the description adds substantial non-structured context: the returned downloadUrl is authenticated and requires Bearer token + Accept: application/pdf (not a pre-signed link), and it stays correct under sandbox/proxy hosts. It also discloses the 404 behavior for unissued draft invoices, all well beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled USE WHEN / AUTH / DO NOT USE / RETURNS sections that each carry actionable content. Slightly long, with a docs URL and URL-template notation that are helpful but marginally verbose; still, few sentences could be cut without losing routing or auth information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the RETURNS block enumerates the response fields (invoiceId, invoiceNumber, status, slug, downloadUrl), and auth/error behavior for draft invoices is documented. An agent has everything needed to call it and consume the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (invoiceId), and schema coverage is 100% with the UUID pattern fully documented. The description says the tool fetches the invoice for number/status/slug but adds no format or sourcing detail for invoiceId beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Resolve the download URL of an invoice's PDF'. It explicitly names siblings it is not (list_invoice_attachments, list_statements) and explains the derived URL format, so the agent can distinguish it from mercury_get_invoice or mercury_list_invoice_attachments without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit USE WHEN block with concrete scenarios (archiving, attaching to email/KYB/compliance), a DO NOT USE block routing to mercury_list_statements and mercury_list_invoice_attachments, and a caveat about draft invoices returning 404. Alternatives are named with the selecting condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_organizationA
Read-only

Retrieve information about your Mercury organization (legal name, EIN, registered address, etc.).

USE WHEN: fetching the workspace's legal identity for invoice generation, tax documents, or to confirm which organization the API token is bound to.

DO NOT USE: for per-account info (use mercury_get_account). The Mercury API exposes only one organization per token, so there is no list variant.

RETURNS: { id, legalName, ein, address, ... }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. Description adds behavioral context: returns specific fields, and that the API exposes only one organization per token. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise with only three short sections. Uses clear headings and bullet-point-like formatting (RETURNS). Every sentence is necessary and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no input parameters and no output schema, the description provides a complete overview: what it does, when to use, and the return shape. No gaps for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in the schema (0 params, 100% coverage). Baseline is 4. Description does not add parameter details because none exist; it correctly states no params needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Retrieve information') and the resource ('Mercury organization'), listing specific fields (legal name, EIN, registered address). It distinguishes from sibling tool mercury_get_account, which is for per-account info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides USE WHEN and DO NOT USE sections, guiding the agent to use this tool for workspace legal identity and to avoid for per-account info. Mentions no list variant due to API limitation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_transactionA
Read-only

Retrieve a specific transaction by ID for a Mercury deposit account.

USE WHEN: fetching the full detail of one transaction whose ID is already known (typically from mercury_list_transactions). Faster than relisting + filtering.

DO NOT USE: to enumerate transactions (use mercury_list_transactions). For IO Credit transactions, use mercury_list_credit_transactions and filter by id client-side.

RETURNS: { id, amount, status, postedAt, counterpartyName, memo, attachments: [{ fileName, attachmentType }], ... } — every Mercury field, except that attachment URLs are stripped. Use mercury_get_transaction_attachment to obtain a download URL.

NameRequiredDescriptionDefault
accountIdYesThe Mercury account ID
transactionIdYesThe transaction ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly/openWorld; the description adds real behavioral detail beyond that, notably that attachment URLs are stripped from the response and must be fetched via mercury_get_transaction_attachment. That is exactly the kind of hidden-surprise disclosure annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded verb+resource in the first sentence, then clearly labeled USE WHEN / DO NOT USE / RETURNS blocks. No filler; even the return shape sample earns its place by implying the attachments structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description supplies the return shape and explicitly flags the one omitted field (attachment URLs) with the sibling to call instead. Nothing an agent needs to invoke or interpret this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are UUIDs documented in the schema, so the baseline is 3. The description only hints at provenance ('typically from mercury_list_transactions') without adding format or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieve a specific transaction by ID') plus the scope ('Mercury deposit account'), which lets an agent distinguish it from list_transactions, list_credit_transactions, and get_transaction_attachment without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN section names the trigger condition (ID already known, typically from mercury_list_transactions) and explains why it beats relisting. DO NOT USE section names both alternatives and when to prefer each, including the client-side filter workaround for IO Credit transactions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_transaction_attachmentA
Read-only

Obtain the pre-signed download URL(s) for a transaction's receipts / attachments.

USE WHEN: you actually intend to download a receipt — filing a supplier invoice, attaching a justification to a bookkeeping entry. Locate candidates first with mercury_list_transactions (hasAttachment: true), then call this for the one you want.

DO NOT USE: to check whether a receipt exists — mercury_list_transactions already reports hasAttachment without minting a credential. Do not call it across a whole statement to pre-fetch URLs: they expire in ~12 hours and every one you mint is a live bearer token sitting in transcripts and logs.

SIDE EFFECTS: none on Mercury (read-only). But the returned URL grants unauthenticated access to the document for ~12 hours to anyone who holds it — treat the response as a secret and do not echo it further than needed.

RETURNS: { transactionId, attachmentCount, attachments: [{ fileName, attachmentType, url }] }.

NameRequiredDescriptionDefault
fileNameNoReturn only the attachment with this exact file name. Omit to return all.
accountIdYesThe Mercury account ID
transactionIdYesThe transaction ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=true annotation by disclosing that the returned URL is an unauthenticated bearer token valid ~12 hours, that it should be treated as a secret, and that pre-fetching mints expiring credentials into logs. This is exactly the kind of non-obvious risk context the description should carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose sentence, then cleanly sectioned into USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS. Despite its length, every section earns its place and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the RETURNS block supplies the exact response shape ({ transactionId, attachmentCount, attachments: [{ fileName, attachmentType, url }] }), and the security/expiry caveats cover the openWorld risk. An agent has everything needed to call it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so accountId, transactionId, and fileName are already documented in the schema; the description adds no syntax or format detail. Baseline 3 applies since the schema does the heavy lifting for parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (obtain) and resource (pre-signed download URLs for a transaction's receipts/attachments), and distinguishes itself from mercury_list_invoice_attachments and mercury_list_transactions by scoping to a single transaction's attachments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN (intending to actually download) and DO NOT USE (just checking whether a receipt exists) sections, plus a named alternative (mercury_list_transactions with hasAttachment: true) for locating candidates and a warning against bulk pre-fetching. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_treasuryA
Read-only

Retrieve Mercury Treasury account information (balance, current yield, eligibility, etc.).

USE WHEN: checking treasury cash balance or yield for cash-management decisions, or to confirm the workspace has Treasury enabled.

DO NOT USE: for deposit accounts (use mercury_get_account). For Treasury transactions or statements, use the dedicated list tools.

RETURNS: { id, currentBalance, yield, eligibility, ... }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds the return structure and mentions eligibility, which is helpful but does not contradict annotations. It could expand on openWorld implications, but overall transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 lines), front-loaded, and every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, a simple return format provided, and annotations covering safety, the description is largely complete. Slight improvement would be noting that workspace-level info is returned, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0 parameters with 100% coverage, so description has no param details needed. Baseline 4 applies as per guidelines for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve Mercury Treasury account information' and lists specific fields (balance, current yield, eligibility). It distinguishes from sibling tool `mercury_get_account` which is for deposit accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides USE WHEN (checking treasury cash balance or yield, confirming Treasury enabled) and DO NOT USE (for deposit accounts, treasury transactions/statements) with named alternatives (`mercury_get_account`, list tools).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_get_webhookA
Read-only

Retrieve a specific webhook endpoint by ID.

USE WHEN: fetching the full detail of one webhook (URL, current status, subscribed events) whose ID is already known.

DO NOT USE: to enumerate webhooks (use mercury_list_webhooks).

RETURNS: { id, url, status, events, ... }.

NameRequiredDescriptionDefault
webhookIdYesThe webhook endpoint ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true; description adds return format details (id, url, status, events) which is consistent and helpful. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three brief sentences, front-loaded with purpose, no waste. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get-by-ID tool, description covers purpose, usage, return structure, and distinctions from siblings. Annotations provide readOnlyHint and openWorldHint. Complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter description 'The webhook endpoint ID'. Description does not add further parameter semantics beyond schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Retrieve a specific webhook endpoint by ID', specifying the verb and resource. Distinct from siblings like mercury_list_webhooks which enumerate, and other CRUD operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (fetch detail of one webhook with known ID) and when not to (use mercury_list_webhooks for enumeration), providing clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_accountsA
Read-only

List all deposit bank accounts in your Mercury workspace (checking, savings, treasury).

USE WHEN: enumerating Mercury bank accounts before drilling into transactions, balances, or statements. Typically the first call when you have an account ID in hand or need one.

DO NOT USE: for IO Credit card accounts (use mercury_list_credit_accounts — /credit is a separate endpoint). For a single account whose ID is already known, prefer mercury_get_account to skip the list payload.

RETURNS: { accounts: [{ id, name, kind, status, availableBalance, currentBalance, accountNumber, routingNumber, ... }] }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations readOnlyHint:true and openWorldHint:true indicate safe read operation and broad scope. Description adds context: returns account details with fields id, name, kind, status, balances, accountNumber, routingNumber, etc., and implies it lists all accounts (no parameters). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, with clear section headers (USE WHEN, DO NOT USE, RETURNS). Every sentence adds value—no redundant or fluff content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description fully specifies the return shape with example fields. With zero parameters, all necessary context is covered: purpose, usage, and output format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters (100% coverage), so description need not explain parameters. Baseline is 4 per guidelines; description adds no extra param info but reinforces that the tool lists all accounts without filters, which is helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states it lists deposit bank accounts (checking, savings, treasury) in Mercury workspace, uses specific verb 'list' and resource, and distinguishes from sibling tools by naming credit accounts and single-account endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'USE WHEN' for enumerating before drilling into transactions/balances, and 'DO NOT USE' for IO Credit card accounts (pointing to mercury_list_credit_accounts) or when account ID is known (prefer mercury_get_account). Clear guidance with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_cardsA
Read-only

List physical and virtual cards attached to a Mercury account.

USE WHEN: enumerating cards (debit, virtual debit, IO Credit) issued against an account — for spend audits, freezing review, or cardholder lookups.

DO NOT USE: to list IO Credit transactions (use mercury_list_credit_transactions). Card creation, freezing, and PIN ops are not exposed by this MCP — the Mercury API does not currently support them.

RETURNS: { cards: [{ id, last4, type, status, holderName, expiry, ... }] }.

NameRequiredDescriptionDefault
accountIdYesThe Mercury account ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, confirming no side effects. The description adds value by specifying the return format (cards array with fields like id, last4, type) and noting current API limitations (no card creation/freezing), which goes beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 sentences), well-structured with clear sections (USE WHEN, DO NOT USE, RETURNS), and contains no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (single parameter, no output schema), the description covers the purpose, usage guidelines, return format, and limitations completely. No additional information is needed for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter accountId, which is clearly documented. The description does not add further semantic meaning beyond the schema, but the schema itself is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it lists physical and virtual cards attached to a Mercury account, with a specific verb and resource. It distinguishes from sibling tools like mercury_list_credit_transactions by exclusion, ensuring no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear 'USE WHEN' and 'DO NOT USE' sections provide explicit context for when to use this tool (e.g., spend audits, freezing review) and when not to (e.g., listing credit transactions, which points to an alternative sibling). Also notes API limitations for card creation and freezing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_categoriesA
Read-only

List transaction categories available in your Mercury workspace (e.g. Office Supplies, Meals, Travel).

USE WHEN: discovering valid categoryId values before calling mercury_update_transaction to recategorise a transaction. Also useful for category-based reporting in downstream tooling.

DO NOT USE: to list transactions in a category (use mercury_list_transactions and filter client-side). Category creation/edit is not exposed by this MCP — the Mercury API does not currently support it.

RETURNS: { categories: [{ id, name, ... }] }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and open world; description adds return format and that category creation is not supported, providing additional context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured with clear sections (USE WHEN, DO NOT USE, RETURNS), no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully explains purpose, usage, return format, and limitations; no missing context despite no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema; description does not need to add parameter details. Baseline 4 for zero-param tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists transaction categories, provides examples, and distinguishes from sibling tool mercury_list_transactions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (discovering valid categoryId for update_transaction) and when not to use (listing transactions, category creation), with alternative tool mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_credit_accountsA
Read-only

List Mercury IO Credit card accounts (charge cards, distinct from deposit accounts).

USE WHEN: enumerating IO Credit accounts to find their balance, statement closing date, or to feed an ID into mercury_list_credit_transactions. Wraps GET /credit (documented under Credit › List all credit accounts in the Mercury API reference).

DO NOT USE: for deposit accounts (checking/savings/treasury) — use mercury_list_accounts, which hits a different endpoint (/accounts).

RETURNS: { accounts: [{ id, status, availableBalance, currentBalance, ... }] }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and openWorldHint; description adds endpoint (/credit), return shape, and notes it is a read operation. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured with sections for USE WHEN, DO NOT USE, RETURNS. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, and return structure adequately. Lacks mention of pagination or limits, but for a zero-parameter list tool with openWorldHint, it is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so baseline is 4. Description adds no parameter info, which is acceptable given the parameter count is zero.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool lists Mercury IO Credit card accounts (charge cards), distinguishes from deposit accounts, and explicitly names the sibling tool for the other account type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN (enumerating accounts for balance, statement closing, feeding ID to mercury_list_credit_transactions) and DO NOT USE (deposit accounts, directs to mercury_list_accounts).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_credit_statementsA
Read-only

List monthly statements for a Mercury IO Credit card account. Each statement has a downloadable PDF URL.

USE WHEN: fetching IO Credit card statements for accounting, audit, or a CPA. Wraps GET /api/v2/account/{id}/statements — the v1 statements path answers 404 for credit accounts and points to this v2 endpoint. Per the Mercury changelog, statements generated after 2026-06-15 report charges as positive (amount owed) and payments as negative, with autopay as a separate line.

DO NOT USE: for deposit-account statements (use mercury_list_statements) or Treasury statements (use mercury_list_treasury_statements). The PDF URL is short-lived — re-fetch it shortly before download.

RETURNS: { statements: [{ id, startDate, endDate, endingBalance, downloadUrl, details, transactions, ... }] }.

NameRequiredDescriptionDefault
accountIdYesThe Mercury IO Credit account ID (from mercury_list_credit_accounts)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnlyHint/openWorldHint annotations by disclosing the v1→v2 endpoint 404 behavior, the sign-convention change for statements after 2026-06-15, and the critical operational caveat that downloadUrl is short-lived. These are non-obvious traits an agent could not get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then uses labeled USE WHEN / DO NOT USE / RETURNS blocks so an agent can scan to the needed section. The changelog sentence is unusual in length but earns its place by preventing misread amounts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description supplies the return shape itself, including the statement fields and downloadUrl. Combined with the endpoint caveat and sibling routing, an agent has everything needed to call this correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single accountId parameter is already documented as coming from mercury_list_credit_accounts. The description reinforces that it must be an IO Credit account, but adds no format or sourcing detail beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("list monthly statements for a Mercury IO Credit card account") and immediately distinguishes itself from mercury_list_statements and mercury_list_treasury_statements. An agent can identify the correct tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN block names the concrete scenarios (accounting, audit, CPA) and the DO NOT USE block names the two sibling alternatives plus the excluded resource types. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_credit_transactionsA
Read-only

List transactions on a Mercury IO Credit card account, including pending (not-yet-settled) card authorisations.

USE WHEN: auditing IO Credit card spend, reconciling a statement, or building a card-level transaction view. Wraps GET /account/{id}/transactions — same path Mercury exposes for deposit-account transactions; both this tool and mercury_list_transactions hit it. Supports the same filters.

DO NOT USE: for deposit-account transactions (use mercury_list_transactions). For posted transactions only, filter by status: "sent".

⚠️ Omitting start does NOT mean "all history". Mercury silently returns only a recent window — roughly the last statement period — with nothing in the response to say it truncated. Observed on a real IO Credit account: 68 transactions without start, 532 for the same card with start set. Always pass start when auditing a period, and page with offset until a call returns fewer than limit rows.

RETURNS (default detail: "compact"): { transactions: [{ id, amount, status, kind, postedAt, counterpartyName, categoryName, hasAttachment, ... }] }. pending items are card authorisations that may still be reversed. hasAttachment is always present, true or false — it answers "which card charges are still missing a receipt". Receipt URLs are never returned here; get one deliberately via mercury_get_transaction_attachment. Pass detail: "full" for every Mercury field.

NameRequiredDescriptionDefault
endNoFilter posted on/before this date (YYYY-MM-DD)
limitNoMax results to return (1-500). Default: 500
startNoFilter posted on/after this date (YYYY-MM-DD)
detailNoPayload shape. "compact" (default) projects to identifying fields and reports receipts as a boolean. "full" returns every Mercury field — attachment URLs are stripped in both modes.
offsetNoPagination offset
searchNoSearch query (counterparty name, memo, etc.)
statusNoFilter by transaction status. `pending` = card auth not yet settled.
accountIdYesThe Mercury IO Credit account ID (from mercury_list_credit_accounts)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint/openWorldHint, so the description carries the real burden and does: it discloses Mercury's silent truncation when `start` is omitted, with a quantified observation (68 vs 532 rows) to make the risk credible, and prescribes offset paging until fewer than `limit` rows return. It also flags that receipt URLs are stripped and must be fetched via `mercury_get_transaction_attachment`. Slight deduction for not stating rate limits or the truncation window's exact boundary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then uppercase USE WHEN / DO NOT USE headers, then a clearly marked warning, then RETURNS. Long but every block is functional — the anecdotal row counts exist to justify the truncation warning rather than pad the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by sketching the returns envelope, explaining that `pending` items are reversible authorisations, and noting `hasAttachment` is always present as a receipt-gap signal. For an 8-parameter, single-required-param read tool with annotations, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description still adds value the schema cannot: the semantics of omitting `start`, how `offset` should be used with `limit`, and what `detail: "compact"` vs `"full"` actually yields. It does not restate or clarify `search`, `end`, or `accountId` beyond schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list transactions on a Mercury IO Credit card account) plus the distinguishing scope detail that it includes pending, not-yet-settled authorisations. It names the confusable sibling `mercury_list_transactions` and explains that both hit the same endpoint, so an agent can separate the two without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Has an explicit USE WHEN block (auditing card spend, reconciling a statement, building a card-level view) and an explicit DO NOT USE block routing deposit-account work to `mercury_list_transactions`. It also gives a concrete downstream filter recipe (`status: "sent"` for posted-only), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_customersA
Read-only

List Accounts Receivable customers, with cursor-based pagination.

USE WHEN: enumerating AR customers before creating an invoice (need a customerId for mercury_create_invoice), or for a customer-level audit. Use startAfter / endBefore for paging beyond the limit.

DO NOT USE: for payment recipients (mercury_list_recipients is the bank-payment counterparty list, distinct from AR customers). For one customer whose ID is known, prefer mercury_get_customer.

RETURNS: { customers: [{ id, name, email, address, ... }] }.

NameRequiredDescriptionDefault
limitNoMax results (1-1000)
orderNo
endBeforeNoPagination cursor (reverse)
startAfterNoPagination cursor (forward)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds cursor-based pagination details ('Use startAfter / endBefore for paging beyond the limit') and return format, enhancing transparency beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (5 sentences) with clear sections: purpose, USE WHEN, DO NOT USE, RETURNS. Front-loaded with purpose, no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (list with pagination), annotations, and schema, the description covers usage context, pagination, and return structure. Output schema is not provided, but description specifies return format. Complete for a list endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, with parameter descriptions for limit, startAfter, and endBefore. The description adds context on how to use pagination cursors ('Use startAfter / endBefore for paging'), but does not document the 'order' parameter, which is not described in schema either.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List Accounts Receivable customers, with cursor-based pagination.' It provides a specific verb ('list'), resource ('AR customers'), and mentions pagination. It distinguishes from siblings like 'mercury_list_recipients' and 'mercury_get_customer'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('enumerating AR customers before creating an invoice...or for a customer-level audit'), when not to use ('DO NOT USE: for payment recipients'), and provides alternatives ('mercury_list_recipients', 'mercury_get_customer').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_invoice_attachmentsA
Read-only

List attachments associated with an invoice (PDF copies, supporting documents).

USE WHEN: discovering which files were attached to an invoice — for archival, audit, or to share with a customer. The download URL is short-lived; refetch shortly before download.

DO NOT USE: to upload an attachment — this MCP currently exposes only the read side. Mercury's API does support attachment upload (POST /ar/invoices/{id}/attachments); a write tool can be added if needed.

RETURNS: { attachments: [{ id, filename, downloadUrl, ... }] }.

NameRequiredDescriptionDefault
invoiceIdYesInvoice ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true. The description adds critical behavioral details: download URLs are short-lived requiring refetch before download, and it returns a specific structure. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (three sections: what, use when, do not use, returns) with no redundant sentences. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter, no output schema, and annotations providing safety hints, the description is complete. It includes return format and critical usage notes, leaving no ambiguity for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with a description for invoiceId. The description adds no extra semantic value beyond what the schema provides, but the parameter is simple and well-documented; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists attachments associated with an invoice, specifying types (PDF copies, supporting documents). The use case section further clarifies purpose, and it is distinct from sibling tools like mercury_get_invoice or mercury_create_invoice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides USE WHEN and DO NOT USE guidance, including alternatives (upload is not supported) and a note on short-lived download URLs. This helps the agent decide when to invoke and when not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_invoicesA
Read-only

List invoices in your Mercury workspace, with cursor-based pagination.

USE WHEN: enumerating invoices for an AR audit, finding the ID of an invoice to update/cancel, or building a dunning report. Use startAfter / endBefore to page beyond the limit.

DO NOT USE: for one invoice whose ID is known (prefer mercury_get_invoice). Mercury does not currently support filtering by status or customer at the API level — filter client-side after listing.

RETURNS: { invoices: [{ id, status, amount, customerId, dueDate, ... }] }.

NameRequiredDescriptionDefault
limitNoMax results to return (1-1000). Default: 1000
orderNoSort order. Default: asc
endBeforeNoPagination: return invoices before this ID
startAfterNoPagination: return invoices after this ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=true) already indicate safety; description adds pagination behavior (cursor-based) and return structure, but no additional behavioral traits beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with purpose, and structured with usage guidelines and return info; no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description provides a clear return structure and pagination details, making it complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description's extra notes on pagination and defaults add minimal value beyond what's already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List invoices in your Mercury workspace' with specific verb and resource, and distinguishes from siblings like mercury_get_invoice and mercury_list_invoice_attachments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides 'USE WHEN' scenarios and 'DO NOT USE' with an alternative (mercury_get_invoice), as well as mentions current API limitations on filtering.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_recipientsA
Read-only

List all payment recipients (counterparties for outbound ACH/wire/check) in your Mercury workspace.

USE WHEN: enumerating recipients before sending money — need a recipientId to feed into mercury_send_money or mercury_request_send_money. Also useful for an audit of who can receive funds from this account.

DO NOT USE: for AR customers (use mercury_list_customers — different surface, different scope). Recipients are bank-payment counterparties; customers are who you invoice.

RETURNS: { recipients: [{ id, name, nickname, defaultPaymentMethod, electronicRoutingInfo, status, ... }] }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. The description adds the return format structure but no additional behavioral traits. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise: three clear sections (purpose, usage, returns). Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 0 parameters and no output schema, the description covers purpose, usage guidelines, and return format thoroughly. No gaps for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0 parameters, so schema coverage is 100%. Description adds context about what recipients are and their fields, which is helpful beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all payment recipients for outbound ACH/wire/check in the workspace, with a specific verb and resource, and differentiates from sibling tools like mercury_list_customers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (before sending money, to get recipientId for mercury_send_money) and when not to use (for AR customers, directing to mercury_list_customers), with clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_statementsA
Read-only

List monthly statements for a Mercury deposit account. Each statement has a downloadable PDF URL.

USE WHEN: fetching the URL of a past statement (e.g. for accounting export, audit, or sharing with a CPA). The PDF URL is short-lived — re-fetch it shortly before download.

DO NOT USE: for IO Credit card statements (use mercury_list_credit_statements, which calls the v2 endpoint — this v1 path answers 404 for credit accounts). For Treasury statements use mercury_list_treasury_statements.

RETURNS: { page, statements: [{ id, startDate, endDate, endingBalance, downloadUrl, accountNumber, routingNumber, transactions, ... }] }.

NameRequiredDescriptionDefault
endNoFilter statements to this date (YYYY-MM-DD)
startNoFilter statements from this date (YYYY-MM-DD)
accountIdYesThe Mercury account ID

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover read-only/open-world, but the description adds critical time-sensitive behavior: PDF URL is short-lived and must be re-fetched before download. Also explains the v1/v2 endpoint failure mode.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with USE WHEN, DO NOT USE, RETURNS sections; every sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, alternatives, critical failure routing, return shape, and URL lifetime. Complete for the 3-param tool despite no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description doesn't explain start/end semantics beyond schema, but it names the account scope and implies accountId requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specifies verb (List), resource (monthly statements), and scope (Mercury deposit account). Explicitly distinguishes deposit statements from credit and treasury statements.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN examples and DO NOT USE routing to the two sibling alternatives with a reason (v1 404 for credit).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_transactionsA
Read-only

List transactions for a Mercury deposit account, with optional filters (date range, status, search).

USE WHEN: auditing deposit-account activity, reconciling a statement, or building a per-account ledger view. Filters server-side: status, start, end, search, limit, offset.

⚠️ Omitting start does NOT mean "all history". Mercury silently returns only a recent window — roughly the last month — with nothing in the response to say it truncated. Observed on a real account: 60 transactions without start, 391 for the same account with start set. Always pass start when auditing a period, and page with offset until a call returns fewer than limit rows.

DO NOT USE: for IO Credit transactions (use mercury_list_credit_transactions, which targets the IO Credit account surface). For Treasury, use mercury_list_treasury_transactions.

RETURNS (default detail: "compact"): { transactions: [{ id, amount, status, kind, postedAt, counterpartyName, categoryName, hasAttachment, ... }] }. hasAttachment is always present, true or false — it answers "which transactions are still missing a receipt". Receipt URLs are never returned here (a pre-signed S3 URL is ~2.4 kB and is a 12-hour bearer credential); get one deliberately via mercury_get_transaction_attachment. Pass detail: "full" for every Mercury field.

NameRequiredDescriptionDefault
endNoFilter posted on/before this date (YYYY-MM-DD)
limitNoMax results to return (1-500). Default: 500
startNoFilter posted on/after this date (YYYY-MM-DD)
detailNoPayload shape. "compact" (default) projects to identifying fields and reports receipts as a boolean. "full" returns every Mercury field — attachment URLs are stripped in both modes.
offsetNoPagination offset
searchNoSearch query (counterparty name, memo, etc.)
statusNoFilter by transaction status
accountIdYesThe Mercury account ID

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses that omitting `start` silently truncates to a recent window with no response signal, gives a concrete observed 60-vs-391 data point, prescribes offset paging until a short page, and explains that attachment URLs are deliberately stripped because they are 12-hour bearer credentials. That is exactly the kind of hidden behavior annotations cannot convey. It stops short of 5 only because it does not state auth/permission requirements or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then clearly sectioned USE WHEN / warning / DO NOT USE / RETURNS. Every sentence carries operational weight — the truncation warning, sibling redirects, and receipt-URL rationale all change agent behavior; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by sketching the compact response shape and confirming `hasAttachment` is always present, plus where receipt URLs must be fetched instead. Adequate for an 8-parameter read tool; only minor gaps remain (error behavior, exact default window boundary).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds semantics the schema lacks: the trap that `start` is effectively required for a bounded audit, that `offset` must be used to page past `limit`, which filters run server-side, and what `detail: "compact"` vs `"full"` actually changes in the payload. This materially changes how the parameters must be set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list transactions for a Mercury deposit account) and immediately names the account surface it covers. It explicitly disambiguates from the two nearest siblings, mercury_list_credit_transactions and mercury_list_treasury_transactions, so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit USE WHEN scenarios (auditing, reconciliation, ledger view) and an explicit DO NOT USE section naming the alternative tools for the cases it does not cover. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_treasury_statementsA
Read-only

List monthly statements for a Mercury Treasury account.

USE WHEN: fetching the URL of a past Treasury statement for tax/audit export. PDF URL is short-lived — fetch it shortly before download.

DO NOT USE: for deposit-account statements (use mercury_list_statements). For IO Credit card statements use mercury_list_credit_statements.

RETURNS: { statements: [{ id, periodStart, periodEnd, downloadUrl, ... }] }.

NameRequiredDescriptionDefault
accountIdYesTreasury account ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond them: the PDF downloadUrl is short-lived and must be fetched shortly before download. It does not mention ordering, pagination, or how far back statements go, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by labeled USE WHEN / DO NOT USE / RETURNS blocks, each carrying distinct information. There is no filler or repetition of the schema, and the time-sensitivity caveat sits next to the use case it affects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the definition supplies everything needed: intent, exclusions, the known failure mode (expired URL), and an inline sketch of the return shape. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100% with the field documented as 'Treasury account ID', so the schema already carries the semantics. The description's phrase 'for a Mercury Treasury account' merely echoes that; no format or source-of-ID guidance is added. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List monthly statements for a Mercury Treasury account') and immediately scopes it to Treasury, which separates it from the deposit-account and credit-card statement siblings. An agent can classify this tool from the first sentence alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN clause names the concrete intent (fetching a past statement URL for tax/audit export), and the DO NOT USE clause routes to the two named alternatives, `mercury_list_statements` and `mercury_list_credit_statements`. No inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_treasury_transactionsA
Read-only

List transactions for a Mercury Treasury account (sweeps, dividend accruals, etc.).

USE WHEN: auditing Treasury cash flows, reconciling yield accruals, or building a Treasury-only ledger view.

DO NOT USE: for deposit-account transactions (use mercury_list_transactions). For IO Credit transactions, use mercury_list_credit_transactions.

⚠️ This endpoint has no date filter. Unlike mercury_list_transactions, Treasury accepts only limit, order and cursor — there is no start/end. To audit a period, page through the transactions and filter on canonicalDay (the Treasury row date, YYYY-MM-DD) yourself.

⚠️ Pagination is cursor-based, not offset-based. Pass the top-level cursor of the response as the cursor of the next call, and stop when it is null or absent — a short page is not the end signal. Passing an offset does nothing — Mercury ignores it and you silently re-read page 1.

RETURNS (default detail: "compact"): { transactions: [{ id, type, description, amount, balance, canonicalDay, security, details, ... }], cursor } — null fields omitted. Pass detail: "full" for every Mercury field (accountId, null fields).

NameRequiredDescriptionDefault
limitNoMax rows to return (default 100)
orderNoSort order on the transaction date. Defaults to "desc".
cursorNoPagination cursor: the top-level `cursor` of the previous response
detailNoPayload shape. "compact" (default) keeps the Treasury fields that identify, date and reconcile a row; "full" returns every Mercury field.
accountIdYesTreasury account ID

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only readOnlyHint/openWorldHint; the description adds non-obvious behavior the agent could not otherwise know: no start/end date filter exists, so period audits require client-side filtering on canonicalDay, and cursor pagination must be followed until null rather than inferred from a short page. It even warns that an offset argument is silently ignored and causes page-1 re-reads — precisely the kind of failure mode that prevents wrong calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled blocks (USE WHEN / DO NOT USE / warnings / RETURNS), and every section carries load-bearing information. Slightly verbose where the DO NOT USE routing and the 'use mercury_list_transactions instead' warning restate the same contrast, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates with an explicit RETURNS block naming the shape, the compact-vs-full distinction, and null-field omission. Combined with the date-filter and pagination caveats, an agent has everything needed to call and page this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds real semantics beyond the schema by specifying the pagination termination condition and the practical consequence of the missing date parameters. It stops short of 5 because it does not elaborate on `limit`/`order` or the `detail: "full"` field set beyond a one-liner.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('List transactions for a Mercury Treasury account') and names the row types (sweeps, dividend accruals) so the agent knows exactly what is returned. It also explicitly separates itself from mercury_list_transactions and mercury_list_credit_transactions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit USE WHEN block (auditing cash flows, reconciling yield accruals, Treasury-only ledger) and a DO NOT USE block that routes to the two competing siblings by name. The routing decision is fully determined without opening any other schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_list_webhooksA
Read-only

List all webhook endpoints configured for your Mercury workspace.

USE WHEN: enumerating registered webhook endpoints — for audit, finding a webhook ID before update/delete, or to confirm a delivery target is registered.

DO NOT USE: to inspect webhook delivery history (Mercury exposes that only via the dashboard, not the API).

RETURNS: { webhooks: [{ id, url, status, events, ... }] }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. Description adds context about the return structure and clarifies that webhook delivery history is not accessible via API, going beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise paragraphs with clear headings (USE WHEN, DO NOT USE, RETURNS). Every sentence is informative and necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameter-less tool with no output schema, the description fully covers purpose, usage, and return structure. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description does not need to elaborate. It adds value by specifying the return format, which compensates for the lack of an output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all webhook endpoints' with a specific verb and resource. It distinguishes this tool from siblings like get, create, delete, and update webhooks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Includes explicit 'USE WHEN' and 'DO NOT USE' sections, providing concrete scenarios (audit, finding ID before update/delete, etc.) and excluding delivery history, which only the dashboard provides.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_request_send_moneyA
DestructiveIdempotent

Request to send money — Mercury creates a pending approval request that a human must approve before any funds move. ALWAYS creates an approval request, regardless of workspace policy.

USE WHEN: submitting an outbound payment that should always wait for human sign-off — for safety, audit, or because workspace policy demands it. Pairs naturally with the "submit, then wait for approver" workflow.

DO NOT USE: when you intend to transfer between your own accounts (use mercury_create_internal_transfer — no external recipient). For payments that may execute immediately under workspace policy, use mercury_send_money (different surface).

SIDE EFFECTS: creates a pending approval request on Mercury — no money has moved at this point. A human approver must sign off in the Mercury web/mobile app. Once approved, Mercury executes the underlying ACH / wire / check. Idempotent via idempotencyKey — auto-generated if not passed; pass an explicit one to make retries safe. Audit log entry on Mercury for the request itself.

RETURNS: { id, status: "pendingApproval", amount, ... } — track via mercury_get_transaction once executed.

NameRequiredDescriptionDefault
noteNo
amountYesAmount in USD
accountIdYesSource Mercury account ID
recipientIdYesRecipient ID
externalMemoNo
paymentMethodYesPayment method
idempotencyKeyNoUnique key to prevent duplicate transfers. Auto-generated if omitted; pass an explicit one to make retries safe.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool always creates a pending approval request regardless of workspace policy, that no money moves until human approval, and that it is idempotent via idempotencyKey. This adds significant context beyond annotations (destructiveHint, idempotentHint, openWorldHint) and aligns with them without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (overview, USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS). Each sentence is informative and concise, with no redundant or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters and no output schema, the description provides complete context: it explains the approval workflow, idempotency mechanism, return shape, and references sibling tools. The description is sufficient for an agent to understand and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides descriptions for 5 of 7 parameters (71% coverage). The description adds only a note about idempotencyKey auto-generation and retries, which is already covered in the schema. No additional parameter details are provided, so the description does not significantly enhance understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is for 'Request to send money' and emphasizes it creates a pending approval request. It distinguishes from sibling tools like mercury_send_money (immediate execution) and mercury_create_internal_transfer (internal transfers), making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use (submitting outbound payments that always wait for human sign-off) and when not to use (internal transfers or immediate payments), and names the alternative tools. This provides clear guidance for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_send_moneyA
DestructiveIdempotent

Send money from a Mercury account to an external recipient via ACH, wire, or check. REAL FUNDS LEAVE YOUR ACCOUNT.

USE WHEN: paying a vendor / contractor / counterparty whose recipientId already exists. ALWAYS confirm amount, recipient name, and payment method with the user before calling — the action is high-impact and largely irreversible (wires especially).

DO NOT USE: to move money between your own Mercury accounts (use mercury_create_internal_transfer). To submit a payment that ALWAYS requires human approval regardless of workspace policy, use mercury_request_send_money instead.

SIDE EFFECTS: moves real money out of the account. Whether the payment executes immediately or queues for approval depends entirely on your Mercury workspace's approval policy (Settings → Approvals on app.mercury.com) — the MCP cannot enforce this; Mercury does. On a $0-threshold workspace every send waits for sign-off; on a permissive workspace small payments may settle without re-prompting. Wires are usually irreversible once executed. Idempotent via idempotencyKey — auto-generated if not passed; pass an explicit one to make retries safe. Audit log entry on Mercury.

RETURNS: { id, status, amount, ... }. status reflects either immediate execution or pending-approval state, depending on workspace policy.

NameRequiredDescriptionDefault
noteNoInternal note
amountYesAmount in USD (e.g. 100.50)
accountIdYesSource Mercury account ID
recipientIdYesRecipient ID (must already exist)
externalMemoNoMemo visible to recipient
paymentMethodYesPayment method
idempotencyKeyNoUnique key to prevent duplicate transfers. Auto-generated if omitted; pass an explicit one to make retries safe.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses real money movement, irreversibility of wires, dependence on workspace approval policy, idempotency via idempotencyKey, and audit logging. Aligns with annotations (destructiveHint, idempotentHint) and adds significant context beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bold headings and front-loaded purpose. While comprehensive, a few sentences could be tightened, but no extraneous information. Earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description adequately explains return values and status. Covers side effects, approval policies, and practical usage constraints. Fully sufficient for a high-impact financial transaction tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for all 7 parameters. The description adds minor context (e.g., idempotencyKey auto-generation) but does not significantly extend beyond the schema. Baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Send money from a Mercury account to an external recipient via ACH, wire, or check', providing a specific verb and resource. It also distinguishes from siblings by naming alternatives for internal transfers and always-review payments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear guidance on when to use (paying an existing recipient) and when not to (internal transfers, always-review payments) with named alternatives. Explicitly advises confirming details with the user before calling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_update_customerA

Update an existing Accounts Receivable customer. Pass only the fields you want to change.

USE WHEN: amending a customer's contact details (name, email, billing address) after creation. Existing invoices are not retroactively modified.

DO NOT USE: to delete a customer (use mercury_delete_customer). To change the customer of an existing invoice, cancel + recreate the invoice.

SIDE EFFECTS: writes the new customer record to Mercury. Persistent. Only the fields you pass are changed — omitted fields keep their current value.

RETURNS: { id, name, email, address, ... } — the updated customer.

NameRequiredDescriptionDefault
nameNo
emailNo
addressNoCustomer billing address (Mercury requires `name` in the address)
customerIdYesCustomer ID

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=false and openWorldHint=true, so the description carries the real burden and does: it discloses that the write is persistent, that omitted fields retain current values, and that existing invoices are not retroactively modified. Those are precisely the non-obvious mutation semantics an agent needs and go well beyond the annotation set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four labeled blocks (statement, USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS), each one or two sentences, with the core action front-loaded. No sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description supplies the return shape ({ id, name, email, address, ... }), adds mutation/persistence semantics, and covers sibling routing. For a 4-parameter nested-object update tool, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, so the description must compensate, and it partly does: it names the updatable surface (name, email, billing address) and the critical partial-update rule that only passed fields change. It does not explain the required customerId or the nested address requirements, but the schema's own nested descriptions cover country code and recipient name, so the gap is modest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an existing Accounts Receivable customer') and immediately scopes it with 'Pass only the fields you want to change.' It also names the sibling it is not (mercury_delete_customer) and rules out the invoice-change interpretation, so an agent can distinguish it from create/delete/update_invoice without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit USE WHEN block names the amendment scenarios (contact details, billing address) and an explicit DO NOT USE block routes deletes to mercury_delete_customer and invoice reassignment to cancel + recreate. When-to-use, when-not, and alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_update_invoiceA

Update an existing invoice. Pass only the fields you want to change.

USE WHEN: amending an outstanding invoice (line items, due date, memo, PO number) before the customer pays. The MCP fetches the current invoice and merges your changes before submitting — Mercury's update endpoint requires the full payload despite the API docs implying PATCH.

DO NOT USE: to cancel an invoice (use mercury_cancel_invoice). To change the customer or the destination account, cancel + recreate. Once an invoice is paid, updates are likely rejected by Mercury — fetch first to confirm status.

SIDE EFFECTS: overwrites the invoice on Mercury's side. The customer-facing payment URL stays the same. If the invoice was already emailed, the customer is NOT re-notified of the change — communicate the change out-of-band if needed.

RETURNS: { id, status, amount, ... } — the updated invoice.

NameRequiredDescriptionDefault
dueDateNoDue date (YYYY-MM-DD)
ccEmailsNo
poNumberNo
invoiceIdYesInvoice ID
lineItemsNo
payerMemoNo
invoiceDateNoInvoice date (YYYY-MM-DD)
internalNoteNo
invoiceNumberNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations (destructiveHint=false, openWorldHint=true) by disclosing the hidden full-payload/merge behavior, that the customer-facing payment URL is unchanged, and critically that the customer is NOT re-notified after an emailed invoice is amended. Overwrite here is field-scoped merging, so it does not contradict destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Labeled sections (USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS) with the core behavior front-loaded in the first sentence. Length is justified because each block delivers a distinct, actionable fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, it sketches the return shape ({ id, status, amount, ... }) and covers the mutation lifecycle concerns an agent needs: merge behavior, irreversibility of paid-invoice edits, and the absent customer notification. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 33% schema description coverage, the description compensates by enumerating the commonly-changed fields (line items, due date, memo, PO number) and by making the partial-update contract explicit, which is the key semantic for this tool. A few parameters (ccEmails, invoiceNumber, internalNote, invoiceDate) still get no meaning from either source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update an existing invoice") and immediately clarifies partial-update semantics with "Pass only the fields you want to change." It is unmistakably distinct from mercury_create_invoice, mercury_cancel_invoice and mercury_get_invoice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN condition (amending an outstanding invoice before payment) and DO NOT USE block that routes to mercury_cancel_invoice for cancellation and to cancel+recreate for customer/destination changes. It even names a precondition check (fetch first to confirm status) for paid invoices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_update_recipientA

Update an existing payment recipient (legal name, nickname, contact emails, default payment method).

USE WHEN: amending a recipient's contact info or default payment method after creation. Useful for re-routing future payments to a recipient via a different method (e.g. ACH → wire) without recreating it.

DO NOT USE: to change the bank account number / routing number — that requires a fresh recipient (security policy on Mercury's side). Use mercury_add_recipient for the new banking info.

SIDE EFFECTS: writes the recipient record on Mercury. Persistent. Only the fields you pass are changed. Mercury endpoint is POST /recipient/{id} (SINGULAR — not the plural /recipients/{id}).

RETURNS: { id, name, nickname, defaultPaymentMethod, ... } — the updated recipient.

NameRequiredDescriptionDefault
nameNoRecipient legal name
emailsNoList of email addresses
nicknameNoInternal nickname
recipientIdYesThe recipient ID
contactEmailNoPrimary contact email
defaultPaymentMethodNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover destructiveHint=false and openWorldHint=true; the description adds the persistence of the write, the partial-patch semantics ('only the fields you pass are changed'), and a Mercury-side security constraint that forces recreation for banking changes. The singular-vs-plural endpoint warning is an unusual but real implementation gotcha worth disclosing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Labeled sections (USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS) with the purpose statement front-loaded. No filler; each block carries decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates with an explicit RETURNS shape. Together with the side-effect and exclusion notes, an agent has everything needed to call this correctly for a 6-parameter mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the schema already documents most parameters and the baseline is 3. The description adds the meaningful semantic that this is a partial update — unspecified fields are left untouched — which changes how an agent should populate the optional params, plus the intent behind defaultPaymentMethod changes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (update an existing payment recipient) and immediately enumerates the mutable fields. The DO NOT USE section names mercury_add_recipient, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN, DO NOT USE, and named alternative routing: changing bank/routing numbers must go through mercury_add_recipient. The motivating example (ACH → wire re-routing without recreating) makes the selection condition concrete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_update_transactionA

Update a transaction's internal note or category (no money movement).

USE WHEN: tagging a transaction with a category for bookkeeping, or attaching an internal memo. Send null to clear a field, omit the key to keep the current value.

DO NOT USE: to change the amount, counterparty, or status — those are immutable post-execution. Mercury endpoint is PATCH /transaction/{id} (no accountId in the path).

SIDE EFFECTS: overwrites the note / category on Mercury's side. Persistent. Audit log on Mercury records the change. No effect on the booked transaction itself or on the counterparty.

RETURNS: { id, note, categoryId, ... } — the updated transaction, with attachment URLs stripped (use mercury_get_transaction_attachment for a download URL).

NameRequiredDescriptionDefault
noteNoInternal note (send null to clear, omit to keep current)
categoryIdNoCategory ID (UUID, see mercury_list_categories). Send null to clear, omit to keep current.
transactionIdYesThe transaction ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover destructiveHint=false and openWorldHint=true, so the description adds substantial value: persistent overwrite on Mercury's side, audit-log recording, no effect on the booked transaction or counterparty. Missing rate-limit/auth notes, but the mutation semantics are well disclosed and consistent with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Labeled sections (USE WHEN / DO NOT USE / SIDE EFFECTS / RETURNS) with the core purpose front-loaded. Every sentence carries information an agent would otherwise have to guess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape, the attachment-URL stripping caveat with a pointer to the right sibling, the underlying endpoint, and immutability constraints. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every parameter's description already documents the null-vs-omit semantics, so the description's 'Send `null` to clear a field, omit the key to keep the current value' largely restates structured data. It adds marginal framing but no new syntax or constraints beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a transaction's internal note or category') and immediately bounds the scope with '(no money movement)'. This cleanly distinguishes it from amount/counterparty/status mutations the agent might otherwise attempt.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN and DO NOT USE sections, including the alternative path for attachment downloads ('use mercury_get_transaction_attachment'). The exclusion of amount/counterparty/status changes is exactly the disambiguation an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mercury_update_webhookA

Update an existing webhook endpoint (URL, status, or subscribed events).

USE WHEN: rotating a webhook's destination URL, changing the event subscription, or reactivating a webhook Mercury auto-disabled after consecutive delivery failures (set status: "active").

DO NOT USE: to inspect delivery history. Same SSRF / non-HTTPS URL guard as mercury_create_webhook applies to the new URL.

SIDE EFFECTS: overwrites the webhook record. Persistent. If status flips to active, Mercury resumes delivery on the next matching event. The new URL takes effect immediately for future events.

RETURNS: { id, url, status, events, ... } — the updated webhook.

NameRequiredDescriptionDefault
urlNoNew publicly reachable HTTPS URL (same rules as mercury_create_webhook).
statusNoWebhook status
webhookIdYesThe webhook endpoint ID
eventTypesNoEvent types to subscribe to. Common values: - transaction.created / transaction.updated - transaction.posted / transaction.pending / transaction.failed - invoice.created / invoice.sent / invoice.paid / invoice.overdue / invoice.cancelled - customer.created / customer.updated - recipient.created / recipient.updated Check https://docs.mercury.com/reference/webhooks for the full list.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses side effects: overwrites the webhook record, persistent changes, immediate effect of new URL, and resumption of delivery if status becomes active. This adds detail beyond the annotations (destructiveHint=false, openWorldHint=true), which only hint at safety and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using structured labels (USE WHEN, DO NOT USE, SIDE EFFECTS, RETURNS) to organize information efficiently. No superfluous sentences; each section adds clear value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explicitly states the return format as '{ id, url, status, events, ... }'. It covers all relevant aspects for an agent to use the tool correctly: when to use, side effects, parameter semantics, and return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters have descriptions in the schema (100% coverage), and the description adds value by providing concrete examples for eventTypes, clarifying status effects (reactivation), and reiterating security rules for url. This goes beyond the schema's basic type/format info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Update an existing webhook endpoint (URL, status, or subscribed events)', using a clear verb+resource structure. It distinguishes itself from sibling tools like mercury_create_webhook and mercury_delete_webhook by focusing on updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'USE WHEN' and 'DO NOT USE' sections, providing explicit guidance on appropriate contexts (e.g., rotating URL, reactivating after failures) and exclusions (e.g., inspecting delivery history). It also references sibling behavior for SSRF guard.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.20.3
    • Changedmercury_add_recipient1 field changed
      • changedInput schema / properties / emails / items / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedmercury_create_customer1 field changed
      • changedInput schema / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedmercury_create_invoice1 field changed
      • changedInput schema / properties / ccEmails / items / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Addedmercury_get_invoice_pdf
    • Addedmercury_get_transaction_attachment
    • Addedmercury_list_credit_statements
    • Changedmercury_list_credit_transactions1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Payload shape. \"compact\" (default) projects to identifying fields and reports receipts as a boolean. \"full\" returns every Mercury field — attachment URLs are stripped in both modes.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedmercury_list_transactions1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Payload shape. \"compact\" (default) projects to identifying fields and reports receipts as a boolean. \"full\" returns every Mercury field — attachment URLs are stripped in both modes.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedmercury_list_treasury_transactions8 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Pagination cursor: the top-level `cursor` of the previous response",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Payload shape. \"compact\" (default) keeps the Treasury fields that identify, date and reconcile a row; \"full\" returns every Mercury field.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / end
        Removed value: -{
        -  "description": "Filter before this date (YYYY-MM-DD)",
        -  "format": "date",
        -  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        -  "type": "string"
        -}
      • addedInput schema / properties / limit / description
        Added value: +"Max rows to return (default 100)"
      • changedInput schema / properties / limit / maximum
        Previous value: -500New value: +1000
      • removedInput schema / properties / offset
        Removed value: -{
        -  "maximum": 9007199254740991,
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • addedInput schema / properties / order
        Added value: +{
        +  "description": "Sort order on the transaction date. Defaults to \"desc\".",
        +  "enum": [
        +    "asc",
        +    "desc"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / start
        Removed value: -{
        -  "description": "Filter after this date (YYYY-MM-DD)",
        -  "format": "date",
        -  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        -  "type": "string"
        -}
    • Changedmercury_update_customer1 field changed
      • changedInput schema / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedmercury_update_invoice1 field changed
      • changedInput schema / properties / ccEmails / items / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedmercury_update_recipient2 fields changed
      • changedInput schema / properties / contactEmail / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • changedInput schema / properties / emails / items / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedmercury_update_transaction2 fields changed
      • removedInput schema / properties / note / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / note / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  2. 36 tool updatesv0.15.6
    • Addedmercury_add_recipient
    • Addedmercury_cancel_invoice
    • Addedmercury_create_customer
    • Addedmercury_create_internal_transfer
    • Addedmercury_create_invoice
    • Addedmercury_create_webhook
    • Addedmercury_delete_customer
    • Addedmercury_delete_webhook
    • Addedmercury_get_account
    • Addedmercury_get_customer
    • Addedmercury_get_invoice
    • Addedmercury_get_organization
    • Addedmercury_get_transaction
    • Addedmercury_get_treasury
    • Addedmercury_get_webhook
    • Addedmercury_list_accounts
    • Addedmercury_list_cards
    • Addedmercury_list_categories
    • Addedmercury_list_credit_accounts
    • Addedmercury_list_credit_transactions
    • Addedmercury_list_customers
    • Addedmercury_list_invoice_attachments
    • Addedmercury_list_invoices
    • Addedmercury_list_recipients
    • Addedmercury_list_statements
    • Addedmercury_list_transactions
    • Addedmercury_list_treasury_statements
    • Addedmercury_list_treasury_transactions
    • Addedmercury_list_webhooks
    • Addedmercury_request_send_money
    • Addedmercury_send_money
    • Addedmercury_update_customer
    • Addedmercury_update_invoice
    • Addedmercury_update_recipient
    • Addedmercury_update_transaction
    • Addedmercury_update_webhook
  3. 36 tool updatesv0.15.5
    • Removedmercury_add_recipient
    • Removedmercury_cancel_invoice
    • Removedmercury_create_customer
    • Removedmercury_create_internal_transfer
    • Removedmercury_create_invoice
    • Removedmercury_create_webhook
    • Removedmercury_delete_customer
    • Removedmercury_delete_webhook
    • Removedmercury_get_account
    • Removedmercury_get_customer
    • Removedmercury_get_invoice
    • Removedmercury_get_organization
    • Removedmercury_get_transaction
    • Removedmercury_get_treasury
    • Removedmercury_get_webhook
    • Removedmercury_list_accounts
    • Removedmercury_list_cards
    • Removedmercury_list_categories
    • Removedmercury_list_credit_accounts
    • Removedmercury_list_credit_transactions
    • Removedmercury_list_customers
    • Removedmercury_list_invoice_attachments
    • Removedmercury_list_invoices
    • Removedmercury_list_recipients
    • Removedmercury_list_statements
    • Removedmercury_list_transactions
    • Removedmercury_list_treasury_statements
    • Removedmercury_list_treasury_transactions
    • Removedmercury_list_webhooks
    • Removedmercury_request_send_money
    • Removedmercury_send_money
    • Removedmercury_update_customer
    • Removedmercury_update_invoice
    • Removedmercury_update_recipient
    • Removedmercury_update_transaction
    • Removedmercury_update_webhook
  4. 36 tool updatesv0.15.4
    • Addedmercury_add_recipient
    • Addedmercury_cancel_invoice
    • Addedmercury_create_customer
    • Addedmercury_create_internal_transfer
    • Addedmercury_create_invoice
    • Addedmercury_create_webhook
    • Addedmercury_delete_customer
    • Addedmercury_delete_webhook
    • Addedmercury_get_account
    • Addedmercury_get_customer
    • Addedmercury_get_invoice
    • Addedmercury_get_organization
    • Addedmercury_get_transaction
    • Addedmercury_get_treasury
    • Addedmercury_get_webhook
    • Addedmercury_list_accounts
    • Addedmercury_list_cards
    • Addedmercury_list_categories
    • Addedmercury_list_credit_accounts
    • Addedmercury_list_credit_transactions
    • Addedmercury_list_customers
    • Addedmercury_list_invoice_attachments
    • Addedmercury_list_invoices
    • Addedmercury_list_recipients
    • Addedmercury_list_statements
    • Addedmercury_list_transactions
    • Addedmercury_list_treasury_statements
    • Addedmercury_list_treasury_transactions
    • Addedmercury_list_webhooks
    • Addedmercury_request_send_money
    • Addedmercury_send_money
    • Addedmercury_update_customer
    • Addedmercury_update_invoice
    • Addedmercury_update_recipient
    • Addedmercury_update_transaction
    • Addedmercury_update_webhook
  5. 36 tool updatesv0.15.2
    • Removedmercury_add_recipient
    • Removedmercury_cancel_invoice
    • Removedmercury_create_customer
    • Removedmercury_create_internal_transfer
    • Removedmercury_create_invoice
    • Removedmercury_create_webhook
    • Removedmercury_delete_customer
    • Removedmercury_delete_webhook
    • Removedmercury_get_account
    • Removedmercury_get_customer
    • Removedmercury_get_invoice
    • Removedmercury_get_organization
    • Removedmercury_get_transaction
    • Removedmercury_get_treasury
    • Removedmercury_get_webhook
    • Removedmercury_list_accounts
    • Removedmercury_list_cards
    • Removedmercury_list_categories
    • Removedmercury_list_credit_accounts
    • Removedmercury_list_credit_transactions
    • Removedmercury_list_customers
    • Removedmercury_list_invoice_attachments
    • Removedmercury_list_invoices
    • Removedmercury_list_recipients
    • Removedmercury_list_statements
    • Removedmercury_list_transactions
    • Removedmercury_list_treasury_statements
    • Removedmercury_list_treasury_transactions
    • Removedmercury_list_webhooks
    • Removedmercury_request_send_money
    • Removedmercury_send_money
    • Removedmercury_update_customer
    • Removedmercury_update_invoice
    • Removedmercury_update_recipient
    • Removedmercury_update_transaction
    • Removedmercury_update_webhook
  6. 36 tool updatesv0.12.0
    • Changedmercury_add_recipient1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_cancel_invoice1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_create_customer1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_create_internal_transfer1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_create_invoice1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_create_webhook1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_delete_customer1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_delete_webhook1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_account1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_customer1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_invoice1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_organization1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_transaction1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_treasury1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_get_webhook1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_accounts1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_cards1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_categories1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedmercury_list_credit_accounts
    • Addedmercury_list_credit_transactions
    • Changedmercury_list_customers1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_invoice_attachments1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_invoices1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_recipients1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_statements1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_transactions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_treasury_statements1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_treasury_transactions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_list_webhooks1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_request_send_money1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_send_money1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_update_customer1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_update_invoice1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_update_recipient1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_update_transaction1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedmercury_update_webhook1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  7. 34 tool updatesv0.9.1
    • First observedmercury_add_recipient
    • First observedmercury_cancel_invoice
    • First observedmercury_create_customer
    • First observedmercury_create_internal_transfer
    • First observedmercury_create_invoice
    • First observedmercury_create_webhook
    • First observedmercury_delete_customer
    • First observedmercury_delete_webhook
    • First observedmercury_get_account
    • First observedmercury_get_customer
    • First observedmercury_get_invoice
    • First observedmercury_get_organization
    • First observedmercury_get_transaction
    • First observedmercury_get_treasury
    • First observedmercury_get_webhook
    • First observedmercury_list_accounts
    • First observedmercury_list_cards
    • First observedmercury_list_categories
    • First observedmercury_list_customers
    • First observedmercury_list_invoice_attachments
    • First observedmercury_list_invoices
    • First observedmercury_list_recipients
    • First observedmercury_list_statements
    • First observedmercury_list_transactions
    • First observedmercury_list_treasury_statements
    • First observedmercury_list_treasury_transactions
    • First observedmercury_list_webhooks
    • First observedmercury_request_send_money
    • First observedmercury_send_money
    • First observedmercury_update_customer
    • First observedmercury_update_invoice
    • First observedmercury_update_recipient
    • First observedmercury_update_transaction
    • First observedmercury_update_webhook

TDQS

A4.3/5.0

Scored across 39 tools

Disambiguation4/5

The tool set is generally well separated by resource surface: deposit accounts, IO Credit accounts, Treasury, recipients, customers, invoices, statements, and webhooks each have dedicated tools. The many list/get pairs and three statement variants could be confused, but the descriptions consistently clarify boundaries with DO NOT USE notes. A few similar tools (e.g. mercury_list_transactions vs mercury_list_credit_transactions vs mercury_list_treasury_transactions) require careful reading but are distinguishable.

Naming Consistency4/5

Almost all tools use a consistent mercury_ prefix and snake_case verb_noun pattern. Minor deviations exist, such as mercury_add_recipient vs mercury_create_customer and mercury_request_send_money, but these are still readable and predictable. No chaotic mixing of camelCase or vague verbs.

Tool Count2/5

Thirty-nine tools is heavy for the apparent scope, even for a broad Mercury banking/invoicing surface. The set covers many distinct resources, but the sheer number of list/get/create/update/cancel/delete variants makes discovery and selection costly. A more consolidated or grouped surface would likely be easier to use.

Completeness4/5

Core workflows are well covered: accounts, transactions, statements, customers, invoices, recipients, webhooks, cards, categories, Treasury, and payments. There are some notable gaps, such as no recipient delete, no invoice attachment upload, and limited card lifecycle operations, but most are explicitly documented as API or MCP limitations. Agents can work around the remaining gaps for typical invoicing and banking tasks.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    A Model Context Protocol server implementation providing standardized access to Xero's accounting and business features, enabling operations like contact management, invoice creation, and chart of accounts management through MCP.
    51
    50,283 npm
    384
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to send real faxes through the FaxDrop API. Provides safeguards including rate limiting, dry-run mode, and audit logging for secure fax operations.
    3
    340 npm
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Simple MCP server that interfaces with the Mercury API, allowing you to talk to your Mercury banking data from any MCP client like Cursor or Claude Desktop.
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A custom MCP server for the Mercury banking API that uses personal API tokens to avoid session expiry. It provides 15 tools for managing accounts, transactions, recipients, treasury, and more.
    15
    MIT