An agent connected to a server over MCP calls the tools below, and its client lists the prompts and resources that follow them.
This page lists version 0.17.0 of the server, the newest release. An entry that names no version it was added in was in version 0.13.0.
This page leaves out each tool’s description, which is written for the agent. An agent reads it, and the tools your server’s version has, from its client’s tool list. Learn more about what an agent can do.
On a server older than the version in an entry’s Changed in field, the entry’s arguments or its description differ from this page’s. An argument whose line ends with “Added in” and a version is missing on a server older than that version.
read_skill
Arguments: name
Read a skill
name(required, one of"answering","triage","placing") — Which document to read.
list_projects
Arguments: none
List projects
create_project
Arguments: name
Create a project
name(required, string)
set_active_project
Arguments: projectId
Work in a project
projectId(required, string ornull)
rename_project
Arguments: projectId, name
Rename a project
projectId(required, string)name(required, string)
edit_project_patterns
Arguments: projectId, addPatterns, removePatterns
Change the addresses a project claims
projectId(required, string)addPatterns(optional, array of string)removePatterns(optional, array of string)
move_site
Arguments: projectId, siteId
Move a site into a project
projectId(required, string)siteId(required, string)
whoami
Arguments: none · Changed in: 0.16.0
Who am I
list_users
Arguments: none
List users
list_sites
Arguments: none
List sites
get_site
Arguments: siteId
Get a site
siteId(required, string)
list_threads
Arguments: url, projects
List the threads on a page
url(required, string)projects(optional,"all"or array of string) — Which projects to read: "all", or a list of project ids from list_projects. Omit it to read every project; each answer says which project it is from.
get_thread
Arguments: threadId · Changed in: 0.16.0
Open one thread
threadId(required, string)
search
Arguments: query, scope
Search
query(required, string)scope(optional, object withkindor object withkind,projectIdor object withkind,siteIdor object withkind,pageId)
get_thread_image
Arguments: threadId, image, clipped
See a thread's screenshot
threadId(required, string)image(optional, one of"flattened","screenshot","drawing", default"flattened")clipped(optional, boolean, defaulttrue)
upload_file
Arguments: content, encoding, mediaType · Changed in: 0.16.0
Put a file on this server
content(required, string) — The file itself: its text whenencodingis utf8, or base64 of its bytes when it is base64.encoding(required, one of"utf8","base64") — How to readcontent. No default: guessing wrong stores a corrupt file silently.mediaType(required, string) — What the file is, e.g. "application/pdf", "text/plain".
upload_file_link
Arguments: mediaType · Added in: 0.16.0
Get a link to send a file to
mediaType(required, string) — What the file is, e.g. "text/markdown", "image/png", "application/pdf".
get_attachment
Arguments: blobId
Read a file on a comment
blobId(required, string) — From a comment'sattachments, not the attachment's ownid.
create_thread
Arguments: url, body, selector, hostPath, title, nickname, mentions, attachments, projectId · Changed in: 0.16.0
Open a comment thread
url(required, string)body(required, string)selector(optional, string)hostPath(optional, array of string) — The frames and shadow hosts between the top document and the element, outermost first: one CSS selector each, resolved in the document or shadow root above it, ending in an element name. A hop ending iniframe,frameorobjectenters that frame's page; any other enters that element's shadow root. Anembedcannot be entered, so comment on one by passing it asselector.selectoris then resolved inside the last one, and is required:hostPath: ["iframe#checkout"]withselector: "form > button"is a button inside that iframe. A thread a person pinned inside one carries the same list as itsplacement.selectorsentry'shostPath; a hop there written as a bare id, such as#checkout, needs its element name in front,iframe#checkout. To comment on an iframe as a whole, pass it asselectorand leave this out. Added in 0.14.0.title(optional, string)nickname(optional, string)mentions(optional, array of string)attachments(optional, array of object withblobId,name) — Files to post with this comment, at most 10. EachblobIdcomes from upload_file_link or upload_file, or from theattachmentsof a comment this server already holds;nameis what a person downloading it will see.projectId(optional, string) — Which project to write into. Omit it and the write goes to the project whose address pattern matches the URL, else to the one this access key is in (set_active_project); there is no default beyond those, so omitting it can fail. Ids come from list_projects.
add_comment
Arguments: threadId, body, nickname, mentions, attachments, notifyParticipants · Changed in: 0.16.0
Reply to a thread
threadId(required, string)body(required, string)nickname(optional, string)mentions(optional, array of string)attachments(optional, array of object withblobId,name) — Files to post with this comment, at most 10. EachblobIdcomes from upload_file_link or upload_file, or from theattachmentsof a comment this server already holds;nameis what a person downloading it will see.notifyParticipants(optional, boolean)
edit_comment
Arguments: commentId, body, mentions
Edit your own comment
commentId(required, string)body(required, string)mentions(optional, array of string)
move_thread
Arguments: threadId, selector, hostPath
Move a pin to another element
threadId(required, string)selector(optional, string)hostPath(optional, array of string) — The frames and shadow hosts between the top document and the element, outermost first: one CSS selector each, resolved in the document or shadow root above it, ending in an element name. A hop ending iniframe,frameorobjectenters that frame's page; any other enters that element's shadow root. Anembedcannot be entered, so comment on one by passing it asselector.selectoris then resolved inside the last one, and is required:hostPath: ["iframe#checkout"]withselector: "form > button"is a button inside that iframe. A thread a person pinned inside one carries the same list as itsplacement.selectorsentry'shostPath; a hop there written as a bare id, such as#checkout, needs its element name in front,iframe#checkout. To comment on an iframe as a whole, pass it asselectorand leave this out. Added in 0.14.0.
set_page_url
Arguments: pageId, url, merge
Point a page at the URL its content moved to
pageId(required, string)url(required, string)merge(optional, boolean, defaultfalse)
resolve_thread
Arguments: threadId, resolved
Resolve or reopen a thread
threadId(required, string)resolved(required, boolean)
mark_read
Arguments: threadId, throughCommentId
Record how far you have read
threadId(required, string)throughCommentId(optional, string)
mark_unread
Arguments: threadId, fromCommentId
Leave a thread for somebody
threadId(required, string)fromCommentId(required, string)
delete_comment
Arguments: commentId
Delete a comment
commentId(required, string)
delete_thread
Arguments: threadId
Delete a thread
threadId(required, string)
list_notifications
Arguments: projects
What happened to me
projects(optional,"all"or array of string) — Which projects to read: "all", or a list of project ids from list_projects. Omit it to read every project; each answer says which project it is from.
wait_for_notifications
Arguments: projects, maxSeconds
Wait for a notification
projects(optional,"all"or array of string) — Which projects to read: "all", or a list of project ids from list_projects. Omit it to read every project; each answer says which project it is from.maxSeconds(optional, integer) — Seconds to wait before answering []. Above 600 is cut to 600.
ack_notifications
Arguments: ids
Acknowledge notifications
ids(required, array of string)
read_notifications
Arguments: ids
Mark notifications acted on
ids(required, array of string)
create_document
Arguments: title, markdown, markdownBlobId, images, projectId · Experimental: planner · Changed in: 0.16.0
Open a document for comment
Part of the planner, which is experimental: it may change or be removed in any release.
title(required, string)markdown(optional, string) — The document, as Markdown. GitHub-flavored Markdown and $…$ / $$…$$ math render; raw HTML is dropped. Pass this ormarkdownBlobId, not both.markdownBlobId(optional, string) — TheblobIdupload_file_link answered for the Markdown file, in place ofmarkdown. The file must be UTF-8 text. Added in 0.16.0.images(optional, object) — Each local image the Markdown names, mapped from its path exactly as the Markdown writes it (e.g. "./fig.png") to the blobId upload_file_link or upload_file answered for it. At most 64; PNG, JPEG, WebP or GIF. A path left out is shown as its alt text, and a remote image as a link.projectId(optional, string) — Which project to file the document in. Omit it and it goes to the project this access key is in (set_active_project), and the call is refused when the key is in none. Ids come from list_projects.
get_document
Arguments: id, url · Experimental: planner
Read a document
Part of the planner, which is experimental: it may change or be removed in any release.
id(optional, string)url(optional, string)
update_document
Arguments: id, markdown, markdownBlobId, title, images · Experimental: planner · Changed in: 0.16.0
Revise a document
Part of the planner, which is experimental: it may change or be removed in any release.
id(required, string)markdown(optional, string) — The document, as Markdown. GitHub-flavored Markdown and $…$ / $$…$$ math render; raw HTML is dropped. Pass this ormarkdownBlobId, not both.markdownBlobId(optional, string) — TheblobIdupload_file_link answered for the Markdown file, in place ofmarkdown. The file must be UTF-8 text. Added in 0.16.0.title(optional, string)images(optional, object) — Each local image the Markdown names, mapped from its path exactly as the Markdown writes it (e.g. "./fig.png") to the blobId upload_file_link or upload_file answered for it. At most 64; PNG, JPEG, WebP or GIF. A path left out is shown as its alt text, and a remote image as a link.
delete_document
Arguments: id · Experimental: planner
End a review
Part of the planner, which is experimental: it may change or be removed in any release.
id(required, string)
export_threads
Arguments: scope, url, projectId · Experimental: exports · Added in: 0.14.0
Export threads to a file
Part of export and import, which are experimental: they may change or be removed in any release.
scope(required, one of"page","site","project") — What to export: "page" is the page aturl, "site" is every page of the siteurlis on, and "project" is every site in the project.url(optional, string) — An address on the page or site to export. Required for "page" and "site"; not taken for "project".projectId(optional, string) — The project to export from. Omitted, a "page" or "site" export uses the project whose address pattern matchesurl, else this key's project; a "project" export uses this key's project.
import_threads
Arguments: projectId · Experimental: exports · Added in: 0.14.0
Import threads from a file
Part of export and import, which are experimental: they may change or be removed in any release.
projectId(optional, string) — The project to import into. Omitted, this key's project; a file's pages go into this one project whatever their addresses' patterns say.
delete_exported_threads
Arguments: exportId, sha256 · Experimental: exports · Added in: 0.14.0
Delete the threads an export holds
Part of export and import, which are experimental: they may change or be removed in any release.
exportId(required, string) — TheexportIdexport_threadsanswered.sha256(required, string) — The SHA-256 of the saved file, as 64 lowercase hex digits.
Prompts
A prompt is a job that your MCP client lists for you to start. The client asks you for the arguments listed under each prompt. This section leaves out each prompt’s description, which is written for the agent.
answer_thread
Arguments: threadId
Answer a comment thread
threadId(required) — The thread to answer. A permalink's first hash segment is one.
catch_up
Arguments: project
Catch up on what is waiting
project(optional) — A project id, or a project's exact name, to work that project alone. Leave it out to work every project.
discuss
Arguments: project
Keep answering as people reply
project(optional) — A project id, or a project's exact name, to work that project alone. Leave it out to work every project.
open_in_planner
Arguments: file · Experimental: planner
Open a document in the planner
Part of the planner, which is experimental: it may change or be removed in any release.
file(required) — The Markdown file to open, as a path you can read.
Resources
A resource is a skill: a document on how to work with the server. An agent
whose client does not read MCP resources gets the same text from the
read_skill tool. This section leaves out each resource’s
description, which is written for the agent.
answering
URI: commentware://skills/answering · Media type: text/markdown
Answering somebody in a thread
triage
URI: commentware://skills/triage · Media type: text/markdown
What is waiting for you
placing
URI: commentware://skills/placing · Media type: text/markdown
Where a comment goes