MCP & AI Connections
MCP (Model Context Protocol) connects your feedback to an external AI tool. Use a hosted HTTPS connection for browser clients, or the local npm server for coding tools. The built-in AI Assistant is a separate dashboard chat.
Find MCP settings and your token
Open any project and click MCP directly in the project sidebar. It is a separate item beside Comments, Board, and Assets. From the workspace, use Workspace settings → MCP & AI connections. You can also open MCP settings directly.
Only workspace owners can authorize external connections or generate account API tokens. Team members should ask the owner to connect the workspace. Project access is selected during browser authorization; opening setup from a project does not grant access automatically.
For a token or API key, find Local API tokens, give the token a name, and click Generate token. Copy it immediately: the full value is shown once. Local tokens have account-wide read, write, and settings access. Use hosted OAuth authorization for read-only or selected-project access.
Availability and Pricing
MCP is included on supported paid plans, including Solo, Team, Pro, Agency,
Enterprise, and Unlimited lifetime plans, and during the 14-day trial. It is
not available on the free plan after the trial. Use get_connection_info to
check the connected account's current plan and access.
There is no separate MCP subscription or per-request fee. Hosted MCP allows 120 authenticated requests per minute per connection. The local server's MCP API allows 120 requests per minute per integration token. These are MCP limits, not a plan-specific allowance; your AI provider's usage limits apply separately. See Troubleshooting for rate-limit recovery.
Hosted connection: ChatGPT and Claude
The hosted MCP route uses your existing Simple Commenter domain:
https://www.simplecommenter.com/api/mcp
Hosted MCP is enabled by default after deployment. Deployment operators can
optionally disable it with MCP_ENABLED=false. Check the server status in
MCP settings before connecting. Hosted connection
unavailable means that hosted access is disabled or unavailable on that
deployment; use the local setup below while it is unavailable. The URL by
itself does not establish a working connection.
The hosted URL uses Streamable HTTP. It is the address to paste into a remote MCP client. The npm package runs locally over stdio and does not provide a URL to paste into ChatGPT. Browser setup uses OAuth sign-in; it does not require you to generate or paste a local API token.
ChatGPT
- Open MCP in the project sidebar and select ChatGPT.
- In ChatGPT, enable Developer mode under Settings → Security and login.
- Open Plugins, choose +, and create a developer-mode app using the hosted server URL. Choose OAuth authentication and dynamic client registration when offered.
- Sign in to Simple Commenter. Select the permitted projects and allowed actions, then authorize the connection.
- In a chat, select the app from Developer mode in the plus menu. Ask: “List my projects and show unresolved feedback.”
Custom app access depends on the ChatGPT account and workspace policy. This server supports dynamic client registration (DCR), rather than Client ID Metadata Documents (CIMD). See OpenAI's developer-mode guide for current client requirements.
Claude
- Open Customize → Connectors in Claude.
- Choose + → Add custom connector, paste the hosted URL, and add the connector.
- Connect and sign in to Simple Commenter, then select projects and approve the allowed actions.
- Enable the connector for the conversation from + → Connectors, then ask Claude to list your feedback.
Organization owners may need to add the connector first. See Claude's custom connector guide.
Choose access and disconnect
Browser authorization starts with read access and selected projects. Enable write access only when the client should create comments, reply, or triage feedback. Settings access permits administrative operations. Workspace-wide access, including future projects, is a separate explicit choice; creating projects and managing the workspace team require it as well as settings access.
| Access | Permitted actions | Project scope |
|---|---|---|
| Read | Read feedback, search, export, report, and manage this connection's report/export jobs. | Selected projects, or explicitly approved workspace access. |
| Write | Create website comments, reply, upload reply files, change status/priority/tags/visibility, and archive or restore feedback. | Only projects included in the connection. |
| Settings | Read and change supported project settings; inspect the selected project's assigned team. | Only projects included in the connection. |
| Settings + all current and future projects | Create projects, list the workspace team, add members, change project assignments, and remove team members. | Workspace-wide administrative access. |
Read access is always included. Write and settings access are optional and independent; enabling one does not enable the other. A client's tool approval dialog cannot expand the access granted in Simple Commenter.
In MCP → Connected apps, review allowed actions, permitted projects, and last use. Click Disconnect to revoke a connection. To add projects or change permissions, reconnect from the AI client and complete authorization again. Revocation also invalidates that connection's saved downloads and job results.
What your AI can do
Read feedback with project context, screenshot references, replies, tags, current statuses, and direct dashboard links. Search, export, and reporting apply the connection's project permissions. Changes require the appropriate granted access.
The connection gives your AI access to feedback. Editing website code also requires access to the relevant code repository and development tools.
Try a workflow
- “List my projects and show the current statuses for my website.”
- “Find urgent feedback created this week, including feedback on assets.”
- “Export all feedback from this project to CSV, including archived comments.”
- “Create a report of feedback by project, status, and priority.”
- “Show me the proposed changes before moving these three comments to review.”
Tool reference
The hosted and local servers share these 27 tools. Your client discovers their
JSON input schemas automatically. The tables below use their exact parameter
names. Supply project_id from list_projects for a single-project tool; a
local configured default can supply it when omitted. Hosted setup does not set
a default project. Tool availability follows the connected server version;
refresh discovery after upgrading and check hosted availability in settings.
| Tool | Access | Inputs and behavior |
|---|---|---|
get_connection_info |
Read | No inputs. Account plan, permissions, project grant, and connection details. |
list_projects |
Read | No inputs. Authorized projects, stable IDs, and dashboard links. |
get_project_context |
Read | project_id. Live statuses, custom status labels, tags, and project features. |
list_comments |
Read | project_id, optional feedback filters, limit, offset. One project's feedback. |
get_comment |
Read | project_id, comment_id, optional asset_id. Full detail, replies, file references, element context, and developer brief when available. |
search_comments |
Read | Optional feedback filters, limit, offset. Search across authorized projects. |
search |
Read | query. Up to 100 citable sources; truncated signals more matches. Use search_comments for paginated retrieval. |
fetch |
Read | id returned by search. Full source content and citation URL; arbitrary URLs are not fetched. |
export_comments |
Read | Optional feedback filters. Complete matching set as a downloadable CSV. |
feedback_report |
Read | Optional feedback filters. Complete totals and breakdowns, with a Markdown download. |
update_comment_status |
Write | project_id, comment_id, and status and/or priority; optional asset_id, idempotency_key. |
update_comment |
Write | project_id, comment_id, and at least one of status, priority, tags, visibility, archived; optional asset_id, idempotency_key. |
create_comment |
Write | project_id, page, text; optional title, status, priority, comma-separated tags, anchor_selector, anchor_text, anchor_tag, idempotency_key. Creates website feedback. |
reply_to_comment |
Write | project_id, comment_id, text; optional asset_id, attachments containing upload_id, idempotency_key. |
prepare_attachment_upload |
Write | project_id, filename, mime_type, exact byte size. Returns a signed PUT URL and upload_id. |
bulk_update_comments |
Write | items and idempotency_key. Each item specifies project_id, comment_id, optional asset_id, and one or more update fields. Maximum 100 distinct items; returns each outcome. |
get_project_settings |
Settings | project_id. Supported non-secret settings. |
update_project_settings |
Settings | project_id and settings. Changes only the supplied supported settings. |
create_project |
Settings + workspace | name, idempotency_key, optional domain. Creates a website project within plan limits. |
list_team_members |
Settings | Optional project_id. Required for a selected-project grant; omitting it lists the workspace team only with workspace-wide access. |
add_team_member |
Settings + workspace | email, idempotency_key; optional name, project_id, role (only team). Adds access without sending an invitation email. |
assign_team_member |
Settings + workspace | project_id, member_id, assigned (true to assign, false to unassign). |
remove_team_member |
Settings + workspace | member_id. Removes the member from the workspace and its projects; cannot remove the owner. |
start_task |
Read | operation (export_comments or feedback_report), arguments containing feedback filters, and idempotency_key. Starts a background job. |
get_task |
Read | task_id. Progress or final result for this connection's job. |
list_tasks |
Read | Optional limit, offset. This connection's jobs. |
cancel_task |
Read | task_id. Cancels an unfinished job; completed results remain available until expiry. |
Filters and complete results
Feedback filters are project_id or project_ids (up to 50), query
(search is an alias), comma-separated status, priority, and tags, exact
page slug, author, created_after, created_before, include_archived,
source, and asset_id. list_comments uses one project_id rather than
project_ids. Dates use ISO timestamps with a timezone; both endpoints are
inclusive. Tags match any supplied tag. Text search matches titles and comment
text, not the reply thread.
source accepts all, website, or asset and defaults to all.
include_archived defaults to false. Deleted feedback is always excluded.
Without project filters, search, exports, and reports cover every project in
the connection's grant, including when the local setup has a default project.
list_comments, search_comments, and list_tasks return total and
next_offset. Use that offset until it is null; each page defaults to 50
records and accepts a limit of 1–100 and offset of 0–1,000,000. Search text
is limited to 1,000 characters. An export or report processes the entire
matching set without limit or offset. Both have a maximum of 50,000 comments
and an 8 MiB generated file limit; narrow the project or date range if exceeded.
Dashboard links require sign-in and the viewer's own access. Website feedback
links open the Board item when it is available in the active view; asset links
open the asset viewer. Archived feedback may not open in the active Board;
retrieve its detail with get_comment or restore it when appropriate.
For example, call search_comments with these arguments, then use the returned
next_offset to continue:
{
"project_ids": ["PROJECT_ID"],
"created_after": "2026-09-01T00:00:00Z",
"created_before": "2026-09-06T23:59:59Z",
"priority": "high,urgent",
"source": "all",
"include_archived": false,
"limit": 100,
"offset": 0
}
Export CSV from the dashboard
Open a project → Comments or Board → Export CSV, beside Add comment. Choose All website feedback for all accessible statuses or Current filters for the complete filtered set, including records below the fold. On Board, filtered export waits for all statuses to finish loading. Both dashboard choices exclude archived and asset feedback. General → Export Feedback also exports all website feedback.
Use MCP export_comments with source: "all" and include_archived: true
when you need assets and archived feedback, or cross-project exports. MCP CSV
rows include project, comment, status, priority, tags, author, creation date,
source, page or asset, archive state, dashboard URL, screenshot URL, and comment
and reply attachment URLs. Dashboard CSV also includes the reply thread; the
MCP CSV does not include reply text.
Updating feedback safely
Read get_project_context before choosing a status; custom and enabled
statuses vary by project. Priorities are low, normal, high, and urgent.
For updates, tags is a replacement array (up to 30 tags); [] clears tags.
visibility is all or team, and changing it can change client visibility.
archived: true archives feedback; false restores it. Restore archived
feedback before replying or making other changes. There is no permanent-delete
tool. New comments and replies accept up to 30,000 text characters; a new
comment's optional title accepts up to 500. Tags contain 1–40 letters, numbers,
underscores, or hyphens.
Use an idempotency_key for create/reply retries. It is required for bulk
updates, project/member creation, and background jobs: 8–128 letters, digits,
underscores, periods, colons, or hyphens. Reuse exactly the same key and arguments
when retrying the same action; receipts last seven days. If the earlier outcome
is uncertain, inspect the affected item before sending a new key. Bulk results
can contain successful and failed items, so review each outcome.
Project and team administration
get_project_settings and update_project_settings support projectName,
domain, active, enabledStatuses, emailNotifications, emailFrequency,
notifyOnOwnComments, drawing, screenshots, uploads, commentTitle,
metaData, minimized, clientAccess, and tokenAccess. Read the current
settings before changing access controls. clientAccess is open, request,
or invite; tokenAccess is a boolean. Status names must already exist in the
project. emailFrequency accepts minute, 15minutes, hourly, daily,
weekly, or monthly. Other settings and credentials are not exposed by these
tools.
Adding a team member through MCP does not send an invitation email. Ask the workspace owner to arrange access through the dashboard when an invitation is needed.
Reports, tasks, and reusable workflows
Use start_task for an export or report that takes longer to produce. For
example, these arguments start a CSV of website and asset feedback:
{
"operation": "export_comments",
"arguments": {
"project_id": "PROJECT_ID",
"source": "all",
"include_archived": true
},
"idempotency_key": "feedback-export-2026-09-06"
}
Save the returned task_id. Call get_task with {"task_id":"TASK_ID"}
no sooner than the returned poll_interval_ms (currently 3,000 ms). Status is
queued, running, completed, failed, or cancelled; a completed task
includes result and its download artifact. cancel_task stops an unfinished
job. Jobs are private to the connection that started them and expire 24 hours
after creation. New starts are rejected when the connection already has five
unfinished jobs. Background processing uses the same data and file-size limits
as direct exports.
Download links last 15 minutes. While a completed job and its stored artifact remain available, retrieving the job renews an expired download link. Artifact content is retained for 24 hours after creation; renewal does not extend that retention. Regenerate a direct export after its link expires, or start a new job after the old one expires. Screenshot and attachment links inside a CSV expire separately; generate a fresh export when you need new file links.
These are regular MCP tools; support for experimental protocol task APIs is not required.
Compatible clients can browse connection, project, comment, and job resources, or use the triage_feedback, release_report, and investigate_comment prompts. Hosts that support MCP Apps can display a read-only feedback browser. Other clients receive ordinary tool results and links.
Reply attachments
Attachment uploads require a client capable of uploading files to a signed URL.
Call prepare_attachment_upload with these arguments (the size is the actual
file size in bytes):
{
"project_id": "PROJECT_ID",
"filename": "review.png",
"mime_type": "image/png",
"size": 12345
}
Upload those bytes with HTTP PUT to the returned upload_url, using its
headers, before the returned expires_at (15 minutes). Then call
reply_to_comment:
{
"project_id": "PROJECT_ID",
"comment_id": "COMMENT_ID",
"text": "Here is the updated screenshot.",
"attachments": [{ "upload_id": "UPLOAD_ID" }],
"idempotency_key": "review-reply-2026-09-06"
}
Each upload is usable once, in the same project and connection. Its declared type and size must match the uploaded object. MCP accepts files up to 100 MiB and at most 10 files per reply; plan file-size, file-count, type, storage, and retention limits may be lower. Uploads must be enabled for the project. Arbitrary remote URLs and local file paths are not imported as attachments.
Local workflow preferences
Local setup can disable AI-created comments or replies. These preferences are enforced for local tool calls. Status choices are read for the selected project; use get_project_context after changing projects to inspect its current workflow.
Local setup: Cursor and Claude Code
Step 1: Run the setup wizard
From your project's root directory, run:
npx @simple-commenter/mcp-server init
Alternatively, install the command globally and run it:
npm install -g @simple-commenter/mcp-server
simple-commenter-mcp init
Step 2: Choose the project and preferences
The wizard will:
- Authenticate with your email and a 6-digit code
- Let you pick a default project
- Configure status preferences for AI workflows
- Ask whether the agent may write replies and create comments
- Create a
.mcp.jsonin your project root if one does not already exist
Email code didn't arrive?
Generate an API key in MCP settings (MCP → Local API tokens → Generate token) and pass it directly to skip the email step:
npx @simple-commenter/mcp-server init --token "$SIMPLE_COMMENTER_API_TOKEN"
Set SIMPLE_COMMENTER_API_TOKEN to your token in your local shell or secret
manager first. The quotes pass its value as one argument. The wizard's
--token option skips email verification; init does not automatically read
the environment variable unless you pass it this way. Never include a real
token in shared instructions or screenshots.
Step 3: Restart Your AI Tool
Restart Claude Code, Cursor, or whichever AI tool you use. The MCP server will be available automatically.
Verify Your Setup
simple-commenter-mcp doctor
This checks Node.js version, config file and its permissions, token, API connectivity, default project, and .mcp.json — reports pass/fail for each. Without a global installation, run npx @simple-commenter/mcp-server doctor instead.
Configuration
.mcp.json
The wizard writes a node command pointing to its installed index.js and
leaves any existing .mcp.json unchanged. For a manual, portable setup, merge
this entry into your client's MCP configuration:
{
"mcpServers": {
"simple-commenter": {
"command": "npx",
"args": ["-y", "@simple-commenter/mcp-server", "serve"]
}
}
}
Environment Variable (CI / Docker)
For automated environments, pass the token as an environment variable instead of using the config file:
{
"mcpServers": {
"simple-commenter": {
"command": "npx",
"args": ["-y", "@simple-commenter/mcp-server", "serve"],
"env": {
"SIMPLE_COMMENTER_API_TOKEN": "REPLACE_WITH_API_TOKEN"
}
}
}
}
You can generate a token from the MCP settings or via CLI login.
Authentication Priority
The server checks for credentials in this order:
--token <token>CLI flagSIMPLE_COMMENTER_API_TOKENenvironment variable~/.simple-commenter/config.json(frominitcommand)
Managing local tokens
Open MCP → Local API tokens or go directly to MCP settings to generate named tokens, inspect last use, and revoke credentials you no longer need.
Revoking an API token disconnects every local tool using that token. Browser-authorized apps have separate credentials and are managed under Connected apps.
CLI Commands
| Command | Description |
|---|---|
| simple-commenter-mcp init | Setup wizard — login + pick project |
| simple-commenter-mcp serve | Start MCP server (default, used by AI tools) |
| simple-commenter-mcp doctor | Health check — verify setup + connectivity |
| simple-commenter-mcp status | Show account info + projects |
| simple-commenter-mcp reset | Remove config + .mcp.json (clean slate) |
login and logout still work as aliases for init and reset.
Security
- Credentials are stored in
~/.simple-commenter/config.jsonwithchmod 600(owner-only) - The server warns if file permissions are too open
- For shared machines, use environment variables instead of the config file
- Add
.simple-commenter/to your.gitignore
Never commit your API token to version control. Use environment variables in CI/CD pipelines.
Troubleshooting
Hosted connection and permissions
| Problem | Recovery |
|---|---|
| Hosted connection unavailable | Check the status in MCP settings. Hosted MCP defaults to on, but the deployment can disable it with MCP_ENABLED=false or be unavailable. Use local setup while the deployment issue is resolved. |
| No MCP URL in the npm instructions | Use https://www.simplecommenter.com/api/mcp for a remote connection. npm/stdio is the local setup. |
| Cannot authorize or manage connections | Sign in as the workspace owner. Team members and clients cannot create owner credentials. |
| Authorization request expired or invalid | Restart Connect in the AI client. Old consent URLs and authorization codes cannot be reused. |
| OAuth registration fails | Use supported DCR, or client credentials supplied for a configured static client. This server does not advertise CIMD. Check the AI client's workspace restrictions. |
| Connection revoked, expired, or invalid token | Reconnect through the AI client and authorize again. For local tools, generate a replacement token and update the local configuration. |
| A project is missing or project not found | Call list_projects and get_connection_info. Use a returned ID; reconnect to add missing projects. Opening MCP from a project does not grant it automatically. |
| A write or settings permission is required | Reconnect and approve the needed scope. Read-only access permits queries, reports, and exports. Project/team administration may also require all current and future projects. |
| MCP unavailable on current plan | Inspect get_connection_info and the account's plan. A trial may have ended; open the returned upgrade link if needed. |
| Too many requests / 429 | Wait for the HTTP Retry-After interval when supplied, then retry with backoff. Hosted requests are limited to 120/minute per connection, local MCP API requests to 120/minute per token. |
| New tools missing in the AI client | Refresh the app's discovered tools or reconnect. Update the installed local package when using npm. |
Feedback, exports, and uploads
| Problem | Recovery |
|---|---|
| Only 50 or 100 comments were returned | Follow next_offset until null, or use export_comments for the complete matching set. |
| Assets or archived comments are absent from dashboard CSV | Dashboard export covers active website feedback. Use MCP with source: "all" and include_archived: true for broader exports. |
| Current filters export is disabled on Board | Wait for all statuses to load. Reload if background loading failed. |
| Export exceeds size limits / 413 | Narrow project or date filters. Jobs have the same 50,000-comment and 8 MiB limits as direct exports. |
| Download link expired | Retrieve the original job again while it is available, or generate a new export. Fresh embedded screenshot/file links require a new export. |
| Job result says original access is unavailable | The original grant, project, connection, or plan changed. Reconnect with the appropriate access and start new work. |
| Five unfinished jobs / 429 | Wait for a job to finish or cancel an unfinished job before starting another. |
| Status is invalid or feedback is archived | Read current project statuses. Restore archived feedback before replying or updating it. |
| Duplicate key or operation already running | Reuse the same arguments for the same idempotency key. Inspect the earlier outcome before issuing a new key. |
| Upload incomplete or expired | PUT the exact file bytes before replying. For an expired reference, prepare a new upload in the same project and connection. |
| File type, size, or storage limit rejected | Check the project's upload setting and account storage/file limits; choose a permitted file. |
| Client cannot upload bytes to a signed URL | Attach the file through the dashboard instead. A local path or web URL in tool arguments is not an upload. |
Local setup
| Check | Fix |
|---|---|
| Config file not found | Run simple-commenter-mcp init |
| No authentication token | Run init or set SIMPLE_COMMENTER_API_TOKEN |
| API connection failed | Check your internet connection; verify the API URL |
| No default project set | Run init and select a project |
| .mcp.json not found | Run init from your project root (where package.json or .git is) |
Still having issues?
Run simple-commenter-mcp doctor for local diagnostics. For hosted issues,
include the client name, MCP settings status, tool name, and error code when
contacting support. Leave out tokens, authorization codes, signed
download URLs, and private feedback.