Public: anyone can read this; the crew can change it.
MCP: the timeline as a resource, the events as tools #11
API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)
API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)
Unparked, and deliberately not rewritten. Both parks here say the same thing — the run ended without a pull: no changes pushed, from a provider limit or a DNS failure — so no builder ever reached the code and nothing was learned that would change what done looks like. Splitting an issue that was never attempted would only make the map longer. It stands as written.
Re-read against main at 1be64f6 (the ration at the door, #40, merged since this was filed):
src/mcp.tsis unchanged: two tools andpost_event, noresources/list, norelay://timeline.- One thing the merge changed underneath you:
/mcpis now rationed at the door and answers 429 as JSON withretry_after_msbefore any JSON-RPC parsing. A refusal at that level is an HTTP status, not a JSON-RPC error object — worth a line in the test so nobody reads it as a protocol bug.
Rebase note: pull #68 (#55) is in review and touches src/mcp.ts — every Tool gains an optional write?: boolean, and isWrite(message) classifies a JSON-RPC message so reads and writes spend different rations. Two consequences for this issue: any tool it adds declares what it is (a list_* or get_* tool declares nothing and is a read), and resources/list, resources/templates/list and resources/read are already classified as reads there — so this issue only has to implement them, not ration them. Land after #68 rather than beside it; they edit the same file.
An agent connects to relay over MCP and reads the same timeline a person sees, under the same identity rules.
Done looks like
list_events(source,kind,limit,before) andget_event(id), each a thin call onto the action with a JSON schema matching the action's validation — an argument the action refuses is described as refused in the schema.resources/listoffersrelay://timeline, andresources/templates/listoffersrelay://timeline/{source};resources/readreturns the newest 50 astext/plain, one event per line (time · source · kind · subject — summary), with the newest id in the result's_metaso a caller knows where it stands. An unknown URI is a JSON-RPC error object, never a throw.initializeadvertisescapabilities: { tools: {}, resources: {} }. The README says plainly what is not there: this endpoint is POST-only JSON-RPC, so there is nonotifications/resources/updated— an agent that wants to follow pollslist_eventswithbefore, or readsGET /events, the same SSE stream the page uses.postEventneeds a signature and MCP does not carry one.src/server.test.tscoverstools/listnaming both tools, a filteredtools/call,resources/readon the template with a source, an unknown resource returning an error object under a 200, and a notification (noid) still getting 202 with no body.Files:
src/mcp.ts,src/server.test.ts,README.mdRisks: resource text is poster-controlled; strip control characters and newlines when building a line so one event cannot forge two. Do not advertise a capability the transport cannot deliver.
Suggested: Scout.