Skip to main content
Glama

ap2-iso20022: Agent-payment mandates → wire-valid ISO 20022

Glama MCP server score

Bridge AP2 (Google's Agent Payments Protocol) and x402 (Coinbase's HTTP-402) mandates into ISO 20022 pain.001 / pacs.008 records — with spending-cap, expiry and authorisation guardrails, and an MCP server. These agentic-payment protocols authorise a payment; this library turns that authorisation into the bank-rail message that actually settles it — the rail the card networks and stablecoins don't cover.

Latest release: v0.0.7: 11 MCP tools over stdio, streamable HTTP or SSE, pure-Python (only mcp), 100% branch coverage, for Python 3.10+. Output feeds straight into pain001 / pacs008 to generate wire-valid XML. Part of the ISO 20022 MCP suite.


Why

An agent with a signed AP2 mandate (or an x402 payment authorisation) can prove it's allowed to pay — but nothing in those protocols emits the pain.001 a bank needs to move the money. ap2-iso20022 is that missing hop. And because moving money is consequential, it only transforms and validates — producing the ISO record is deliberately separate from generating and sending it, so the actual payment stays an explicit, guarded step.

Related MCP server: acmt001-mcp

Install

pip install ap2-iso20022
# or run the MCP server without installing:
uvx --from ap2-iso20022 ap2-iso20022-mcp

MCP client config (e.g. Claude Desktop):

{
  "mcpServers": {
    "ap2-iso20022": {
      "command": "ap2-iso20022-mcp"
    }
  }
}

Transports

One command line, three transports:

Command

Transport

Endpoint

Protocol revisions

ap2-iso20022-mcp

stdio

the client spawns the process

2026-07-28, 2025-11-25

ap2-iso20022-mcp --transport streamable-http

Streamable HTTP

http://127.0.0.1:8000/mcp

2026-07-28 (stateless, server/discover) and 2025-11-25 (initialize, Mcp-Session-Id) on the same endpoint; responses stream as server-sent events, GET opens the server-to-client stream

ap2-iso20022-mcp --transport sse

HTTP+SSE (2024-11-05)

http://127.0.0.1:8000/sse and /messages/

for clients that still expect the older transport

--host and --port change the bind address (defaults 127.0.0.1 and 8000). The HTTP transports carry no authentication of their own: bind loopback, or put the server behind a gateway you trust before binding a routable address. Every release is verified over streamable HTTP with scout in both protocol eras and over SSE with the MCP SDK client; see ADR 0001.

{
  "mcpServers": {
    "ap2-iso20022": { "url": "http://127.0.0.1:8000/mcp" }
  }
}

Flow: normalise → guardrail → convert

from ap2_iso20022 import bridge

# 1. Normalise the protocol payload into a canonical mandate.
mandate = bridge.from_ap2({
    "intent_id": "AP2-CoffeeRun-7",
    "payer": "Alice's Shopping Agent",
    "payer_account": "DE89370400440532013000",
    "merchant_name": "Blue Bottle Coffee",
    "payee_account": "GB29NWBK60161331926819",
    "amount": "12.50", "currency": "EUR", "memo": "oat latte",
    "spending_limit": "50.00",
    "signature": "eyJ...", "signature_type": "jws",
})

# 2. Guardrail before it becomes a payment.
check = bridge.check_mandate(mandate, as_of="2026-03-02T09:00:00")
assert check["ok"]          # required fields ok, within cap, not expired, signed

# 3. Convert to a pain.001 record that feeds pain001 -> wire-valid XML.
record = bridge.to_pain001(mandate)   # exact pain001 field names + JSON number amounts

Tools

  • normalize_ap2 — AP2 mandate payload → canonical mandate.

  • normalize_x402 — x402 payment payload → canonical mandate.

  • check_mandate — Guardrail: required fields, spending cap, expiry (with as_of), authorisation proof.

  • to_pain001 — Canonical mandate → pain.001 record (customer credit transfer).

  • to_pacs008 — Canonical mandate → pacs.008 record (FI-to-FI).

The output field names and types match what pain001 / pacs008 expect (validated against their JSON schemas), so to_pain001(mandate) → pain001 generate_message → XSD-valid pain.001 with no glue.

Guardrails

