twocents
Server Details
Human feedback for AI agents: share HTML, get a live review link, read anchored notes as markdown.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- twocents-page/twocents-mcp
- GitHub Stars
- 0
- Server Listing
- twocents
TDQS
Scored across 4 tools
Each tool has a clearly distinct job: share_page handles single documents, share_pages handles atomic multi-page publishing, get_feedback retrieves notes, and resolve_feedback updates their resolved state. The one potentially overlapping pair, share_page vs share_pages, is explicitly differentiated in the descriptions and by plural naming.
All tool names follow a consistent verb_noun pattern: share_page, share_pages, get_feedback, resolve_feedback. The singular/plural distinction between share_page and share_pages is intentional and matches their actual behavior.
Four tools is well-scoped for this review workflow: share content, share multi-page sets, fetch feedback, and resolve feedback. Each tool earns its place with no redundant utilities.
The set covers the full review loop: publishing/updating a page, publishing multi-page sets, reading reviewer notes, and resolving/reopening them. No obvious dead ends remain since updates go through share_page again and notes can be toggled back open.
Available Tools
4 toolsget_feedbackGet reviewer feedback for a shared pageAInspect
Fetch the reviewer notes for a page shared with share_page, as markdown grouped by page. Each note carries the anchored text, the element and its markup as the reviewer saw it, so you can locate and apply it; each page heading carries a URL to read the whole page back, so you never have to guess which file it is. Show your human each new note and apply only the ones they approve. Pass the note ids already decided in earlier sessions as "handled" to see only what is new.
| Name | Required | Description | Default |
|---|---|---|---|
| room | Yes | The room id returned by share_page. | |
| handled | No | Note ids the creator already decided on (applied or skipped) — e.g. the keys of a saved .twocents/decisions.json. These are summarized in one line each instead of repeated in full, so the response leads with what still needs a decision. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden and meets it exceptionally: it details what the output contains (anchored text, element, markup, URL per heading), how it is structured, and the intended interactive workflow. It goes far beyond a simple 'fetch' and prepares the agent for real usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each dense with purpose: the first states the core function and format, the second details the note contents and page URLs, and the third gives operational guidance. No filler, perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description clearly explains the return format (markdown grouped by page, note details, URLs). It covers both parameters contextually and provides a complete workflow for an agent, leaving little ambiguity for a tool with this moderate complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents 'room' and 'handled'. The description adds meaningful context for 'handled' by explaining it represents previously decided note ids and that such notes appear summarized rather than in full, which goes beyond the schema's field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Fetch') and resource ('reviewer notes for a page shared with share_page'), and adds useful detail (markdown, grouped by page). It clearly distinguishes from the sibling share_page by focusing on retrieval rather than creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly ties usage to pages shared via share_page, explains the workflow (show human, apply only approved notes), and instructs how to use the 'handled' parameter to filter previously decided notes. This gives clear when and how, even without naming alternatives beyond the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_feedbackMark reviewer notes as addressedAInspect
Mark notes resolved once you have actually applied them. This is what closes the loop: the note leaves the active list for every later get_feedback, and the reviewer who wrote it sees it marked resolved on the page — live, if they have it open — instead of finding their old note sitting next to content you already fixed. Pass "what" you changed; that sentence is shown to the reviewer, so write it for them, not for the log. Requires the creatorKey that share_page returned when the room was created — the review link alone cannot resolve, or any reader could clear feedback that was not theirs. Nothing is deleted: call again with resolved:false to reopen a note.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Who applied it, if you want it credited. Max 80 chars. | |
| ids | Yes | Note ids to resolve — the `id:` field of each note in get_feedback output. | |
| room | Yes | The room id the notes belong to. | |
| what | No | One sentence on what you changed, shown to the reviewer beside their note. Max 400 chars. | |
| resolved | No | Defaults to true. Pass false to reopen a note you resolved by mistake. | |
| creatorKey | Yes | The room's creator key, returned by share_page when the room was created and kept in .twocents/state.json. For a room created before creator keys existed, the first key you present claims the room. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so excellently. It discloses that notes disappear from later get_feedback results, the reviewer sees the resolution live, nothing is deleted, and resolved:false reopens a note. It also explains the security rationale for requiring creatorKey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and every sentence adds distinct value: trigger condition, system effect, payload guidance, authentication requirement, and reversibility. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with six parameters and no output schema, this is complete: it covers when to use it, what payload to write, the required credential, the behavioral impact on get_feedback, and how to undo the action. No critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that 'what' is shown directly to the reviewer and should be written for them, that creatorKey comes from share_page and can claim legacy rooms, and that resolved:false reopens. This exceeds baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('mark notes resolved'), the target object ('reviewer notes'), and the concrete effect ('leaves the active list for every later get_feedback'). This clearly distinguishes it from sibling tools get_feedback, share_page, and share_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to call: 'once you have actually applied them,' and it gives an important prerequisite: the creatorKey is required and the review link alone cannot resolve. It does not explicitly list alternative-tool routing, but no sibling is a true alternative to resolving feedback, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
resolve_feedback
2 tool updates
- Changed
share_page1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"For multi-page sets: the filename this content lives at in the room (e.g. \"about.html\" or \"plan.md\"). Defaults to \"index.html\", the page reviewers land on. Share the other files into the same room id and link between them with plain relative hrefs — formats can be mixed freely, so a plan.md may link to a demo.html and back."New value: +"For multi-page sets: the filename this content lives at in the room (e.g. \"about.html\" or \"plan.md\"). Defaults to \"index.html\", the page reviewers land on. For a set of more than one page prefer share_pages, which publishes them all in one atomic request — sharing them one call at a time can leave a half-published room whose links point at pages that were never stored."
- Added
share_pages
1 tool update
- Changed
share_page5 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "html" + ] + }, + { + "required": [ + "markdown" + ] + } +] - added
Input schema / properties / markdownAdded value: +{ + "description": "Markdown to render as a document, instead of \"html\". Use this for plans, specs, PR descriptions, summaries — anything you want a human to read and approve before you act. Pass exactly one of html or markdown. Max ~120 KB.", + "type": "string" +} - changed
Input schema / properties / path / descriptionPrevious value: -"For multi-page sites: the filename this HTML lives at in the room (e.g. \"about.html\"). Defaults to \"index.html\", the page reviewers land on. Share the other pages into the same room id and link between them with plain relative hrefs."New value: +"For multi-page sets: the filename this content lives at in the room (e.g. \"about.html\" or \"plan.md\"). Defaults to \"index.html\", the page reviewers land on. Share the other files into the same room id and link between them with plain relative hrefs — formats can be mixed freely, so a plan.md may link to a demo.html and back." - added
Input schema / properties / sourceAdded value: +{ + "description": "Where this content came from, for whoever reads the feedback later — a project path like \"DROPS.md\" or \"public/p/foo/index.html\", or a note like \"drafted in this conversation, not yet a file\". You are the only one who knows this: twocents receives HTML, never a path, so if you omit it a future session gets reviewer notes with nothing to point them at the right file. get_feedback echoes it back verbatim.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "html" -]New value: +[]
1 tool update
- Changed
get_feedback1 field changed- added
Input schema / properties / handledAdded value: +{ + "description": "Note ids the creator already decided on (applied or skipped) — e.g. the keys of a saved .twocents/decisions.json. These are summarized in one line each instead of repeated in full, so the response leads with what still needs a decision.", + "items": { + "type": "string" + }, + "type": "array" +}
2 tool updates
- First observed
get_feedback - First observed
share_page
Related MCP Connectors
Comment on AI-generated webpages; feedback flows back to your coding agent. Free, MIT, local-first.
MarkupBase turns AI-generated Markdown and HTML into durable, versioned artifacts that people can review and discuss. Its MCP server lets agents publish new versions, preserve contextual comments, include hosted images, and respond to feedback through secure account-linked identities, creating a clear human review boundary without requiring real-time editing.
Host the HTML or Markdown pages your AI generates and share each as a link with comments and access.
Versioned artifact review for people and AI agents, with contextual comments and human control.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to publish HTML artifacts for human review, receive anchored feedback, and iterate until approval.2-
- AlicenseNot gradedqualityAmaintenanceLocal-first HTML review workspace for AI coding agents, enabling direct text and formatting edits, element comments, area annotations, and slide-aware review with durable agent handoffs.1MIT
- AlicenseNot gradedqualityAmaintenanceGive AI agents visual + structured feedback about live web UIs — and give humans deterministic demo reels while you're at it.351 PyPI3Apache 2.0
- AlicenseAqualityAmaintenanceThe open-source review layer for AI agents. Work done for humans is decided by humans.1815 npm1AGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.