Quickstart
From nothing to a verified tool call with a signed receipt. No card, no application, no approval — 25 free accepted calls over 14 days, once for your workspace across every product.
Free to start
One connection, four steps
You do not create a key per server. One Jithox connection reaches every live tool and the free Labs tools; the credential is shown once on your account page and travels only as a bearer header.
1Endpoint
POST https://jithox.com/api/agent-connection/v1/mcp — Streamable HTTP, JSON answers, MCP 2025-06-18. initialize and tools/list need no credential.
2Authenticate
Authorization: Bearer <PASTE_YOUR_JITHOX_CONNECTION> — the connection credential from /mcp/account, or a ten-minute token from https://jithox.com/api/oauth/token (client_credentials: client_id = connection id, client_secret = the credential).
3Call
tools/call with the tool name exactly as listed and an x-jithox-idempotency-key; only an accepted answer is charged, at the price the tool's description states.
4Receipt
_meta.receipt (the server's signed receipt) and _meta.jithoxConnection.receiptReference in every accepted answer; your account page lists them.
The shortest working configuration for your client
Official endpoint, a safe placeholder, the minimum fields — and the exact status of each snippet. CERTIFIED means a real client completed a call on production; nothing is CERTIFIED yet.
Run it once in a terminal where Claude Code is installed, with the credential from your account page in place of <PASTE_YOUR_JITHOX_CONNECTION>. Claude Desktop: Settings → Connectors → Add custom connector with the endpoint and the same Authorization header.
claude mcp add --transport http jithox https://jithox.com/api/agent-connection/v1/mcp --header "Authorization: Bearer <PASTE_YOUR_JITHOX_CONNECTION>"Claude Desktop and Claude Code speak MCP over Streamable HTTP with OAuth.
The public terminal package is currently unavailable. Use the native client configuration above. How the Connect Kit works
One safe test
First list the tools (free, no credential), then one read-only accepted call with a public company VAT number. Replace the placeholder with your own credential; never paste a credential anywhere else.
curl -sS https://jithox.com/api/agent-connection/v1/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'curl -sS https://jithox.com/api/agent-connection/v1/mcp \
-H "Authorization: Bearer <PASTE_YOUR_JITHOX_CONNECTION>" \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-H 'x-jithox-idempotency-key: first-call-1' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"validate_vat_number","arguments":{"vatNumber":"BE0403170701"}}}'Every refusal names its way out
A stable code, a plain explanation, the safe next step, the human page, and a machine-readable action in error.data.recovery. The same words the funnel records.
| Code | JSON-RPC | What happened | Next step | Action |
|---|---|---|---|---|
| parse_error | -32700 | The body was not valid JSON. | Send one JSON-RPC 2.0 object per POST. page | fix_request |
| invalid_request | -32600 | The request is not a JSON-RPC 2.0 object, or it is a batch or too large. | Send one object with jsonrpc, id, method and params, under 64 KB. page | fix_request |
| method_not_found | -32601 | This gateway serves initialize, ping, tools/list and tools/call only. | Use tools/list to see what exists, then tools/call. page | fix_request |
| invalid_params | -32602 | The tool refused the arguments before running anything. Nothing was charged. | Read data.issues, fix the arguments, and call again with a new idempotency key. page | fix_request |
| unauthorized | -32001 | No valid Jithox connection credential was presented, or the connection is revoked or expired. | Create a connection on the account page and send it as Authorization: Bearer. page | create_connection |
| not_entitled | -32002 | The tool is not on sale right now, or the server refused the call for this workspace. Nothing was charged. | Choose a live tool from tools/list, or ask the owner to check the workspace on the account page. page | choose_another_tool |
| insufficient_scope | -32003 | This connection does not carry the scope the tool needs. | Ask the owner for a connection that carries it; the challenge header names the scope. page | ask_owner |
| budget_exceeded | -32004 | The per-call or daily budget of this connection would be exceeded. Nothing was charged. | Ask the owner to raise the budget on the account page, or wait for the next UTC day. page | ask_owner |
| rate_limited | -32005 | Too many requests from this origin in one minute. | Wait for the Retry-After window and try again. page | slow_down |
| replayed_request | -32006 | This idempotency key was already used on this connection; the earlier outcome stands and nothing ran twice. | Read data.earlier_outcome; to run again on purpose, use a new idempotency key. page | new_idempotency_key |
| tool_not_found | -32010 | No tool with this exact name exists on this gateway. | Use the names from tools/list exactly as listed. page | choose_another_tool |
| upstream_unavailable | -32011 | The server that owns the tool did not answer. Nothing ran and nothing was charged. | Try again in a moment with a new idempotency key. page | retry_later |
| store_unavailable | -32012 | The connection store or the key vault is not answering, so budgets and keys cannot be checked. Nothing ran and nothing was charged. | Try again shortly. page | retry_later |
| credential_unavailable | -32013 | This connection holds no server key for the product yet. | Open the account page: the connection can create one, or replace a key made by hand — never silently. page | check_connection |
Prefer the guided route? The Setup Doctor asks which AI you use, hands you the same snippet and checks what you pasted. The steps below are the long way: one key per server, which still works.
The long way: one key per server
1Discover what exists and what it costs — no account
Two public documents, no key and no account. The first lists every server, its endpoint and its tools and says which are publicly available; the second is the only price that counts, per product and per tool, with the free allowance and the rules for what is charged.
curl -sS https://jithox.com/api/capabilities/v1 curl -sS https://jithox.com/api/pricing/v1
If you are an agent rather than a person, the agent context names every canonical document and what each is authoritative for, and SKILL.md is the same onboarding as an instruction file you can load.
2Create an account and a key
Sign up, verify your e-mail, then create an MCP credential from your dashboard. The credential is shown once — copy it immediately. If you lose it, rotate it; you never have to pay twice and your balance is untouched by a rotation.
One key per server, created on that server’s connect page and shown once:
3Point your MCP client at the endpoint
Each product is its own MCP server with its own OAuth resource, so a token minted for one is refused by another. That is deliberate: a credential cannot spend somewhere you did not intend.
| Product | MCP endpoint |
|---|---|
| Jithox E-Invoice | https://mcp.jithox.com/mcp |
| EU Import Preflight | https://import.mcp.jithox.com/mcp |
| EU Energy Label Preflight | https://energy.mcp.jithox.com/mcp |
| EU Counterparty Sanctions Preflight | https://sanctions.mcp.jithox.com/mcp |
Authentication is OAuth 2.1 with PKCE (S256, mandatory). Your client discovers the authorization server from /.well-known/oauth-protected-resource and registers itself — you paste your access key once on the consent screen, and the client keeps a refreshing connection. Discovery below needs none of that; a paid tool call does.
4List the tools — copy, paste, run (no key needed)
Discovery is open on every server: initialize and tools/listneed no token and cost nothing. These two commands run in a bare terminal exactly as written — swap the URL for another product’s endpoint from the table above to explore it instead.
curl -sS https://mcp.jithox.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"quickstart","version":"1"}}}'
curl -sS https://mcp.jithox.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'initializereturns the server’s name and protocol version; tools/list returns the tools and their input schemas. Both answer with plain JSON — there is no session header to carry between requests.
5Make your first call — from an MCP client, or from a terminal
A tool call spends a free call or balance, so it needs your key. An MCP client exchanges it for an OAuth token on the consent screen; a terminal sends the key itself as a bearer token and needs no browser. Every client needs the same thing — the endpoint. In VS Code that is .vscode/mcp.json:
{
"servers": {
"jithox-einvoice": {
"type": "http",
"url": "https://mcp.jithox.com/mcp"
}
}
}Claude Desktop has no file for remote servers — open Settings → Connectors → Add custom connector and paste the same URL. Whatever the client, it discovers the authorization server, registers itself, and opens a consent screen where you paste your access key once. The connect page has the exact steps for VS Code, Cursor, Claude Desktop and any generic client.
A structural VAT check is the fastest way to see the whole path — decision, evidence and a signed receipt. Ask your client to run validate_vat_number on BE0403170701. From a terminal it is one JSON-RPC request carrying your key as a bearer token. In Bash or Zsh the key is read into $JITHOX_ACCESS_KEY silently, so it never lands in shell history:
# Bash/Zsh (read -rs is not POSIX sh). Paste the key when prompted; it is read silently and never lands in shell history.
read -rs JITHOX_ACCESS_KEY && export JITHOX_ACCESS_KEY
curl -sS https://mcp.jithox.com/mcp \
-H "Authorization: Bearer $JITHOX_ACCESS_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"validate_vat_number","arguments":{"vatNumber":"BE0403170701"}}}'
# Clear the key from this shell when you are done:
unset JITHOX_ACCESS_KEYThe result carries a machine-readable decision state, the evidence behind it, and a _meta.receiptyou can verify offline against the server’s published public key. Without a key this exact call returns 401 and runs nothing; a key this server does not accept is refused as invalid_api_key. Neither is ever charged.
6Know what a call costs before you make it
Prices are server-side and per accepted call. Your client never sends an amount, and nothing a client says can change a price.
| Product | Price per accepted call | Tools |
|---|---|---|
| einvoice | €0,10 | 5 |
| eu-import-preflight | €0,25 | 5 |
| eu-energy-label-preflight | €0,25 | 5 |
| eu-sanctions-preflight | €0,50 | 5 |
Every row here is read from the running price catalog at request time, so the products shown are exactly the ones on sale right now. If an official source is down, that product’s calls return a truthful unavailable and cost €0,00 — the price is what a call costs, not a promise the source is up this second.
7When the free calls run out
The server answers 402 payment_required with a typed payment_required object on the error: the product and tool, why (budget_exhausted or entitlement_required), the amount required in cents, your remaining free calls, and the pricing and checkout URLs to act on. chargeable is always false: it does not execute, does not charge, and does not upgrade you to anything. Add prepaid credit and repeat the same call.
- One balance covers every product — spend it wherever you like.
- Credit does not expire and there is no automatic top-up.
- Tax is charged on top of credit and is never spendable.
- A refund reverses credit; it never creates a negative balance.
8Keep the receipt, and verify it without asking us
Every accepted call answers with _meta.receipt: an Ed25519 signature over what was asked, what was answered and when. The public key is published separately from the receipt, so verifying one is a local computation — the receipt verification guide walks through it with the exact commands.
# The key that signs this server's receipts (every server publishes its own): curl -sS https://mcp.jithox.com/receipts/public-key.pem
Your calls and every receipt they produced are also listed on your usage page.
Troubleshooting
| You see | What it means |
|---|---|
| 401 | No valid token. Re-run the OAuth flow; your client should do this for you. |
| 403 | The token is valid but not for this resource or scope — check you are calling the product you authorized. |
| 404 / 405 | Wrong URL or method. The endpoint answers POST at the paths above; a plain browser GET returning 405 is the server working, not an outage. |
| 402 payment_required | Free calls used up and the balance cannot cover this call. Add credit and retry the same request. |
| 429 rate_limited | Too many calls too quickly. Honour the retry-after header; nothing was charged. |
| 503 canary_disabled | The operator paused this server. Nothing was executed and nothing was charged. |
| unavailable / source_unavailable | An upstream official source did not answer. You get a truthful non-answer, never a guess, and it costs €0,00. |
| Credential rejected after rotation | The old credential is contained on purpose. Use the new one; your balance and free calls are unchanged. |
Something not covered here? Contact — include the correlation id from the error body and we can trace the exact call.
These figures are read from the running price catalog at request time, so this page cannot promise a price the server does not charge.