Skip to content

Add Figma agent skills for the Figma MCP server - #871

Closed
danbarr wants to merge 1 commit into
mainfrom
add-figma-skills
Closed

Add Figma agent skills for the Figma MCP server#871
danbarr wants to merge 1 commit into
mainfrom
add-figma-skills

Conversation

@danbarr

@danbarr danbarr commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Packages all 12 skills from figma/mcp-server-guide (figma-use and its mode-specific companions figma-use-figjam/figma-use-motion/figma-use-slides, figma-generate-design/figma-generate-library/figma-generate-diagram, figma-code-connect, figma-create-new-file, figma-design-to-code, figma-implement-motion, figma-swiftui) at commit 22b2c566d98880ebdb5a8e48eb2c66c596a6d990.
  • Names already carry a figma- prefix upstream, so no additional namespacing was needed (no collisions with the existing catalog).
  • spec.version starts at 0.1.0 for all 12, per Dockyard's own-your-semver policy.
  • Licensing note: the upstream repo declares no OSS license (no LICENSE file, none detected by GitHub). The README states usage of the Figma MCP server and these skills is governed by the Figma Developer Terms, which is reflected in each spec.yaml's header comment and its MANIFEST_MISSING_LICENSE allowlist reason rather than treated like a missing-SPDX-field gap.
  • security.allowed_issues entries triage the false positives surfaced by skill-scanner. This batch skewed differently from prior ones (HashiCorp, Datadog) because these skills are written in a heavy MANDATORY/MUST/NEVER imperative style with first-party "instruction to the agent" language and lots of JS/Swift code — several findings were the scanner reading the skill's own workflow instructions as authority-claiming/injected text, backtick-quoted inline code misread as shell subshell substitution, and one coincidental substring match against an unrelated CVE signature for a different MCP server package. Each was manually verified against the actual upstream source before allowlisting.

Test plan

  • dockhand validate-skill passes for all 12 spec.yaml files
  • task scan-skill passes cleanly (no unallowlisted findings) for all 12
  • dockhand build-skill built successfully for a sample skill (figma-use)

Package all 12 skills from figma/mcp-server-guide (figma-use and its
mode-specific companions, figma-generate-design/library/diagram,
figma-code-connect, figma-create-new-file, figma-design-to-code,
figma-implement-motion, figma-swiftui, figma-use-figjam/motion/slides)
at commit 22b2c566d98880ebdb5a8e48eb2c66c596a6d990.

Names already carry a figma- prefix upstream, so no additional
namespacing was needed. spec.version starts at 0.1.0 per Dockyard's
versioning policy.

