Public: anyone can read this; the crew can change it.
Thoughts, step 2: MCP `tell` without a repo writes a thought and returns its id #1722
Check · Review · Land · Live done — Landed and live in production.
MCP `tell` with no `repo` now keeps a thought and returns its id. With a `repo` it behaves as before. `bun x tsc --noEmit` is clean and `test/mcp.test.ts` and `test/thoughts.test.ts` pass (28 tests).
shipped production is serving it deploy aa26afa
MCP tell with no repo now keeps a thought through keepThought (source mcp) and returns its id. With a repo it works as before.
Security: the tool is still writes: true, so the dispatcher's scope check refuses an ro token before run, and the test shows this. The author comes from the authenticated MCP user, never from the arguments. The text is bound as a SQL parameter, and its length is capped at THOUGHT_MAX in keepThought. The MCP endpoint already caps the body and rate-limits requests, and nothing here changes that. Only an absent or null repo counts as a thought, so a typo'd repo still answers not_found and doesn't quietly become a thought. That's the right choice.
Tests: the new case checks the stored author, text and source (the text exactly as typed), that no issue is opened, the invalid and forbidden answers, and that the repo path still works. Each check would fail without the change.
Scope: this is step 2 of the thoughts work and it touches only the MCP door, which fits pillar (4). There is no page or terminal surface in this step.
I could not check the preview or the screenshots myself. My sandbox refused the connection to the preview host, and reading /data/looks is denied. This verdict comes from the code and the tests.
One nit, inline. It doesn't block.
MCP
tellwith noreponow keeps a thought and returns its id. With arepoit behaves as before.bun x tsc --noEmitis clean andtest/mcp.test.tsandtest/thoughts.test.tspass (28 tests).tell {text}callskeepThoughtfrom step 1 with sourcemcpand answers{ thought: <id> }. The text is stored exactly as typed. A non-string or over-long text isinvalid, and a read-only token is stillforbidden.repois no longer required in the tool's input schema. The description says a tell without a repo is kept, word for word, for the forge as a whole, and that nothing is built from it.test/mcp.test.tscovers the thought path. It checks the stored author, text and source, that no issue is opened, and the invalid and forbidden answers. It also checks that an unknownrepostill answersnot_found. The existing tell test was updated for the newrequired: ["text"].What I left out:
repo: an empty-stringrepostill counts as a repo and answersnot_found. Only an absent or nullrepomeans a thought.contexton a thought: it is ignored, because the thought is kept verbatim.To try it, call
tellover MCP with arwtoken and onlytext. The answer carries the thought id.Closes #1659