figma-comments-mcp

figma-comments-mcp

Enables reading and acting on comments in Figma and FigJam, resolving which layer each comment is pinned to, complementing the official Figma MCP server.

Category
访问服务器

README

figma-comments-mcp

CI License: MIT Node Model Context Protocol

A local MCP server that lets Claude (or any MCP client) read, understand, and act on comments in Figma and FigJam — the layer the official Figma Dev Mode MCP doesn't expose.

Works on both Figma design files (figma.com/design/…) and FigJam boards (figma.com/board/…), so it fits the whole arc of a project: design reviews, design QA, and the messy collaborative middle — workshops, brainstorms, retros, and jams where the thinking lives in pinned comments on stickies and frames.

Why this exists: clients, reviewers, and workshop participants leave most of their feedback as comments pinned onto the canvas. AI assistants can read the design itself — layers, screenshots, code — but not those pinned comments, so the feedback never actually makes it into the work. This server closes that gap: Claude reads the comments and knows exactly which layer or sticky each one points to, so "make this blue" becomes "make Checkout / CTA Button blue."

The official Figma MCP gives an AI assistant the design tree, screenshots, variables, and code, but not comments. Clients, reviewers, and workshop participants leave most of their feedback as comments pinned onto the canvas. This server wraps the Figma REST comments API and, crucially, resolves which node each comment is pinned to — a layer in a design file, or a sticky/shape/section in a FigJam board (name + breadcrumb path + node id) — so feedback like "make this blue" becomes actionable: "comment on Checkout / CTA Button (node 1:360): make this blue."

It composes alongside the official Figma MCP — that one reads design structure and writes design changes; this one adds the missing comment layer.

┌─────────┐   reads comments     ┌──────────────────────┐
│ Claude  │ ───────────────────▶ │  figma-comments-mcp  │ ──▶ Figma REST API
│ (MCP    │                      │      (this repo)     │     /v1/files/:key/comments
│ client) │ ◀─────────────────── └──────────────────────┘
│         │   reads/writes design ┌──────────────────────┐
│         │ ◀──────────────────▶  │  Figma Dev Mode MCP  │ ──▶ Figma (official)
└─────────┘                       └──────────────────────┘

Contents

Tools

Read (always available):

Tool What it does
get_comments_summary Counts (total/open/resolved), open threads grouped by target page/frame, one-line digest per open thread. Start here.
list_comments All threads, grouped, each enriched with its target node. Open-only by default.
get_comment_thread One full thread (root + replies + reactions + resolved state + target node).
render_comment_target Renders the node a comment is pinned to (or an explicit node_id) and returns the image so the assistant can see it.

Write (only when FIGMA_ENABLE_WRITES=true, and each defaults to a dry_run preview):

Tool What it does
reply_to_comment Post a reply to a thread (e.g. "Done — changed the button to blue").
react_to_comment Add an emoji reaction (default :white_check_mark:) as a lightweight "addressed" marker.
post_comment Place a new pinned comment at a node or coordinate.

Resolution limitation: the Figma REST API has no endpoint to resolve a commentresolved_at can only be set in the Figma UI. Use a reply or a :white_check_mark: reaction as the machine-writable "addressed" signal.

Sample output

get_comments_summary returns an at-a-glance overview — counts, open threads grouped by where they sit, and a one-line digest of each:

Comments: 12 total, 4 open, 8 resolved.

Open threads by target:
  - Checkout / Payment: 2
  - Home / Hero: 1
  - (unpinned): 1

Open threads:
  #3 Checkout / CTA Button: make this blue
  #7 Checkout / Card field: the label is cut off on mobile
  #9 Home / Hero: can we try a lighter headline?
  #11 (unpinned): overall looks great, ship it

list_comments / get_comment_thread return the full thread, each tied to the exact layer it's pinned to:

#3  [OPEN]  @jane  2026-06-10
Target: Checkout / CTA Button  (node 1:360)
"make this blue"
  └ reply @simon: "on it"
  ✅ x1

The (node 1:360) is the part the official Figma MCP can't give you: it tells the assistant precisely which layer the feedback is about.

How comment → node mapping works

Each comment carries client_meta in one of four shapes:

  • FrameOffset / FrameOffsetRegion — has a node_id → direct lookup of the node name, type, and breadcrumb path (a layer in Figma, a sticky/shape/section in FigJam).
  • Vector / Region — bare absolute coordinates → the server fetches the file's node tree and returns the deepest node whose bounding box contains the point, flagged [inferred] so you know the mapping is heuristic.

