Skip to main content
Glama
usejot
by usejot

@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/mcp

Or 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

JOT_API_TOKEN

yes

none

Your agent token, from Settings → Agents

BACKEND_API_URL

no

https://api.usejot.co

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

fetch_feedback

List feedback

projectId, optional status, page, environment, source

Lists reports: id, status, source, labels, the reviewer's sentence and where it was left

get_comment

Read a Jot

commentId

Everything about one report: the repro context, the thread, and any recording as a text timeline

update_status

Set status

commentId, status (IN_PROGRESS or RESOLVED)

Moves a report along

post_reply

Reply in thread

commentId, message (up to 5,000 characters)

Adds a note the reporter can see, such as "Fixed in PR #204"

create_batch_note

Post one note to several Jots

comment_ids (1 to 50), message

One note linked across several threads. All or nothing: one unknown id and nothing posts

Good to know:

  • Read-only tools. fetch_feedback and get_comment are marked read-only, so your client can allow them without asking. No tool is destructive. update_status is safe to repeat.

  • No approving. update_status accepts only IN_PROGRESS and RESOLVED. RESOLVED means "please check", not "closed". The reporter approves.

  • Public feedback is opt-in. Without source, fetch_feedback leaves out anonymous visitor feedback that the team hasn't triaged. Pass source: ["PUBLIC"] to include it.

  • Recordings as text. An agent can't watch a video, so get_comment turns a recording into a timeline: console errors and failed requests, each with its timestamp.

  • Structured output. fetch_feedback, update_status and create_batch_note also 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 test

Try it with the MCP Inspector:

JOT_API_TOKEN=jot_agent_… npx @modelcontextprotocol/inspector node dist/index.js

This 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.

License

MIT

Available Tools

5 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
comment_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
replyIdsYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 feedbackA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOnly comments made on this page — any URL on the page works
sourceNoOnly comments from these reporters. Omitted: public feedback still tagged FEEDBACK is left out
statusNoOnly return comments in this state
projectIdYesThe Jot project id
environmentNoOnly comments captured on this deployment, e.g. "staging"

Output Schema

ParametersJSON Schema
NameRequiredDescription
commentsYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 JotA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
commentIdYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
commentIdYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 statusA
Idempotent

Move a comment to IN_PROGRESS or RESOLVED. Agents cannot approve — only the person who reported a problem can confirm it is fixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
commentIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
statusYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.6.0
    • First observedcreate_batch_note
    • First observedfetch_feedback
    • First observedget_comment
    • First observedpost_reply
    • First observedupdate_status

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Read 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.
    7
    4 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables 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.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables 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.
    -