iso20022-bank-profile-mcp
A fully local, closed-world MCP server for discovering, fetching, and applying ISO 20022 clearing profiles to lint payloads and validate bank rule packs.
List available clearing profiles (
list_profiles) with summaries likeprofile_id, market practice, tier, entitlement, supported messages, and rule count.Fetch a full profile (
get_profile) including rule bodies, validation logic, and metadata; premium profiles require entitlement.Lint raw ISO 20022 XML/JSON payloads (
lint_payload) against a specific clearing profile to find market-practice violations; premium profiles require entitlement.Validate bank-supplied profile/rule-pack JSON definitions (
validate_profile_definition) for schema shape and known assertion verbs.Serve profiles over stdio (default), streamable HTTP, SSE, or authenticated OAuth 2.1/static-token HTTP.
Support open baseline profiles (Generic, CBPR+, SEPA_Instant, FedNow) and premium entitlement-gated bank-specific rule packs via a registration seam.
Provide pure, read-only, idempotent, closed-world operations with no network calls; it does not perform structural XSD validation, message generation, or streaming.
Provides clearing profiles, validation, and linting for SEPA (Single Euro Payments Area) payments, including SEPA Instant credit transfers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iso20022-bank-profile-mcpLint this pacs.008 against the CBPR+ profile"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
iso20022-bank-profile-mcp: The ISO 20022 Bank Clearing-Profile Server
A fully local, closed-world Model Context Protocol server that
manages, validates, and serves bank-specific ISO 20022 clearing profiles /
rule packs — the market-practice rules that sit beyond structural XSD
validation. It is a foundational member of the
ISO 20022 MCP Suite and a sibling of
iso20022-readiness-suite-mcp,
whose readiness gateway can consume the profiles this server serves.
The November 2026 milestones. As the major schemes (CBPR+, HVPS+, T2, FedNow) tighten their ISO 20022 requirements — structured postal addresses chief among them — a payment that was fine yesterday can be rejected tomorrow.
iso20022-bank-profile-mcpturns those scheme rules into versioned, agent-callable clearing profiles:list_profilesandget_profileserve them,lint_payloadevaluates a payload against one, andvalidate_profile_definitionvets a bank-supplied rule pack. v0.0.6, 4 read-only tools over stdio (the default), streamable HTTP, SSE or authenticated OAuth 2.1 HTTP, premium rule-pack entitlement gating, Python 3.10+.
Contents
Transports — stdio, streamable HTTP (2026-07-28 and 2025-11-25), SSE and authenticated HTTP from one command line
Related MCP server: camt053-mcp
Overview
The Model Context Protocol (MCP) is an open standard that lets AI agents and assistants discover and call external tools in a uniform way. iso20022-bank-profile-mcp owns the market-practice profile layer of the ISO 20022 MCP Suite: the scheme-specific and bank-specific rules a payment must satisfy to clear, which live above the XSD and vary by clearing system.
A clearing profile is pure data — a profile_id, its market_practice,
the messages it supports, and a list of declarative custom_rules. The server
ships open baseline profiles (Generic, CBPR+, SEPA_Instant, FedNow) and
exposes four read-only tools to discover them, fetch them in full, lint a
payload against one, and validate a candidate rule pack.
It is a fully local, closed-world server: no network surface, no
sub-servers, no meta-client. Every tool computes from the bundled profile data
and returns typed, JSON-serialisable output; on any failure — a bad input, an
unparseable payload, an unknown profile — it returns an {"error": ...}
payload rather than raising into the client transport. XML payloads are parsed
with defusedxml only (no XXE / billion-laughs).
Website: https://sebastienrousseau.github.io/iso20022-bank-profile-mcp/
Source code: https://github.com/sebastienrousseau/iso20022-bank-profile-mcp
Bug reports: https://github.com/sebastienrousseau/iso20022-bank-profile-mcp/issues
flowchart TD
A["MCP client<br/>(Claude Desktop, IDE, agent)"] -->|stdio, streamable HTTP, SSE| B["iso20022-bank-profile-mcp<br/>(clearing-profile server)"]
B --> C["ProfileEngine<br/>(bundled JSON + register() seam)"]
C --> D["Generic"]
C --> E["CBPR+"]
C --> F["SEPA_Instant"]
C --> G["FedNow"]
H["iso20022-readiness-suite-mcp<br/>(readiness gateway)"] -.consumes profiles.-> BThe ISO 20022 MCP Suite
iso20022-bank-profile-mcp is one of a set of coordinated, vendor-neutral MCP
servers for the ISO 20022 migration. Dependency ranges are kept aligned across
the suite, so the servers co-install cleanly in a single Python environment.
Server | Scope | Install |
Orchestration gateway: readiness scoring, remediation, clearing-profile linting, and bank-response simulation over the foundational servers |
| |
Compiles readiness findings, remediation diffs and simulated responses into a sealed, Ed25519-signable audit evidence pack |
| |
ISO 20022 postal-address classification, assessment, and remediation for the Nov 2026 structured-address cliff |
| |
Unified gateway meta-tools ( |
| |
ISO 20022 camt.05x bank statements: parse, validate, filter, reverse; MT94x migration; CBPR+ readiness |
| |
Generate & validate ISO 20022 pain.001 payment-initiation files (v03–v12, pain.008, SEPA) with rulebook checks |
| |
Reconcile ISO 20022 payments and statements; match initiations to their bank-side outcomes |
| |
Parse bank statements (MT940/MT942 and camt) into structured, agent-friendly data |
|
Where the foundational servers each do one message job well and the readiness gateway composes them, this server owns the clearing profiles: it manages, validates, and serves the market-practice rule packs the rest of the suite lints against.
Install
iso20022-bank-profile-mcp runs on macOS, Linux, and Windows and
requires Python 3.10+ and pip. It pulls in the MCP SDK, pydantic,
and defusedxml automatically — all published on PyPI.
python -m pip install iso20022-bank-profile-mcpOr run it without installing, straight from PyPI, with
uvx:
uvx iso20022-bank-profile-mcppython -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
python -m pip install -U iso20022-bank-profile-mcpQuick Start
For the 10-minute install → MCP client config → first conversation tutorial,
see docs/quickstart.md.
Launch the server over stdio (the default transport):
iso20022-bank-profile-mcpRegister it with any MCP client (e.g. Claude Desktop) by adding it to the client's configuration:
{
"mcpServers": {
"iso20022-bank-profile": { "command": "iso20022-bank-profile-mcp" }
}
}The command speaks MCP on stdin/stdout — it is meant to be launched by an MCP client, not used interactively. The agent can then call the tools below.
You can also invoke the tools in-process — without a transport — straight through the FastMCP instance. This mirrors what an agent receives over stdio; everything is local, so no other servers are needed:
import asyncio
from iso20022_bank_profile_mcp import server
async def main() -> None:
async def call(name, args):
result = await server.server.call_tool(name, args)
# mcp 2.x returns a CallToolResult (use .content); 1.x returns
# the content list, or a (content, meta) tuple.
content = getattr(result, "content", None)
if content is None:
content = result[0] if isinstance(result, tuple) else result
return content[0].text if content else ""
# Which clearing profiles can I target?
print(await call("list_profiles", {}))
# -> {"profile_id": "...", "market_practice": "...", "rule_count": ...}, ...
# Lint a payload against a profile: a CBPR+ address missing its town.
payload = "<Document><PstlAdr><Ctry>DE</Ctry></PstlAdr></Document>"
print(await call("lint_payload",
{"payload_content": payload, "profile_id": "CBPR+"}))
# -> {"profile_id": "CBPR+", "is_compliant": false,
# "findings": [{"code": "CBPR_MISSING_TOWN", "locator": "TwnNm", ...}]}
asyncio.run(main())Transports
One command line, four transports:
Command | Transport | Endpoint | Protocol revisions |
| stdio | the client spawns the process | 2026-07-28, 2025-11-25 |
| Streamable HTTP |
| 2026-07-28 (stateless, |
| HTTP+SSE (2024-11-05) |
| for clients that still expect the older transport |
| Authenticated streamable HTTP (see |
| OAuth 2.1 resource server or a static dev-mode token, |
--host and --port change the bind address of streamable-http and
sse (defaults 127.0.0.1 and 8000). Those two carry no
authentication of their own: bind loopback, or put the server behind a
gateway you trust before binding a routable address; --transport http
is the authenticated option. 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": {
"iso20022-bank-profile": { "url": "http://127.0.0.1:8000/mcp" }
}
}Tools
All tools return JSON-serialisable data; on a domain, validation, or value
error they return an {"error": ...} payload rather than raising. Every tool
is a pure, local, read-only, idempotent, closed-world lookup — no network, no
sub-servers.
list_profiles— List the available clearing profiles as lightweight summaries (profile_id,market_practice,tier,entitled,supported_messages,rule_count). Use it to discover theprofile_idvalues the other tools accept and see which ones the current caller is entitled to.get_profile— Return one clearing profile in full, including its rule bodies. On a premium profile the caller must be entitled, otherwise it returns aBP_NOT_ENTITLEDerror (see Open-core vs premium).lint_payload— Evaluate a raw ISO 20022 payload against a clearing profile and return the findings (a compliant payload yields none). Likeget_profile, a premium profile requires an entitlement or it returnsBP_NOT_ENTITLED.validate_profile_definition— Validate a bank-supplied profile / rule-pack definition supplied as raw JSON, confirming its shape and that every rule uses a known assertion verb.
HTTP transport & authentication
stdio is the default and needs no authentication — one process per operator,
launched by the client, no network surface. The suite's streamable-http
and sse transports above are unauthenticated too. For shared,
multi-tenant deployments the server also speaks an authenticated
streamable-HTTP transport:
iso20022-bank-profile-mcp --transport=http --bind=127.0.0.1:8080--bind defaults to 127.0.0.1:8080 (loopback-only), so exposing the server
beyond the host is an explicit opt-in (e.g. --bind=0.0.0.0:8080). The HTTP
transport refuses to start without authentication — it never serves an
unauthenticated endpoint. Two auth modes apply, strongest first:
OAuth 2.1 resource server (RFC 9728) — set
ISO20022_BANK_PROFILE_OAUTH_ISSUERandISO20022_BANK_PROFILE_OAUTH_AUDIENCE(both required), with optionalISO20022_BANK_PROFILE_OAUTH_JWKS_URL(defaults to<issuer>/.well-known/jwks.json) andISO20022_BANK_PROFILE_OAUTH_SCOPES. Every request must carryAuthorization: Bearer <jwt>; the token is validated against the JWKS and itsiss/aud/exp/nbf/ required scopes. Failures are rejected401/403with an RFC 9728WWW-Authenticatechallenge, and protected-resource metadata is served at/.well-known/oauth-protected-resource. This server validates tokens from your existing authorization server (Okta, Auth0, Entra ID, …); running the authorization server is out of scope.ISO20022_BANK_PROFILE_OAUTH_ISSUER=https://auth.example.com \ ISO20022_BANK_PROFILE_OAUTH_AUDIENCE=https://mcp.example.com/mcp \ iso20022-bank-profile-mcp --transport=http --bind=0.0.0.0:8080Static dev-mode token — set
ISO20022_BANK_PROFILE_TOKENto a shared secret; every request must then sendAuthorization: Bearer <secret>. This is a single shared secret with no expiry and no scopes — intended for local development, not production.
An optional X-MCP-Tenant request header is forwarded into the tool-visible
request context for multi-tenant scoping. See
docs/transport.md for the full setup.
How it fits the suite
This server is the profile authority for the ISO 20022 MCP Suite. The
sibling iso20022-readiness-suite-mcp
gateway scores and remediates payments against clearing profiles; those
profiles are exactly what this server manages, validates, and serves. Aligning
on one profile source keeps the readiness gateway and any bank's own tooling
evaluating a payment against the same market-practice rules.
The profile catalogue is extensible at the seam the whole suite shares. The
ProfileEngine loads the open baseline from bundled JSON with
ProfileEngine.from_bundled(), and exposes ProfileEngine.register(profile)
to add (or replace) a profile at runtime. A premium, bank-specific rule
pack is the same shape as a bundled profile — a ClearingProfile with a
profile_id, a market_practice, its supported_messages, and a list of
custom_rules — so a deployment that embeds this server can register its
licensed packs and serve them alongside the open baseline without changing the
tool surface. See docs/profiles.md for the rule
mini-language and the register() seam.
Open-core vs premium
The server is open core: the baseline scheme profiles and the profile
engine are open source and always available. Higher-tier, institution-specific
capabilities are commercial add-ons that plug into the same profile-engine seam
(the engine already exposes a register() hook for runtime-loaded rule packs).
Capability | Tier |
Profile engine + rule mini-language | Open Source |
Baseline scheme profiles (Generic, CBPR+, SEPA_Instant, FedNow) | Open Source |
Entitlement gate for premium profiles (tier, scopes, allowlist) | Open Source |
Bank-specific / proprietary scheme rule packs | Paid |
Stateful profile-version history & audit logs | Paid |
Nothing in the open-source tier is time-limited or feature-gated.
How the entitlement gate works
Every clearing profile carries a tier: "open" (the baseline profiles —
unrestricted and always accessible) or "premium" (a licensed rule pack). A
bundled premium sample profile, ACME_Premium, ships so you can exercise
the gate. list_profiles reports each profile's tier and a per-caller
entitled boolean; get_profile and lint_payload on a premium profile
return a BP_NOT_ENTITLED error unless the caller is entitled.
Entitlement is granted by either of two independent sources (ORed):
OAuth scope (HTTP transport) — a token bearing the
profile:premiumscope is entitled to every premium profile; a token bearingprofile:<profile_id>is entitled to just that one.Environment allowlist (stdio / dev) —
ISO20022_BANK_PROFILE_ENTITLEMENTSlists the premiumprofile_idvalues (comma- or space-separated) the operator is licensed for;*grants all of them.
# stdio: license the ACME_Premium sample pack for this process
ISO20022_BANK_PROFILE_ENTITLEMENTS=ACME_Premium iso20022-bank-profile-mcpThe gate ships in this release; the premium rule packs themselves (and
stateful version history / audit logs) remain a paid, out-of-tree concern.
See docs/profiles.md for the full entitlement model.
When not to use iso20022-bank-profile-mcp
You have no MCP client. This server only makes sense paired with an MCP-aware host (Claude Desktop, the IDE plugins, an agent framework).
You need structural XSD validation or message generation. Those live in the foundational suite servers (
iso20022-mcp,camt053-mcp,pain001-mcp). This server evaluates market-practice rules above the XSD; it does not parse, generate, or structurally validate messages.You want an end-to-end readiness score and remediation. That is the job of
iso20022-readiness-suite-mcp, which consumes these profiles. Use it if you want scoring, remediation, and bank-response simulation composed together.You need a long-lived network service on a routable address without auth. stdio is the default (one process per operator, no network surface);
--transport streamable-httpand--transport ssebind loopback and carry no authentication, so a routable deployment belongs behind a gateway you trust; the--transport httpoption exists for shared, multi-tenant deployments and always requires authentication (OAuth 2.1 or a static dev-mode token) — it will not serve an unauthenticated endpoint.You need streaming responses. Tool calls return whole values, not streams.
Development
iso20022-bank-profile-mcp uses Poetry and mise.
git clone https://github.com/sebastienrousseau/iso20022-bank-profile-mcp.git && cd iso20022-bank-profile-mcp
mise install
poetry install
poetry shellNote: the server is fully local and closed-world, so the test suite runs with nothing else installed. See
CONTRIBUTING.md.
A Makefile orchestrates the quality gates (kept in lockstep with CI):
make check # all gates (REQUIRED before commit): lint + type-check + test
make test # pytest (100% line + branch coverage)
make lint # ruff + black
make type-check # mypy --strict
make security # banditSecurity
iso20022-bank-profile-mcp returns errors as data — every tool catches the
documented domain, validation, and value errors and returns an
{"error": ...} envelope; it never propagates raw exceptions to the MCP
client. Payloads reached through the clearing-profile engine are parsed with
defusedxml only (no XXE / billion-laughs), and the server opens no network
sockets. Reporting practice, supported versions, the attack surface, and the
full supply-chain posture (SLSA L3 provenance, PEP 740 attestations, SBOMs, and
the NIST SP 800-218 SSDF practice mapping) are documented in
SECURITY.md. Vulnerabilities go via GitHub Private
Vulnerability Reporting, not public issues.
Documentation
README.md— this fileCHANGELOG.md— release notesSECURITY.md— disclosure + supported versionsSUPPORT.md— how to get helpROADMAP.md— what's shipped (HTTP transport, premium entitlement gating) and what's next (richer bank rule packs)MAINTAINERS.md— who can mergedocs/quickstart.md— 10-minute install → first conversationdocs/profiles.md— the clearing profiles, the rule mini-language, premium rule packs, and the entitlement gatedocs/transport.md— the optional HTTP transport and OAuth 2.1 setupglama.json— Glama directory manifest
MCP Registry
mcp-name: io.github.sebastienrousseau/iso20022-bank-profile-mcp
License
Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.
Contributing
Contributions are welcome — see the contributing instructions. Thanks to all contributors.
Acknowledgements
Built alongside the foundational servers of the ISO 20022 MCP Suite and the Model Context Protocol Python SDK.
Available Tools
4 toolsget_profileGet a clearing profileARead-onlyIdempotent
Return one clearing profile in full, including its rule bodies.
Purpose:
Retrieve the complete definition of an ISO 20022 clearing profile,
including rule bodies, validation logic, and metadata.
When to use:
Use when inspecting the specific market-practice rules, XPath
targets, or error severity configured for a specific clearing network.
When NOT to use:
Do not use to discover available profile identifiers; use `list_profiles`
first. Do not use to evaluate payloads; use `lint_payload`.
Behavioral transparency:
- Deterministic: Given the same profile_id and entitlements, returns
identical profile data.
- External dependencies: None (local memory/registry).
- Side effects: Pure read-only operation; modifies no state.
- Error states: Returns an error object if profile_id is unknown
or requires ungranted entitlements.
Args:
profile_id: The clearing profile identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | The profile to fetch (see list_profiles). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive/openWorld, so lines like 'pure read-only operation; modifies no state' are redundant. However, the description adds genuinely new context beyond the annotations: determinism guarantees, no external dependencies, and the specific error states (unknown profile_id, missing entitlements). That is useful disclosure, though partly padded with annotation restatement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded opening sentence is good, but the 'Purpose' paragraph largely repeats it, the 'Behavioral transparency' bullets restate annotations, and the Args line duplicates a 100%-covered schema field. Several sentences do not earn their place, though the sectioned layout remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it covers purpose, routing, prerequisites, and error behavior. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented there ('The profile to fetch (see list_profiles)'). The description's Args section restates the identifier without adding format, naming convention, or lookup syntax, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('Return one clearing profile in full, including its rule bodies') and the Purpose section clarifies scope (rule bodies, validation logic, metadata). An agent can distinguish this from list_profiles and lint_payload 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' and 'When NOT to use' sections name both conditions and the alternative tools (list_profiles for discovery, lint_payload for evaluation). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lint_payloadLint a payload against a profileARead-onlyIdempotent
Evaluate a payload against a clearing profile and return findings.
Purpose:
Validate an ISO 20022 XML or JSON message payload against the
market-practice rules and constraints of a specific bank clearing profile.
When to use:
Use before submitting payment messages to clearing rails (CBPR+, SEPA,
FedNow) to identify rule violations, missing elements, or format defects.
When NOT to use:
Do not use for basic XSD schema validation; use structural XML
validators. Do not use to validate rule pack schemas; use
`validate_profile_definition`.
Behavioral transparency:
- Deterministic: Identical payload and profile_id produce identical
findings.
- External dependencies: None (defusedxml parser only).
- Side effects: Pure read-only operation; writes no data.
- Error states: Returns an error object on XML syntax error,
unknown profile_id, or entitlement failure.
Args:
payload_content: The raw ISO 20022 message text.
profile_id: The clearing profile to lint against.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | The clearing profile to lint against. | |
| payload_content | Yes | Raw ISO 20022 payload text (not a path). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description goes further: determinism, no external dependencies (defusedxml), explicit purity statement, and three named error states (XML syntax error, unknown profile_id, entitlement failure). That error-state disclosure is genuinely beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line summary, then labeled sections that make scanning easy. The Args block duplicates the schema and the section headers add slight length, but every section carries non-redundant content, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers everything else an agent needs: scope, timing, exclusions, determinism, dependencies, and error states. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the 'not a path' clarifier for payload_content. The description's Args section largely restates the schema, adding only 'raw ISO 20022 message text' which the schema already conveys. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lint/evaluate) and resource (ISO 20022 payload against a clearing profile), and explicitly names two sibling alternatives (structural XML validators, validate_profile_definition) that it is not. An agent can distinguish it from list_profiles, get_profile, and validate_profile_definition without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' names concrete upstream scenarios (before submitting to CBPR+, SEPA, FedNow) and 'When NOT to use' names the alternative tools for adjacent tasks. This is textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_profilesList clearing profilesARead-onlyIdempotent
List the available clearing profiles as lightweight summaries.
Purpose:
Discover and enumerate all built-in and registered ISO 20022 clearing
profiles, including supported messages and rule counts.
When to use:
Call this tool first to discover valid `profile_id` values before
fetching full profile rules with `get_profile` or linting payloads
with `lint_payload`.
When NOT to use:
Do not use if you need full rule bodies and validation expressions;
use `get_profile` instead.
Behavioral transparency:
- Deterministic: Returns identical summaries for registered profiles.
- External dependencies: None (reads internal registry).
- Side effects: Pure read-only operation; modifies no state.
- Error states: Always succeeds and returns a list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds genuinely new context: determinism across calls, no external dependencies (reads internal registry), and the error state ('always succeeds and returns a list'). Some lines restate the annotations rather than extend them, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the one-line summary precedes the Purpose/When-to-use/When-NOT-to-use/Behavior sections, and the routing advice appears early. The behavioral section is somewhat long and partially duplicates the annotations, which is minor redundancy rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not describe the return shape, and the tool is a parameterless read-only list. An agent has everything needed: purpose, correct call ordering, the sibling to fall back to, and the guarantee of success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline is 4. The description references profile_id values only as outputs to discover, not as inputs, which is consistent with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the available clearing profiles as lightweight summaries') and scopes it to built-in and registered ISO 20022 clearing profiles, including what the summaries contain (supported messages, rule counts). It is clearly distinguishable from get_profile, which returns full rule bodies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to call it ('Call this tool first to discover valid profile_id values before fetching full profile rules with get_profile or linting payloads with lint_payload') and when not to ('Do not use if you need full rule bodies...; use get_profile instead'). It names the sibling alternatives and the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_profile_definitionValidate a profile definitionARead-onlyIdempotent
Validate a bank-supplied profile / rule-pack definition (raw JSON).
Purpose:
Verify that a candidate clearing profile or rule-pack JSON text meets
all schema, syntactic, and semantic requirements.
When to use:
Use before registering new custom bank profiles or importing external
rule packs into the engine.
When NOT to use:
Do not use to validate payment messages; use `lint_payload` instead.
Behavioral transparency:
- Deterministic: Evaluates strictly according to the Pydantic profile
schema.
- External dependencies: None (standard JSON parsing).
- Side effects: Pure read-only validation; does not register the profile.
- Error states: Returns `is_valid: False` with descriptive error details
if validation fails.
Args:
definition_content: The candidate profile definition, as JSON text.
| Name | Required | Description | Default |
|---|---|---|---|
| definition_content | Yes | A profile / rule-pack definition as JSON text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses determinism, absence of external dependencies, that it does not register the profile, and the error-state shape (`is_valid: False` with descriptive details). These are substantive behavioral traits that the annotations alone do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and organized into purpose, usage, behavior, and args sections. Each section carries distinct information with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values in detail, and it still covers error semantics and side effects. It is complete for a validation tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter is already fully documented by the input schema. The description's Args section repeats the same JSON-text semantics without adding format, encoding, or example details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Validate') and resource ('bank-supplied profile / rule-pack definition'), and it explicitly distinguishes that resource from payment messages by naming `lint_payload` as the sibling for the latter case. An agent can identify the tool's domain 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'When to use' and 'When NOT to use' sections, including the condition for registration/import workflows and the alternative sibling `lint_payload` for payment messages. This leaves no ambiguity about selection.
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.
4 tool updates
v0.0.2- First observed
get_profile - First observed
lint_payload - First observed
list_profiles - First observed
validate_profile_definition
TDQS
Scored across 4 tools
Each tool targets a distinct action-resource pair: list_profiles (summaries), get_profile (full rule bodies), lint_payload (payload validation), and validate_profile_definition (profile/rule-pack validation). The descriptions explicitly cross-reference when to use each tool and clarify boundaries, eliminating overlap.
All tool names use a consistent snake_case verb_noun pattern: list_profiles, get_profile, lint_payload, validate_profile_definition. There is no mixing of conventions or vague verbs, making the set highly predictable.
Four tools is well-scoped for a focused ISO 20022 profile server. Each tool has a clear, non-redundant role in discovery, retrieval, payload linting, and definition validation, so every tool earns its place.
The surface covers read and validation workflows (list, get, lint, validate_definition) but lacks any operation to register, update, or delete profiles or rule packs. This is a notable gap because the descriptions mention registering new custom bank profiles and importing external rule packs, yet no such tool exists.
Maintenance
Related MCP Connectors
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that gives AI agents deterministic, verified access to ISO 8583 field specs, MTI decoding, jPOS packager XML generation, deploy descriptor validation, message building, and jPOS documentation search.720 PyPI4MIT
- AlicenseAqualityAmaintenanceMCP server that enables AI agents to parse, validate, and reverse ISO 20022 bank statements, with tools for discovering message types and return reasons.24416 PyPI2Apache 2.0
- AlicenseAqualityAmaintenanceAn 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.16433 PyPI1Apache 2.0
- AlicenseAqualityAmaintenanceMatches expected payments (pain.001) against observed booked entries (camt.053) for ISO 20022 cash reconciliation, providing explainable match results with scoring and classification.10386 PyPI1Apache 2.0