Repository navigation
Releases
figjam-context-mcp 0.13.1
- Retry transient Windows filesystem errors on cache write locks and report persistent permission errors with the affected path inside the cache directory.
- Explain HTTP 402 with fixed billing or retry guidance in ingest summaries, answers and diagnostics. Diagnostics add the token counts OpenRouter reports, without other provider text.
- Identify missing snapshots by their ID prefix and board, request a full ID when needed, and explain how to restart a cursor read.
- Recognize quoted Node.js startup options and recommend the available proxy and certificate settings in Figma connection errors.
- Report the Node.js version and proxy status in
diagnose_llm_configwithout exposing proxy values. - Show documented plan tier and rate limit type values from Figma HTTP 429 responses.
- Suggest close board words, including single-edit typos in short words, and exclude words sourced solely from FigJam default names.
- Show the installed server version in
diagnose_llm_configtext and structured output. - Redact quoted
Authorizationheaders, bearer values and JWTs in error messages, and limit SDK debug logs (OPENAI_LOG) on stderr to fixed request facts without provider headers or bodies.
figjam-context-mcp 0.13.0
- Find common word forms and compounds with exact matches ranked first, and suggest similar board words when search finds no matches. Generated placeholders remain visible in reads and are skipped by search.
project,Projekt, andThemaare now searchable.- Topic search counts only matches in
totalMatchedand marks contextual excerpts withcontext: true. - Improve Figma connection and model errors, first-run configuration, and branch and design file handling.
FIGMA_FILE_REQUEST_TIMEOUT_MSnow defaults to 45000 ms, down from 60000 ms.- Hidden section contents are excluded from new snapshots and URL passwords are redacted; previously retained snapshots remain unchanged on disk, and the first ingest after this update reinterprets images (extraction version 8).
- Re-ingest after updating. Earlier snapshots can still return hidden section contents by
snapshotIduntil they age out of history or you delete the cache. - Read slightly offset rows from left to right in board context and diffs, including excerpts within clusters and sections in outlines. Derived excerpts follow their cluster's original sources.
diff_boardnames nodes that move between sections or pages, identifies resizes and regrouped clusters, counts section moves separately from their contents, and reports section visibility changes between snapshots from extraction version 8 onward.- Guide MCP hosts through the tools during initialization, clarify tool inputs and results, and speed up page reads on boards with many sections.
figjam-context-mcp 0.12.1
- Credential tables protect nonempty values in either direction, including ambiguous headers; empty cells stay empty, protected clusters skip vision, and historical model interpretations are rebuilt from shared deterministic fallbacks.
- Compact board overviews budget one reusable page read, preserve page IDs with explicit omission counts, and guide reads of pages without sections; subsection lists add a parent read only when shortened, and page reads include outside-section content.
figjam-context-mcp 0.12.0
-
Breaking: the server no longer loads a
.envfrom its working directory. Put the variables into theenvblock of the MCP client configuration, or setFIGJAM_MCP_ENV_FILEto the file's absolute path; in VS Code's Local harness,envFileworks too. -
Content fingerprints use redacted text and hashes no longer depend on locale; the first ingest after this update reinterprets images.
-
A key that equals a parameter except for case,
_or-(ingest_mode,node_ids,figma_file_url) ends the call with "did you mean …" before any work; other unknown keys are ignored as before, named without their values in the text and in the newignoredArgumentsofstructuredContent. -
nodeIdsandfocusNodeIdsread IDs in link form (5-87,5%3A87,I5-87%3B1-2) and Figma links of the board with anode-id, name the conversion once, and reject links of another board with both file keys. -
boardIdofget_board_context,answer_from_boardanddiff_boardaccepts the board URL too (its schema loses thepatternand allows 2048 characters);get_board_contextreads the URL'snode-idwhennodeIds,topicandoutsideSectionsare absent. -
An unknown
boardIdlists the stored boards (file keys and last ingest, at most 10) and, for a key that differs only in case, starts with "Did you mean ?"; this also holds on case-insensitive file systems. -
Named enclosing frames and groups become searchable excerpt provenance; generic names and image filenames are omitted, and nonempty frames and groups no longer produce name excerpts.
-
Model-generated cluster labels are marked in context and answer prompts, and answer source locations use sections or frames.
-
Full context quotes each excerpt text line, and names are flattened to one line in readable output and answer prompts.
-
Reading paths expose pagination cursors, whole-board summary guidance and Figma link patterns, and tool descriptions ask for citations.
-
Compact overview headings retain longer names and show direct parent sections in tree order when useful.
-
Ingest, answer and diff text identifies snapshots; singular counts use singular wording, and triangle arrowheads retain their direction.
-
Search ignores accents (café = cafe), also finds hyphenated words written together (Wi-Fi = wifi), keeps uppercase acronyms such as IT, ignores invisible characters, searches arrow labels and table column headings, no longer matches every excerpt of a page by its page name, and
answer_from_boardno longer sends excerpts with identical text twice. -
answer_from_boardexplains lexical search misses and prompt-budget limits, and treats model responses without evidence IDs as unsupported. -
get_board_contexttopic searches explain matching, context excerpts and empty results, with match counts by section. -
diff_boardcaps each cluster list at 20, arrow and table-cell lists at 50, and node changes at 100, with optional omitted counts, full totals and shortened cell texts; the text explains tables counted as edited only for cell changes. -
diff_boardreports section/frame renames and layout-only changes, distinguishes unmatched snapshot details from identical snapshots, notes unchanged re-ingests before the latest change, and uses 0-based table coordinates and arrow IDs with named endpoint IDs likeget_board_context. -
Failed snapshot saves name the cause and remedy in the warning and summary; locks left by crashed local servers and all locks older than 10 minutes are recovered automatically, and existing cache directory permissions are preserved.
-
Processes sharing a cache refresh boards from the latest saved snapshot before reading from memory.
-
Empty boards are saved as empty snapshots, replacing old content and allowing comparisons with the previous state.
-
Damaged snapshots fall back to readable history with a notice; damaged manifests report a history restart, and cleanup skips damaged entries and removes old temporary files.
-
Hidden elements and their descendants are excluded from snapshots, excerpts, search, clusters and image requests.
-
Credential redaction covers qualified labels, next-line values, underscore separators, PIN codes, Zugangscode, Bearer tokens, JWTs and credential-labelled table columns and rows;
Pin: Feature X to the topremains unchanged. -
Messages redact configured credentials, and tokens with invalid HTTP-header characters fail before any request.
-
Environment values are validated when a tool needs them; invalid values do not stop startup, and
max_speedneeds no model configuration. -
FIGJAM_MCP_CACHE_DIRandFIGJAM_MCP_ENV_FILEexpand a leading~or~/to the home directory. -
Removed the unused
LLM_MAX_OUTPUT_TOKENSsetting. -
answer_from_boardand the other model requests end at their request deadline even when the provider stops sending an error response body. -
Model-provider errors say what to do and point to
diagnose_llm_config: HTTP 401 and 403, a missing connection, a wrong path (HTTP 404/405 without an error message, also as JSON such as{"detail":"Not Found"}) and HTTP 429 with the time fromRetry-AfterorX-RateLimit-Reset, which is retried only whenLLM_RATE_LIMIT_MAX_BACKOFF_MSallows.LLM_BASE_URLmust be an absolute http(s) URL without/chat/completions; ingest reports these failures as the new reasonbase_url. -
Empty, refused, filtered or cut-off model replies, replies without
choices, tool calls instead of text and bodies that are no JSON object get messages with their cause instead of raw errors; the general message for other statuses namesdiagnose_llm_configtoo;answer_from_boardanswers with excerpts and the cause instead of an error, and ingest counts them asinvalid_reply. -
A 400 or 422 that names the response format starts the format fallback; the server remembers the working format per
LLM_BASE_URLand model (not for theopenrouter/freeandopenrouter/autorouters), anddiagnose_llm_configsendsLLM_ANSWER_REASONING_EFFORTwith its text check. -
Removing evidence IDs from an answer and extracting JSON from a model reply take linear time; long runs of whitespace or opening braces no longer block the server for seconds.
-
The answer prompt shows each excerpt as an
<excerpt id="…" node="…" source="…">element; board text that imitates a header, an ID or a closing tag stays text inside its own element, and connection lines stay on one line. -
Figma request errors help: 404 names the token's account, a 429 wait over two minutes is shown as a UTC time with a rough duration, HTTP 500, 502, 503 and 504 are repeated once, other 4xx show Figma's error text, and unreadable answers (HTML, cut off, no JSON, no document) are named without parser text.
-
ingest_boardseparates Figma from model-provider failures for images: the new fallback reasonsfigma_auth(401/403 of the Figma API for the image fills or a render request),figma_rate_limit(429, withnextRetryAtfromRetry-After) andfigma_timeoutnameFIGMA_ACCESS_TOKENand Figma's seat limit;auth,rate_limitandtimeoutnow mean the model provider (LLM_API_KEY). Snapshots with the old reasons stay readable. -
The
ingest_boardsummary says to run it again only where a new run helps unchanged; forconfig,auth,figma_auth,paymentandbase_urlit names the change first and ends with "After that, run ingest_board again; finished clusters are kept."; waits in "Retry after" appear in seconds up to two minutes and otherwise as a UTC time with a rough duration. -
Fallback renders of image clusters are bundled: nodes without an image fill, or whose original proves unusable while downloading, share
/v1/imagesrequests of up to 18 nodes, so 30 image clusters without image fills cost 2 render requests instead of 30. -
A cluster uses the nodes Figma rendered and fails only when Figma renders none of them; then it gets the new reason
render_unavailable("Figma cannot render these elements"), which later ingests keep without another render request while its content is unchanged, andforceFullIngestasks again. -
Text that the server generates for a cluster without text or model is marked "generated placeholder, no model" instead of "model interpretation" in
get_board_context, the answer prompt and answers (modelDerivedstaystrue); the reasondownload_budgetsays that the images of an ingest exceeded the 64 MiB download budget. -
The README quick start has five steps for testers: the token and its Figma quota, a client entry that needs only
FIGMA_ACCESS_TOKEN, an optional model provider with a local-server note, and amax_speedcheck; Claude Desktop has its own section, the VS Code entry uses the Copilot harness file, and the assistant instructions move to "Using the tools". -
server.jsonregistry metadata:FIGMA_ACCESS_TOKENis required (file_content:read, used byingest_board), the model variables say when they are needed, andFIGJAM_MCP_ENV_FILEis listed. -
The configuration reference drops the version check from
FIGMA_REQUEST_TIMEOUT_MS, showsLLM_REQUEST_TIMEOUT_MSas unset by default and says that a local LLM server still needs a non-emptyLLM_API_KEY; the README says thatingest_boardalso reads/design/,/file/and/proto/URLs, built for FigJam boards.
figjam-context-mcp 0.11.0
- Model-provider HTTP 402 errors explain how to add credits, raise the API key's credit limit or choose a free model;
ingest_boardstops starting image requests after the first payment failure and keeps affected clusters pending. ingest_boarddefaults to 8 parallel image requests for paid OpenRouter candidates, retaining 3 for free candidates and other providers; an explicit concurrency setting overrides both.ingest_boardreports progress after each started image cluster when the client supplies a progress token.- README documents client-specific tool timeout settings and raising the image budget alongside them.
get_board_contextautomatically shows compact source-ID overviews for large section reads;detail: "full"reads complete excerpts and Figma links from the same snapshot.- Full
get_board_contextexcerpts omit inheritedsnapshotId, zerochunkIndexand falsetruncated/modelDerivedfields to fit more source text in each page. diagnose_llm_configuses a pure blue test image to avoid ambiguous color-check failures.diagnose_llm_confignames the active models when environment variables override the preset.diff_boardreturns an empty change report after an unchanged re-ingest of a board with one snapshot.- Unlabeled arrows with identical endpoints are omitted from context connections and their counts.
- README adds setup per client, explicit approval behavior, registry refreshes and limits of section overviews and
max_qualityingests. - Search in
answer_from_boardandget_board_contexttopics favors query-word coverage and penalizes long excerpts less. answer_from_boarddefaults to 15 excerpts and 40,000 prompt characters; the prompt limit can be raised to 60,000.- When the model finds no supporting evidence,
answer_from_boardreturns no citations and points to matching sections or text outside sections. - Missing
LLM_BASE_URLorLLM_API_KEYgives one message iningest_board,answer_from_boardand
diagnose_llm_configthat names every missing variable, points toenvin the MCP client configuration and says
to restart the server;.envis only mentioned for a local checkout. It named only the first missing variable. diagnose_llm_confignames each failing check with its cause in the text, one line per shared cause; it only
counted them.isErrorstays false.get_board_contextwithnodeIdsfails when none of the IDs is in the snapshot, naming them and where valid IDs
come from; it returned an empty page. Unknown IDs among known ones are named in one line and in the new optional
unknownNodeIds; known nodes without excerpts, empty table cells included, are named as containing no text, and
requested arrows as listed under connections.- Figma 401/403 errors name
FIGMA_ACCESS_TOKEN, the scopefile_content:readand that its account must be able to
open the file; 404 names the file key instead of the API path. - Clearer wording: an invalid board URL shows an example URL instead of a pattern,
answer_from_boardwithout
matching excerpts says "The board has no excerpts that answer this question." (German likewise), and
ingest_boardnames the causes of incomplete image interpretation in plain words, with a cluster count per cause
only when there are several. answer_from_boardremoves evidence IDs (ev_…) that a model wrote into the answer text, with brackets and
lead-ins such as "evidence IDs:" they leave behind; the sources are listed below the answer.
figjam-context-mcp 0.10.3
answer_from_boardlists its citations in the text content after the answer, under "Sources (untrusted board data):",
one line each with node ID, innermost section (else cluster label), quote (at most 200 characters) and link. Clients
that pass only the text to the model got the answer without sources;structuredContentis unchanged.get_board_contextacceptsmaxCharsfrom 2,000 (was 512) and returns a page for every request at that size. Under a
small budget the model summaries of the clusters on the page now yield too (summaryis empty), after the overview
and the page position, before the first excerpt is shortened; 512 to about 1,300 always failed with "The context
budget cannot fit one source excerpt". The new optionaltruncation.omittedSummariescounts the clusters on the page
whose model summary is left empty;truncatedis then true.get_board_contextestimates "Page N of about M" from up to three probe pages built like follow-up pages, at the next
excerpt and after one and two thirds of the rest, instead of from the first page, whose overview leaves room for few
excerpts; on large boards it reported several times the real number of pages.diff_boardnames the innermost section of each new, removed and modified cluster in the text output, unless its
label starts with that name (- "Ideas board" in "3 · Ideas": 1 edited), and in the new optionalsectionof those
entries. A model label alone did not say where on the board the cluster is.
figjam-context-mcp 0.10.2
diff_boardnames each edited, added and removed node, in the text output and in the new optionalnodeChanges:
its section, old and new text (only the changed words of a long text), link and what changed (text,name,
image,rotation,type,appearance); beyond 100 entriesnodeChangesOmittedcounts the rest. It only counted
them before.diff_boardnames each changed table cell in the text output with its table, row and column (counted from 1) and
the labels of its row and column;tableCellChangesentries get row and column from cell IDs likeget_board_context
when the snapshot stores none, and the new optionaltableName,rowLabelandcolumnLabel. Before, cells were only
intableCellChanges, without row and column for tables read through the REST API.
figjam-context-mcp 0.10.1
ingest_boarddownloads the board on every call. A re-ingest skipped the download while/metareported the same
version, butversionandlast_touched_atthere follow an edit only minutes later, with Figma's next autosave,
so re-ingests could return an outdated board.file_metadata:readis no longer needed.- Renders for image interpretation show the current board. They were requested for the file's
version, so Figma
rendered its last autosave: edited drawings looked outdated and nodes added since were missing. - A request to
openrouter/freeoropenrouter/autothat fails with an error that moves on to the next model (not a
429 or a cancellation) is sent once more while at least a second of the deadline is left: the router picks a model per
request, and the free Nemotron often fails with HTTP 404 from its only provider.diagnose_llm_configlists both
attempts and calls a check that passed on the second one a retry, not a fallback. - Without
LLM_FAST_TEXT_MODELS,diagnose_llm_config'sfast_text_jsoncheck uses the text models, including
LLM_TEXT_MODEL, as documented; it used the preset's list, so a customLLM_TEXT_MODELSwas not checked there.
figjam-context-mcp 0.10.0
- Clusters without a model label that hold at least two texts in one section are named after it: the section name if
it holds no other cluster, else ": ". Other clusters take their first text in reading order
instead of member order. Labels are recomputed on every ingest, so existing snapshots get them with the next one;
phases fromdocStructureHintandcustomPhasesfollow the new labels. - An arrow's text is no longer a loose excerpt; it stays the arrow's label in
connections, relations and
diff_board.get_board_contextshows an arrow once one of its ends, or a section, frame or group around one, is
on the page, never an arrow to a page, and names an end that is no excerpt of the page with its short text (a section
with its name) in the new optionalfromTextortoText.answer_from_boardkeeps only arrows between its
excerpts. forceFullIngestdownloads and extracts the board again but keeps the image interpretations of unchanged clusters
in every mode; pending clusters continue as on any ingest, with provider cooldowns. Model and prompt changes are
detected without it. Before, a forcedbalancedormax_qualityingest discarded them and started over.diagnose_llm_configlists the models each check tried in the new optionalattempts(model, ok and the provider's
message or error). A failed check names every model with its error, and the summary names checks that passed only
with a later candidate, with the model that failed.- The
student-freepreset sends text toopenrouter/freeonly, like images: the free Nemotron 3 Super answered for
hours with HTTP 404 from its only provider, which cost every text request an extra request. Image interpretations
now depend only on the vision models,LLM_BASE_URL,LLM_PROVIDER_REQUIRE_PARAMETERSand the extraction and prompt
versions, so changing text models keeps them. After this update, the next ingest interprets images once again. get_board_contextreturnsnextCursoras<page>.<offset>.<snapshot prefix>.<checksum>, about 35 characters of
digits, a–f and dots instead of over 300. A changed character or a cursor sent with other settings gives an error that
names what to send; the cursor still reads its snapshot after later ingests, and older cursors are accepted.- The
ingest_boardsummary says whether the board content changed since the previous ingest of the same extraction
version and, if so, namesdiff_boardwith the board's ID as the next step.
figjam-context-mcp 0.9.1
ingest_boardsends every image to the vision model with at most 1,024 px on the longest side. Larger PNG and JPEG
originals, now downloaded up to 8 MiB, and larger renders are scaled down on a worker thread and sent as JPEG. The
EXIF orientation of a JPEG is applied, so a turned phone photo arrives upright, also within 1,024 px. GIF and WebP
above 1,024 px, originals above 40 megapixels and malformed ones are rendered instead. In 0.9.0, full-size originals
pushed image requests past the 40-second vision budget.- Text, answer and image requests move to the next configured model after HTTP 404 or 410 or OpenRouter's "Provider
returned error"; 400, 401, 402, 403 and 422 without these signs still stop. A faileddiagnose_llm_configcheck
names the provider's message (message, code and provider name, at most 200 characters); other tools still leave
provider details out.