Bonlive dispatches verified human helpers to execute physical-world tasks — inspections, pickups, stock checks, queueing, property checks — and returns machine-verifiable proof: timestamped, geotagged photos, video, and structured checklists. One MCP server, four tools, real humans on the ground.
The Bonlive Agent API is an MCP server: standard JSON-RPC 2.0 over Streamable HTTP. Stateless — no session id, no handshake state to keep between calls. Any MCP-compatible client (Claude, an agent framework, or a raw fetch()) can use it directly.
| Endpoint | https://mcp.bonlive.ch/mcp |
|---|---|
| Method | POST only — a GET returns a JSON 405 by design, that's expected, not a bug. |
| Auth | Pass your key as the api_key argument on every tool call. No headers needed. |
| Transport | Responses are Server-Sent Events even for a single reply: parse the line starting data: before JSON.parse. |
1. List task types (no key needed to read this doc, but the call itself requires one):
curl -s https://mcp.bonlive.ch/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "bonlive_list_task_types",
"arguments": { "api_key": "blk_your_key_here" }
}
}'
2. Every tool response is wrapped — the real payload is a JSON string inside result.content[0].text:
{
"result": {
"content": [
{ "type": "text", "text": "{\"currency\":\"CHF\",\"task_types\":[...]}" }
]
}
}
Parse content[0].text as JSON to get the actual data. A failed call sets result.isError: true with an {error, message} object in the same place — check isError rather than HTTP status alone (the HTTP layer returns 200 for a well-formed JSON-RPC error).
Call tools/list to fetch these programmatically; schemas below are kept in sync with the live server.
List the physical task types Bonlive helpers can execute in Geneva right now, with fixed CHF pricing and the proof each type returns on completion. Call this before bonlive_create_task to confirm pricing — it can change.
blk_).Dispatch a verified helper to a Geneva location. Places a real CHF hold against your key's spend limit at the task type's fixed price — confirm the budget with your human before calling this. Returns a task_id; poll bonlive_get_task for status and proof.
bonlive_list_task_types, e.g. stock_check or package_reception.Fetch a task's current status plus any submitted proof-of-completion: signed URLs for photos/video (valid 1 hour), checklist answers, geotags, and timestamps.
task_id returned by bonlive_create_task (UUID).Note the response shape: bonlive_create_task returns its fields flat at the top level, but bonlive_get_task nests them under a task key — {"task": {"task_id": ..., "status": ...}}. The two are not symmetric.
List up to the 50 most recent tasks created under your API key's agent account, newest first, with current status.
Coverage is Geneva only today. Prices are fixed CHF per task, always confirmable live via bonlive_list_task_types.
| Slug | Task | Price | Proof returned |
|---|---|---|---|
| verification_visit | Verification visit — inspect an item/property before a purchase or rental decision | 89 CHF | 5+ photos, checklist, optional video |
| property_check | Property check — mail, damage, meters, plants for absentee owners | 79 CHF | 6+ photos, checklist, note |
| queue_standin | Queue stand-in — hold a spot at an admin office or venue | 69 CHF | 2 photos, outcome note |
| package_reception | Package reception & forwarding | 39 CHF | 3+ photos, signature if required |
| stock_check | In-store stock check — is it on the shelf, at what price | 29 CHF | 2 photos, checklist |
Instant, self-serve, no human in the loop. New keys are capped at 50 CHF total and 50 CHF daily spend — plenty for testing and light production use. Email hi@bonlive.ch once you're ready to raise the limit.