check_mandate returns {ok, violations, warnings}:

  • required fields — payer/payee name + account, amount, currency

  • spending cap — amount <= max_amount when a cap is present

  • expiry — refuses an expired mandate when you pass as_of

  • authorisation proof — warns when no proof_type/proof_value is present

It never moves money; it tells you whether the mandate is safe to act on.

The suite

Part of a family of vendor-neutral, Python-native ISO 20022 MCP servers:

Development

git clone https://github.com/sebastienrousseau/ap2-iso20022
cd ap2-iso20022
python -m venv .venv && . .venv/bin/activate
pip install -e . && pip install pytest pytest-cov ruff black mypy
pytest                      # 100% branch coverage gate
ruff check ap2_iso20022 tests && black --check ap2_iso20022 tests && mypy ap2_iso20022

License

Licensed under the Apache License, Version 2.0 (LICENSE).


mcp-name: io.github.sebastienrousseau/ap2-iso20022

Available Tools

11 tools
check_agent_spend_limitsA
Read-onlyIdempotent

Guardrail an agent's proposed spend against per-transaction, daily and monthly caps. Stateless: pass the current spent_today/spent_month running totals; nothing is stored. Returns is_allowed, the remaining daily cap and any violations.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idYesIdentifier of the spending agent.
daily_capNoMaximum USD spendable per day.
per_tx_capNoMaximum USD per single transaction.
monthly_capNoMaximum USD spendable per month.
spent_monthNoUSD already spent this month (caller-supplied).
spent_todayNoUSD already spent today (caller-supplied).
proposed_amount_usdYesProposed spend, in USD.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing that nothing is persisted and that the caller owns the running totals — an important property that prevents an agent from assuming the check tracks spend itself. It also previews the is_allowed/remaining/violations outcome, though with an output schema present that detail is partly redundant. Idempotency and read-only safety are already covered by annotations.

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

Conciseness5/5

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

Three tight sentences: purpose first, then the stateless calling contract, then the return shape. No filler; every clause carries information an agent needs.

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 annotations covering the safety profile and an output schema covering return values, the description supplies the remaining critical fact — statelessness and caller-owned totals. It leaves minor ambiguity about cap boundary behavior and default resolution, but nothing that would cause a miscall.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already labels spent_today/spent_month as '(caller-supplied)' and defines each cap's meaning and defaults. The description reinforces the caller-supplied totals but adds no format, units, or boundary semantics (e.g., inclusive vs exclusive caps) beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb ('guardrail ... proposed spend') and resource ('per-transaction, daily and monthly caps'), and the scope is unambiguous. No sibling in the list (token rates, mandates, x402, ISO 20022 conversions) overlaps, so an agent can select this tool without opening the schema.

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

Usage Guidelines4/5

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

Gives clear operating context: it is stateless and the caller must supply spent_today/spent_month running totals rather than relying on stored state. It does not state when-not-to-use it or name alternatives, but no sibling competes for this job, so the omission is low-cost.

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

check_mandateA
Read-onlyIdempotent

Guardrail a mandate before it becomes a payment: check required fields, the spending cap (amount <= max_amount), expiry (when 'as_of' is supplied), and whether an authorisation proof is present. Returns ok plus any violations and warnings. Run this before converting.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNoISO date/datetime to evaluate expiry against.
mandateYesA canonical mandate object (see normalize_ap2/normalize_x402 output): payer_/payee_ name+account_iban, amount, currency, plus optional reference, execution_date, max_amount, expiry, proof_type/proof_value.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Description details what is checked (fields, cap, expiry, proof) and that output includes 'ok plus violations and warnings.' Annotations already declare readOnly and idempotent, so description adds behavioral context without contradiction.

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

Conciseness5/5

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

Three sentences: purpose, output, usage instruction. No wasted words, front-loaded with key information.

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

Completeness5/5

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

Given parameter complexity (mandate object with many fields) and existence of output schema, description sufficiently covers when and how to use. Mentions return format and prerequisite step.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. Description adds meaning by explaining 'as_of' is for expiry check and 'mandate' is the canonical object from normalize tools, providing context beyond schema descriptions.

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

Purpose5/5

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

