Nano MCP Server
Provides tools for using the Nano (XNO) cryptocurrency network: read any account's balance, info, history and receivables, get the XNO price in USD with conversions, create unique-amount invoices payable to your own address with a nano: link and expiry, wait for or verify payment of an invoice (or any block by hash, address and amount), and — when explicitly enabled — send small amounts from a capped wallet with an allowlist, per-call/daily limits, exactly-once idempotency keys and a secure seed. Receiving requires no key and funds go straight to the configured address.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Nano MCP ServerCreate a $2.50 invoice and wait for it to be paid."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@nano133/mcp — a Nano (XNO) server for AI agents
An MCP server that gives an AI agent (Claude Desktop, Claude Code, Cursor, any MCP client) the tools to use Nano: read any account, price things in dollars, take payments with invoices it can check by itself, and — only if you turn it on — send small amounts from a capped wallet.
Nano has no fees and confirms in about a second, so an agent can pay or get paid a cent without waiting. The receive side is the nano133 Kit's Nano Checkout: the same unique-amount invoices and payment checks that run nano133.com.
Tools
Tool | Key | What it does |
| – | balance and receivable of an account |
| – | frontier, representative, block count, voting weight |
| – | latest sends and receives, with paging |
| – | sends waiting to be received |
| – | XNO in USD (median of public feeds), with conversion |
| – | an invoice in USD or XNO: an exact amount, a |
| – | waits up to 2 minutes for an invoice to be paid |
| – | checks an invoice, or any block by hash, address and amount |
| wallet | the send wallet's address, balance, limits and what is left today |
| wallet | sends XNO from the capped wallet, once per |
Related MCP server: AgentBTC MCP Server
Custody: who holds what
Receiving needs no key. Invoices only need your address (
NANO_PAY_TO). Payments go straight to your wallet; the server never holds them.Sending is off by default. It needs
NANO_SEND=on, a seed, caps, and a choice of whom it may pay: an allowlist, orNANO_SEND_ANY_ADDRESS=1on purpose.Use a separate, small wallet for sending, never your main one: create a new seed, put a few cents in it, and give the agent only that. Think of it as a prepaid card.
Caps, checked before every send:
Setting
Default
Hard ceiling
NANO_SEND_MAX_PER_CALL_XNO0.01
1
NANO_SEND_DAILY_CAP_XNO(rolling 24 hours)0.05
10
NANO_SEND_ALLOWLIST(comma-separated addresses)required, unless
NANO_SEND_ANY_ADDRESS=1–
The ceilings are in the code; a setting can lower them, never raise them. The daily cap counts both the journal on disk and the wallet's own sends on the ledger, so a restart, a deleted journal or another state folder does not reset it.
Exactly once. Every
nano_sendneeds anidempotency_key, one per payment. The send is written to the journal before it is published, and a retry with the same key never pays twice. While a send is signed but not yet on the ledger, the wallet makes no new send. The same amount to the same address under a new key within 10 minutes is refused unless the call saysallow_repeat.The node can't make it send more. Before it signs, the wallet checks the node's balance against the account's latest block and that block's signature. A wrong or lying node can stop a send, never enlarge or repeat one.
Fail closed. When the node doesn't answer, nothing is credited and nothing is sent.
The seed stays in the server. No tool returns it, it is never logged, and
NANO_WALLET_SEEDis removed from the environment once read.Several clients, one wallet. Servers that share a state folder (Claude Desktop and Claude Code, say) take turns: one send at a time, against one journal.
What the limits don't cover
The limits bind what the agent can do through this server's tools. They can't
bind an agent that runs commands or edits files as you: Claude Code, Cursor's
agent, Grok Build and other coding agents can, when you allow it, read
~/.nano-mcp/seed, change the server's settings in your MCP config, or edit the
server itself. Then they could spend the whole wallet.
So:
Keep the send wallet small. Its balance is the real limit: put in only what you would let the agent spend.
Keep the agent out of the state folder. In Claude Code, for example, add to
~/.claude/settings.json:{ "permissions": { "deny": ["Read(~/.nano-mcp/**)", "Edit(~/.nano-mcp/**)"] } }and read each shell command before you approve it (a deny rule for files does not stop
catin a shell).For full separation, run the server as another user account, which owns
~/.nano-mcp, so that the agent's account can't read it at all.
Add it to your agent
Build it once (npm install && npm run build in this folder), then add the server.
Claude Desktop (claude_desktop_config.json) or Cursor (.cursor/mcp.json):
{
"mcpServers": {
"nano": {
"command": "node",
"args": ["/path/to/nano133-mcp/dist/index.js"],
"env": {
"NANO_PAY_TO": "nano_your_receiving_address"
}
}
}
}Claude Code:
claude mcp add nano -e NANO_PAY_TO=nano_your_receiving_address -- node /path/to/nano133-mcp/dist/index.jsTo let the agent send, use a NEW, small wallet. Put its seed in a file that only you can read — in your own terminal, never in a chat with an AI:
mkdir -m 700 -p ~/.nano-mcp && pbpaste > ~/.nano-mcp/seed && chmod 600 ~/.nano-mcp/seed(pbpaste writes what you copied from your wallet app; on Linux, use your editor.)
Then add to the server entry:
"NANO_SEND": "on",
"NANO_WALLET_ADDRESS": "nano_your_send_wallet_address",
"NANO_SEND_MAX_PER_CALL_XNO": "0.01",
"NANO_SEND_DAILY_CAP_XNO": "0.05",
"NANO_SEND_ALLOWLIST": "nano_first_address_it_may_pay,nano_second_one",
"NANO_REPRESENTATIVE": "nano_a_representative_you_choose"The server finds the account under the seed (legacy hex seeds and 12/24-word
phrases, indexes 0–99) and sends only if it is exactly NANO_WALLET_ADDRESS.
Without NANO_SEND_ALLOWLIST, sending stays off and the server says why, unless you
set NANO_SEND_ANY_ADDRESS=1 to let the agent pay any address. The read-only tools work
either way.
A new wallet needs NANO_REPRESENTATIVE before it can receive its first payment: the
account that votes for its balance (it never holds the coins). Choose one from a public
list, such as nano.community/representatives.
A wallet that is already open keeps its representative.
Then ask the agent for nano_wallet: it shows the wallet's address to fund.
All settings
Setting | Default | What |
|
| the node for reads, checks and publishing; use your own node for real money |
|
| where proof of work comes from ( |
| – | the address invoices are paid to (no invoices without it) |
| 15 | how long an invoice is open |
| 60 | how long after that a late payment still counts |
|
| invoices and the send journal (keep it; servers that share it take turns) |
| off |
|
| – | the send wallet's address; the server refuses to send unless the seed gives exactly this address |
|
| a file that holds the seed (64 hex digits, or a 12/24-word phrase); it must be |
| – | the seed itself, instead of the file (the file is safer: it stays out of config files and logs) |
| 0.01 | the most one send may move (≤ 1) |
| 0.05 | the most all sends may move in 24 hours (≤ 10) |
| – | the only addresses the wallet may pay; sending stays off without it, unless |
| – |
|
| – | the representative a new wallet opens with (required before its first receive; a list); an open wallet keeps its own |
The public node at node.nano133.com allows these actions with per-IP limits.
For real money, point NANO_RPC_URL at a node you run.
How invoices work
nano_create_invoiceasks for the price plus a unique tail of 1–999,999 raw (millionths of a millionth of a cent), so one payment names one invoice.The payer sends exactly that amount to
NANO_PAY_TO(thenano:link fills it in).nano_wait_for_payment/nano_verify_paymentask the node for a confirmed send of exactly that amount, first seen while the invoice was open (or in its grace). An older payment of the same amount never counts, and one payment pays one invoice.
Develop
npm test # the tools on a mock ledger: no network, no money
npm run lint
npm run build
npm run demo -- nano_your_address # a real MCP client, live network, reads onlyRelease
A tag v<version> (the version in package.json) runs .github/workflows/release.yml:
npm ci, typecheck, lint, tests, build, a check that the package holds only dist/,
the README and the license, then npm publish with provenance. It needs the
NPM_TOKEN repository secret, a public repository, and no "private": true.
MIT. From nano133.com and the nano133 Kit.
Available Tools
10 toolsnano_account_infoAccount infoB
An account's frontier (latest block), representative, block count, balance and when it opened. An account that never received anything is 'not opened'.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | a Nano address (nano_…) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the returned fields and the 'not opened' edge case, but says nothing about permissions, error behavior, or that the operation is read-only, leaving meaningful gaps for an agent relying on the description alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences are appropriately sized and front-loaded with the returned data before the edge case. The first sentence is a dense list but avoids waste and stays under the attention budget.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description does the important work of listing the returned fields and noting the 'not opened' condition. It remains somewhat incomplete because it never clarifies when to prefer this aggregate info over the more focused sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single account parameter is already documented in the schema as a Nano address. The description adds no syntax, formatting, or constraint details beyond what the schema provides, so it meets the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (an account) and enumerates the specific data returned: frontier, representative, block count, balance, and open time. It is easy to tell what the tool does, but it does not explicitly differentiate itself from siblings like nano_balance or nano_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as nano_balance, nano_history, or nano_receivable. The note about 'not opened' accounts describes an edge case but does not help an agent choose this tool over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_balanceBalanceB
An account's confirmed balance and what waits for it to receive, in XNO and raw.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | a Nano address (nano_…) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the return semantics (confirmed vs pending, XNO vs raw), which is real context beyond the schema, but says nothing about whether the call is read-only, whether an unopened/unfunded account errors, auth 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the core noun (confirmed balance) and finishing with the units. Nothing is wasted, though the phrasing 'what waits for it to receive' is slightly indirect where 'receivable' would be crisper.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is the only signal about return values, and it gives only a high-level hint (XNO and raw, confirmed and pending) without indicating structure or field names. For a simple single-parameter read that is borderline adequate, but the no-annotation, no-output-schema combination leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is fully documented in the schema (100% coverage) as a nano_ address, so the schema does the heavy lifting. The description adds no format, validation, or example information beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource precisely: an account's confirmed balance plus the amount pending receipt, returned in both XNO and raw units. It is clearly distinguishable from sibling reads like nano_history or nano_account_info, though it never explicitly names or contrasts with nano_receivable, which covers overlapping pending-funds ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives. An agent cannot tell from the description whether to use nano_balance or nano_receivable to check incoming funds, even though the tools clearly overlap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_create_invoiceCreate an invoiceB
An invoice for a price in USD or XNO, paid to the configured address (NANO_PAY_TO). It asks for an exact amount: the price plus a few raw that identify this invoice. Show the payer the exact amount and the nano: link. No key is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| memo | No | what it is for | |
| minutes | No | how long it stays open (default 15) | |
| amount_usd | No | ||
| amount_xno | No | an amount in XNO as a decimal string, like "0.01" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real value: it discloses that no key is needed (auth-free), that the amount is price plus identifying raws, and that it targets a configured NANO_PAY_TO address. It omits key behaviors such as what happens if both amount_usd and amount_xno are supplied, and how expiry (minutes) affects the invoice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded on the core concept, with no filler. Slight redundancy in restating 'the price plus a few raw' in prose after already framing the amount, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with no annotations and no output schema, the description orients the agent well (exact amount, nano: link to show the payer, keyless operation) but leaves the amount-parameter exclusivity and the expiry semantics unexplained, which an invoking agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3. The description explains the USD/XNO price concept that backs amount_usd and amount_xno, but says nothing about memo or the minutes expiry window, leaving its addition over the schema minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and its economics precisely (an invoice for a price in USD or XNO paid to NANO_PAY_TO), which distinguishes it from siblings like nano_wait_for_payment and nano_verify_payment. It never uses an explicit verb such as 'create', opening with a noun phrase, so it falls just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to create an invoice versus when to use nano_verify_payment or nano_wait_for_payment, nor any prerequisite context. The usage is only inferable from the payment-flow sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_historyHistoryA
An account's latest sends and receives, newest first. Use before (a block hash) to page back.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| before | No | start from this block (the last hash of a previous page) | |
| account | Yes | a Nano address (nano_…) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses ordering (newest first) and the pagination mechanism, but omits whether this is strictly read-only (implied), rate-limit behavior, the default page size of 10, and what happens when `before` points to an unknown block. Adequate but incomplete for a node-backed query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and ordering, then the paging rule. Nothing is wasted and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the agent is left guessing the shape of returned entries (hashes, amounts, counterparties) and whether results are limited to confirmed blocks. For a 3-parameter listing tool this is adequate but leaves real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: `before` and `account` are already documented in the schema, while `count` has only type/default/bounds. The description reinforces the paging semantics of `before` as a block hash but adds no new format or validation meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource precisely ('an account's latest sends and receives') and its ordering ('newest first'), which is more than a restatement of the name 'History'. It does not explicitly contrast with siblings like nano_balance or nano_receivable, but the scope is clear enough that an agent can distinguish a transaction listing from a balance or receivable lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one conditional usage rule — use `before` to page back — which is genuinely actionable. However, it never says when to choose this tool over nano_account_info or nano_receivable, nor any precondition (e.g., account must exist). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_rateXNO priceA
XNO in US dollars (the median of public price feeds). Give amount_usd or amount_xno to convert.
| Name | Required | Description | Default |
|---|---|---|---|
| amount_usd | No | ||
| amount_xno | No | an amount in XNO as a decimal string, like "0.01" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the data source ("the median of public price feeds"), signaling an aggregated rather than exchange-specific rate, but omits auth needs, rate limits, and what the response contains for a query with no amount.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and followed by the invocation hint; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should ideally describe the returned shape (rate alone vs. converted amount) and the no-parameter default behavior. It covers the core purpose but stops short of the completeness an annotation-free, output-schema-free tool needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only amount_xno is described in the schema), and the description compensates partially by framing the two parameters as an either/or conversion input. It does not explain what happens when both or neither are supplied, nor that both are optional, leaving a real gap for a 2-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (XNO price in US dollars) and a conversion capability, which is unambiguous and clearly distinct from the wallet/payment siblings. It does not name any sibling, but none of them overlap, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Give amount_usd or amount_xno to convert" implies how to invoke it for conversion, but says nothing about when to call it with neither parameter (plain price lookup) or whether the two parameters are mutually exclusive. No alternatives exist among siblings, so there is no when-not guidance to give, but the invocation contract is left partly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_receivableReceivableB
Sends waiting for an account to receive them (largest first), with sender and amount.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| account | Yes | a Nano address (nano_…) | |
| min_xno | No | an amount in XNO as a decimal string, like "0.01" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully states that results are ordered largest first and include sender and amount, but it omits pagination behavior, the count limit, read-only safety context, and any authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no filler. It is front-loaded with the core pending-receivable concept, though the phrasing 'Sends waiting' is slightly awkward.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter list tool with no output schema and no annotations, the description provides only partial context. It covers the core return content but omits pagination details, count limits, and filter behavior, leaving an agent with open questions about invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with account and min_xno described in the schema but count left undocumented. The description adds ordering context but does not explain count, pagination, or how min_xno filters results, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys that this tool returns pending sends awaiting receipt by an account, with ordering and included fields. The verb is implicit rather than explicit, and it does not directly distinguish itself from siblings such as nano_history or nano_wait_for_payment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like nano_history, nano_wait_for_payment, or nano_verify_payment. The agent must infer the use case from the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_sendSend XNOADestructiveIdempotent
Sends real XNO from the scoped wallet. It first receives what waits, then checks the per-send limit, the 24-hour cap and the allowlist, and sends once. Make a new idempotency_key for each payment and give the same one when you retry it: a retry then never pays twice. Confirm amount and address with the user before you send.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | a Nano address (nano_…) | |
| amount_xno | Yes | an amount in XNO as a decimal string, like "0.01" | |
| allow_repeat | No | only when the user wants to pay the same amount to the same address again within 10 minutes | |
| idempotency_key | Yes | one key per payment, reused on every retry of it (for example an order id) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that the tool first sweeps in pending receivable funds, then enforces a per-send limit, a 24-hour cap and an allowlist before sending exactly once. It also explains retry safety semantics ('a retry then never pays twice') and demands user confirmation, which is exactly the risk context an agent needs for a destructiveHint=true, openWorldHint=true money-movement tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool does and the funds-moving risk, then the internal checks, then the idempotency and confirmation rules. No filler, and each sentence carries a distinct operational requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers what matters: real funds move, what internal validation happens, the retry contract, and the required user-confirmation step. Combined with 100% schema coverage and the annotations, an agent has everything needed to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so 'to', 'amount_xno', 'allow_repeat' and 'idempotency_key' are already documented at the field level, which sets the baseline at 3. The description adds the payment-lifecycle meaning of the idempotency key (new per payment, reused on retry, never double-pays), but that largely restates the schema's own wording and says nothing extra about amount format or allow_repeat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sends real XNO from the scoped wallet') and immediately scopes it to the wallet the agent is operating on, which separates it from read-only siblings like nano_balance, nano_receivable and nano_history. An agent can tell this is the actual payment-execution tool, not the invoice or verification tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: pre-checks run automatically, a fresh idempotency_key per payment with reuse on retry, and an explicit instruction to confirm amount and address with the user before sending. It never names an alternative sibling (e.g. nano_create_invoice for requesting payment, nano_verify_payment for checking one), so the when-not-to-use side 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.
nano_verify_paymentVerify a paymentB
Either checks an invoice (invoice_id, optionally the payer's block hash), or checks any block: a confirmed send of exactly amount to to, first seen after since. States: paid, pending (not confirmed), waiting, expired, wrong (not that payment), invalid, used (already paid another invoice), unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | a Nano address (nano_…) | |
| hash | No | ||
| since | No | ISO time; the send must have been first seen after it (default: any time) | |
| amount_raw | No | ||
| amount_xno | No | an amount in XNO as a decimal string, like "0.01" | |
| invoice_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real value by enumerating the possible result states (paid, pending, waiting, expired, wrong, invalid, used, unknown), which tells the agent this is a non-mutating status probe. However, it omits whether the call is read-only, whether it requires an API key, and whether 'since' matters for invoice mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The two-mode structure is front-loaded and dense, with the state enumeration appended efficiently. Every clause carries information, though the single run-on sentence merging mode explanation and parameter listing is slightly hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no annotations and no output schema, the description does the core job of explaining both modes and the possible return states. But it leaves required/optional behavior (0 required params is surprising and unexplained) and the amount_raw vs amount_xno choice unresolved, so an agent could still call it incorrectly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%; the description usefully explains hash as the payer's block hash, ties to/amount/since together in the block-check mode, and clarifies 'since' semantics. It fails to disambiguate amount_raw from amount_xno, both of which map to the vague 'exactly amount' phrasing, leaving one of the undocumented parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the operation ('checks') and clearly delineates two distinct modes: invoice verification via invoice_id and raw block/payment verification via to/amount/since. It is specific enough that an agent can tell it apart from nano_create_invoice or nano_send, though it never names the nearest sibling nano_wait_for_payment to contrast polling vs waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Either...or' phrasing explains which parameters belong to which mode, but there is no explicit when-to-use guidance and no mention of when to prefer this over nano_wait_for_payment or nano_history. An agent must infer the polling vs waiting distinction from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_wait_for_paymentWait for paymentA
Waits (up to timeout_seconds, at most 120) until the invoice is paid, its payment is seen but not yet confirmed (pending), or it expires. Call it again to keep waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | ||
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose the key traits: it blocks up to timeout_seconds, hard-caps the wait at 120 seconds, and returns on any of three distinct states, including the subtle 'payment seen but not confirmed (pending)' case. It stops short of stating permissions/rate limits or what happens on timeout, and the absence of an output schema means return-value behavior is only partially covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the blocking semantics and terminal states front-loaded, and no filler. The parenthetical cap and the trailing retry hint both earn their place, though the phrasing around the parenthetical is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a blocking poll with no annotations and no output schema, the description covers the important 'when does it return' question but not 'what does it return' — an agent cannot tell whether a timeout yields an error, a null, or an unpaid status. Given the tool's complexity this is close, but the missing return-on-timeout semantics leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that timeout_seconds bounds the wait and is capped at 120 (echoing the schema's maximum), but says nothing about invoice_id beyond the implied 'wait for this invoice'. That is adequate but not full compensation for two undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Waits ... until the invoice is paid') and enumerates the three terminal conditions (paid, pending, expired), so an agent understands exactly what the call blocks on. It does not explicitly differentiate itself from the closest sibling, nano_verify_payment, leaving some ambiguity about which to choose for a one-shot check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call it again to keep waiting' implies the polling pattern, which is useful usage context. However, there is no explicit guidance on when to use this versus nano_verify_payment, nor any stated prerequisites such as the invoice needing to exist or which states are worth retrying on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nano_walletSend walletB
The scoped send wallet: whether sending is on, its address (fund it here), balance, limits and what is left in the last 24 hours. Never the seed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add two real behavioral facts: the wallet is 'scoped' to sending, and the seed is 'never' returned. That security disclosure is genuinely useful. It still omits whether the call is read-only, what auth it needs, or the return shape, so it falls short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the scope ('The scoped send wallet') before the field list, with no filler. Slightly dense/list-like, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey return contents, and it does: sending-enabled flag, address, balance, limits, and 24-hour remaining amount, plus the seed exclusion. The only material gap is the absence of routing guidance against overlapping siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document; the baseline of 4 applies. The description correctly avoids inventing arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource ('the scoped send wallet') and enumerates what it exposes (address, balance, limits, 24h remaining, whether sending is on), so an agent can infer it is a read of wallet state. However, there is no explicit verb — it is a noun phrase, not 'Get/Retrieve the send wallet' — and it does not distinguish itself from sibling nano_balance or nano_account_info, which plausibly overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives despite a crowded sibling set (nano_balance, nano_account_info, nano_send). The agent must guess whether this is the right call for balance or wallet-config questions.
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.
10 tool updates
v0.1.0- First observed
nano_account_info - First observed
nano_balance - First observed
nano_create_invoice - First observed
nano_history - First observed
nano_rate - First observed
nano_receivable - First observed
nano_send - First observed
nano_verify_payment - First observed
nano_wait_for_payment - First observed
nano_wallet
TDQS
Scored across 10 tools
Most tools have distinct purposes (balance vs history vs receivable vs rate vs invoice lifecycle vs send). However nano_balance and nano_account_info overlap on balance reporting, and nano_receivable partly overlaps with the 'waiting to receive' portion of nano_balance, creating some potential confusion.
All tools share the consistent nano_ prefix, which aids grouping. The suffix style is mixed (noun-style like nano_balance, nano_history, nano_wallet vs verb_noun like nano_create_invoice, nano_verify_payment), but it remains readable and predictable.
Ten tools is well-scoped for a crypto/payment server, covering account queries, pricing, and the full invoice/payment flow without redundancy or bloat.
The surface covers account reading, pricing, invoice creation, payment waiting/verification, wallet management, and sending, which is close to full lifecycle coverage. A few operations like refunds or explicit receive control are absent, but nano_send auto-receives so core workflows are not blocked.
Maintenance
Related MCP Connectors
Pay-per-use tool API for AI agents. Free tier, x402 USDC micropayments, or API key.
Non-custodial crypto payments for AI assistants: balances, payments, and create payment links.
Keyless non-custodial crypto payments for AI agents: payment links and tip jars, no API key.
Pay-per-call tools for AI agents, paid in USDC on Base or Solana. Web search, page and PDF reading, crypto news, Hyperliquid perps, market pulse, Chainlink price history, token checks, SEC filings, weather and more. Free calls every day, and a failed call costs nothing. Works with Tollkit Wallet.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents using the Model Context Protocol (MCP) to send Nano cryptocurrency and retrieve account/block information via Nano node RPC.43 npm11MIT
- AlicenseAqualityDmaintenanceEnables AI agents to perform Bitcoin and Lightning Network payments using a non-custodial, zero-trust architecture. It provides 13 tools for wallet management, invoice creation, and payment processing while keeping node credentials local to the user's machine.138 npmMIT
- AlicenseAqualityBmaintenanceSelf-custodied Nano wallet + x402 payment client and merchant server for AI agents, enabling micropayments, on-ledger settlement, and paid endpoints.6236 PyPI3MIT

PayAgents MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI agents to autonomously make policy-controlled payments for APIs and tools via Bitcoin Lightning (L402) and Base USDC (x402), including paying paywalled endpoints, checking balances, and reviewing transactions.37 npm1MIT