IoMarkets.tech ISO 20022 Test Bench
io.github.SergoVashakmadze/iomarkets-techSergoVashakmadzestreamable-httpv1.0.0Scanned
Check ISO 20022 messages (pacs.008, pain.001, camt.053, seev.031) against schema and rules.
23 tools: 7 change things and 16 only read.
- Reads private data · 5
- Reads text others write · 9
- Can send data out · 0
- 1 finding
Tools listed without sign-in. Remote posture
Anlyon alternative
7 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
23 tools
Changes things 7Claude Code: ask
check_token_contractCheck a token contract against the Tokenized Asset Map: is it the issuer's own contract for a tokenized fund or security on that chain?No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Check a token contract against the Tokenized Asset Map: is it the issuer's own contract for a tokenized fund or security on that chain? Verdicts: official, other-chain (the address is listed, but on another chain), impostor (a listed symbol on this chain, a different contract), unknown (not in the map, which says nothing either way).
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
estimate_data_api_costWhat a monthly volume of Data API calls costs at the per-call x402 prices, against the indicative subscription plans.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it What a monthly volume of Data API calls costs at the per-call x402 prices, against the indicative subscription plans. Give calls per month for each route; routes left out count as zero.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
explain_issueWhat a Test Bench issue code (such as IBAN_CHECKSUM, BALANCE_MISMATCH or OUT_OF_ORDER) means and how to fix it.1 finding
Why it is in this group
- The name "explain_issue" says "explain": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "explain_issue" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "explain_issue" says "explain": a word for reading.
Description, as the server wrote it What a Test Bench issue code (such as IBAN_CHECKSUM, BALANCE_MISMATCH or OUT_OF_ORDER) means and how to fix it. Without a code, lists every code.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
holdings_calendarFor a list of holdings (tickers, CIKs or FIGIs), every ex-date, record date, payment date and effective date in one week, day by day.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it For a list of holdings (tickers, CIKs or FIGIs), every ex-date, record date, payment date and effective date in one week, day by day. The week holding `day`, Monday to Sunday; this week by default. Ends with an iCalendar (webcal) subscription URL for those holdings, to give the user for their calendar app.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
token_corporate_actionsFor a token contract that the Asset Map lists as a tokenized stock or ETF (such as an xStock): the security it tracks, and that security's dividends, splits and mergers from the co…No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it For a token contract that the Asset Map lists as a tokenized stock or ETF (such as an xStock): the security it tracks, and that security's dividends, splits and mergers from the corporate actions feed, each with what it does to the token. Answers 'I hold this token; what is coming?' in one call.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
verify_execution_reportCheck the whole JSON that POST https://api.iomarkets.tech/v1/proof/execution returned ({ audit, summary, attestation }): that the ed25519 signature matches the published IoMarkets …Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Check the whole JSON that POST https://api.iomarkets.tech/v1/proof/execution returned ({ audit, summary, attestation }): that the ed25519 signature matches the published IoMarkets key, that its USDC payment is confirmed on Algorand mainnet (a public indexer IoMarkets does not run), that the rows hash to the signed audit_sha256, and that every row and the summary recompute with the API's own scoring, against the last trade and against the arrival mid (side-aware cost, qty-weighted averages, spread, matched and unmatched fills). The same checks as the page at https://iomarkets.tech/execution-check. Returns each check, and the recomputed summary as structured data.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
verify_proofCheck a signed proof (the { payload, signature } JSON a Data API proof route returns): that the ed25519 signature matches the published IoMarkets key, and that its USDC payment is …Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Check a signed proof (the { payload, signature } JSON a Data API proof route returns): that the ed25519 signature matches the published IoMarkets key, and that its USDC payment is confirmed on Algorand mainnet (looked up on a public indexer IoMarkets does not run).
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
Only reads 16Show 16 read-only tools
explain_execution_requestExactly how to call POST https://api.iomarkets.tech/v1/proof/execution, the paid best-execution audit: the body (pair, one of BTC-USDC, ETH-USDC, SOL-USDC, and fills: ts, fill_pric…No findings
Why it is in this group
- The name "explain_execution_request" says "explain": a word for reading.
Description, as the server wrote it Exactly how to call POST https://api.iomarkets.tech/v1/proof/execution, the paid best-execution audit: the body (pair, one of BTC-USDC, ETH-USDC, SOL-USDC, and fills: ts, fill_price, qty, side), the limits (fills per call, how old a fill may be, how close the market trade must be), the price, what comes back, and the answers that are not charged (400 for a bad body or an unsupported pair, 422 when no fill matches a trade). Give a draft body to check it with the API's own validation first. Read from the API's code; this tool calls nothing and pays nothing.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
explain_termA plain-English meaning of a word used on the site (ISO 20022, schema, IBAN, BIC, LEI, ISIN, UETR, CBPR+, x402, signed proof, MCP…) or of an ISO 20022 XML tag abbreviation such as …No findings
Why it is in this group
- The name "explain_term" says "explain": a word for reading.
Description, as the server wrote it A plain-English meaning of a word used on the site (ISO 20022, schema, IBAN, BIC, LEI, ISIN, UETR, CBPR+, x402, signed proof, MCP…) or of an ISO 20022 XML tag abbreviation such as GrpHdr, CdtrAcct or IntrBkSttlmAmt. Without a term, lists the words.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_api_statusWhether the Data API at https://api.iomarkets.tech is answering right now, from its /health check.Reads text others writeNo findings
Why it is in this group
- The name "get_api_status" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- untrusted-inputThe description's first sentence says "http": it reads web pages, which anyone can write.
Description, as the server wrote it Whether the Data API at https://api.iomarkets.tech is answering right now, from its /health check.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
get_corporate_actionOne event in full: every date and term, the filing and the sentence or table row it came from, tokenized versions in the Asset Map, and the event as an ISO 20022 seev.031.001.14 no…Reads private dataNo findings
Why it is in this group
- The name "get_corporate_action" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "table": it reads databases.
Description, as the server wrote it One event in full: every date and term, the filing and the sentence or table row it came from, tokenized versions in the Asset Map, and the event as an ISO 20022 seev.031.001.14 notification (checked by the Test Bench).
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_guideStep-by-step instructions, with the exact button names, for one task on iomarkets.tech (checking a message, CI, verifying a proof, calling the Data API…).Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_guide" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "message": it reads messages.
- untrusted-inputThe description's first sentence says "message": it reads messages, which other people can write.
Description, as the server wrote it Step-by-step instructions, with the exact button names, for one task on iomarkets.tech (checking a message, CI, verifying a proof, calling the Data API…). Without a task, lists the tasks.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_overviewWhat IoMarkets.tech is and what is built: the ISO 20022 Test Bench, the Data API (market data for AI agents, paid per request over x402), the main pages, and what comes next.No findings
Why it is in this group
- The name "get_overview" says "get": a word for reading.
Description, as the server wrote it What IoMarkets.tech is and what is built: the ISO 20022 Test Bench, the Data API (market data for AI agents, paid per request over x402), the main pages, and what comes next.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_roadmapWhat IoMarkets.tech has built and is building next, in the same words as iomarkets.org/roadmap.No findings
Why it is in this group
- The name "get_roadmap" says "get": a word for reading.
Description, as the server wrote it What IoMarkets.tech has built and is building next, in the same words as iomarkets.org/roadmap.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_sampleThe XML of one sample message from list_samples, to use as a starting point or in tests.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_sample" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "message": it reads messages.
- untrusted-inputThe description's first sentence says "message": it reads messages, which other people can write.
Description, as the server wrote it The XML of one sample message from list_samples, to use as a starting point or in tests. Every party and account in it is made up.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
get_tokenized_assetOne Asset Map entry in full: the security, every token contract chain by chain, the issuer sources each comes from, and whether its IoMarkets signature verifies.No findings
Why it is in this group
- The name "get_tokenized_asset" says "get": a word for reading.
Description, as the server wrote it One Asset Map entry in full: the security, every token contract chain by chain, the issuer sources each comes from, and whether its IoMarkets signature verifies.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
list_corporate_actionsCorporate actions of US-listed companies from their own SEC EDGAR filings (8-Ks of US companies, 6-Ks of foreign private issuers): cash dividends (amount in the stated currency, pe…No findings
Why it is in this group
- The name "list_corporate_actions" says "list": a word for reading.
Description, as the server wrote it Corporate actions of US-listed companies from their own SEC EDGAR filings (8-Ks of US companies, 6-Ks of foreign private issuers): cash dividends (amount in the stated currency, per share or per ADS, ex, record and payment dates), stock splits, reverse splits and completed mergers (cash or shares per share). Filter by holdings (tickers, CIKs or FIGIs), by days (any of an event's dates between from and to) and by type. Each event links its filing and the sentence or table row it was read from. Also gives the iCalendar subscription URL for the same holdings and types (calendarUrl in structuredContent).
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
list_data_endpointsThe Data API routes at https://api.iomarkets.tech, what each returns and its price per call in USDC, with how an AI agent pays (x402 on Algorand mainnet, no account).Reads text others writeNo findings
Why it is in this group
- The name "list_data_endpoints" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "http": it reads web pages, which anyone can write.
Description, as the server wrote it The Data API routes at https://api.iomarkets.tech, what each returns and its price per call in USDC, with how an AI agent pays (x402 on Algorand mainnet, no account).
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
list_messagesThe ISO 20022 message types and versions the Test Bench checks, with what each is for.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "list_messages" says "list": a word for reading.
What it can reach
- private-dataThe name "list_messages" says "list" and "message": it reads messages.
- private-dataThe description's first sentence says "message": it reads messages.
- untrusted-inputThe name "list_messages" says "list" and "message": it reads messages, which other people can write.
- untrusted-inputThe description's first sentence says "message": it reads messages, which other people can write.
Description, as the server wrote it The ISO 20022 message types and versions the Test Bench checks, with what each is for.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
list_samplesThe Test Bench sample library: a valid message of each type and broken ones, each with the issue code it raises.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "list_samples" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "message": it reads messages.
- untrusted-inputThe description's first sentence says "message": it reads messages, which other people can write.
Description, as the server wrote it The Test Bench sample library: a valid message of each type and broken ones, each with the issue code it raises. Use get_sample for the XML.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
list_tokenized_assetsThe securities in the Tokenized Asset Map with their identifiers (FIGI, ISIN where the issuer gives it) and the chains they are tokenized on.No findings
Why it is in this group
- The name "list_tokenized_assets" says "list": a word for reading.
Description, as the server wrote it The securities in the Tokenized Asset Map with their identifiers (FIGI, ISIN where the issuer gives it) and the chains they are tokenized on. Optionally filter by issuer, name, symbol, ticker, ISIN or FIGI.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
validate_messageCheck one ISO 20022 XML message (pacs.008.001.08, pacs.009.001.08, pacs.002.001.10, pacs.004.001.09, pain.001.001.09, camt.053.001.08, camt.054.001.08 or seev.031.001.14) against t…No findings
Why it is in this group
- The name "validate_message" says "validate": a word for reading.
Description, as the server wrote it Check one ISO 20022 XML message (pacs.008.001.08, pacs.009.001.08, pacs.002.001.10, pacs.004.001.09, pain.001.001.09, camt.053.001.08, camt.054.001.08 or seev.031.001.14) against the official base schema, then business rules (check digits, totals, cross-element rules, market practice). Returns valid or not, and every problem with its line, element path, stable code and a plain reason. The message type is read from the namespace. The message is checked and not stored. Same code as https://iomarkets.tech/test-bench.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
verify_asset_with_issuerFetch the issuer's own sources for one Asset Map entry now (its contracts page, its public API, or its stellar.toml) and confirm every listed contract is still there, so trust need…Reads text others writeNo findings
Why it is in this group
- The description's first verb is "fetch": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Fetch the issuer's own sources for one Asset Map entry now (its contracts page, its public API, or its stellar.toml) and confirm every listed contract is still there, so trust needn't rest on IoMarkets.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.
- Reads private data5
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write9
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Remote posture
What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.
Looked at Oct 30, 2026, 22:19 UTC, unchanged since Oct 30, 2026. No credentials were sent and no tool was called. What is looked at.
- Reachable
- yes
- HTTP status of an anonymous initialize
- 200
- tools/list served without credentials
- yes
- Tools that change things, listed without credentials
- 7
- Protocol version
- 2025-06-18
- WWW-Authenticate on 401
- not observed
- resource_metadata in WWW-Authenticate
- not observed
- RFC 9728 protected resource metadata
- not observed
- Authorization servers
- not observed
- Legacy HTTP+SSE transport
- no
- Dynamic client registration
- not observed
- Client ID metadata documents
- not observed
- WarnThe whole server
The endpoint served tools/list without credentials, and the list has 7 tools that change things (7 write). Whether a call also works without credentials was not tested: tools are never called.
What this check looks forMatched text
https://iomarkets.tech/mcp: tools/list returned 23 tools to an anonymous client, including explain_issue (write), estimate_data_api_cost (write), verify_proof (write), verify_execution_report (write), check_token_contract (write) and 2 more
Findings
Matches of fixed checks, with the text they matched.
- Warnexplain_issue
The server marks "explain_issue" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "explain_issue" says "explain": a word for reading.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http iomarkets-tech https://iomarkets.tech/mcpclaude mcp add --transport http iomarkets-tech https://iomarkets.tech/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__iomarkets-tech__get_overview",
"mcp__iomarkets-tech__get_guide",
"mcp__iomarkets-tech__explain_term",
"mcp__iomarkets-tech__list_messages",
"mcp__iomarkets-tech__validate_message",
"mcp__iomarkets-tech__list_samples",
"mcp__iomarkets-tech__get_sample",
"mcp__iomarkets-tech__list_data_endpoints",
"mcp__iomarkets-tech__get_api_status",
"mcp__iomarkets-tech__explain_execution_request",
"mcp__iomarkets-tech__list_tokenized_assets",
"mcp__iomarkets-tech__get_tokenized_asset",
"mcp__iomarkets-tech__verify_asset_with_issuer",
"mcp__iomarkets-tech__list_corporate_actions",
"mcp__iomarkets-tech__get_corporate_action",
"mcp__iomarkets-tech__get_roadmap"
],
"ask": [
"mcp__iomarkets-tech__explain_issue",
"mcp__iomarkets-tech__estimate_data_api_cost",
"mcp__iomarkets-tech__verify_proof",
"mcp__iomarkets-tech__verify_execution_report",
"mcp__iomarkets-tech__check_token_contract",
"mcp__iomarkets-tech__holdings_calendar",
"mcp__iomarkets-tech__token_corporate_actions"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as iomarkets-tech. Review it before you use it.
Capability tags behind 10 rules
- mcp__iomarkets-tech__get_guide private-data, untrusted-input
- mcp__iomarkets-tech__list_messages private-data, untrusted-input
- mcp__iomarkets-tech__list_samples private-data, untrusted-input
- mcp__iomarkets-tech__get_sample private-data, untrusted-input
- mcp__iomarkets-tech__list_data_endpoints untrusted-input
- mcp__iomarkets-tech__get_api_status untrusted-input
- mcp__iomarkets-tech__verify_proof untrusted-input
- mcp__iomarkets-tech__verify_execution_report untrusted-input
- mcp__iomarkets-tech__verify_asset_with_issuer untrusted-input
- mcp__iomarkets-tech__get_corporate_action private-data
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/io.github.SergoVashakmadze/iomarkets-tech/verify?hash=dd1101d9d271180a178a7ad77a492d97a62002e02fcc43d83c1a543bb9503733" | jq -e '.changed == false'Pinned hash dd1101d9d271, from Oct 30, 2026, 22:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.github.SergoVashakmadze/iomarkets-tech/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.github.SergoVashakmadze/iomarkets-tech)Source: MCP Registry. Synced Oct 30, 2026, 22:17 UTC.