figma-comments-mcp
This server lets you fetch, filter, and interact with comments from Figma files directly through Claude Code.
Fetch all comments (
get_all_comments): Retrieve every comment thread in a Figma file, grouped by page and canvas element, with resolved threads collapsed to a count.Fetch unresolved comments (
get_unresolved_comments): Get only threads not marked as resolved in Figma.Fetch comments mentioning you (
get_comments_mentioning_me): Retrieve threads where the Figma token owner is @mentioned.Fetch recent comments (
get_recent_comments): Get threads with activity in the past N hours (default 24, up to 2,160).Reply to a comment (
reply_to_comment): Post a reply to an existing thread by ID (requires a write-scoped Figma token).
All fetch tools support optional filters:
page— Limit to a specific page by name or ID.author— Filter by author (partial, case-insensitive match).search— Filter by keyword (case-insensitive).max_threads— Cap the number of unresolved threads returned (default 50, newest first).
An optional built-in triage skill sorts unresolved comments into categories such as decisions, open questions, waiting-for items, and to-dos.
Fetches comments from Figma files, including unresolved, recent, and threads mentioning the user, and allows replying to threads. Supports filtering by page, author, or keyword search, and provides a triage skill to sort comments by decisions, questions, blocked threads, and to-dos.
Click on "Install 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., "@figma-comments-mcpTriage the comments in https://www.figma.com/design/abc123/My-File"
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.
Figma Comments MCP
An MCP server for Claude Code that fetches comments from any Figma file link, plus a triage skill that sorts them into what the team needs to do: decisions, open questions, who's waiting on whom, and who owns each to-do.
Tools
Tool | What it returns |
| Every comment thread in the file |
| Threads not yet marked resolved in Figma |
| Threads where you are @mentioned (detected from your token, no config) |
| Threads with activity in the past 24 hours (or a custom |
| Posts a reply to a thread (needs the write scope, see below) |
The fetch tools take a figma.com link (or bare file key) and return threads grouped by the canvas element each comment is pinned to, with authors, replies, @mentions, age, the page it sits on, and a deep link back to the comment in Figma.
Output is deliberately compact to keep Claude's context cost low: resolved threads come back as a count only, messages are capped at 300 characters, and at most max_threads unresolved threads (default 50, newest first) are shown, with a note on how to narrow further. Deep links are built from one pattern in the header rather than repeated per thread.
Every fetch tool also accepts three optional narrowing arguments. In Claude Code, just say it: "unresolved comments on the Homepage page of ", "what has Sarah commented?", "any comments about the pricing table?".
page— one page only, by name ("Homepage") or id ("1:2" / "1-2"). If the name doesn't match, the error lists the file's pages. Figma's comments API itself is file-wide, so comments are anchored via the page's top-level frames; in rare cases a comment pinned to a deeply nested element may not resolve to a page and only appears in unfiltered results.author— threads where this person wrote a message (partial, case-insensitive).search— threads whose text contains a keyword (case-insensitive).
reply_to_comment lets Claude answer a thread for you ("reply 'on it' to that one"). It posts as the token owner and only works if your token has the File comments (write) scope; with a read-only token the fetch tools still work and only replying fails.
Related MCP server: Figma Comments MCP
Setup
Figma token. figma.com → Settings → Security → Personal access tokens. Create one with the File comments scope: read is enough for fetching, write if you also want
reply_to_comment.Save the token. Paste this in the terminal, replacing
your-token-herewith the token you copied:echo "FIGMA_TOKEN=your-token-here" > ~/.figma-comments-mcp.envThat creates a small file in your home folder. The token stays on your machine and is only ever sent to Figma. When the token expires, repeat this step with a new one. (A
FIGMA_TOKENenvironment variable also works and takes precedence, if you prefer that.)Register with Claude Code.
claude mcp add figma-comments -- npx -y figma-comments-mcpOr, running from a clone of this repo:
npm install npm run build claude mcp add figma-comments -- node /path/to/figma-comments-mcp/dist/server.jsUse it. In a Claude Code session:
Triage the comments in https://www.figma.com/design/abc123/My-File
The triage skill
The server fetches and filters; the actual sorting intelligence lives in a skill, a markdown file at .claude/skills/figma-comment-triage/SKILL.md that teaches Claude how to read the threads. It sorts every unresolved thread into four categories, in this order:
Needs a decision — explicit "should we A or B" threads, plus conflicts: because threads arrive grouped by canvas element, the skill compares takes on the same element and flags it when two people argue opposite directions, quoting both positions.
Open questions — unanswered questions, each with who it's waiting on (inferred from @mentions or who spoke last).
Waiting for — threads blocked on something promised or external, with what and how long.
To-dos — actionable requests with an inferred owner, marked unassigned when nobody has picked it up, so tasks don't silently fall to nobody.
Anything older than 7 days gets called out as stale, every item links back to the comment in Figma, and resolved threads are reported as one closing count line.
To get it: copy the .claude/skills/figma-comment-triage folder into your own project's .claude/skills/ folder (the npm package ships only the server, so the skill comes from this repo). Without it, Claude still fetches and sorts comments when asked; the skill is what makes the triage consistent and opinionated. It's also plain markdown, so if you want different categories or rules, edit the file. No rebuild needed.
Quick manual check
Test the fetcher against a real file without going through MCP:
FIGMA_TOKEN=<your-token> npm run probe -- https://www.figma.com/design/abc123/My-FilePrints the token owner, thread counts, and the raw grouped JSON.
Project layout
src/
├── core/ # transport-agnostic: API client, threading, filters
│ ├── figma.ts
│ └── filters.ts
├── tools.ts # MCP tool definitions (Figma client injected)
├── server.ts # local stdio entry point (token from env)
└── probe.ts # manual CLI checkcore/ and tools.ts never touch env vars, the filesystem, or stdio. A future hosted version (Cloudflare Workers + Figma OAuth) only needs a new entry point next to server.ts.
A note from the maker
I'm a designer, and this is my first published developer tool. I built it because I kept opening Figma files to forty comment bubbles with no way to tell which ones actually needed me. It's been solid in my own daily use, but there may be rough edges I haven't hit yet. If something breaks or behaves oddly, open an issue and I'll take a look.
Licence
MIT
Available Tools
5 toolsget_all_commentsGet all commentsA
Fetch every comment thread in a Figma file, grouped by page and the canvas element each thread is pinned to. Resolved threads are returned as a count only. Prefer a narrower tool (unresolved/recent/mentions, or the page argument) when it answers the question.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A figma.com file link (design/file URL) or a bare file key | |
| page | No | Optional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2") | |
| author | No | Optional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive. | |
| search | No | Optional: only threads whose text contains this keyword (case-insensitive) | |
| max_threads | No | Cap on unresolved threads shown, newest first (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format (grouped, resolved as count) and implies broad fetch, but lacks details on pagination, performance impact, or maximum result handling beyond the max_threads parameter. No annotations provided.
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 plus a usage note, all front-loaded with the core functionality. No redundant information.
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?
Covers the main behavior and filtering options, but lacks explanation of how filters interact (e.g., author + search), and does not detail the output structure further due to missing output schema. Still adequate for the tool's complexity.
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 baseline is 3. The description does not add new semantic meaning to parameters beyond what the schema already provides; usage guidance is about tool selection, not parameter details.
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?
Clearly states that the tool fetches every comment thread, grouped by page and canvas element, and that resolved threads are returned as a count. It also contrasts with narrower sibling tools by advising when to prefer them.
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 advises to use a narrower tool (unresolved/recent/mentions) or the page argument when they suffice, providing clear decision criteria for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_comments_mentioning_meGet comments mentioning meB
Comment threads where the owner of the Figma token is @mentioned.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A figma.com file link (design/file URL) or a bare file key | |
| page | No | Optional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2") | |
| author | No | Optional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive. | |
| search | No | Optional: only threads whose text contains this keyword (case-insensitive) | |
| max_threads | No | Cap on unresolved threads shown, newest first (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It only states the basic purpose and does not disclose behavioral traits such as authentication requirements, read-only status, pagination behavior, or what happens when no mentions are found.
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?
The description is a single, clear sentence. It is concise but lacks additional structure or front-loading of key info.
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?
Given the tool has 5 parameters, no output schema, and no annotations, the description is too sparse. It does not explain edge cases, the nature of comment threads, or how the mention filter works, making it incomplete for an agent to use correctly.
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?
Parameter schema coverage is 100%, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides for each parameter.
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 clearly states that the tool returns comment threads where the token owner is @mentioned. The verb 'get' and resource 'comments mentioning me' are specific, and it distinguishes from sibling tools like get_all_comments and get_unresolved_comments.
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 description implies the tool is for retrieving comments mentioning the user, but it does not provide explicit guidance on when to use it versus alternatives, nor does it mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_commentsGet recent commentsC
Comment threads with activity in the past N hours (default 24).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A figma.com file link (design/file URL) or a bare file key | |
| page | No | Optional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2") | |
| author | No | Optional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive. | |
| search | No | Optional: only threads whose text contains this keyword (case-insensitive) | |
| max_threads | No | Cap on unresolved threads shown, newest first (default 50) | |
| hours | No | Look-back window in hours, default 24 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It only mentions the time filter and default, but omits ordering (likely newest first), pagination, or limits beyond max_threads. The return format is unspecified.
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?
The description is a single concise sentence that immediately conveys the core purpose. It is front-loaded and avoids unnecessary words.
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?
Given the low complexity (no nested objects, no output schema), the description is somewhat complete for a basic time-filtered query. However, it lacks details on what constitutes 'activity' and the response structure, which would be helpful for an AI agent.
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 100%, so the baseline is 3. The description adds minimal value beyond the schema (e.g., reiterates default 24). It does not clarify parameter relationships or elaborate on optional parameters.
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 clearly states the tool retrieves comment threads filtered by time since last activity, with a default of 24 hours. This distinguishes it from sibling tools like get_all_comments (no time filter) and get_unresolved_comments (status filter).
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?
No explicit guidance on when to use this tool versus alternatives. The description implies use for recent activity but does not mention exclusions or comparisons to sibling tools like get_comments_mentioning_me or get_all_comments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unresolved_commentsGet unresolved commentsC
Comment threads not yet marked resolved in Figma.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A figma.com file link (design/file URL) or a bare file key | |
| page | No | Optional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2") | |
| author | No | Optional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive. | |
| search | No | Optional: only threads whose text contains this keyword (case-insensitive) | |
| max_threads | No | Cap on unresolved threads shown, newest first (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description carries full burden. It only states what it retrieves but does not disclose ordering, inclusivity of replies, read-only nature, or any side effects. Minimal behavioral info.
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?
Single sentence with no extraneous words. Highly concise and to the point.
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?
Despite high schema coverage, the description lacks information about return value format, pagination, or thread structure. With no output schema and a moderate parameter count, the description is insufficiently complete.
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% with descriptions for all 5 parameters. The tool description adds no additional parameter info, meeting the baseline expectation.
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?
Description states 'Comment threads not yet marked resolved in Figma', clearly indicating retrieval of unresolved threads. However, it doesn't explicitly mention the Figma file resource, though the parameter 'url' implies it.
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?
No guidance on when to use this tool versus siblings like 'get_all_comments'. The description does not differentiate use cases or mention any conditions for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_commentReply to a commentA
Post a reply to an existing comment thread in a Figma file. Use a thread id from the [brackets] in fetch output as comment_id. Requires the Figma token to have the File comments write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A figma.com file link (design/file URL) or a bare file key | |
| comment_id | Yes | Id of the thread to reply to, from the [brackets] in fetch output | |
| message | Yes | Reply text, plain text. "@Name" mentions are sent as plain text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully handles behavioral disclosure. It specifies the required scope ('File comments write'), notes that message is plain text and '@Name' mentions are sent as plain text (not parsed), providing clear expectations.
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 sentences with no waste. First sentence states core action, second provides key parameter guidance, third covers permissions and format. Each sentence earns its place.
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?
Given three required parameters, no output schema, and no nested objects, the description covers all necessary context: input details, where to find comment_id, plain text behavior, and required permissions. No gaps remain.
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%, but description adds significant value: it explains comment_id source (from brackets in fetch output) and clarifies how message handles mentions. This goes beyond what the schema provides.
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 clearly states 'Post a reply to an existing comment thread in a Figma file.' It specifies the resource (comments in Figma files) and the action (reply). It distinguishes from siblings like get_all_comments, which are read-only.
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 description provides explicit guidance on using the thread id from fetch output in brackets. It implies this is for replying only, not creating threads, but lacks explicit when-not-to-use or alternative tool suggestions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a clearly distinct subset of comments: all, unresolved, recent, mentions, or replying. No overlap in purpose.
Most tools follow `get_<modifier>_comments` pattern, but `reply_to_comment` breaks the verb prefix convention. Still clear and predictable overall.
Five tools is well-scoped for a Figma comments server, covering core read operations and a write operation without overwhelming.
Reading and replying are covered, but there is no tool to create a new comment thread, which is a notable omission for a comments-focused server.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The Figma MCP server brings Figma design context directly into your AI workflow.
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server for the Figma API. Lets AI agents fetch designs, nodes, and rendered images from Figma.2,160
- AlicenseNot gradedqualityBmaintenanceA lightweight MCP server that adds Figma Comments support to AI assistants, enabling reading, querying, and replying to comments via the Figma REST API.14MIT
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server that wraps the Figma REST API, providing tools like get file metadata, list frames, and export node image URLs for AI SDLC agents.
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets Claude read Figma file comments directly, with tools to list comment threads scoped to a frame or file and render images of pinned nodes.14ISC
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/processedfood/figma-comments-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server