Getting started
Introduction
The Enrich MCP server is a thin wrapper over the existing programmatic /v1 API — it authenticates with the same sk-tm- org key and respects the platform's auth, billing, rate limits and human-in-the-loop plan approval exactly as any other /v1 client would. No separate credential, no separate contract.
Multi-tenant by design: every connecting client sends its own key — a single hosted server can serve many organisations, each billed under their own account. There is no shared fallback credential.
| Client | Auth model | Works today? |
|---|---|---|
| Claude Code | Static Bearer header | Yes |
| Claude Desktop | Static Bearer header | Yes |
| Cursor | Static Bearer header | Yes |
| OpenAI Codex CLI | Static Bearer header | Yes |
| Gemini CLI | Static Bearer header | Yes |
| claude.ai | Static header (beta) or OAuth | Beta, gradual rollout |
| ChatGPT (Developer Mode) | OAuth 2.1 only | Not yet |
ChatGPT's custom connector integration requires a full OAuth 2.1 authorization server (issuer, dynamic client registration) — Enrich's MCP server deliberately keeps auth simple (the same static sk-tm- key as /v1), so ChatGPT can't connect directly yet. Every other client above works the same way: if yours supports custom HTTP headers on a remote MCP server, it'll work even if it isn't listed.
https://enrich.timble.ai/mcp
6 tools, same /v1 backend: enrich_verify run a verification enrich_get_run poll a run enrich_get_report structured report + PDF enrich_approve_plan resolve HITL approval enrich_list_workflows discover workflow slugs enrich_usage credit balance
Getting started
Authentication
Your existing /v1 API key works as-is — no separate credential to generate. Create or find one under Admin → Developers → API Keys. Every MCP client sends it as a standard bearer token.
Bearer sk-tm-... (with the space), not just the bare key. Most clients send the value exactly as entered, with no auto-prefixing.Authorization: Bearer sk-tm-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
401 invalid_token Authorization: Bearer <sk-tm-...> required
Getting started
Connect a client
Pick your client below. Replace sk-tm-... with a real key from Admin → API Keys.
claude mcp add --transport http enrich https://enrich.timble.ai/mcp \ --header "Authorization: Bearer sk-tm-..."Claude Code official MCP docs →
enrich_verify on its own.Reference
Available tools
| Tool | Description |
|---|---|
| enrich_verify | Run a verification in plain language; by default waits for the full result (status, answer, structured report, report_url, credits). |
| enrich_get_run | Poll or re-fetch a run's current state. |
| enrich_get_report | Get the structured report JSON plus a fresh presigned PDF URL. |
| enrich_approve_plan | Approve or decline a plan parked awaiting human approval — see Plan approval below. |
| enrich_list_workflows | List workflows available to your org (pass a slug to enrich_verify as workflow). |
| enrich_usage | Your org's credit balance. |
Guides
Plan approval (human-in-the-loop)
For multi-step verifications the agent may propose a plan before executing checks — a control point for cost and compliance, unless your key is configured to auto-approve.
enrich_verifyreturnsstatus: "requires_approval"with aplan_pending_approvalfield.- Review it, then call
enrich_approve_plan(run_id, decision)—"approved"or"declined". - Approved resumes to completion. Declined ends the run with no further tool calls — only planning work already done is billed.
For unattended/zero-touch use, enable auto-approve plans on the key instead — runs never pause.
enrich_approve_plan( run_id="run_9f3a2c…", decision="approved" // or "declined" )
Guides
Idempotency & retries
Pass idempotency_key to enrich_verify so a retried call — after a network blip or a client-side timeout — replays the original run instead of starting and billing a new one.
Only reuse the same value when retrying the same request. A different key (or omitting it) always starts a fresh, separately-billed verification — even for an identical query.
enrich_verify( query="Verify PAN ABCDE1234F", idempotency_key="order-7841" )
Help
Troubleshooting
| Symptom | Cause & fix |
|---|---|
| 401 invalid_token | No Authorization header reached the server, or it isn't sk-tm--shaped. Confirm your client config actually has the header set — a connector added without one will fail this way. |
| Garbled HTML instead of a clean error | Some clients respond to an unauthenticated 401 by probing for OAuth server metadata — Enrich doesn't use OAuth, so that probe lands on the web app and returns an HTML 404 page, which the client then fails to parse as JSON. Fix the underlying cause: add the Authorization header to your connector config (see Connect above). |
| Tool call fails, Enrich API 401 | The key reached the server but /v1 rejected it — unknown, revoked, or expired. Rotate it under Admin → API Keys. |
| 402 insufficient_credits | Org balance is at or below zero. Check enrich_usage, top up, then retry with the same idempotency_key. |
| No "Request headers" option on claude.ai | That feature is a gradual beta rollout — contact Anthropic for access. Claude Code and Claude Desktop both support header auth today with no waitlist. |
| Run stuck at requires_approval | Call enrich_approve_plan(run_id, decision), or ask your admin to enable auto-approve on the key so future runs never park. |
Enrich MCP Server · Timble Technologies · see also the REST API documentation