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"}}}