Description clearly states the tool checks a mandate before payment conversion, listing specific checks (fields, cap, expiry, proof). It distinguishes from sibling normalize and convert tools by positioning as a guardrail step.

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?

Explicitly says 'Run this before converting,' indicating it should be used before to_pain001 or to_pacs008. Does not exclude other uses but provides clear context.

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

get_token_fiat_rateA
Read-only

Fetch a spot token->fiat exchange rate from the CoinGecko public API, e.g. to price a crypto-denominated (x402) mandate in fiat. Supports USDC, USDT, EURC, ETH and SOL. Requires the optional 'oracle' extra (pip install ap2-iso20022[oracle]). Reaches an external service: the returned rate is a live spot price, not a guarantee, and this tool never moves money.

ParametersJSON Schema
NameRequiredDescriptionDefault
token_symbolYesToken symbol: USDC, USDT, EURC, ETH or SOL.
fiat_currencyNoFiat currency code to price in.USD

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, openWorld, non-idempotent and non-destructive, so the safety profile is covered. The description adds genuinely new context: it reaches an external service, the rate is a live spot price rather than a guarantee, and an optional 'oracle' extra must be installed. The 'never moves money' clause largely restates destructiveHint=false, which keeps it out of 5 territory.

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 dense but well-ordered passage: purpose, use case, supported values, install prerequisite, then the risk caveat. Every sentence earns its place, though the install and caveat clauses could be trimmed slightly.

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?

Output schema exists, so return values need no explanation. The description covers prerequisites, external dependency, supported inputs, and the non-guarantee caveat — everything an agent needs to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (token_symbol, fiat_currency with default USD) are fully documented in the schema. The description's token list merely echoes the schema, adding no syntax or format detail beyond it, so baseline 3 applies.

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

Purpose5/5

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

Specific verb (fetch) + resource (spot token->fiat exchange rate) + named provider (CoinGecko public API) + a concrete use case (pricing an x402 mandate in fiat). None of the sibling tools overlap, so the agent can route unambiguously.

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 a clear usage context ('to price a crypto-denominated (x402) mandate in fiat') and states the supported token set. It does not name an alternative or an explicit when-not-to-use, but no sibling tool competes for this job.

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

normalize_ap2A
Read-onlyIdempotent

Normalise a Google AP2 (Agent Payments Protocol) mandate payload into a canonical mandate the other tools accept.

ParametersJSON Schema
NameRequiredDescriptionDefault
payloadYesAn AP2 mandate payload.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, which the description does not contradict. The description adds behavioral context by explaining the transformation to a canonical format and its consumption by other tools.

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

Conciseness5/5

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

The description is a single, concise sentence that efficiently conveys the tool's purpose without any extraneous words.

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

Completeness4/5

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

Given the presence of an output schema and annotations covering safety, the description adequately completes the context for a transformation tool. It lacks some detail on the canonical mandate format but the output schema likely fills that 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 coverage is 100% with a clear description for the only parameter 'payload'. The description does not add significant additional meaning beyond what the schema already provides, so it meets the baseline.

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

Purpose5/5

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

The description clearly states the verb 'normalise', the specific resource 'Google AP2 mandate payload', and the outcome 'canonical mandate the other tools accept'. It effectively distinguishes from sibling tools like 'normalize_x402' by specifying the AP2 format.

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?

The description clearly indicates the tool is for AP2 payloads, which helps differentiate it from sibling normalizer 'normalize_x402'. However, it does not explicitly state when not to use it or provide alternatives beyond the implied sibling context.

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

normalize_token_amountA
Read-onlyIdempotent

Normalise raw on-chain base units to a human token amount using the token's decimals (USDC/USDT/EURC=6, SOL=9, ETH=18). Returns amount and decimals. Errors on an unsupported token.

ParametersJSON Schema
NameRequiredDescriptionDefault
token_symbolYesToken symbol, e.g. USDC, ETH, SOL.
raw_base_unitsYesRaw integer base units (smallest unit).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context: it states it errors on unsupported tokens and that it returns amount plus decimals, which the annotations do not convey.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core conversion action and its basis, followed by return values and the error case. No filler and every clause carries information.

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?

