MCP.so
Sign In
Servers

Ontology Mcp Server

@mrcholis

Turn ISO 20022 banking messages into a queryable knowledge graph — accessible to any AI agent via MCP.

Banks, fintechs, and payment processors deal with thousands of ISO 20022 messages daily (pacs.008 payments, camt.056 cancellations, camt.029 responses). These XML files are dense, interconnected, and nearly impossible to query across — until now.

Ontology ingests ISO 20022 XML, extracts structured financial signals, builds an RDF knowledge graph, and exposes it as native tools that any MCP-compatible AI agent can use.

pip install ontology-mcp
python mcp_server.py
# Connect Claude Desktop, Cursor, or any MCP client

Why This Exists

ISO 20022 is the global standard for financial messaging. Every payment, settlement, cancellation, and statement flows through it. But the data is trapped:

  • XML is not queryable — finding "all transactions over $50K involving BLUEUSNY" means grepping through files
  • Messages are interconnected — a camt.056 cancellation references a pacs.008 payment, but they live in separate XML files with no link
  • AI agents can't use it — even with RAG, structured financial data resists naive chunking

Ontology solves all three by building a typed, linked knowledge graph with a natural-language interface.


Quick Start

Docker (easiest)

docker pull ghcr.io/mrcholis/ontology-mcp:latest
docker run ghcr.io/mrcholis/ontology-mcp

Or run the demo:

docker run ghcr.io/mrcholis/ontology-mcp python demo.py

pip install

pip install ontology-mcp
# Or with persistent storage:
pip install "ontology-mcp[oxigraph]"

2. Run the demo

python -m ontology_mcp.demo

This loads sample ISO 20022 messages and shows you what the graph looks like.

3. Fire up the server

python mcp_server.py

4. Connect to Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "ontology": {
      "command": "python",
      "args": ["/path/to/ontology-mcp/mcp_server.py"]
    }
  }
}

Restart Claude. Now you can ask:

"Load the XML files from my messages folder and find all transactions above $50,000 involving BLUEUSNY"

"What is the full lifecycle of cancellation case 20220718USDDSA9407803873?"

"Are there any anomalies or balance mismatches in the loaded data?"


What You Can Do

ToolWhat it does
extract_and_mapParse ISO 20022 XML → signals → RDF, merge into graph
load_xml_fileLoad an XML file from disk and process it
load_output_directoryLoad all pre-built .ttl files from a folder
query_lifecycleFull message chain for a case ID / transaction ID / BIC
sparql_queryRun arbitrary SPARQL against the graph
find_anomaliesFlag high-value transactions, rejected cancellations, balance mismatches
get_institution_activityAll messages for a BIC code, with totals by type
graph_statsTriple count, signal breakdown, BIC inventory
start_stream_serverStart a WebSocket server for streaming XML ingest
push_stream_messagePush an XML message over WebSocket in real-time

Supported Message Types

MessageDescription
pacs.008Payment initiation (FI → FI)
pacs.009Payment settlement
camt.053Account statement
camt.054Debit/credit notification
camt.056Cancellation request
camt.026Unable to apply
camt.029Cancellation response / resolution

Architecture

ISO 20022 XML
    |
    v
FinancialSignalExtractionPipeline   → extracts typed Python signal objects
    |
    v
FinancialSignalToRDFMapper          → maps signals to RDF triples
    |
    v
RDF Knowledge Graph (rdflib / Oxigraph)
    |  queryable via SPARQL
    v
MCP Tools (mcp_server.py)           → exposed over stdio transport
    |
    v
AI Agent / Claude Desktop

Persistent storage uses Oxigraph (RocksDB-backed). Falls back to in-memory rdflib if Oxigraph isn't installed.


Examples

Query a full payment lifecycle

User: What happened with cancellation case 20220718USDDSA9407803873BLUEUSNY001?

Agent: I found 4 messages in the lifecycle:

  1. pacs.008 — Payment initiated (BLUEUSNY → FEDNYUSS)
     $94,078.03 USD on 2022-07-18

  2. camt.056 — Cancellation requested by BLUEUSNY
     Reason: duplicate submission

  3. camt.029 — Cancellation rejected
     Reason: payment already settled

  4. camt.026 — Unable to apply notification sent to BLUEUSNY

Find anomalies

User: Are there any unusual transactions?

Agent: Found 4 high-value transactions (>$50K):
  - TXN_20220718_001: $94,078.03 (BLUEUSNY → FEDNYUSS)
  ...

Found 1 rejected cancellation:
  - Case 20220718USDDSA9407803873: rejected (already settled)

Development

git clone https://github.com/mrcholis/ontology-mcp
cd ontology-mcp
python3.11 -m venv venv311
source venv311/bin/activate
pip install -e ".[all]"

# Run tests
python _test_mcp_v2.py

Roadmap

  • ISO 20022 message support (pacs.008/009, camt.053/054/056/026/029)
  • Persistent Oxigraph storage
  • WebSocket streaming ingest
  • Production IRIs (replace http://example.org/ namespaces)
  • SPARQL HTTP endpoint
  • pain.001 / pain.002 payment initiation messages
  • Docker image for one-command deploy

License

MIT

More from Other