Primitiv
Primitiv
The design contract layer for your agents.
Retrieval gives you data. Reconciliation gives you truth.
Primitiv sits above your design sources — Figma, codebase, Storybook, token files — scans them, reconciles conflicts between them, and exposes a single machine-readable contract via MCP. Any agent that connects gets one authoritative answer before it builds. Your code never leaves your machine.
Quick start
npx @ai-by-design/primitiv init # detect your stack, write config + MCP registration
npx @ai-by-design/primitiv build # scan sources, resolve conflicts, write the contract
npx @ai-by-design/primitiv serve # start the MCP serverinit writes a .mcp.json to your project root, so Cursor, Claude Code, Codex, Windsurf, and any other MCP-compatible tool pick up the server without manual config.
If your project is on GitHub, init also installs .github/workflows/primitiv-verify.yml — a workflow that runs primitiv verify on every PR and push. Pair it with branch protection on your default branch and the merge is blocked when an agent ships UI that breaks the contract.
From here, every agent that builds UI calls get_design_context first and gets your resolved design contract back.
Related MCP server: Designesy
The problem
Design-relevant information is spread across Figma, tokens, Storybook, and the codebase itself — sources that were never meant to stay in sync. Humans reconcile the drift by inference; agents can't, so they fall back on training-data patterns and build UI that works but doesn't fit.
Primitiv resolves it: one contract, built from every source, served live to every agent.
How it works
Any source Primitiv Your agent
Figma ──┐
Codebase ──┤──► scan ──► reconcile ──► contract ──► MCP ──► Cursor / Claude Code / Codex / Windsurf / any MCP-compatible tool
Storybook ──┤
Tokens file ──┤
Any adapter ──┘Scan — Primitiv ingests from any configured source via adapters
Reconcile — Conflicts between sources are surfaced and resolved according to your governance configuration
Infer — Design rules are extracted from actual codebase patterns and written into the contract
Contract — A single
primitiv.contract.jsonis written as the canonical referenceMCP — Agents call
get_design_contextbefore building and receive the resolved contract
Install
npm install @ai-by-design/primitiv
# or
bun add @ai-by-design/primitivCLI
Command | Description |
| Detect your project and generate |
| Scan sources, resolve conflicts, write the contract |
| Start the MCP server |
MCP tools
Tool | Description |
| Get all tokens, components, conflicts, and inferred rules. Pass |
| Look up a specific token by name |
| Look up a specific component and its props |
| Get unresolved conflicts between sources |
| Get the design rules Primitiv has extracted from your codebase patterns |
Primitiv works with any tool that speaks MCP — it is not tied to a specific editor or agent ecosystem.
Using Primitiv across multiple projects
Primitiv runs one MCP server process per project, each pointed at that project's contract. This is intentional — each project has its own resolved contract, and there is no global shared state.
primitiv init writes a project-scoped MCP config automatically. Do not add Primitiv to your editor's global MCP config — if you do, the global server will keep serving one project's contract regardless of which project your agent is working in.
Per-editor setup
Editor | Project-level config | Global config (avoid for Primitiv) |
Claude Code |
|
|
Cursor |
|
|
Windsurf |
|
|
Zed |
|
|
primitiv init detects which editor config exists and writes to the right project-level file. If none exists, it creates .mcp.json (works with Claude Code and most modern editors).
Switching between projects
Each project needs its own primitiv init + primitiv build. When you switch projects in your editor, the project-scoped MCP config is loaded automatically — no manual switching needed, as long as you haven't added Primitiv to the global config.
If you already added Primitiv to your global editor config, remove it:
# Cursor — edit ~/.cursor/mcp.json and remove the "primitiv" entry
# Windsurf — edit ~/.codeium/windsurf/mcp_config.json and remove "primitiv"Stale or mismatched contract warnings
If get_design_context returns a warnings array, stop and resolve before proceeding:
STALE CONTRACT— the contract is outdated. The warning includes the exact command to rebuild, e.g.:npx @ai-by-design/primitiv build /path/to/your/primitiv.config.jsCONTRACT MISMATCH— the server is serving a contract from a different project. This usually means Primitiv is in your global editor MCP config. Remove it from there and re-runprimitiv initin the correct project.
CI / GitHub Actions
primitiv init auto-installs .github/workflows/primitiv-verify.yml when the project's remote is on GitHub. The workflow runs on every pull request and push to your default branch and fails the check when the contract is stale or has unresolved conflicts.
To turn the failed check into a hard merge gate, enable branch protection on the default branch — init prints the exact settings URL after install (https://github.com/<owner>/<repo>/settings/branches).
The workflow uses npx --yes @ai-by-design/primitiv verify, so it works regardless of your project's package manager. Two notes:
Monorepos — the workflow runs at repo root. If
primitiv.config.jslives in a subdirectory, add aworking-directory:to the verify step in the generated YAML.Pinning —
npx --yes @ai-by-design/primitivfetches the latest version. To pin, edit the workflow'srun:line tonpx --yes @ai-by-design/primitiv@1.4.0 verify(or your chosen version).
The workflow is idempotent — re-running primitiv init refreshes the block between # <!-- primitiv --> markers, preserving any content you've added outside them.
Configuration
// primitiv.config.js
module.exports = {
sources: {
codebase: {
root: "./src",
patterns: ["**/*.css", "**/*.ts", "**/*.tsx"],
ignore: ["node_modules", "dist", ".next"]
},
// figma: {
// token: process.env.FIGMA_ACCESS_TOKEN,
// fileId: "your-figma-file-id"
// },
// storybook: {
// url: "http://localhost:6006"
// }
},
governance: {
sourceOfTruth: "codebase", // "codebase" | "figma" | "storybook" | "manual"
onConflict: "warn" // "error" | "warn" | "auto-resolve"
},
output: {
path: "./primitiv.contract.json"
}
}Contributing
Local setup
git clone https://github.com/AI-by-design/primitiv.git
cd primitiv
bun install
bun run buildRunning in development
To run the MCP server against local source without a build step, point your MCP config directly at the source file. Bun runs TypeScript directly so changes are picked up on the next server restart:
{
"mcpServers": {
"primitiv": {
"command": "bun",
"args": ["/path/to/primitiv/src/cli.ts", "serve", "./primitiv.config.js"]
}
}
}The MCP server also hot-reloads primitiv.contract.json automatically whenever primitiv build runs.
Build commands
bun run build # Compile TypeScript → dist/
bun run dev # Run src/index.ts directly via ts-node
bun run lint # ESLint on src/**/*.tsArchitecture
src/
├── cli.ts Entry point — routes init / build / serve
├── index.ts Exports build() and serve()
├── types.ts All shared interfaces — define types here, not inline
├── scanner/ CodebaseScanner — extracts tokens and components from the filesystem
├── sources/ Source adapters — Figma (Variables API), Storybook (manifest)
├── contract/ ContractBuilder — merges sources, detects conflicts, applies governance
├── inferrer/ inferRules() — derives design rules from token and component patterns
├── mcp/ PrimitivMCPServer — loads the contract and registers MCP tools
└── init/ init() — detects framework and writes primitiv.config.jsSee CLAUDE.md for conventions on adding new sources, MCP tools, and types.
Releases
Releases are managed by Release Please. Commit messages must follow the Conventional Commits format:
Prefix | Effect |
| Patch release (0.1.0 → 0.1.1) |
| Minor release (0.1.0 → 0.2.0) |
| Major release |
| No release |
On merge to main, Release Please opens a release PR. Merging that PR tags the release and publishes to the package registry automatically.
Design principles
Source-agnostic — Primitiv does not assume any particular toolchain. Sources are configured via adapters, and new adapters can be added for any system that holds design-relevant information. Works with Figma, Storybook, token files, raw codebase — or any combination.
Contract over documentation — The output is a machine-readable contract, not human-readable documentation. It is designed to be consumed by agents, not read by people.
Active reconciliation, not retrieval — Primitiv does not answer questions about what exists in your codebase. It resolves conflicts between sources and produces something authoritative. The distinction matters: retrieval gives you data, reconciliation gives you truth.
Inferred before prescribed — Primitiv surfaces the rules your codebase is already following before asking you to write any. The inferred rules are a starting point, not a final answer.
Governance is explicit — When sources conflict, the resolution is not silent. Conflicts are surfaced, logged, and resolved according to rules you define. Nothing is resolved by guessing.
Local-first and private — Primitiv runs entirely on your machine. Your codebase is never sent to an external service. The contract is a local file; the MCP server is a local process.
Incrementally adoptable — Start with a single source. Add more as needed. The contract remains valid at any level of completeness.
Roadmap
Codebase scanner (CSS variables, TypeScript tokens, React components)
Contract builder with conflict detection
MCP server with 5 tools
primitiv init— project detection and config generationInferred rules — extract design rules from actual codebase patterns
AGENTS.md / CLAUDE.md integration —
primitiv initwrites agent instructions to the project's agent config file, ensuringget_design_contextis called before any UI build without manual promptingProject-scoped MCP config —
primitiv initwrites a project-level MCP config so the server is scoped to the current project, not a global user-level serverbuild-componentskill —primitiv initinstalls a Claude Code slash command that queries the contract before building any UI componentRemediation steps on conflicts — conflicts include a
suggestedFixandactionableflag so agents know exactly what to do, not just what's wrongPublished to npm — available as
@ai-by-design/primitivFigma source adapter — scan Figma Variables and components via the Figma REST API
Storybook source adapter — scan components and variants via the Storybook manifest
Source provenance — every token and component in the contract traces back to its origin (file, line number, Figma variable ID, Storybook story ID)
CI enforcement —
primitiv initauto-installs a GitHub Actions workflow that runsprimitiv verifyon every PR; pair with branch protection to block merges on contract driftToken relationships — document how tokens relate and what constraints exist between them
Part of a larger system
Primitiv is the contract layer. It works alongside Design-workflow — a build system for going from idea to working product with agents. Design-workflow gives agents the process. Primitiv gives them the source of truth.
License
MIT
Available Tools
6 toolsget_componentARead-only
Look up a component by name or id. Read-only, no side effects. Pass context (your current working file or directory) so same-name components resolve by path scope. Returns the component JSON (with its id) when the lookup resolves to exactly one component, or an error listing available names if not found. Detail is opt-in: pass 'api' for the component's declared prop contract, 'usage' for static JSX-site counts and observed prop values, 'relationships' for sorted outgoing uses and derived incoming usedBy counts, 'conflicts' for bounded source-conflict evidence, or 'all' for every projection. These are static source-site facts, never runtime frequency. When several components share the name and neither governance nor scope decides, returns { ambiguous, matches, instruction } — follow the instruction: match each candidate's rationale.when against the user's intent, and if that doesn't decide, ask the user; never pick arbitrarily. Use this when you need implementation details for a known component to reuse it rather than recreate it. For a list of all components, use get_design_context with category 'components' instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No | ||
| detail | No | ||
| offset | No | ||
| context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the readOnlyHint annotation: it explains the resolution behavior (exactly one component vs. error listing available names), the ambiguity response structure ({ ambiguous, matches, instruction }), and the nature of the data ('static source-site facts, never runtime frequency'). It also clarifies that detail is opt-in and what each detail option returns. The only minor gap is not explicitly stating pagination behavior for limit/offset, but the schema covers those parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured. It front-loads the core purpose and read-only nature, then explains resolution behavior, detail options, ambiguity handling, and usage guidance. Every sentence adds value, though it is somewhat long. The structure is logical: purpose → behavior → parameters → usage → alternative. It earns a 4 for being comprehensive without being bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no output schema, and no schema descriptions, the description covers all essential aspects: what it does, how to use it, what the return values look like (component JSON, error, ambiguity object), what each detail option returns, and when to use an alternative. The ambiguity resolution instruction is particularly valuable for an agent. Nothing critical is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains the 'context' parameter ('Pass context (your current working file or directory) so same-name components resolve by path scope'), the 'detail' parameter (lists all enum values and their meanings), and the 'name' parameter (lookup by name or id). It doesn't explicitly explain 'limit' and 'offset', but those are standard pagination parameters with clear schema constraints. The description adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up a component by name or id' and distinguishes it from siblings by noting 'For a list of all components, use get_design_context with category 'components' instead.' It also specifies the resource (component) and the action (look up), making it easy for an agent to understand what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool ('Use this when you need implementation details for a known component to reuse it rather than recreate it') and when not to use it ('For a list of all components, use get_design_context with category 'components' instead'). It also explains the ambiguity resolution process, which is a clear usage guideline for handling multiple matches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conflictsARead-only
Get a bounded, repeatable page of design-system conflicts. Read-only, no side effects. Filter by type, status, scope, exact component name or durable component ID, and a structured fieldPath prefix. Use offset and limit for pagination (default 25, maximum 100). For resolved design values, use get_token or get_component instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| scope | No | ||
| offset | No | ||
| status | No | ||
| component | No | ||
| fieldPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only, no side effects' while adding useful behavior: bounded, repeatable pages with pagination defaults. It does not describe sorting or response shape, but for a read-only list tool the disclosed behavior is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose, safety, filters, pagination, and alternatives. The most important facts are front-loaded, and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read-only paginated endpoint with no output schema, the definition covers the core invocation needs: filters, pagination behavior, and when to choose different tools. It leaves out explicit return details and the relationship to get_violations, but an agent can safely invoke the tool based on this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well: it explains type/status/scope filters, clarifies that component is an exact name or durable ID, describes fieldPath as a structured prefix, and gives pagination defaults. Every parameter in the schema is given some operational meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get a bounded, repeatable page of design-system conflicts.' It also routes resolved-value lookups to get_token/get_component, but it does not clearly distinguish this from the sibling get_violations, which could overlap in meaning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and pagination instructions ('Use offset and limit for pagination, default 25, maximum 100') and explicitly says to use get_token or get_component for resolved design values. It does not, however, say when get_violations or get_inferred_rules would be more appropriate than this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_design_contextARead-only
Get the resolved design system context before building UI. Read-only, no side effects. Default (no category) returns a JSON summary of token counts, component names, conflict counts, comparison diagnostic counts, and contract metadata. Pass category: 'all' | 'tokens' | 'components' | 'conflicts' | 'diagnostics' to get detail. Pass tokenCategory to filter tokens: colors, spacing, sizes, typography, borderRadius, shadows, zIndex, breakpoints, motion (unknown/aliased categories return an actionable error, not a silent empty result). Use this as the first call to understand what exists. For lookups by name, use get_token or get_component instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| category | No | ||
| tokenCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although readOnlyHint=true is already in annotations, the description adds substantial behavioral context beyond it: the default return shape, the category-detail behavior, tokenCategory filtering semantics, and notably the error behavior ('unknown/aliased categories return an actionable error, not a silent empty result'). It also reinforces 'Read-only, no side effects,' which aligns with the annotation. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense with a logical flow: purpose, safety disclaimer, default return, category options, tokenCategory filter with error behavior, usage positioning, and alternatives. Every sentence earns its place, though the parameter enumerations make it longer than necessary. Well front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for an overview tool: default return contents, category values, tokenCategory values, error behavior, and usage positioning are all covered, with no output schema to fall back on. The main gap is pagination semantics for limit and offset, which remain unexplainable given the 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden, and it compensates well for two parameters: category (explicit value list: 'all' | 'tokens' | 'components' | 'conflicts' | 'diagnostics') and tokenCategory (exact filter values: colors, spacing, sizes, typography, borderRadius, shadows, zIndex, breakpoints, motion). However, limit and offset are completely unaddressed in both the bare schema (only type/min/max) and the description, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the resolved design system context before building UI.' It clearly explains what the tool returns (a summary of token counts, component names, conflict counts, diagnostics, and contract metadata) and explicitly differentiates from siblings by noting 'For lookups by name, use get_token or get_component instead.' An agent can immediately distinguish this overview tool from the lookup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use this as the first call to understand what exists.' It also provides clear when-not-to-use direction with named alternatives ('For lookups by name, use get_token or get_component instead'). This is exemplary routing behavior that leaves nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inferred_rulesARead-only
Get the design rules inferred from your codebase patterns. Read-only, no side effects. Returns JSON with a list of rules including category, pattern, and confidence, or an error if no rules have been generated yet. Pass category to filter: spacing, colors, typography, borderRadius, naming, components. Omit category to get all. Use this to understand implicit conventions the codebase follows. For explicit design token values, use get_token. For source conflicts, use get_conflicts.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description repeats that fact. It adds useful behavioral context beyond the annotation: returns a JSON list with category/pattern/confidence, errors if no rules have been generated, and supports filtering by category.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, with every sentence adding value: purpose, safety, return shape, filter usage, and alternative tools. No wasted words or repetition of schema-only details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional parameter, no output schema), and the description covers the return format, error case, filter values, and usage context. It is fully adequate for correct tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates by enumerating exact accepted values: spacing, colors, typography, borderRadius, naming, components. It also explains that omitting the parameter returns all rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Get the design rules inferred from your codebase patterns." It clearly differentiates from siblings by naming get_token and get_conflicts as alternatives for other intents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ("understand implicit conventions") and provides exclusions: "For explicit design token values, use get_token. For source conflicts, use get_conflicts." Also explains category filtering and omission behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tokenARead-only
Look up a specific design token by name. Read-only, no side effects. Returns the token's name, value, and category, or an error if not found. Pass category to narrow search: colors, spacing, sizes, typography, borderRadius, shadows, zIndex, breakpoints, motion (aliases like 'color'/'radius'/'z-index' are normalized). Omit category to search all. Use this when you know the token name. For a broad overview of all tokens, use get_design_context with category 'tokens' instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint=true, the description adds meaningful behavioral detail: 'Read-only, no side effects,' explains the return value, and discloses the error condition when the token is not found. It also explains alias normalization for categories, which goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of three well-structured sentences, with the primary action and read-only guarantee front-loaded, followed by return/error behavior, then category semantics and sibling-tool guidance. Each sentence earns its place, though the category-alias list makes it slightly denser than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter look-up tool, the description is complete: it covers input semantics, return behavior, error outcome, category normalization, and alternative tool usage. No output schema is present, but the description explicitly lists what the return contains and the error case, so the agent can predict behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero description coverage, so the description carries the full burden of explaining parameters. It explains that 'name' is the token name to search for and 'category' narrows the search, listing all valid categories and alias normalization behavior. This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up a specific design token by name' and specifies the exact resource (design tokens), the return value, and the error behavior. It is distinguished from sibling tools like get_design_context by explicitly targeting single-token lookup vs broad overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: 'Use this when you know the token name.' It also provides an explicit alternative for a different use case: 'For a broad overview of all tokens, use get_design_context with category 'tokens' instead.' This is model guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_violationsARead-only
Get hardcoded token values: literals in source code typed inline instead of referencing a design token, bypassing the contract. Read-only, no side effects. Returns JSON with a count, suggestion-coverage stats, and a list with file:line:column, the captured literal, the surrounding utility (e.g. 'bg-[#ff0000]'), and an optional smart-match suggestion when a contract token has the same value. Pass category to filter: 'all' | 'colors' | 'spacing' (hardcoded values are only detected for these). Call this BEFORE generating UI with literal values — prefer the suggested token over a hardcoded literal. For available tokens to use instead, use get_design_context or get_token.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Read-only, no side effects,' which aligns with and expands on the readOnlyHint annotation. It additionally discloses return structure, filtering behavior, and the fact that hardcoded values are only detected for certain categories. This provides rich behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: it defines the topic, states safety, summarizes output, explains the parameter, and gives usage guidance. No sentence is wasted; it remains readable while packing substantial information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description thoroughly details the return JSON structure (count, suggestion-coverage stats, list with file:line:column, literal, utility, smart-match suggestion). It covers the parameter, use cases, and alternatives, making the tool fully understandable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining that the `category` parameter filters results and lists allowed values ('all' | 'colors' | 'spacing'), also noting why these categories matter. This adds essential meaning not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: getting hardcoded token values (literals in source code instead of design tokens). It distinguishes itself from siblings by explicitly referencing get_design_context and get_token as alternatives for available tokens, and by describing its specific output related to violations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Call this BEFORE generating UI with literal values — prefer the suggested token over a hardcoded literal.' It also names alternative tools for token lookup, giving clear when-to-use vs. when-not-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v2.19.0- Changed
get_component3 fields changed- changed
Input schema / properties / detail / enumPrevious value: -[ - "api", - "usage", - "relationships", - "all" -]New value: +[ + "api", + "usage", + "relationships", + "conflicts", + "all" +] - added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "maximum": 1000000, + "minimum": 0, + "type": "integer" +}
- Changed
get_conflicts7 fields changed- added
Input schema / properties / componentAdded value: +{ + "maxLength": 4096, + "type": "string" +} - added
Input schema / properties / fieldPathAdded value: +{ + "items": { + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "maximum": 1000000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / scopeAdded value: +{ + "enum": [ + "all", + "cross-source", + "within-source" + ], + "type": "string" +} - added
Input schema / properties / status / enumAdded value: +[ + "all", + "pending", + "resolved" +] - added
Input schema / properties / type / enumAdded value: +[ + "all", + "token", + "component" +]
- Changed
get_design_context2 fields changed- added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "maximum": 1000000, + "minimum": 0, + "type": "integer" +}
1 tool update
v2.15.0- Changed
get_component1 field changed- added
Input schema / properties / detailAdded value: +{ + "enum": [ + "api", + "usage", + "relationships", + "all" + ], + "type": "string" +}
5 tool updates
v2.1.2- Changed
get_conflicts1 field changed- removed
Input schema / requiredRemoved value: -[ - "type", - "status" -]
- Changed
get_design_context1 field changed- removed
Input schema / requiredRemoved value: -[ - "category", - "tokenCategory" -]
- Changed
get_inferred_rules1 field changed- removed
Input schema / requiredRemoved value: -[ - "category" -]
- Changed
get_token1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "category" -]New value: +[ + "name" +]
- Changed
get_violations1 field changed- removed
Input schema / requiredRemoved value: -[ - "category" -]
1 tool update
v2.0.0- Changed
get_component1 field changed- added
Input schema / properties / contextAdded value: +{ + "type": "string" +}
6 tool updates
v1.8.0- Added
get_component - Added
get_conflicts - Added
get_design_context - Added
get_inferred_rules - Added
get_token - Added
get_violations
5 tool updates
v1.6.0- Removed
get_component - Removed
get_conflicts - Removed
get_design_context - Removed
get_inferred_rules - Removed
get_token
TDQS
Scored across 6 tools
Each tool targets a clearly distinct concern: token lookup, design context overview, component lookup, conflict pagination, inferred rules, and violations. Even the overlapping get_token and get_design_context are explicitly differentiated with guidance on when to use each.
All tools follow a consistent get_<noun> pattern (get_token, get_component, get_conflicts, get_violations). The two compound names (get_design_context, get_inferred_rules) still follow the same verb_noun convention and fit the pattern cleanly.
Six read-only tools is well-scoped for a design system introspection server. Each tool represents a distinct query surface with no redundancy or bloat.
The surface covers token lookup, component lookup, design context overview, conflict discovery, inferred rules, and hardcoded-value violations — a coherent read-only audit toolkit. A minor gap is the lack of a write/update path, but the tool set is explicitly read-only by design, so this is acceptable.
Maintenance
Related MCP Connectors
Serves your design system and coding standards to coding agents, so they stop guessing.
Live React design-system APIs, patterns, and code validation so AI agents build real UI, not slop.
Access and maintain design system docs, tokens, components, skills, and contexts across any project.
Give your agent a real design system: tokens, measured WCAG contrast, and rules to follow.
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides deterministic, read-only design knowledge for AI coding agents to help them choose visual directions, plan UI states, and compose design tokens, all without network access.6264 npm4MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to score live URLs against a 40-check design contract, validate DTCG tokens and Lottie animations, audit accessibility, and retrieve design-system contracts, catalogs, and review rubrics.43 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to query a workspace's design system before writing UI and validate generated code against the same system afterward, using configurable token and component sources.10 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides coding agents with local tools to inspect project UI inventories, propose and compare visual direction boards, compile versioned design contracts and DTCG tokens, retrieve section-specific blueprints, and audit running interfaces with browser evidence including screenshots, accessibility findings, and overflow measurements.MIT