An output schema exists, so the return shape need not be described, yet the description still summarizes it briefly. Combined with the annotation-covered safety profile and the documented error case, an agent has what it needs; only explicit when-to-use routing between siblings is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, and the description earns an extra point by specifying the supported token set with explicit decimal values (USDC/USDT/EURC=6, SOL=9, ETH=18), which meaningfully constrains valid token_symbol inputs beyond what the schema declares.

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 ('normalise') and a precise resource ('raw on-chain base units' to 'human token amount'), and even names the conversion basis. It is clearly distinguishable from siblings like normalize_x402 or normalize_ap2, which normalise entirely different payload types.

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 purpose implies when it applies (converting raw base units for display/human-readable output), and it notes it errors on unsupported tokens, which is a useful boundary. However, it never explicitly states when to reach for this versus another tool, nor does it name any alternative, so guidance is only implied.

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

normalize_x402A
Read-onlyIdempotent

Normalise a Coinbase x402 (HTTP-402) payment requirement/receipt into a canonical mandate the other tools accept.

ParametersJSON Schema
NameRequiredDescriptionDefault
payloadYesAn x402 payment payload.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, indicating no side effects. The description adds that the output is a canonical mandate, which is useful context but does not disclose error handling or validation behavior.

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?

Single, well-structured sentence with no redundancy. Front-loads the action and outcome.

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?

Given the open input schema (additionalProperties: true) and existence of an output schema, the description provides a high-level transformation purpose. However, it lacks details on what constitutes a valid x402 payload, which an agent might need to construct inputs.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents the single parameter. The description adds only 'An x402 payment payload.', which is generic and adds minimal semantic value beyond the parameter name.

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

Purpose5/5

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

The description clearly states the action (normalize), the source format (Coinbase x402 payment requirement/receipt), and the output (canonical mandate). It distinguishes itself from sibling normalize_ap2 by naming the specific source protocol.

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 implies this tool is a prerequisite for other tools like check_mandate, to_pain001, etc., by mentioning 'the other tools accept'. However, it does not explicitly state when to use this over normalize_ap2 or provide any exclusions.

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

to_pacs008A
Read-onlyIdempotent

Convert a canonical mandate into a pacs.008 record (FI-to-FI credit transfer) using the field names pacs008 expects, for interbank settlement of an agent-authorised payment.

ParametersJSON Schema
NameRequiredDescriptionDefault
mandateYesA canonical mandate object (see normalize_ap2/normalize_x402 output): payer_/payee_ name+account_iban, amount, currency, plus optional reference, execution_date, max_amount, expiry, proof_type/proof_value.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds valuable context about the output format (using pacs.008 field names) and business purpose, which goes beyond annotations.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the main action. Every word serves a purpose, with no redundancy or filler.

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

Completeness4/5

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

Given the presence of a detailed input schema and output schema, the description is adequately complete. It explains the tool's purpose and output format. The only minor gap is a lack of explicit prerequisite reference (e.g., mandate must be canonical from normalize tools), but this is covered in the schema.

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

Parameters3/5

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

The input schema provides 100% coverage for the mandate parameter, so baseline is 3. The tool description does not add new information about the parameter itself; it focuses on the output. No additional semantics provided beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'convert' and the resource 'canonical mandate into a pacs.008 record', explaining its use for interbank settlement of an agent-authorised payment. This distinguishes it from siblings like to_pain001 (which produces pain.001) and normalize 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?

The description implies usage for converting a canonical mandate to a pacs.008 record for interbank settlement, providing clear context. However, it does not explicitly mention when not to use this tool or compare it to alternatives beyond the implicit purpose.

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

to_pain001A
Read-onlyIdempotent

Convert a canonical mandate into a pain.001 record (customer credit transfer initiation) using the exact field names pain001 expects, so it feeds straight into pain001 generate_message for wire-valid XML.

ParametersJSON Schema
NameRequiredDescriptionDefault
mandateYesA canonical mandate object (see normalize_ap2/normalize_x402 output): payer_/payee_ name+account_iban, amount, currency, plus optional reference, execution_date, max_amount, expiry, proof_type/proof_value.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses that the tool performs a conversion using 'exact field names pain001 expects', which adds behavioral context beyond the annotations. Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description's transformation nature aligns with these. No contradictions observed.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the action, and contains no extraneous words. Every part serves a purpose: defining the conversion, specifying the output format, and indicating the downstream use.

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

