---
title: "MCP tools, prompts and resources"
description: "The tools, prompts and skill resources a server offers an AI agent over MCP, each tool and prompt with its arguments, for the newest release."
---

> Documentation Index
> Fetch the complete documentation index at: https://commentware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP tools, prompts and resources

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](/docs/concepts/agents/).

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 or `null`)

## `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 with `kind` or object with `kind`, `projectId` or object with `kind`, `siteId` or object with `kind`, `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, default `true`)

## `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 when `encoding` is utf8, or base64 of its bytes when it is base64.
- `encoding` (required, one of `"utf8"`, `"base64"`) — How to read `content`. 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's `attachments`, not the attachment's own `id`.

## `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 in `iframe`, `frame` or `object` enters that frame's page; any other enters that element's shadow root. An `embed` cannot be entered, so comment on one by passing it as `selector`. `selector` is then resolved inside the last one, and is required: `hostPath: ["iframe#checkout"]` with `selector: "form > button"` is a button inside that iframe. A thread a person pinned inside one carries the same list as its `placement.selectors` entry's `hostPath`; 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 as `selector` and leave this out. Added in 0.14.0.
- `title` (optional, string)
- `nickname` (optional, string)
- `mentions` (optional, array of string)
- `attachments` (optional, array of object with `blobId`, `name`) — Files to post with this comment, at most 10. Each `blobId` comes from upload\_file\_link or upload\_file, or from the `attachments` of a comment this server already holds; `name` is 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 with `blobId`, `name`) — Files to post with this comment, at most 10. Each `blobId` comes from upload\_file\_link or upload\_file, or from the `attachments` of a comment this server already holds; `name` is 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 in `iframe`, `frame` or `object` enters that frame's page; any other enters that element's shadow root. An `embed` cannot be entered, so comment on one by passing it as `selector`. `selector` is then resolved inside the last one, and is required: `hostPath: ["iframe#checkout"]` with `selector: "form > button"` is a button inside that iframe. A thread a person pinned inside one carries the same list as its `placement.selectors` entry's `hostPath`; 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 as `selector` and 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, default `false`)

## `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 or `markdownBlobId`, not both.
- `markdownBlobId` (optional, string) — The `blobId` upload\_file\_link answered for the Markdown file, in place of `markdown`. 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 or `markdownBlobId`, not both.
- `markdownBlobId` (optional, string) — The `blobId` upload\_file\_link answered for the Markdown file, in place of `markdown`. 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 at `url`, "site" is every page of the site `url` is 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 matches `url`, 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) — The `exportId` `export_threads` answered.
- `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`](#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