figjam-context-mcp
Exposes tools to ingest FigJam boards, retrieve context summaries, and answer free-form questions about the board content.
README
figjam-context-mcp
MCP server that turns a FigJam board into queryable context for LLMs — read directly via the Figma REST API, no manual PDF-export detour. It exposes four tools:
- ingest_board — reads a FigJam/Figma file, clusters its content
spatially, verifies and labels each cluster with a vision model, and
caches the result under a
boardId(= the Figma file key). - get_board_context — returns a compact, paste-ready context block plus the underlying clusters for an ingested board, optionally scoped to a topic.
- answer_from_board — answers a free-form question about an ingested board, citing the clusters the answer was derived from.
- diagnose_llm_config — runs small text + vision JSON checks against the active model setup and reports actionable failures.
How it works
FigJam boards are spatially chaotic: rotated stickies, overlapping shapes, embedded screenshots, no reading order. The pipeline therefore combines geometry with vision:
fetchFileTree+flattenNodeTree— pull the raw node tree and flatten it into normalized nodes (position, size, rotation, text, image refs), dropping empty structural noise.geometricPreCluster— rotation-aware distance clustering into coarse groups.refineClusterWithVision— per cluster, node screenshots + extracted text go to a vision model in one request; it confirms which nodes belong together, labels the group, describes embedded images, and writes a 3–5 sentence summary.mapToDoubleDiamond(optional,docStructureHint: "double_diamond") — assigns each cluster to Discover / Define / Develop / Deliver (or "unclear").- Results are cached in-memory per file key;
get_board_contextandanswer_from_boardread from the cache.
Setup
npm install
cp .env.example .env
Fill in .env:
FIGMA_ACCESS_TOKEN — log in at figma.com, go
to Settings → Security → Personal access tokens, generate a token. (Can
also be passed per-call via the figmaAccessToken input on ingest_board.)
LLM_BASE_URL / LLM_API_KEY / LLM_MODEL_PRESET — any
OpenAI-compatible endpoint. Free options:
- OpenRouter (default in
.env.example): get a key at openrouter.ai/keys. The defaultstudent-freepreset uses explicit free models for each role:google/gemma-4-26b-a4b-it:freefor vision andqwen/qwen3-next-80b-a3b-instruct:freeplusnvidia/nemotron-nano-9b-v2:freefor text/Q&A.openrouter/freeremains a last-resort fallback, not the primary model. - GitHub Models: free with any GitHub account — create a token at
github.com/marketplace/models,
set
LLM_BASE_URL=https://models.github.ai/inference.
Optional overrides:
LLM_VISION_MODELS— comma-separated vision model candidates.LLM_TEXT_MODELS— comma-separated text/Q&A candidates.LLM_FAST_TEXT_MODELS— comma-separated small/fast text candidates.- Legacy
LLM_VISION_MODEL/LLM_TEXT_MODELstill work as first-candidate overrides.
Run
npm run dev
This starts the MCP server over stdio using tsx watch. To try the tools
interactively:
npx @modelcontextprotocol/inspector npx tsx src/index.ts
Note: don't pass plain
npm run devto the Inspector (or any MCP client) — npm prints a> figjam-context-mcp@0.1.0 devbanner to stdout before the server starts, which corrupts the JSON-RPC stream the client expects there. Either invoketsxdirectly as above, or add--silent:npx @modelcontextprotocol/inspector npm run dev --silent.
MCP UI timeouts
ingest_board can be slow because it calls Figma and a vision LLM for board
clusters. If the MCP UI shows MCP error -32001: Request timed out, the client
gave up before those external calls finished.
The server now keeps provider calls bounded by default:
FIGMA_REQUEST_TIMEOUT_MS=15000LLM_REQUEST_TIMEOUT_MS=20000LLM_RATE_LIMIT_RETRIES=1LLM_ANSWER_MAX_OUTPUT_TOKENS=800INGEST_BOARD_VISION_BUDGET_MS=35000FIGMA_SCREENSHOT_DOWNLOAD_CONCURRENCY=3
ingest_board defaults to ingestMode: "balanced": text-rich clusters use
deterministic summaries, while image-heavy or low-text clusters use vision
within the budget. max_speed skips vision; max_quality attempts vision for
every cluster. Finished ingests are persisted under .cache/figjam-mcp/, keyed
by file state, node hash, model preset, document hint, and ingest mode.
Run diagnose_llm_config after changing model env vars. It checks text JSON,
vision JSON, and fallback setup without ingesting a board.
Usage example
Paste in a Figma board link and ingest it:
// tool: ingest_board
{
"figmaFileUrl": "https://www.figma.com/board/AbC123XyZ456/Semester-Project-Research",
"docStructureHint": "double_diamond"
}
// → { "boardId": "AbC123XyZ456", "clusterCount": 5,
// "summary": "Ingested board AbC123XyZ456: 5 clusters — \"User interview quotes\", \"Problem framing\", …" }
The boardId is the file key itself — re-running ingest_board on the same
file refreshes the cache entry. Then pull context, optionally scoped to a
topic:
// tool: get_board_context
{ "boardId": "AbC123XyZ456", "topic": "user research" }
// → contextText:
// FigJam board AbC123XyZ456 — 2 of 5 clusters (topic: user research):
//
// ## User interview quotes [discover]
// Sticky notes with verbatim quotes from six student interviews about exam
// stress. Two embedded screenshots show survey results (bar charts of study
// habits). Main pain points: unclear requirements and late feedback. …
The contextText block is deliberately token-lean — paste it straight into
a documentation-writing chat (e.g. for a semester report). Or ask directly:
// tool: answer_from_board
{ "boardId": "AbC123XyZ456", "question": "What were the main user pain points?" }
// → { "answer": "Unclear requirements and late feedback …",
// "citedClusters": ["User interview quotes", "Problem framing"] }
Scripts
npm run dev— run the server withtsx watch(auto-restart on change).npm run build— compile TypeScript todist/.npm start— run the compiled server fromdist/.npm test— run the Vitest test suite.
Project layout
src/
├── index.ts # stdio entrypoint
├── server.ts # McpServer setup + tool registration
├── tools/ # tool handlers (ingest pipeline, context, Q&A)
├── schemas/ # Zod input/output schemas per tool
├── lib/ # Figma API, node tree, clustering, vision, LLM, cache
└── types.ts # shared domain types
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.