Developers
Every published business is an MCP server
Streamable HTTP with JSON-RPC 2.0. All technical information in one place.
Quick start
Add a business to Claude Code with one command. Replace the slug with the business's address. The example shop is public and read-only.
claude mcp add --transport http zoomag https://storefront.fleetq.net/mcp/zoomag
Endpoints
| Endpoint | Returns |
|---|---|
| POST /mcp/{slug} | MCP server for one business; tools depend on its type |
| POST /mcp | Directory with find_business; returns the mcp_url of matching businesses. search_products without business searches every shop |
| GET /.well-known/mcp/directory.json | The directory as JSON |
| GET /b/{slug}/llms.txt | The profile as text for people and agents |
A draft or paused business returns 404.
Connecting
{
"mcpServers": {
"zoomag": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://storefront.fleetq.net/mcp/zoomag"
]
}
}
}
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(new URL("https://storefront.fleetq.net/mcp/zoomag")));
const res = await client.callTool({
name: "search_products",
arguments: { query: "храна за куче", max_price: 35, limit: 5 },
});
Examples for third-party clients are not tested against every version.
Tools by business type
| Type | Read | Requests |
|---|---|---|
| All | get_info get_policies get_request_status |
accept_counter_offer reject_counter_offer cancel_request |
| Shop | search_products get_product |
create_order |
| Restaurant | get_menu |
book_table create_food_order |
| Venues and events | get_menu |
book_table create_food_order |
| Services | get_services get_availability get_schedule |
book_appointment book_class request_rental request_quote |
| Transport | find_station search_trips |
|
| Health | get_services get_availability |
book_visit |
| Lodging | get_rooms check_stay |
request_stay |
| Real estate and vehicles | search_listings get_listing |
request_viewing |
| Events | list_events get_event |
|
| Directory | find_business |
none |
An unclaimed business is read-only: request tools return the error unsupported, and the agent sends the customer to source_url.
A shop with a live catalog adds get_categories; there, search_products and get_product read the shop at the time of the call.
Tool descriptions are in English because agents read them. Full reference with all arguments
Confirmed requests
A request is not a booking or order until the owner confirms it. The agent polls its status with get_request_status.
pending_confirmation confirmed / counter_offered / declined / expired / cancelled
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "book_table",
"arguments": {
"date": "2026-10-16",
"time": "19:30",
"party_size": 4,
"name": "Мария"
}
}
}
{
"request_id": "rq_example",
"kind": "booking",
"status": "pending_confirmation",
"expected_response": "PT15M",
"next_actions": [
"get_request_status",
"cancel_request"
]
}
The full list of states and reasons is in the reference.
Data and freshness
- Every successful answer carries source_url and last_verified.
- For a shop with a live catalog, get_product reads the shop at the time of the call; if the site does not answer, it returns the last copy with stale: true.
- For a business with a stored catalog, get_product returns an evidence snippet from the page.
- Searches may come from a cache of up to 1 hour, and last_verified says when the shop was read.
- Prices are in euro; stock is the last verified state.
- All read tools carry readOnlyHint: true.
- Text written by a model carries generated_by.
Sessions, limits, errors
-
Session
initialize returns an mcp-session-id header; send it with every following request. Methods: POST, DELETE; GET returns 405.
-
Rate limit
Headers x-ratelimit-limit and x-ratelimit-remaining.
-
Encoding
UTF-8. Invalid JSON (for example garbled Cyrillic) returns -32700 Parse error.
Plans & limits
Paid plans start from €99/mo, metered by calls; a write operation counts as 5 calls. During the beta everything is free and limits are not enforced.
Start today on Sandbox terms: use the endpoint above. No API key is needed.