Completeness4/5

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

Given the simple parameter set (1 required parameter with full schema coverage), the description adequately explains the tool's purpose and workflow integration. It mentions the output format and downstream tool, which is helpful. The existence of an output schema (not shown) further reduces the need to describe return values. Minor gap: no mention of error handling or validation.

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 schema description for the 'mandate' parameter is comprehensive, listing expected fields and referencing normalization tools. The description adds value by stating 'using the exact field names pain001 expects', which clarifies the mapping goal beyond the schema's listing of fields.

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

Purpose5/5

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

The description clearly specifies the verb 'Convert', the resource 'canonical mandate into a pain.001 record', and the intended use case 'for wire-valid XML'. It differentiates from siblings by mentioning the specific output format (pain.001) and the expected input (canonical mandate as from normalize_ap2/normalize_x402), making it distinct from to_pacs008 and others.

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?

The description implies usage context by stating the output 'feeds straight into pain001 generate_message', indicating a downstream tool. Sibling tools like to_pacs008 and normalize_* steps suggest different stages in a workflow, but no explicit 'when to use' or 'when not to use' guidance is provided, though the context is clear.

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

validate_eip712_permitA
Read-onlyIdempotent

Validate an EIP-2612 permit: owner/spender/value/nonce/deadline must be present and well-formed, and deadline must not be before the caller-supplied now_timestamp. Returns is_valid and any violations.

ParametersJSON Schema
NameRequiredDescriptionDefault
permitYesAn EIP-2612 permit: owner, spender, value, nonce, deadline.
now_timestampYesCurrent time to evaluate deadline, epoch secs.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real value by disclosing the exact validation semantics: field presence/well-formedness plus a deadline-vs-now_timestamp comparison, and that violations are returned rather than throwing. It never says whether the EIP-712 signature itself is recovered/verified, which is the one notable ambiguity for a tool named 'validate_eip712_permit'.

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 sentences, fully front-loaded: the validation contract first, the return value second. No filler and every clause carries information.

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 an output schema present, the description need not explain is_valid/violations in detail, and it covers both inputs and the validation rules. The only gap is the ambiguity over signature verification, which leaves a small hole for a tool whose name emphasizes EIP-712 signing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by enumerating the required permit subfields and clarifying that now_timestamp is caller-supplied and used specifically as the deadline comparison point. That is a genuine increment over the schema text.

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

Purpose5/5

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

States a specific verb (validate) and a precise resource (EIP-2612 permit), then enumerates the concrete checks applied. The narrow domain immediately separates it from siblings like check_mandate, validate_mandate_expiry, and verify_x402_signature without needing to name them.

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 validation rules imply the intended use (pre-flight checking of a permit before submission), but there is no explicit statement of when to call this versus verify_x402_signature or check_mandate_expiry, nor any exclusions. Usage is inferable rather than stated.

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

validate_mandate_expiryA
Read-onlyIdempotent

Check a mandate's expiry by unix-epoch (seconds) comparison. The caller supplies now_timestamp (the server never reads the clock); a mandate is valid while now is before expiration. Returns is_valid.

ParametersJSON Schema
NameRequiredDescriptionDefault
now_timestampYesCurrent time to evaluate against, epoch secs.
expiration_timestampYesMandate expiry, unix epoch seconds.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description still adds genuinely useful behavioral context beyond that: the server never reads the clock, so results depend entirely on the caller-supplied now_timestamp, making it a pure deterministic function.

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 short sentences, front-loaded with the operation and its units, then the key semantic constraint, then the return value. No filler.

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

Completeness5/5

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