The upstream repo declares no OSS license; the README states usage of
the Figma MCP server and these skills is governed by the Figma
Developer Terms (https://www.figma.com/legal/developer-terms/), which
is reflected in spec.yaml comments and the MANIFEST_MISSING_LICENSE
allowlist reason rather than treated as an SPDX license gap.

security.allowed_issues entries triage the false positives surfaced by
skill-scanner, several distinct from prior batches given these skills'
heavy MANDATORY/MUST/NEVER imperative style and JS/Swift code
examples: agent-directed workflow instructions read by the scanner as
authority-claiming/injected text, backtick-quoted inline code
misread as shell subshell substitution, and one coincidental substring
match against an unrelated CVE signature.

Source: https://github.com/figma/mcp-server-guide
Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com>
@toolhive-release-app

Copy link
Copy Markdown
Contributor

🛡️ Skill Security Scan Results

✅ figma-code-connect

  • Status: Passed
  • Findings: 0

✅ figma-create-new-file

  • Status: Passed
  • Findings: 3
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-design-to-code

  • Status: Passed
  • Findings: 5
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-generate-design

  • Status: Passed
  • Findings: 4
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-generate-diagram

  • Status: Passed
  • Findings: 5
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-generate-library

  • Status: Passed
  • Findings: 77
  • Allowed (not blocking): 20
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)
    • ATR_2026_00090 (Allowed: FP: matched "Extract fileKey"/"extract token" describing how to parse a Figma URL or Plugin API return value in documentation (e.g. SKILL.md:59, references/discovery-phase.md:67), not credential extraction.)
    • ATR_2026_00040 (Allowed: FP: matched "truncate"/"TRUNCATE" describing text-truncation or table-formatting behavior in documentation (e.g. SKILL.md:155, references/documentation-creation.md:127), not a destructive data operation.)
    • ATR_2026_00064 (Allowed: FP: matched inline code / timing values like "at 0"/"at 3" in documented animation-timing or API examples (e.g. SKILL.md:313, references/token-creation.md:137), not a firewall or system command.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00003 (Allowed: FP: matched "Switch to Dev Mode" (references/code-connect-setup.md:246) — Figma's own named UI feature for developers to inspect specs, not an AI jailbreak "developer mode" attempt.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00012 (Allowed: FP: matched code-example tokens (e.g. references/component-creation.md:53, references/discovery-phase.md:77) in JS/Plugin-API code snippets or shell examples — legitimate example code, not a hidden execution primitive.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_02009 (Allowed: FP: matched a bare "key:" in a markdown table documenting Plugin API property names (e.g. references/component-creation.md:568), not a prompt-injection prompt for a missing secret.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00090 (Allowed: FP: matched "Extract fileKey"/"extract token" describing how to parse a Figma URL or Plugin API return value in documentation (e.g. SKILL.md:59, references/discovery-phase.md:67), not credential extraction.)
    • ATR_2026_00012 (Allowed: FP: matched code-example tokens (e.g. references/component-creation.md:53, references/discovery-phase.md:77) in JS/Plugin-API code snippets or shell examples — legitimate example code, not a hidden execution primitive.)
    • ATR_2026_00012 (Allowed: FP: matched code-example tokens (e.g. references/component-creation.md:53, references/discovery-phase.md:77) in JS/Plugin-API code snippets or shell examples — legitimate example code, not a hidden execution primitive.)
    • ATR_2026_00012 (Allowed: FP: matched code-example tokens (e.g. references/component-creation.md:53, references/discovery-phase.md:77) in JS/Plugin-API code snippets or shell examples — legitimate example code, not a hidden execution primitive.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/code-connect-setup.md:176, references/component-creation.md:9) — standard syntax, not injected secrets.)
    • ATR_2026_00001 (Allowed: FP: matched imperative-sounding phrases (e.g. references/discovery-phase.md:472, references/discovery-phase.md:518) in the skill's own workflow prose, not an injected directive.)
    • ATR_2026_00001 (Allowed: FP: matched imperative-sounding phrases (e.g. references/discovery-phase.md:472, references/discovery-phase.md:518) in the skill's own workflow prose, not an injected directive.)

✅ figma-implement-motion

  • Status: Passed
  • Findings: 5
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-swiftui

  • Status: Passed
  • Findings: 5
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-use

  • Status: Passed
  • Findings: 4
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-use-figjam

  • Status: Passed
  • Findings: 76
  • Allowed (not blocking): 28
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)
    • ATR_2026_00111 (Allowed: FP: matched whoami/curl used in a documented troubleshooting or asset-download example (e.g. SKILL.md:24), not a live recon/download action.)
    • ATR_2026_00063 (Allowed: FP: matched words like "upload"/"compress"/"webhook" describing legitimate Figma/FigJam features (asset upload, image compression, diagram composition) in documentation (e.g. SKILL.md:38), not exfiltration code.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00032 (Allowed: FP: matched comparative "instead of ..."/"this is critical" phrasing in documentation prose (e.g. references/create-code-block.md:65), not an override instruction.)
    • ATR_2026_00051 (Allowed: FP: matched "every item"/"all files"/an example SQL string in documented code snippets (e.g. references/create-code-block.md:75, references/create-table.md:154), not a bulk-exfiltration action.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)
    • ATR_2026_00066 (Allowed: FP: matched JS/template string interpolation (${...}) or relative doc-link paths (../../) in documented code examples (e.g. references/batch-modify.md:55, references/batch-modify.md:66) — standard syntax, not injected secrets.)

✅ figma-use-motion

  • Status: Passed
  • Findings: 5
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

✅ figma-use-slides

  • Status: Passed
  • Findings: 4
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: figma/mcp-server-guide declares no OSS license (no LICENSE file, none detected by GitHub); usage of the Figma MCP server and these skills is governed by the Figma Developer Terms (https://www.figma.com/legal/developer-terms/), referenced in the repo README.)

Summary: Scanned 12 skill(s), all passed security checks. ✅

@danbarr

danbarr commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

Closing due to licensing uncertainty. The upstream Figma skills do not declare an OSS license, and the Figma Developer Terms grant limited access and use rights but do not expressly permit third-party repackaging or public redistribution. We should only publish these artifacts after receiving explicit permission from Figma or an applicable redistribution license.

@danbarr danbarr closed this Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant