twocents
What this MCP does
Shares HTML or Markdown pages for human review and retrieves, resolves, and tracks anchored reviewer feedback.
Tools
Input schema
{'type': 'object', 'required': ['room'], 'properties': {'room': {'type': 'string', 'description': 'The room id returned by share_page.'}, 'handled': {'type': 'array', 'items': {'type': 'string'}, '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.'}}}
Input schema
{'type': 'object', 'required': ['room', 'ids', 'creatorKey'], 'properties': {'by': {'type': 'string', 'description': 'Who applied it, if you want it credited. Max 80 chars.'}, 'ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Note ids to resolve — the `id:` field of each note in get_feedback output.'}, 'room': {'type': 'string', 'description': 'The room id the notes belong to.'}, 'what': {'type': 'string', 'description': 'One sentence on what you changed, shown to the reviewer beside their note. Max 400 chars.'}, 'resolved': {'type': 'boolean', 'description': 'Defaults to true. Pass false to reopen a note you resolved by mistake.'}, 'creatorKey': {'type': 'string', 'description': "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."}}}
Input schema
{'type': 'object', 'anyOf': [{'required': ['html']}, {'required': ['markdown']}], 'required': [], 'properties': {'html': {'type': 'string', 'description': 'A complete, self-contained HTML document (inline CSS/JS/images — no local file references, they will 404 for reviewers). Max ~120 KB.'}, 'path': {'type': 'string', 'description': '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.'}, 'room': {'type': 'string', 'description': 'Room id from a previous share_page call, to update that page. Omit to create a new room.'}, 'source': {'type': 'string', '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.'}, 'markdown': {'type': 'string', '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.'}}}
Input schema
{'type': 'object', 'required': ['pages'], 'properties': {'room': {'type': 'string', 'description': 'Room id to publish into. Omit to create a new room.'}, 'entry': {'type': 'string', 'description': 'Which page reviewers land on, if it is not already "index.html". Must be one of the paths in "pages"; its content is also stored as index.html so the review link opens it.'}, 'pages': {'type': 'array', 'items': {'type': 'object', 'required': ['path'], 'properties': {'html': {'type': 'string', 'description': 'A complete, self-contained HTML document.'}, 'path': {'type': 'string', 'description': 'Filename in the room, e.g. "notes.html". Max 200 chars.'}, 'source': {'type': 'string', 'description': 'Where this page came from, e.g. a project path. Echoed by get_feedback.'}, 'markdown': {'type': 'string', 'description': 'Markdown to render as a document, instead of "html".'}}}, 'description': 'The pages of this set. Each item needs a "path" (the filename in the room, e.g. "index.html" or "plan.md") plus exactly one of "html" or "markdown". Link between them with plain relative hrefs; formats mix freely.'}, 'prune': {'type': 'boolean', 'description': 'Delete pages already stored in this room that are not in this request. Use it when republishing a set whose layout changed, so stale pages from the old layout do not linger unreachable. Default false — without it a room only ever accretes.'}}}
Recent tool changes
Similar MCP servers
Courier
Provides notification delivery infrastructure for users, tenants, lists, templates, preferences, journeys, automations, brands, a…
FlowCastle
Enables users to build, edit, and deploy Telegram bots through FlowCastle’s hosted visual workflow platform.
Postmark
Provides Postmark email delivery monitoring, including outbound messages, raw message details, delivery statistics, bounces, and …
MinuteMail
Provides temporary mailboxes, simulated inbound email, attachments, custom-domain verification, and mock OAuth identities for tes…
Slack channel name shape, value discarded
Checks the shape of Slack channel names without accessing Slack, alongside generic developer validation utilities.
E.164 shape, number discarded
Validates the shape of E.164 phone numbers without retaining the number.
mailto: shape, address discarded
Validates the shape of a mailto URI.
Slack Webhook Shape
Validates the shape of Slack webhook URLs without retaining secrets, alongside generic developer validation utilities.