Skip to main content
Glama

@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

nano_balance

–

balance and receivable of an account

nano_account_info

–

frontier, representative, block count, voting weight

nano_history

–

latest sends and receives, with paging

nano_receivable

–

sends waiting to be received

nano_rate

–

XNO in USD (median of public feeds), with conversion

nano_create_invoice

–

an invoice in USD or XNO: an exact amount, a nano: link, an expiry

nano_wait_for_payment

–

waits up to 2 minutes for an invoice to be paid

nano_verify_payment

–

checks an invoice, or any block by hash, address and amount

nano_wallet

wallet

the send wallet's address, balance, limits and what is left today

nano_send

wallet

sends XNO from the capped wallet, once per idempotency_key (required)

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, or NANO_SEND_ANY_ADDRESS=1 on 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_XNO

    0.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_send needs an idempotency_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 says allow_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_SEED is 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 cat in 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.js

To 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

NANO_RPC_URL

https://node.nano133.com/rpc

the node for reads, checks and publishing; use your own node for real money

NANO_WORK_URL

NANO_RPC_URL

where proof of work comes from (work_generate)

NANO_PAY_TO

–

the address invoices are paid to (no invoices without it)

NANO_INVOICE_MINUTES

15

how long an invoice is open

NANO_INVOICE_GRACE_MINUTES

60

how long after that a late payment still counts

NANO_STATE_DIR

~/.nano-mcp

invoices and the send journal (keep it; servers that share it take turns)

NANO_SEND

off

on to allow sending

NANO_WALLET_ADDRESS

–

the send wallet's address; the server refuses to send unless the seed gives exactly this address

NANO_WALLET_SEED_FILE

~/.nano-mcp/seed

a file that holds the seed (64 hex digits, or a 12/24-word phrase); it must be chmod 600

NANO_WALLET_SEED

–

the seed itself, instead of the file (the file is safer: it stays out of config files and logs)

NANO_SEND_MAX_PER_CALL_XNO

0.01

the most one send may move (≤ 1)

NANO_SEND_DAILY_CAP_XNO

0.05

the most all sends may move in 24 hours (≤ 10)

NANO_SEND_ALLOWLIST

–

the only addresses the wallet may pay; sending stays off without it, unless NANO_SEND_ANY_ADDRESS=1

NANO_SEND_ANY_ADDRESS

–

1 lets the wallet pay any address, when no allowlist is set (only the value 1 counts)

NANO_REPRESENTATIVE

–

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

  1. nano_create_invoice asks 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.

  2. The payer sends exactly that amount to NANO_PAY_TO (the nano: link fills it in).

  3. nano_wait_for_payment / nano_verify_payment ask 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 only

Release

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 tools
nano_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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesa Nano address (nano_…)

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesa Nano address (nano_…)

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memoNowhat it is for
minutesNohow long it stays open (default 15)
amount_usdNo
amount_xnoNoan amount in XNO as a decimal string, like "0.01"

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
beforeNostart from this block (the last hash of a previous page)
accountYesa Nano address (nano_…)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/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 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
amount_usdNo
amount_xnoNoan amount in XNO as a decimal string, like "0.01"

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
accountYesa Nano address (nano_…)
min_xnoNoan amount in XNO as a decimal string, like "0.01"

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 XNOA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesa Nano address (nano_…)
amount_xnoYesan amount in XNO as a decimal string, like "0.01"
allow_repeatNoonly when the user wants to pay the same amount to the same address again within 10 minutes
idempotency_keyYesone key per payment, reused on every retry of it (for example an order id)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

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 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoa Nano address (nano_…)
hashNo
sinceNoISO time; the send must have been first seen after it (default: any time)
amount_rawNo
amount_xnoNoan amount in XNO as a decimal string, like "0.01"
invoice_idNo

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYes
timeout_secondsNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

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 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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

  1. 10 tool updatesv0.1.0
    • First observednano_account_info
    • First observednano_balance
    • First observednano_create_invoice
    • First observednano_history
    • First observednano_rate
    • First observednano_receivable
    • First observednano_send
    • First observednano_verify_payment
    • First observednano_wait_for_payment
    • First observednano_wallet

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

Ten tools is well-scoped for a crypto/payment server, covering account queries, pricing, and the full invoice/payment flow without redundancy or bloat.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers