Jot MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Jot MCP ServerFetch open feedback, fix what you can, and reply on each Jot."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@usejot/mcp
Let your AI coding agent read and resolve Jot feedback.
Jot is click-to-pin feedback for live web apps. A reviewer clicks the broken thing on the real page and types one sentence. Each report comes with a screenshot, the element's selector, the URL, the browser and OS, and sometimes a session replay with console and network.
This is an MCP server. It gives an agent such as Claude Code, Cursor or Windsurf five tools: list feedback, read a report in full, mark it in progress or resolved, and reply in the thread. Agents can never approve a fix. Only the person who reported the problem can confirm it is fixed.
Quick start
1. Create a token
In Jot, open Settings → Agents, choose the project, name the token after who will use it (for example "Claude Code") and create it. Copy it straight away: it is shown only once. A token sees one project and nothing else. You can revoke it at any time on the same page.
2. Add Jot to your agent
The server runs with npx, so there is nothing to install.
Claude Code: run this in your project:
claude mcp add jot --env JOT_API_TOKEN=jot_agent_… -- npx -y @usejot/mcpOr save this as .mcp.json in your project root:
{
"mcpServers": {
"jot": {
"command": "npx",
"args": ["-y", "@usejot/mcp"],
"env": { "JOT_API_TOKEN": "jot_agent_…" }
}
}
}Cursor: add the same mcpServers block to ~/.cursor/mcp.json (all projects) or
.cursor/mcp.json (one project).
Windsurf: add the same mcpServers block to ~/.codeium/windsurf/mcp_config.json.
Any other MCP client works too. Run npx -y @usejot/mcp over stdio with JOT_API_TOKEN set.
Don't commit a file that contains your token. Add it to .gitignore, or keep the token in your
environment.
3. Ask
Fetch the open feedback for this project. Fix what you can, reply on each Jot with what you changed, and mark them resolved.
Related MCP server: uigrep
Settings
Variable | Required | Default | What it does |
| yes | none | Your agent token, from Settings → Agents |
| no |
| The Jot API to talk to. Change it only if you self-host Jot |
The server needs Node 18 or later.
Tools
Tool | Title | Takes | Does |
| List feedback |
| Lists reports: id, status, source, labels, the reviewer's sentence and where it was left |
| Read a Jot |
| Everything about one report: the repro context, the thread, and any recording as a text timeline |
| Set status |
| Moves a report along |
| Reply in thread |
| Adds a note the reporter can see, such as "Fixed in PR #204" |
| Post one note to several Jots |
| One note linked across several threads. All or nothing: one unknown id and nothing posts |
Good to know:
Read-only tools.
fetch_feedbackandget_commentare marked read-only, so your client can allow them without asking. No tool is destructive.update_statusis safe to repeat.No approving.
update_statusaccepts onlyIN_PROGRESSandRESOLVED.RESOLVEDmeans "please check", not "closed". The reporter approves.Public feedback is opt-in. Without
source,fetch_feedbackleaves out anonymous visitor feedback that the team hasn't triaged. Passsource: ["PUBLIC"]to include it.Recordings as text. An agent can't watch a video, so
get_commentturns a recording into a timeline: console errors and failed requests, each with its timestamp.Structured output.
fetch_feedback,update_statusandcreate_batch_notealso return structured data next to the text.Errors don't crash. A failed call comes back as a tool error your agent can read.
A typical session
You: Fix the open Jot feedback on the checkout page.
Agent: → fetch_feedback { projectId: "…", status: "OPEN", page: "https://shop.example.com/checkout" }
3 open reports, two about the same button.
→ get_comment { commentId: "…" }
"Pay button does nothing on Safari" · button#pay · Safari 18 / macOS
Timeline: TypeError at 00:04, POST /checkout failed (500)
→ update_status { commentId: "…", status: "IN_PROGRESS" }
… edits the code, opens PR #204 …
→ update_status × 2 { status: "RESOLVED" }
→ create_batch_note { comment_ids: ["…", "…"], message: "Fixed in PR #204. Please check." }
You: (the reviewers see the note on their pins, check the fix, and approve)fetch_feedback needs the id of the project your token was created for. It is the id in the
address bar when you open the project in Jot. Tell your agent once, for example in your
project's agent instructions file.
Develop
git clone https://github.com/usejot/jot-mcp.git
cd jot-mcp
npm install
npm run build
npm testTry it with the MCP Inspector:
JOT_API_TOKEN=jot_agent_… npx @modelcontextprotocol/inspector node dist/index.jsThis server follows the Jot SDK contract (§5, MCP
tools). A pinned copy ships in contract/, and the tests check the tools against its vectors.
Contributing
Read CONTRIBUTING.md. Found a security problem? Don't open an issue. Follow SECURITY.md. Everyone taking part agrees to the Code of Conduct.
Links
Website: https://usejot.co
Docs: https://docs.usejot.co
Contract: https://github.com/usejot/jot-contract
JavaScript SDKs: https://github.com/usejot/jot-js
License
Available Tools
5 toolscreate_batch_notePost one note to several JotsA
Report one action that spanned several comments (e.g. 'resolved 3 comments in PR #204') as a single note, linked across every thread it names. Atomic: one unknown id and nothing is posted.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| comment_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| replyIds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, non-idempotent, open-world profile, so the description's job is to add beyond that — and it does, disclosing the critical all-or-nothing semantics ('one unknown id and nothing is posted') and cross-thread linking behavior. It still omits permission requirements and any duplicate/limit handling.
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?
Two sentences, zero filler, front-loaded with the action and example before the atomicity caveat. Every clause carries information the agent needs.
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 two-parameter mutation with an output schema (return shape need not be described) and safety annotations, the definition covers intent, batch scope, and failure atomicity well. Missing only secondary details such as auth scope and rate/size limits.
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 description coverage is 0%, so the description must compensate. 'Linked across every thread it names' and 'one unknown id' hint that comment_ids are thread identifiers and that invalid ids abort the call, but it never names the parameters, explains the message's 5000-char limit, or notes the 1-50 id bounds.
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 (report one spanned action as a single note) on a specific resource (multiple comment threads, linked), which is clearly distinct from single-thread siblings like post_reply. It never names an alternative explicitly, so differentiation is implied rather than spelled out.
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?
Usage is implied by the example ('resolved 3 comments in PR #204') and the 'spanned several comments' condition, which tells the agent when batching applies. However, no exclusions are stated and no sibling tool is named as the single-thread alternative, so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_feedbackList feedbackARead-only
List feedback comments for a project. Filter by status to find work to do. Public visitor feedback is left out unless source asks for it.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Only comments made on this page — any URL on the page works | |
| source | No | Only comments from these reporters. Omitted: public feedback still tagged FEEDBACK is left out | |
| status | No | Only return comments in this state | |
| projectId | Yes | The Jot project id | |
| environment | No | Only comments captured on this deployment, e.g. "staging" |
Output Schema
| Name | Required | Description |
|---|---|---|
| comments | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description contributes real non-annotation behavior: PUBLIC visitor feedback is excluded by default unless 'source' requests it, which tells the agent the result set is filtered before it ever calls the tool.
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 short sentences, the core purpose and the most surprising behavior (default exclusion of public feedback) front-loaded. No filler, no repetition of the title.
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?
An output schema exists, so return values need no explanation, and annotations carry the safety profile. The description covers scope, filtering intent, and the non-obvious default. It is nearly complete, though it says nothing about result volume or ordering.
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 largely restates what the schema already documents for 'source' and adds only a plain-language version of the same default-exclusion rule, with no syntax or interaction detail beyond the schema.
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?
States a specific verb and resource ('List feedback comments for a project'), which is unambiguous against siblings like get_comment (singular) and update_status/post_reply (mutations). It does not explicitly name or differentiate itself from those siblings, so it stops short of a 5.
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?
'Filter by status to find work to do' implies a usage context (triaging open work) but gives no explicit when-not or alternative-tool routing. No sibling is named, and 'use X instead when Y' guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commentRead a JotARead-only
Full detail for one comment: the repro context, the thread, and — when a session was recorded — a text timeline of what happened, since an agent cannot watch a replay.
| Name | Required | Description | Default |
|---|---|---|---|
| commentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, openWorldHint), and the description adds genuine conditional behavior: the text timeline is only returned 'when a session was recorded.' That discloses a variability in the response an agent otherwise could not predict, which is real value beyond the annotations.
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?
A single front-loaded sentence opens with the core purpose, and the em-dash aside adds the response contents plus the agent-relevant reason for the timeline. Efficient overall, though the mid-sentence aside slightly complicates parsing.
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?
With no output schema, the description correctly shoulders the job of describing return contents (repro context, thread, conditional timeline), and annotations cover the read-only safety profile. For a one-param read tool it is close to complete, missing only the commentId format.
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 description coverage is 0% and the single commentId parameter is undocumented in the schema, so the description carries the burden -- but it only implies the ID identifies 'one comment' and gives no format or sourcing guidance. With one self-naming parameter, this is minimally adequate rather than compensating for the gap.
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?
States a specific action and resource: retrieving full detail for one comment, enumerating what that detail includes (repro context, thread, timeline). It is clear about scope (single comment) but never distinguishes itself from siblings like fetch_feedback, so it lands at 4 rather than 5.
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?
Usage is only implied: you call it to get detail on one comment, and the closing rationale hints at the value of a text timeline over an unwatchable replay. No explicit when-to-use condition, no exclusion, and no routing to alternatives such as fetch_feedback is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_replyReply in threadB
Add a note to a comment thread so the reporter can see what happened, e.g. 'Fixed in PR #204'.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| commentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write, open-world, non-idempotent, non-destructive profile. The description adds a genuinely useful behavioral fact beyond them: the note is visible to the reporter. It omits, however, that repeated calls will stack duplicate notes on the same thread (non-idempotent), which an agent would benefit from knowing.
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?
A single front-loaded sentence with an inline example; nothing is wasted. The example arguably earns its place by showing expected message content.
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?
There is no output schema and only two simple required params, so the bar is modest, but a mutation tool with 0% param documentation should do more than state the intent: it never clarifies the commentId's origin or the effect of repeated replies.
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 description coverage is 0%, so the description must carry the burden, and it largely does not: commentId is never explained, and message semantics (the 1-5000 char limit, whether markdown is allowed) are only loosely hinted at by the example string.
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?
States a specific verb+resource (add a note to a comment thread) and gives a concrete example message. It does not differentiate itself from the sibling create_batch_note, which likely has an overlapping purpose, so it falls short of a 5.
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?
The phrase 'so the reporter can see what happened' implies the situation for using it, but there is no explicit when-not guidance and no routing to alternatives such as create_batch_note or update_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_statusSet statusAIdempotent
Move a comment to IN_PROGRESS or RESOLVED. Agents cannot approve — only the person who reported a problem can confirm it is fixed.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| commentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds a non-obvious authorization constraint (agent cannot confirm/approve) that annotations cannot express, which is genuinely valuable. It stops short of explaining what a successful transition returns or whether RESOLVED actually closes the comment given the approval caveat.
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?
Two tight sentences with the action and its values front-loaded, followed by the single most load-bearing constraint. No filler.
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?
With an output schema present, return values need not be described, and annotations already cover idempotency and non-destructiveness. The authorization caveat fills the main behavioral gap. Minor residual ambiguity remains about whether an agent may ever set RESOLVED, since the enum permits it while the text says only the reporter can confirm a fix.
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 description coverage is 0%, so the description must carry the burden. It names the two status values (already in the enum) and hints at the semantics of confirming a fix, but says nothing about commentId or its format/scope. Partial compensation for an undocumented parameter set.
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?
States a concrete verb and resource ('Move a comment to IN_PROGRESS or RESOLVED') and enumerates the allowed target states, so the agent knows exactly what the tool mutates. No sibling (get_comment, fetch_feedback, post_reply, create_batch_note) performs status transitions, so the operation is unambiguously distinct.
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?
Explicitly draws a permission boundary: agents cannot approve, only the reporter can confirm a fix. This tells the agent a class of action is off-limits. It does not, however, say when to prefer IN_PROGRESS versus RESOLVED, so the transition guidance is only partially supplied.
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.
5 tool updates
v0.6.0- First observed
create_batch_note - First observed
fetch_feedback - First observed
get_comment - First observed
post_reply - First observed
update_status
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: listing feedback versus retrieving one comment, changing status versus adding a reply, and posting a single reply versus a batch note across threads. The descriptions explicitly distinguish single-thread and multi-thread actions, so misselection is unlikely.
All tool names follow a consistent snake_case verb_noun pattern: get_comment, fetch_feedback, update_status, post_reply, create_batch_note. The verbs are varied but appropriate, and the structure is predictable throughout.
Five tools is well-scoped for a feedback/comment management server. Each tool earns its place by covering a distinct part of the agent workflow without redundancy.
The surface covers listing, reading, updating, replying, and batch-noting feedback comments, which handles the core agent workflow. Minor gaps exist, such as no bulk status update or edit/delete operation for replies, but these are workable around.
Related MCP Connectors
- BugTapeOAuthai.bugtape
Production bugs with replay, network, console and stack, ranked for your coding agent to fix.
Give AI coding agents access to your Vynix visual feedback, bug reports, and AI diagnosis.
Visual feedback from your website's visitors as tasks for your coding agent.
Read and triage bug reports captured by Session Replay for your verified domains.
Related MCP Servers
- AlicenseAqualityAmaintenanceRead visual bug reports from Feedbug in your AI coding agent: screenshot, console logs, failed network requests, session replay and the DOM context of the element the tester clicked. Trace the bug to its source file, comment and resolve without leaving the editor.74 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to pull structured UI feedback captured in the browser — including element selectors, bounding boxes, computed styles, screenshots, and annotations — and to mark issues as fixed.MIT
- FlicenseNot gradedqualityAmaintenanceEnables coding agents to access recorded browser flows with user actions, network, console, storage, DOM events, and screen recording so they can debug, report bugs, perform regression testing, and generate Playwright tests without reproducing the issue.-
- FlicenseNot gradedqualityAmaintenanceEnables coding agents to access recorded browser flows—including user actions, network activity, console logs, storage, DOM events, and screen recordings—for debugging and regression testing. It lets agents inspect and analyze these flows to report bugs and generate tests without manually reproducing issues.-