Query FigJam board context, source-cited answers and snapshot changes through five local MCP tools.
A local MCP server that turns FigJam boards into source-cited context for LLMs. It reads a board through the Figma REST API, groups stickies, tables, images and arrows into clusters, and answers questions with links back to the original nodes.

Workshop boards hold research notes, decisions and open questions, but an LLM cannot read a canvas. Screenshots and PDF exports lose tables, arrow direction and the link to the source. This server keeps the board's structure and cites every answer to the nodes it came from.
| Tool | What it does | LLM call |
|---|---|---|
ingest_board | Reads a board, clusters it and saves a local snapshot. Re-ingests reuse unchanged clusters. | In balanced (default) and max_quality mode |
get_board_context | Returns paginated, source-linked context, optionally for a topic or exact node IDs. Use it for overviews, summaries and documentation. | No |
answer_from_board | Answers one specific question (a number, status or decision) from the most relevant excerpts, with node-level citations or an insufficient-evidence result. Not meant for whole-board summaries. | Yes |
diff_board | Compares two snapshots: new, removed and changed clusters, nodes, table cells and arrows. | No |
diagnose_llm_config | Tests the configured models with small text and image JSON checks. | Yes |
Requires Node.js 22.12 or later.
file_content:read. Add file_metadata:read
so re-ingests of an unchanged board skip the download. The token's account
needs access to the board.answer_from_board and diagnose_llm_config. Without it, use
ingestMode: "max_speed" with get_board_context and diff_board.{
"mcpServers": {
"figjam-context": {
"command": "npx",
"args": ["-y", "figjam-context-mcp"],
"env": {
"FIGMA_ACCESS_TOKEN": "your-figma-token",
"LLM_BASE_URL": "https://openrouter.ai/api/v1",
"LLM_API_KEY": "your-openrouter-key"
}
}
}
}
For Claude Code:
claude mcp add figjam-context -e FIGMA_ACCESS_TOKEN=your-figma-token -e LLM_BASE_URL=https://openrouter.ai/api/v1 -e LLM_API_KEY=your-openrouter-key -- npx -y figjam-context-mcp
Then ask your assistant to ingest a board URL, for example "Ingest
https://www.figma.com/board/FILE_KEY/Name and list the open questions."
The boardId of every later call is the file key from that URL.
All settings: configuration. Problems: troubleshooting.
ingest_board downloads the board through the Figma REST API. If
Figma reports the same version as the last ingest, the download is skipped.balanced mode, clusters with images or little text get a
vision-model summary within a 40-second budget; the rest keep their extracted
text. Unfinished clusters continue on the next ingest.get_board_context searches it (BM25 over original text, table cells and
names), answer_from_board answers with citations and diff_board compares
snapshots.The default preset student-free uses free OpenRouter models: text goes to
nvidia/nemotron-3-super-120b-a12b:free and then openrouter/free; images go to
openrouter/free, which picks a free model that accepts images and structured
outputs. The free default is best effort: free models change, hit rate limits
and time out.
max_speed needs none.LLM_BASE_URL takes any
OpenAI-compatible endpoint, and LLM_TEXT_MODELS / LLM_VISION_MODELS set
the model lists.diagnose_llm_config after every model change. It checks JSON replies
and image understanding with synthetic inputs.balanced and max_quality ingests send board text and screenshots to the
configured LLM provider. answer_from_board sends the question and selected
excerpts. max_speed with get_board_context and diff_board sends nothing
to an LLM provider.Passwort: … or API keys are redacted before they
reach the cache, tool output or an LLM provider
(FIGJAM_MCP_REDACT_CREDENTIALS). This is a
safety net, not a guarantee: screenshots are not redacted, so keep credentials
off the board.Measured results: evaluation.
git clone https://github.com/ecestnrkl/figjam-mcp.git
cd figjam-mcp
npm ci
cp .env.example .env # add your tokens
npm run check # typecheck, tests, build, package validation
npm run package:smoke # install the packed package and exercise all tools
npm run eval:retrieval # offline retrieval and diff evaluation
npx @modelcontextprotocol/inspector --config inspector.config.json
See CONTRIBUTING.md and the changelog.
MIT © 2026 ecestnrkl
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y figjam-context-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-ecestnrkl-figjam-mcp": {
"command": "npx",
"args": [
"-y",
"figjam-context-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencefigjam-context-mcpnpmio.github.ecestnrkl/figjam-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.