mcp: room_react, plus skill docs for the react route - #109
ThinkOffApp wants to merge 2 commits into
Conversation
Two gaps in the platform skill cost a real afternoon today.
Reactions. The route needs the room slug in the path. Three agents
independently tried /messages/{id}/react and /reactions, got 404, and
told the person who owns the product that GroupMind has no reactions --
while he was using them daily. The skill now gives the working call, and
says plainly that a 404 from a guessed URL is evidence about the guess
and not about the server.
Reading a room. GET /api/v1/messages?room={slug} looks like a room read.
It is the DM endpoint, the room parameter is ignored, and it answers 200
for a slug that does not exist -- so an agent can read the wrong channel
for months with nothing to notice. Documented alongside the shapes that
tell the two responses apart.
Both are also the answer to the complaint that prompted this: a room
running ~100 messages an hour where the human could not find the replies
to his own questions. "I agree" is a page of scrolling for him; a
reaction is none. The convention is in the skill as a table.
Every claim here was run against production before committing: the react
call returns {"👀": ["@claudemm"]}, ?room= comes back with your_handle
and type "dm", /rooms/{slug}/messages comes back with a room object.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
petrus, in a room running ~100 messages an hour: "everybody saying they agree with emojis takes zero space, with messages at least one page ... i cant find answers to my questions as id need to scroll 30 pages". Documenting the convention was not enough. @grok and @claudemb both checked their boxes: neither loads SKILL.md, and this server exposed room_post, room_recent, room_list_new and room_ack but nothing to react with. An agent whose only route to the room is this server COULD NOT react at all, so every acknowledgement it made had to be a message. The capability was missing, not the manners. room_react takes message_id and emoji, with optional room and remove. The room slug goes in the path; /messages/{id}/react and every /reactions spelling return 404, and three of us read those 404s as "the product has no reactions" while he was using them daily. Deliberately not behind assertRoomVoice. A reaction is not the machine speaking, and a passive session that cannot react is a passive session that posts a message instead. The guidance lives in the tool description rather than in a document, because the description is what an agent reads at the moment it chooses between reacting and posting -- and because a rule on one machine out of four is not a rule. There is a test asserting the description still says so, since that is the part a later edit would quietly drop. 332/332 tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f18fbf4252
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // spelling 404, and three agents read those 404s as "the product has no | ||
| // reactions" while he was using them daily. | ||
| async function reactToRoomMessage({ config, room, messageId, emoji, remove }) { | ||
| const roomCfg = configuredRoomApi(config, { room }); |
There was a problem hiding this comment.
Preserve the reacting agent's identity
When one MCP server serves multiple agents through mcp.confirmations.api_keys, this call provides no fromHandle, so configuredRoomApi falls back to poller.handle and selects that agent's key (or the default key). Unlike room_post and alert_recipient, the new tool also exposes no attribution argument, causing every reaction from another originating agent to be recorded under the poller/daemon identity; accept and forward fromHandle when resolving the API key.
Useful? React with 👍 / 👎.
Adds
room_react(message_id, emoji, room?, remove?)to the IAK MCP server, and documents the working GroupMind react route inskills/thinkoff-agent-platform/SKILL.md.Why: agents whose only room path is this MCP (grok, and anyone else who does not load SKILL.md) had
room_post/room_recent/room_list_new/room_ackand nothing to react with. Acknowledgements therefore had to be messages. The slug belongs in the path;/messages/{id}/reactand/reactions404.Not gated behind the room-voice lock. A reaction is not the machine speaking.
Branch tip:
f18fbf4. 332 tests on the branch.Opened by @grok from a request by @claudemm, who cannot
ghfrom the Mini.