Skip to content

Releases

figjam-context-mcp 0.13.1

Choose a tag to compare

@github-actions github-actions released this 14 Nov 19:01
46c489b
  • 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_config without 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_config text and structured output.
  • Redact quoted Authorization headers, 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

Choose a tag to compare

@github-actions github-actions released this 13 Nov 22:34
dc742e6
  • 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, and Thema are now searchable.
  • Topic search counts only matches in totalMatched and marks contextual excerpts with context: true.
  • Improve Figma connection and model errors, first-run configuration, and branch and design file handling.
  • FIGMA_FILE_REQUEST_TIMEOUT_MS now 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 snapshotId until 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_board names 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

Choose a tag to compare

@github-actions github-actions released this 11 Nov 19:35
cf84e9b
  • 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

Choose a tag to compare

@github-actions github-actions released this 05 Nov 22:07
2fa2fe6
  • Breaking: the server no longer loads a .env from its working directory. Put the variables into the env block of the MCP client configuration, or set FIGJAM_MCP_ENV_FILE to the file's absolute path; in VS Code's Local harness, envFile works 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 new ignoredArguments of structuredContent.

  • nodeIds and focusNodeIds read IDs in link form (5-87, 5%3A87, I5-87%3B1-2) and Figma links of the board with a node-id, name the conversion once, and reject links of another board with both file keys.

  • boardId of get_board_context, answer_from_board and diff_board accepts the board URL too (its schema loses the pattern and allows 2048 characters); get_board_context reads the URL's node-id when nodeIds, topic and outsideSections are absent.

  • An unknown boardId lists 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_board no longer sends excerpts with identical text twice.

  • answer_from_board explains lexical search misses and prompt-budget limits, and treats model responses without evidence IDs as unsupported.

  • get_board_context topic searches explain matching, context excerpts and empty results, with match counts by section.

  • diff_board caps 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_board reports 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 like get_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 top remains 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_speed needs no model configuration.

  • FIGJAM_MCP_CACHE_DIR and FIGJAM_MCP_ENV_FILE expand a leading ~ or ~/ to the home directory.

  • Removed the unused LLM_MAX_OUTPUT_TOKENS setting.

  • answer_from_board and 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 from Retry-After or X-RateLimit-Reset, which is retried only when LLM_RATE_LIMIT_MAX_BACKOFF_MS allows. LLM_BASE_URL must be an absolute http(s) URL without /chat/completions; ingest reports these failures as the new reason base_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 names diagnose_llm_config too; answer_from_board answers with excerpts and the cause instead of an error, and ingest counts them as invalid_reply.

  • A 400 or 422 that names the response format starts the format fallback; the server remembers the working format per LLM_BASE_URL and model (not for the openrouter/free and openrouter/auto routers), and diagnose_llm_config sends LLM_ANSWER_REASONING_EFFORT with 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_board separates Figma from model-provider failures for images: the new fallback reasons figma_auth (401/403 of the Figma API for the image fills or a render request), figma_rate_limit (429, with nextRetryAt from Retry-After) and figma_timeout name FIGMA_ACCESS_TOKEN and Figma's seat limit; auth, rate_limit and timeout now mean the model provider (LLM_API_KEY). Snapshots with the old reasons stay readable.

  • The ingest_board summary says to run it again only where a new run helps unchanged; for config, auth, figma_auth, payment and base_url it 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/images requests 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, and forceFullIngest asks 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 (modelDerived stays true); the reason download_budget says 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 a max_speed check; 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.json registry metadata: FIGMA_ACCESS_TOKEN is required (file_content:read, used by ingest_board), the model variables say when they are needed, and FIGJAM_MCP_ENV_FILE is listed.

  • The configuration reference drops the version check from FIGMA_REQUEST_TIMEOUT_MS, shows LLM_REQUEST_TIMEOUT_MS as unset by default and says that a local LLM server still needs a non-empty LLM_API_KEY; the README says that ingest_board also reads /design/, /file/ and /proto/ URLs, built for FigJam boards.

