{
  "markdown": "# AINumbers MCP Apps Server\n\n[![CI](https://github.com/PostOakLabs/ainumbers-mcp-apps/actions/workflows/ci.yml/badge.svg)](https://github.com/PostOakLabs/ainumbers-mcp-apps/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nAn agent calling a fintech tool by name has no way to know if the tool actually ran the math it claims to have run. This server closes that gap for the AINumbers.co suite: every tool call is deterministic, zero PII, and served straight from the suite's own single-file HTML, not a paraphrase of it.\n\nAn [MCP Apps](https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/) (SEP-1865) server that exposes the [AINumbers.co](https://ainumbers.co) fintech tool suite to any MCP host, including Claude, ChatGPT, M365 Copilot, VS Code, and Cursor.\n\n![baas_provider_comparator, one of the flagship widget tools, the same HTML MCP Apps hosts render inline in chat](docs/mcp-widget-demo.gif)\n\n## Quick start\n\n```bash\n# Claude: Settings -> Connectors -> Add custom connector\nhttps://mcp.ainumbers.co/mcp\n\n# Inspector\nnpx @modelcontextprotocol/inspector   # then Streamable HTTP -> the URL above\n```\n\nNo auth, no API key, no account. Production runs on Cloudflare Workers (`/healthz` reports `runtime: cloudflare-workers`), so there are no cold starts. Cursor and other Open Plugins directories pick this repo up automatically via the root `.mcp.json`, which declares the same endpoint.\n\n**Live endpoint:** `https://mcp.ainumbers.co/mcp` (streamable HTTP) · **Docs:** [ainumbers.co/mcp.html](https://ainumbers.co/mcp.html) · **Registry:** [`co.ainumbers/tools`](https://registry.modelcontextprotocol.io/v0.1/servers?search=co.ainumbers) on the Official MCP Registry\n\n## Run your own (org-hosted)\n\n[![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/PostOakLabs/ainumbers-mcp-apps)\n\nFork this repo and deploy the button above to run the same server inside your own Cloudflare account: no auth to add, no build step at deploy time, the Worker boots straight from the `data/` and `kernels/` already committed here.\n\nTwo edits to `wrangler.jsonc` before that first deploy will succeed on a fresh account:\n\n- **`routes`** points at `mcp.ainumbers.co`, a zone this fork doesn't own. Rename `name` and either delete `routes` (ship on the free `workers.dev` subdomain) or point it at a zone in your own account.\n- **`queues` / `workflows`** feed an internal analytics loop and are guarded in code (`if (env.EVENTS_QUEUE)`, `if (env.RENEWAL_WATCH_WORKFLOW)`) — the MCP handshake and every tool call work without them. Queues need a Workers Paid plan; drop both blocks to stay free-tier.\n\nEverything else, including the `ASSETS` binding serving the committed tool data, works unmodified. Full write-up (WAF rate-limit recipe, re-vendor cadence, conformance-attestation offer): [ainumbers.co/mcp.html#deploy-your-own](https://ainumbers.co/mcp.html#deploy-your-own).\n\n## Tools\n\n**Read-only MCP tools** — count intentionally not hardcoded here (it drifted stale the last time it was). See `data/counts.json` for the live figure; never hand-type this number, `scripts/surface-parity.mjs` and the site repo's count-drift gate both check against it. The flagship widgets below render as interactive widgets, the rest are ChainGraph compute nodes plus a handful of catalog and discovery utility tools: `list_ainumbers_tools`, `find_tool`, `find_chain`, `build_workflow_links`, `run_chain`, `verify_execution_hash`, `build_chaingraph`, `emit_chaingraph_artifact`, `build_session_receipt`.\n\nEvery tool declares `readOnlyHint: true`. No account, no auth, zero PII, nothing mutates state.\n\n### The flagship widgets\n\nEach renders as the actual single-file AINumbers tool, served as a `text/html;profile=mcp-app` resource and driven by the AIN Bridge (prefill, run, Policy Mandate export). This table IS the enumeration — its row count is the widget count, never a number typed elsewhere:\n\n| MCP tool | AINumbers tool |\n|---|---|\n| `baas_provider_comparator` | T152 BaaS Provider Comparator |\n| `validate_ap2_mcp_policy` | T320 AP2 MCP Policy Validator & Bridge |\n| `build_google_ap2_mandate` | T285 Google AP2 Checkout/Payment Mandate Builder |\n| `score_mcp_readiness` | T288 MCP Developer Readiness Scorecard |\n| `agentic_mandate_sandbox` | RBE-06 Agentic Mandate Sandbox |\n| `customer_risk_rating` | T110 Customer Risk Rating Engine |\n| `ap2_aml_mandate_builder` | T131 AP2 AML Mandate Builder |\n| `lint_mcp_tool_definition` | T274 MCP Tool-Definition Linter |\n| `validate_mcp_server_json` | T275 MCP server.json Validator |\n| `compare_agentic_payment_protocols` | T276 Agentic Payments Protocol Comparator |\n| `decode_x402_payment` | T277 x402 Decoder & 402 Flow Simulator |\n| `audit_mcp_oauth` | T278 MCP OAuth 2.1 Authorization Auditor |\n| `scan_tool_poisoning` | T282 MCP Tool-Poisoning Scanner |\n| `validate_a2a_agent_card` | T283 A2A Agent Card Validator |\n| `inspect_visa_tap_signature` | T286 Visa TAP Signature Inspector |\n| `run_kernel_vm` | Kernel VM Widget |\n\n`list_ainumbers_tools` and `find_tool` search the full catalog (see `data/counts.json` for the current tool count) and return deep-links. Prefill-enabled tools accept `#in=<base64url(JSON of {element_id: value})>[&run=1]` for one-click invocation. `find_chain` and `build_workflow_links` return ordered deep-links for a named multi-tool workflow. `run_chain` executes one server-side; each run returns an OpenTelemetry span document as a resource link (one `execute_tool` span per executed step under an `invoke_agent` parent). `verify_execution_hash` independently re-verifies a returned artifact's hash.\n\n## Architecture\n\n```\n../repo (site repo, PostOakLabs/ainumbers)\n   |  chaingraph.json, manifests/, pilot.mjs-referenced tool HTML\n   |\n   v  node generate.mjs (build-time only, cannot run in cloud CI, needs the sibling repo)\ndata/       vendored: chaingraph.json, catalog.json, manifests, counts.json\nkernels/    vendored: server-side compute kernels\n   |\n   v\nworker.mjs  (Cloudflare Workers, this repo's live runtime)\nserver.mjs  (Node/express variant, local dev only, not deployed)\n   |\n   v\nhttps://mcp.ainumbers.co/mcp   (the one live endpoint: the Worker, not the express variant)\n```\n\n`data/` and `kernels/` are generated, committed artifacts. The Worker boots from what's committed, not from a live read of `../repo`. Any change to `chaingraph.json`, a manifest, `pilot.mjs`, or a kernel in the site repo requires re-running `generate.mjs` here and committing `data/` and `kernels/` in the same push, or the worker deploys stale.\n\n## Deploy flow (CI-owned)\n\nBranch, then PR. CI runs the `validate` job: tool-name collisions, surface-parity, kernel coverage, chain validation, vendor-freshness, and a `wrangler deploy --dry-run`. Merging to `master` runs the `deploy` job, which runs `wrangler deploy` against Cloudflare Workers, then a post-deploy `/mcp` smoke test (a real `initialize` call against the live endpoint). No manual `wrangler deploy`, ever: Cloudflare Workers Builds stays disconnected on purpose, since running both is a double-deployer and has caused outages before. A green CI bundle does not by itself prove the live handshake works; only the smoke step does.\n\nDependabot auto-merges every dependency update (patch, minor, and major, all CI-gated), so run `git pull --rebase` before pushing any local branch since `master` moves on its own.\n\n## Independent monitoring\n\n[![MCP Queen grade](https://mcpqueen.com/badge/co.ainumbers/tools.svg)](https://mcpqueen.com/s/co.ainumbers/tools)\n\n[MCP Queen](https://mcpqueen.com) is a third-party operational probe: it continuously re-checks the live `/mcp` endpoint's protocol handshake and tool-schema responses and grades what it observes. This is not a security or compliance attestation, ours or theirs — it describes observable server behavior only.\n\n## Develop\n\n```bash\nnpm install\nnode generate.mjs   # re-vendor tool HTML + manifests + catalog + kernels from ../repo into data/ + kernels/\nnpm start           # http://localhost:3300/mcp (+ /healthz), Node/express variant (server.mjs), local dev only\nnode scripts/check-tool-names.mjs   # verify no mcp_name collision before pushing\nnode scripts/surface-parity.mjs     # verify counts.json matches the registered surface\n```\n\n`pilot.mjs` is the single source of truth for the widget tool set. After changing any pilot tool in the site repo, run `node generate.mjs`, commit `data/` and `kernels/`, and push. CI validates and deploys.\n\nAll tool content is client-side, deterministic, and zero PII. Code is MIT licensed (see `LICENSE`); content is CC BY 4.0, Post Oak Labs. See `README-SPEC.md` for architecture and history.\n\n<!-- automerge-label.yml end-to-end proof, WORKER-VENDOR-LAND-0817-2 addendum, 2026-08-17 -->\n\n",
  "bytes": 8857,
  "sha": "2ed807fcee71390559d34ec7559f9febd0535b621ea23a46934c86b9e978ee64",
  "repo_slug": "postoaklabs/ainumbers-mcp-apps",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_co_ainumbers_tools_9ae91bdf/readme"
}