Payment Reconciliation Copilot
Enables investigation of Adyen payment event data, including duplicate-charge detection, stuck-refund analysis, and out-of-order webhook identification, with read-only and escalation tools.
Enables investigation of Stripe payment event data, including duplicate-charge detection, stuck-refund analysis, and out-of-order webhook identification, with read-only and escalation tools.
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., "@Payment Reconciliation CopilotWhy did I get charged twice for order ORD-DUP-001?"
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.
Payment Reconciliation Copilot
A small, safety-bounded MCP server for operations investigations such as “I was charged twice” and “my refund never arrived.” It turns normalized payment-event data into an auditable timeline, detects defined reconciliation anomalies, and creates a human-review escalation. It never executes, retries, captures, voids, or refunds payments.
Try the hosted service
Endpoint | URL |
Welcome |
|
Health |
|
Streamable HTTP MCP |
|
The hosted deployment contains synthetic data only. Configure any MCP client that supports Streamable HTTP with the /mcp URL. Client configuration syntax varies; conceptually:
{
"mcpServers": {
"payment-reconciliation": {
"url": "https://transactions-mcp.onrender.com/mcp"
}
}
}After connecting, ask the client or its LLM:
Investigate the duplicate-charge complaint for
ORD-DUP-001. Use the connected tools, propose a resolution, and do not execute a payment action.
Related MCP server: Commerce Incident Investigator MCP Server
What it does
Finds a transaction from an order ID, customer email, or amount plus date range.
Returns its normalized event timeline and any payload conflicts.
Detects duplicate-charge, stuck-refund, and out-of-order-webhook evidence.
Produces one diagnostic escalation per anomaly for human review.
The design is intentionally read-heavy. Only anomalies and escalations may be written; transactions, provider state, and payment state are never changed by MCP tools.
MCP tools
Tool | Input | Result | Safety boundary |
|
| Transaction summary records | Read-only |
|
| Ordered normalized events and linked conflicts | Read-only |
|
| Existing or newly detected anomaly records | Writes only idempotent anomaly audit records |
|
| Existing or newly created escalation with reasoning | Writes only one diagnostic escalation; never executes anything |
Data model and idempotency
The database, not application memory, enforces the important guarantees:
Guarantee | Database constraint | Retry behavior |
First provider event wins |
| A conflicting later payload is recorded in |
One conflict per distinct conflicting payload |
| Repeated delivery of the same conflict does not create another row. |
Same evidence, same anomaly |
| Detection updates only |
One escalation per anomaly |
| Retried proposals return the same escalation regardless of status. |
evidence_hash is generated from canonically ordered evidence event IDs and the detection window. This makes detection retries safe while allowing new evidence to produce a separate anomaly.
Demo scenarios
The synthetic seed contains 24 transactions across MockStripe and MockAdyen:
Scenario | Order ID | Expected result |
Duplicate charge |
|
|
Stuck refund |
|
|
Out-of-order webhook |
|
|
Conflicting provider payload |
| Timeline includes an |
For the duplicate case, call detect_anomaly twice and then call propose_resolution twice. The anomaly and escalation IDs should remain stable across retries.
Run locally
Prerequisites
Node.js 20+
PostgreSQL database dedicated to this synthetic demo
Setup
npm ci
Copy-Item .env.example .env
# Set DATABASE_URL in .env to a disposable local/development Postgres database.
npm run db:migrate
npm run db:seedWarning:
npm run db:seeddeletes all records in this project’s six tables before rebuilding the deterministic synthetic fixtures. Never run it against real, shared, or production-like data.
Commands
npm run dev # Local development server with tsx watch
npm run build # Emit production JavaScript to dist/
npm run start # Run compiled production server
npx tsc --noEmit # Strict type check
npm run test -- --run # Focused integration suite
npm run db:generate # Generate a Drizzle migration after schema changes
npm run db:migrate # Apply pending migrations
npm run db:seed # Reset and seed the synthetic databaseLocal endpoints are http://localhost:3000/, /health, and /mcp.
Test and verification
The focused integration suite uses the real disposable Postgres database and resets synthetic fixtures before each test:
npm run test -- --runIt verifies:
find_transactionrejects ambiguous input and does not change mutable records.get_transaction_timelinereturns linked payload conflicts without writes.Calling
detect_anomalyrepeatedly returns one anomaly for the same evidence.Calling
propose_resolutionrepeatedly returns one escalation, including after escalation status changes.
For hosted verification, connect an MCP client to the deployed /mcp URL and run the duplicate-charge workflow in Demo scenarios. The deployment was also exercised through an LLM-connected MCP client.
Deployment
The service is deployed to Render as a Node web service. Its production build compiles TypeScript before starting Node:
Build command: npm ci --include=dev && npm run build
Start command: npm run start
Health check: /healthRuntime variables required by the service:
DATABASE_URL=<isolated synthetic/demo PostgreSQL connection string>
NODE_ENV=production
DB_POOL_MAX=3Do not run the destructive synthetic seed automatically on every deployment. Apply migrations and seed a new isolated demo database deliberately.
Project layout
src/db/ Drizzle schema, pooled client, and deterministic seed
src/reconciliation/ Lookup, timeline, anomaly, and escalation behavior plus tests
src/mcp/ MCP server and tool registrations
src/index.ts Streamable HTTP endpoint, welcome/health routes, shutdown handling
drizzle/ Generated SQL migrations
ASSUMPTIONS_AND_EXCLUSIONS.md
AI_WORKLOG.md
WALKTHROUGH_SCRIPT.mdSubmission assets
Safety reminder
This is a synthetic-data demonstration. The public endpoint is unauthenticated by intentional assignment scope, so it must never be pointed at real customer, transaction, or payment-provider data.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only checks for proposed orders against evidence and policy; no trading or payment authority.
Read-only MCP over your own revenue and net margin across 14 billing rails
Read-only finance and operations controls for AI agents with evidence and safe next actions.
Preflight x402 payment compatibility with structured risk evidence and remediation guidance.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server for investigating payment/webhook drift, classifying order status mismatches, detecting duplicate charges, and escalating findings for human review. It is read-only for payment state and does not automatically retry or correct transactions.-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to investigate commerce incidents where a payment was captured but no order was created, by checking payment/order status and creating or updating incident escalations for human review. It also provides tools to list open escalations and check escalation status, without ever taking automated corrective action.-
- AlicenseNot gradedqualityBmaintenanceEnables agents to interrogate payment routing decisions through six tools: route transactions, explain decisions, simulate scenarios, inspect segment evidence, normalize decline codes, and review backtest summaries. It provides read-only access to the routing engine, allowing natural-language queries without modifying any decisions.MIT
- AlicenseAqualityBmaintenanceEnables agents to query a read-only ledger of machine payments, exposing tools for spending totals, purchases with event chains, verdicts, payer passports, and fiscal reporting data.7MIT