figjam-context-mcp 0.11.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 02:26
509ef21
  • Model-provider HTTP 402 errors explain how to add credits, raise the API key's credit limit or choose a free model; ingest_board stops starting image requests after the first payment failure and keeps affected clusters pending.
  • ingest_board defaults to 8 parallel image requests for paid OpenRouter candidates, retaining 3 for free candidates and other providers; an explicit concurrency setting overrides both.
  • ingest_board reports 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_context automatically shows compact source-ID overviews for large section reads; detail: "full" reads complete excerpts and Figma links from the same snapshot.
  • Full get_board_context excerpts omit inherited snapshotId, zero chunkIndex and false truncated/modelDerived fields to fit more source text in each page.
  • diagnose_llm_config uses a pure blue test image to avoid ambiguous color-check failures.
  • diagnose_llm_config names the active models when environment variables override the preset.
  • diff_board returns 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_quality ingests.
  • Search in answer_from_board and get_board_context topics favors query-word coverage and penalizes long excerpts less.
  • answer_from_board defaults 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_board returns no citations and points to matching sections or text outside sections.
  • Missing LLM_BASE_URL or LLM_API_KEY gives one message in ingest_board, answer_from_board and
    diagnose_llm_config that names every missing variable, points to env in the MCP client configuration and says
    to restart the server; .env is only mentioned for a local checkout. It named only the first missing variable.
  • diagnose_llm_config names each failing check with its cause in the text, one line per shared cause; it only
    counted them. isError stays false.
  • get_board_context with nodeIds fails 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 scope file_content:read and 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_board without
    matching excerpts says "The board has no excerpts that answer this question." (German likewise), and
    ingest_board names the causes of incomplete image interpretation in plain words, with a cluster count per cause
    only when there are several.
  • answer_from_board removes 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

Choose a tag to compare

@github-actions github-actions released this 22 Oct 08:58
f8ac77f
  • answer_from_board lists 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; structuredContent is unchanged.
  • get_board_context accepts maxChars from 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 (summary is 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 optional truncation.omittedSummaries counts the clusters on the page
    whose model summary is left empty; truncated is then true.
  • get_board_context estimates "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_board names 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 optional section of those
    entries. A model label alone did not say where on the board the cluster is.

figjam-context-mcp 0.10.2

Choose a tag to compare

@github-actions github-actions released this 21 Oct 18:59
9f87b0d
  • diff_board names each edited, added and removed node, in the text output and in the new optional nodeChanges:
    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 entries nodeChangesOmitted counts the rest. It only counted
    them before.
  • diff_board names 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; tableCellChanges entries get row and column from cell IDs like get_board_context
    when the snapshot stores none, and the new optional tableName, rowLabel and columnLabel. Before, cells were only
    in tableCellChanges, without row and column for tables read through the REST API.

figjam-context-mcp 0.10.1

Choose a tag to compare

@github-actions github-actions released this 21 Oct 13:52
e470e99
  • ingest_board downloads the board on every call. A re-ingest skipped the download while /meta reported the same
    version, but version and last_touched_at there follow an edit only minutes later, with Figma's next autosave,
    so re-ingests could return an outdated board. file_metadata:read is 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/free or openrouter/auto that 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_config lists 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's fast_text_json check uses the text models, including
    LLM_TEXT_MODEL, as documented; it used the preset's list, so a custom LLM_TEXT_MODELS was not checked there.

figjam-context-mcp 0.10.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 09:14
6805c34
  • 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 from docStructureHint and customPhases follow 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_context shows 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 optional fromText or toText. answer_from_board keeps only arrows between its
    excerpts.
  • forceFullIngest downloads 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 forced balanced or max_quality ingest discarded them and started over.
  • diagnose_llm_config lists the models each check tried in the new optional attempts (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-free preset sends text to openrouter/free only, 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_PARAMETERS and the extraction and prompt
    versions, so changing text models keeps them. After this update, the next ingest interprets images once again.
  • get_board_context returns nextCursor as <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_board summary says whether the board content changed since the previous ingest of the same extraction
    version and, if so, names diff_board with the board's ID as the next step.

figjam-context-mcp 0.9.1

Choose a tag to compare

@github-actions github-actions released this 20 Oct 16:14
8b48479
  • ingest_board sends 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 failed diagnose_llm_config check
    names the provider's message (message, code and provider name, at most 200 characters); other tools still leave
    provider details out.