For a pure two-parameter comparison tool with full schema coverage, annotations covering safety, and an output schema, the description supplies everything an agent needs: units, comparison direction, clock source, and return field.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description earns above baseline by clarifying that now_timestamp is caller-supplied (not server clock) and by defining the comparison direction (valid while now < expiration), which the schema alone does not convey.

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 a specific verb and resource (check a mandate's expiry) and pins down the exact mechanism (unix-epoch seconds comparison). It is clearly narrower than the sibling check_mandate, but it never names that sibling to make the distinction explicit.

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 explains the comparison semantics ('valid while now is before expiration') which implies when the tool applies, but gives no explicit when-to-use or when-not-to-use guidance, and does not mention check_mandate as the alternative for a fuller mandate inspection.

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

verify_x402_signatureA
Read-onlyIdempotent

Verify an x402 EIP-191 personal_sign over the mandate JSON: recover the signer with eth_account and compare (case-insensitively) to the expected address. Returns is_valid and the recovered_address.

ParametersJSON Schema
NameRequiredDescriptionDefault
mandate_jsonYesThe exact mandate JSON string that was signed.
signature_hexYes0x-prefixed hex signature (65 bytes).
expected_addressYesThe address expected to have signed.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, but the description goes further by disclosing the verification algorithm (recover signer with eth_account), the case-insensitive address comparison, and the returned fields. No failure modes or malformed-signature handling are described, which keeps it short of a 5.

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

Conciseness4/5

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

Two tight sentences, front-loaded with purpose and mechanism; the second sentence about return values is mildly redundant given the output schema but costs little.

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?

An output schema exists and annotations cover the safety profile, so the description only needs to convey mechanism and comparison semantics, which it does fully. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are documented in the schema; the description only reinforces mandate_json as the signed payload and adds the case-insensitive comparison detail. With the schema doing the heavy lifting, the baseline of 3 is appropriate.

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

Purpose5/5

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

States a specific verb (verify) and resource (x402 EIP-191 personal_sign over the mandate JSON), and names the recovery mechanism (eth_account) so an agent can distinguish it from the EIP-712 sibling validate_eip712_permit without opening either schema.

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

Usage Guidelines3/5

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

Usage is implied by the signature scheme named in the description (EIP-191 personal_sign over mandate JSON), which implicitly routes the agent away from validate_eip712_permit. However, no explicit when-to-use/when-not statement or named alternative is given, so the agent must infer the boundary itself.

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. 6 tool updatesv0.0.3
    • Addedcheck_agent_spend_limits
    • Addedget_token_fiat_rate
    • Addednormalize_token_amount
    • Addedvalidate_eip712_permit
    • Addedvalidate_mandate_expiry
    • Addedverify_x402_signature
  2. 5 tool updatesv0.0.2
    • First observedcheck_mandate
    • First observednormalize_ap2
    • First observednormalize_x402
    • First observedto_pacs008
    • First observedto_pain001

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have clearly distinct targets: normalization (ap2/x402/token_amount), validation (expiry/signature/eip712), conversion (pain001/pacs008), and rate/limit checks. The main overlap is check_mandate, which is a composite guardrail covering required fields, spend cap, expiry and authorization proof—partly duplicating validate_mandate_expiry and check_agent_spend_limits, though the descriptions clarify it is the umbrella 'run this before converting' tool.

Naming Consistency4/5

All names are snake_case and mostly follow verb_noun (get_/check_/validate_/verify_/normalize_). The two converters use a different to_<format> pattern (to_pain001, to_pacs008) with embedded domain codes, a minor deviation but still readable and predictable.

Tool Count5/5

11 tools is well-scoped for an agent-payments/ISO 20022 pipeline; each tool covers a distinct stage (rate lookup, normalization, validation, conversion) and none feels redundant or gratuitous.

Completeness4/5

The surface covers the full normalize -> validate -> convert pipeline with both pain.001 and pacs.008 outputs plus input normalizers for AP2 and x402. Minor gaps exist around the ISO 20022 lifecycle (no pacs.002 status or camt statement handling, no parsing of an existing ISO message), but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server for ISO 20022 acmt.001 Account Opening (and companion acmt.* messages): message-type discovery, required-field lookup, JSON Schema introspection, IBAN/BIC/LEI validation, flat-record validation, and validated acmt XML generation.
    7
    436 PyPI
    1
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that exposes the pacs008 ISO 20022 FI-to-FI Customer Credit Transfer library as tools for AI agents and assistants, enabling generation, validation, and parsing of pacs.008 credit transfer XML messages.
    16
    433 PyPI
    1
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Unified gateway for ISO 20022 message families, providing meta-tools to search, describe, validate, generate, and parse financial messages.
    7
    391 PyPI
    1
    Apache 2.0