Skip to main content
Glama
processedfood

figma-comments-mcp

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

get_all_comments

Every comment thread in the file

get_unresolved_comments

Threads not yet marked resolved in Figma

get_comments_mentioning_me

Threads where you are @mentioned (detected from your token, no config)

get_recent_comments

Threads with activity in the past 24 hours (or a custom hours)

reply_to_comment

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

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

  2. Save the token. Paste this in the terminal, replacing your-token-here with the token you copied:

    echo "FIGMA_TOKEN=your-token-here" > ~/.figma-comments-mcp.env

    That 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_TOKEN environment variable also works and takes precedence, if you prefer that.)

  3. Register with Claude Code.

    claude mcp add figma-comments -- npx -y figma-comments-mcp

    Or, 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.js
  4. Use 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:

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

  2. Open questions — unanswered questions, each with who it's waiting on (inferred from @mentions or who spoke last).

  3. Waiting for — threads blocked on something promised or external, with what and how long.

  4. 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-File

Prints 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 check

core/ 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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA figma.com file link (design/file URL) or a bare file key
pageNoOptional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2")
authorNoOptional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive.
searchNoOptional: only threads whose text contains this keyword (case-insensitive)
max_threadsNoCap on unresolved threads shown, newest first (default 50)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA figma.com file link (design/file URL) or a bare file key
pageNoOptional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2")
authorNoOptional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive.
searchNoOptional: only threads whose text contains this keyword (case-insensitive)
max_threadsNoCap on unresolved threads shown, newest first (default 50)

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA figma.com file link (design/file URL) or a bare file key
pageNoOptional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2")
authorNoOptional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive.
searchNoOptional: only threads whose text contains this keyword (case-insensitive)
max_threadsNoCap on unresolved threads shown, newest first (default 50)
hoursNoLook-back window in hours, default 24

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA figma.com file link (design/file URL) or a bare file key
pageNoOptional: limit to one page, by page name (e.g. "Homepage") or page id (e.g. "1:2" or "1-2")
authorNoOptional: only threads where this person wrote a message. Matches the Figma handle, partial and case-insensitive.
searchNoOptional: only threads whose text contains this keyword (case-insensitive)
max_threadsNoCap on unresolved threads shown, newest first (default 50)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA figma.com file link (design/file URL) or a bare file key
comment_idYesId of the thread to reply to, from the [brackets] in fetch output
messageYesReply text, plain text. "@Name" mentions are sent as plain text.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

A3.7/5.0
Disambiguation5/5

Each tool targets a clearly distinct subset of comments: all, unresolved, recent, mentions, or replying. No overlap in purpose.

Naming Consistency4/5

Most tools follow `get_<modifier>_comments` pattern, but `reply_to_comment` breaks the verb prefix convention. Still clear and predictable overall.

Tool Count5/5

Five tools is well-scoped for a Figma comments server, covering core read operations and a write operation without overwhelming.

Completeness3/5

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

ActivityStale
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A lightweight MCP server that adds Figma Comments support to AI assistants, enabling reading, querying, and replying to comments via the Figma REST API.
    14
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-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.
  • A
    license
    Not graded
    quality
    B
    maintenance
    An 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.
    14
    ISC

Latest Blog Posts

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