← Docs

Programmatic Zambo MCP usage

Zambo exposes one hosted HTTP JSON-RPC endpoint. Connect one server, use the default catalog, search for specialists in-session, and preserve the receipt returned with every real result.

Connection

POST https://zambo.dev/mcp
Content-Type: application/json

The free path is metered per tool per UTC day. A normal call returns a JSON-RPC result and a verifiable receipt. HTTP 402 means the caller's quota is exhausted and includes a payment next step; HTTP 429 means a provider or transport throttle and should be retried after the returned delay. Do not treat either response as a successful execution.

Python transport with a complete response-body read

import json
import time
import urllib.error
import urllib.request

URL = "https://zambo.dev/mcp"

def post_json(payload):
    request = urllib.request.Request(
        URL,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json", "Accept": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(request, timeout=30) as response:
            expected = int(response.headers.get("Content-Length", "0") or 0)
            chunks = []
            while True:
                chunk = response.read(64 * 1024)
                if not chunk:
                    break
                chunks.append(chunk)
            body = b"".join(chunks)
            if expected and len(body) != expected:
                raise RuntimeError(f"truncated MCP response: {len(body)} of {expected} bytes")
            return response.status, json.loads(body)
    except urllib.error.HTTPError as error:
        body = error.read()
        return error.code, json.loads(body)

The loop reads until EOF rather than trusting a single read(). For production clients, requests is also supported; preserve the complete response body before parsing.

Retry only the transport throttle

payload = {"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"live_price","arguments":{"symbol":"BTC"}}}
for attempt in range(3):
    status, body = post_json(payload)
    if status != 429:
        break
    retry_after = int(body.get("error", {}).get("data", {}).get("retry_after_seconds", 2))
    time.sleep(min(retry_after, 30))

Do not automatically retry HTTP 402 or initiate payment. Ask the user first, then retry the same tool and unchanged arguments only after verified access.

Call a tool and verify

{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"live_price","arguments":{"symbol":"BTC"}}}

Keep result._receipt.id and the returned receipt URL. Open https://zambo.dev/run/<id> or call /api/receipt/<id>/verify. A failed lookup still has a failed receipt; report that the record was not found instead of presenting it as verified evidence.

Universal jobs

Call zambo_universal with need and one stable _session_id. Its result states distinguish executed, planned, and answered. A planned/preview result is not an execution-success receipt.

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"zambo_universal","arguments":{"need":"Find the current BTC price and show the source.","_session_id":"session-123"}}}

Install a client → · Read the JSON-RPC reference →

For developers and agents

Zambo gives AI work a receipt you can check. For people: add Zambo to your AI app and ask for a job. These technical links are for developers and AI agents. One hosted MCP at https://zambo.dev/mcp. Check the proof for recorded tool calls (verify a receipt). Agents: 24-hour Day Pass, $0.99 USDC on Base via x402, not per call. People: Zambo Pass $29/mo or $290/yr; holder pass $19/mo for verified $ZAMBO holders.

Start here: For AI agents · Add Zambo · Check a receipt · Answers · Guides · What a receipt is · Open receipt format (draft) · All tools · Pricing · Day Pass: $0.99 · Agent Day Pass · Switch AIs without losing your work · Connect your AI · Founder · Source code
Brennan on X · Zambo on X