The file tree is fetched once and cached in-memory (TTL, default 60s) so enrichment doesn't refetch for every comment.

Quick start

Requirements: Node 20+ and npm.

1. Create a Figma Personal Access Token

Figma → Settings → Security → Personal access tokens. Select these scopes when creating it:

  • file_comments:read — read comments & reactions (required)
  • file_content:read — read the node tree for enrichment + render images (required)
  • file_comments:write — post replies/reactions/comments (only if you enable writes)

2. Install and build

git clone https://github.com/junsimon/figma-comments-mcp.git
cd figma-comments-mcp
npm install
npm run build

3. Provide the token

Copy .env.example to .env and set FIGMA_TOKEN:

cp .env.example .env
# edit .env and paste your token

The server and CLI auto-load .env from the project root. (Alternatively, pass FIGMA_TOKEN via the MCP client's env block — see below.) .env is gitignored.

4. Verify with the CLI

node dist/cli.js "https://www.figma.com/design/<KEY>/<name>" --summary   # Figma design file
node dist/cli.js "https://www.figma.com/board/<KEY>/<name>" --summary     # FigJam board

You should see comment counts and a one-line digest per open thread. A bare file key works too, and /design/, /board/, /file/, and /proto/ URLs are all accepted.

Register with an MCP client

The server speaks MCP over stdio. For Claude Code, either run:

claude mcp add figma-comments \
  -e FIGMA_ENABLE_WRITES=false \
  -- node /absolute/path/to/figma-comments-mcp/dist/index.js

…or add it to your MCP config (.mcp.json / claude_desktop_config.json / etc.):

{
  "mcpServers": {
    "figma-comments": {
      "command": "node",
      "args": ["/absolute/path/to/figma-comments-mcp/dist/index.js"],
      "env": {
        "FIGMA_TOKEN": "<your token>",
        "FIGMA_ENABLE_WRITES": "false"
      }
    }
  }
}

Replace /absolute/path/to/figma-comments-mcp with the real path on your machine — that string is a placeholder, not a literal value. If you copy it verbatim, the client will fail to start the server with Error: Cannot find module '/absolute/path/to/figma-comments-mcp/dist/index.js'. Run pwd in the cloned repo to get the path, and make sure you've built it (npm run build) so dist/index.js exists. The same applies to the claude mcp add command above.

If you keep the token in .env, you can omit FIGMA_TOKEN from the config above. Set FIGMA_ENABLE_WRITES to true to expose the write tools — even then, every write defaults to a dry_run preview, so the assistant must pass dry_run:false to actually mutate a shared file. Restart the client after registering.

CLI (for debugging)

node dist/cli.js "<figma file url>"                    # enriched comment blocks (open only)
node dist/cli.js "<figma file url>" --include-resolved  # include resolved
node dist/cli.js "<figma file url>" --summary           # counts + digest
node dist/cli.js "<figma file url>" --json              # raw enriched JSON

During development you can skip the build with npm run cli -- "<url>" (via tsx).

Configuration reference

Env var Default Purpose
FIGMA_TOKEN — (required) Personal Access Token.
FIGMA_ENABLE_WRITES false Register the write tools.
FIGMA_TREE_TTL_MS 60000 In-memory file-tree cache TTL.
FIGMA_TREE_DEPTH 4 Max node-tree depth fetched for pin enrichment. Bounds the payload so large files don't drop the connection. 0 = unbounded.

All can be set in the environment or in .env.

Development

npm test          # vitest — URL parsing, enrichment hit-test, threading
npm run typecheck # tsc --noEmit
npm run dev       # run the server from source via tsx
npm run cli -- "<url>"   # run the CLI from source

CI (GitHub Actions) runs typecheck, build, and tests on Node 20.

Contributing

Contributions are welcome — see CONTRIBUTING.md. Please don't commit secrets or paste tokens into issues/PRs.

Security

Keep your token in .env (gitignored), grant it the minimum scopes you need, and revoke any token that leaks. The server only ever sends the token to Figma's API. Found a vulnerability? Email simonjun@simonjun.cz rather than opening a public issue.

License

MIT © Šimon Jůn

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选