The durable brain Poke consults.
A production-shaped, multi-agent MCP server that Poke calls as a client — the inversion that turns an iMessage front-end into a durable agent backend.
Poke is the client. This is the server.
Poke lives in iMessage (sanctioned, no Apple API, no ban risk) and is an MCP client that calls external MCP servers. poke-conduit is the server it calls. You text Poke; Poke calls a tool here; conduit does durable work — and can text you back later through Poke's inbound API when an async verdict lands or a reminder fires.
iMessage ──▶ Poke (MCP client) ──▶ poke-conduit /mcp ──▶ Postgres (Neon)
▲ │ orchestrator · worker-agents
└────── proactive push ──┘ council · backlog · scheduler
(Poke inbound API)
13 tools across four capabilities.
Queued-notes backlog — flagship
A durable to-read / to-do queue with 1-based references and pinning.
Council — multi-agent
Fans a hard question out to six persona agents — Builder, Skeptic, Operator, User-Advocate, Strategist, Pragmatist — then a synthesizer makes the call. Reply inline, or return now and push the verdict when it's ready.
Proactive reminders
A minute-resolution scheduler fires due reminders and pushes them through Poke. One-shot or daily.
Status & recipes
Availability / DND (active · dnd · deep_work) and saved routines — a recipe can be a free-text prompt or an executable macro of conduit tool-calls that run_recipe dispatches in order.
A few small, testable seams.
- Hand-rolled MCP — a Streamable-HTTP JSON-RPC handler over Web
Request/Response. No SDK: the surface Poke speaks is tiny, and hand-rolling keeps it edge-compatible and fully unit-testable. - Store port — one
SqlStoreruns on pg-mem (tests · serve · demo) and Neon (prod) over an injected driver. Timestamps are ISO text, so they sort lexically and round-trip byte-identically. - Model port — real Claude when
ANTHROPIC_API_KEYis set, else a deterministic mock, so tests and the demo need zero credentials. - Step seam — council logic is written once against
Step; runs in-process by default, or on Inngest for true serverless durability when configured — an optional provider kept out of the 3-dep core and loaded lazily only when switched on. - Two credentials, two directions — inbound (Poke → conduit) is distinct from outbound (conduit → Poke's inbound API, which makes Poke act on the message).
Point a Poke MCP integration at /mcp.
Poke presents its API key as a Bearer token and auto-injects x-poke-user-id — so per-user scoping comes for free. Data tools are gated by MCP_AUTH_ENFORCE; the endpoint is rate-limited per identity. Proactive pushes go back out through Poke's inbound API.
Zero credentials required.
Falls back to pg-mem + a mock model + a mock Poke client.
npm install npm test # 129 tests — unit, tool handlers, full MCP wire e2e npm run demo # narrated, self-asserting walkthrough (22 checks) npm run serve # local HTTP: GET / · POST /mcp · GET /cron · GET /healthz