The footer on production says POST /mcp answers here already. It does:
$ curl -sX POST https://drift--forge-trevato-apps.open-platform.sh/mcp \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
{"jsonrpc":"2.0","id":1,"result":{"tools":[]}}
An empty door is worse than no door — a model that connects learns nothing and leaves. The round's
tools are #14 and wait on the socket and the ladder; this issue is the smaller, nearer thing: make the
door tell the truth about what drift already is, using what src/concept.ts put on main last night.
Done looks like
[ ] rule — returns RULE and the shape of a round (ROUND_SECONDS, INTERMISSION_SECONDS,
ROSTER_MAX) from src/concept.ts, so the model, the page and the terminal quote one source and
cannot drift apart.
[ ] concept — returns the five INVARIANTS, numbered as docs/wake.md numbers them, and one
paragraph of what the game is. Nothing here restates a number that lives in world.ts.
[ ] Each tool has a name, one sentence and a JSON schema, and decides nothing: it reads
src/concept.ts and shapes an answer, exactly as AGENTS.md describes a door.
[ ] tools/list is no longer empty, and the README's claude mcp add line is the one that actually
runs — checked against the deployed app, with the output in the pull.
[ ] A test asserts tools/list is non-empty and that each tool's result matches the constant it
claims to expose, so a change to the rule cannot leave the door quoting the old one.
[ ] The footer's sentence matches reality either way: if this lands before #14, it says what is there
now rather than what is coming.
Filessrc/mcp.ts, src/server.test.ts, README.md.
Risks Small enough to overbuild — resist adding a steer or a look here, they are #14's and they
need the round. The only real trap is duplicating the rule text into the tool instead of importing it;
src/concept.ts exists precisely so that every door says the same sentence.
Ready now: everything it needs is on main. Fits Vesper's brief, or Quill's for the words.
The footer on production says
POST /mcpanswers here already. It does:An empty door is worse than no door — a model that connects learns nothing and leaves. The round's tools are #14 and wait on the socket and the ladder; this issue is the smaller, nearer thing: make the door tell the truth about what drift already is, using what
src/concept.tsput onmainlast night.Done looks like
rule— returnsRULEand the shape of a round (ROUND_SECONDS,INTERMISSION_SECONDS,ROSTER_MAX) fromsrc/concept.ts, so the model, the page and the terminal quote one source and cannot drift apart.concept— returns the fiveINVARIANTS, numbered asdocs/wake.mdnumbers them, and oneparagraph of what the game is. Nothing here restates a number that lives in
world.ts.src/concept.tsand shapes an answer, exactly asAGENTS.mddescribes a door.tools/listis no longer empty, and the README'sclaude mcp addline is the one that actuallyruns — checked against the deployed app, with the output in the pull.
tools/listis non-empty and that each tool's result matches the constant itclaims to expose, so a change to the rule cannot leave the door quoting the old one.
now rather than what is coming.
Files
src/mcp.ts,src/server.test.ts,README.md.Risks Small enough to overbuild — resist adding a
steeror alookhere, they are #14's and they need the round. The only real trap is duplicating the rule text into the tool instead of importing it;src/concept.tsexists precisely so that every door says the same sentence.Ready now: everything it needs is on
main. Fits Vesper's brief, or Quill's for the words.