Introduction
Model Context Protocol (MCP) is the open standard AI clients use to call external tools. Connecting the Food Web server means Claude Code, Claude Desktop, Cursor and friends can search the map, file curation suggestions, and participate in the forum on your behalf — with exactly the permissions your account has, nothing more.
The model runs on the client side: the server performs no inference, it just executes tools. Anonymous access is allowed for public reads, so you can try it before minting a key.
Endpoint & transport
https://mcp.foodweb.networkTransport is Streamable HTTP in stateless mode: each JSON-RPC message is one POST, responses are plain JSON, and no session state is held between calls — ideal for serverless. GET/DELETE return 405. A raw exchange looks like:
# The endpoint speaks MCP Streamable HTTP (JSON responses).
curl -X POST https://mcp.foodweb.network \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer fw_YOUR_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
"protocolVersion":"2025-06-18",
"capabilities":{},
"clientInfo":{"name":"curl","version":"0"}}}'Authentication
Send Authorization: Bearer <credential> with either:
- an API key (
fw_…) minted on the dashboard — long-lived, revocable, stored hashed; or - a Firebase ID token — the same credential the REST API uses (expires hourly, so keys are the better fit for MCP clients).
Roles are live
API keys authenticate only the MCP server today; /v1 REST endpoints continue to take Firebase ID tokens.
Role tiers
The server registers tools per credential, so tools/list shows only what your account can actually call:
Tool catalog — asset map
18 tools across the three map tiers.
Public reads (anonymous OK)
whoamiAuth status: method, uid, roles, unlocked capabilitiessearch_entitiesSearch the asset map by text, type, region, or bounding box (paginated)get_entityOne entity with its place and app linkslist_citiesMapped cities for a country + provinceContributor (verified email)
suggest_entityFile a map suggestion (create/edit/report-duplicate); curators can auto-applycheck_duplicatesDuplicate candidates near a coordinate before suggestingCurator / admin
list_suggestionsReview queue, filterable by status/typereview_suggestionApprove/apply, reject, or resolve as duplicateadmin_search_entitiesCuration search: hidden/duplicate rows, sort, UUID lookupentity_statsWhole-dataset counts and per-type breakdownupdate_entityEdit entity fields (status active|hidden, meta merge)update_placeEdit address/coordinates/status of a placemerge_entitiesMerge a duplicate entity into a canonical onemerge_placesMerge a duplicate place into a canonical onearchive_entitySoft-archive; admins may hard-deleteenrich_entityFill empty fields from Google Placesreingest_entityQueue re-ingestion from the entity website (single or bulk)link_entity_appConnect an entity to a Food Web app record (e.g. its kitchen listing)Forum tools
Reads follow the forum's visibility model (anonymous → public threads; signed-in → members threads and your private invites). Writes post as your account and require authentication.
forum_list_categoriesForum channels, in display orderforum_list_discussionsGlobal or per-category feed, visibility-filteredforum_get_discussionOne thread with messages and repliesforum_create_discussionStart a thread (public / members / private + invites)forum_post_messagePost a top-level messageforum_replyReply to a messageforum_voteLike/dislike a discussion, message, or replyAuditing & limits
- Every mutating tool call is recorded in an audit log — actor, key, tool, redacted arguments, affected ids, outcome. Reads are not logged.
- Requests are rate-limited to 120 calls/minute per account (per IP when anonymous); exceeding it returns an error with a retry hint.
whoamishows your remaining budget. - Suggestions are additionally limited to 20/hour per account, matching the REST API.
- Search pages are capped at 100 rows per call; use
cursorto paginate. - Up to 10 active API keys per account.
Connect a client
For Claude Code it is one command:
claude mcp add --transport http foodweb https://mcp.foodweb.network \
--header "Authorization: Bearer fw_YOUR_KEY"Cursor and Claude Desktop configs (including the mcp-remote bridge for stdio-only clients) are on the dashboard, pre-filled and copy-pastable.