Skip to main content
Glama

symbols-mcp

mcp-name: io.github.symbo-ls/symbols-mcp

MCP server for Symbols.app — provides documentation search, code generation, conversion, auditing, project management, publishing/deployment, and CLI/SDK reference tools for AI coding assistants (Cursor, Claude Code, Windsurf, claude.ai, etc.).

Targets the modern smbls stack — flat element API, signal-based reactivity, declarative fetch: (@symbo.ls/fetch), polyglot translations (@symbo.ls/polyglot), helmet metadata (@symbo.ls/helmet), SPA routing via el.router(...), theme via @symbo.ls/scratch, and SSR via @symbo.ls/brender.

No API keys required for documentation tools. Project management tools require a Symbols account (login or API key).


Tools

Context — start here

Tool

Description

get_project_context

CALL FIRST. Walks up from cwd to find symbols.json, returns owner, key, dir, bundler, sharedLibraries, brender, env_type (local/cdn/json_runtime/remote_server), env_evidence, env_guidance, token_present, and a next_step hint telling the agent what to do (ask user, log in, or proceed). Replaces the older detect_environment for new code.

get_project_rules

Mandatory ruleset. No arguments → compact CORE bundle (reuse directive + RULES essentials + every STRICT rule + frankability checklist + section index + next-step table, <80K chars — fits every client's tool-output cap). section="SYNTAX" (or COMPONENTS, FRANKABILITY, RULES + part=N, … 16 sections) fetches one section per call. full=true → legacy ~590K one-shot (capless clients only). Call before any code generation task.

get_cli_reference

Complete Symbols CLI (@symbo.ls/cli) command reference.

get_sdk_reference

Complete Symbols SDK (@symbo.ls/sdk) API reference.

search_symbols_docs

Keyword search across all bundled Symbols documentation files.

detect_environment

[Legacy] Caller-supplied flags variant of env classification. Prefer get_project_context.

Generation & conversion

Tool

Description

generate_component

Generate a DOMQL component from a natural language description. Returns prompt + bundled context (≈300K chars).

generate_page

Generate a full page with routing, helmet metadata, and declarative fetch: integration.

convert_react

Convert React/JSX code to Symbols DOMQL (modern smbls stack).

convert_html

Convert raw HTML/CSS to Symbols DOMQL components.

convert_to_json

Convert DOMQL JS source to platform JSON (mirrors frank's toJSON pipeline). Use after generate_component / generate_page to feed save_to_project.

Audit

Tool

Description

audit_component

Inline VALIDATOR for a single component string. Returns violations + warnings (≈1K chars). Use during generation. Pass include_playbook=True to also dump the AUDIT.md playbook.

audit_project

Returns the multi-phase project audit PLAYBOOK (instructions for the agent — Phase 0 setup → Phase 5 report). Pair with bin/symbols-audit.cjs CLI for the static-audit phase.

For filesystem-wide audits the package ships a CLI: npx -y @symbo.ls/mcp symbols-audit <symbols-dir> (strict by default, exit 1 on findings). Under the hood it runs frank-audit audit --strict — the audit core is now @symbo.ls/frank-audit, the AST-based engine that owns the canonical 59-rule registry, prescription generation, and verify-or-rollback fixers.

lib/audit.js is preserved as a backward-compat shim that delegates to frank-audit (subprocess CLI, or the /audit-content HTTP endpoint when FRANK_AUDIT_URL is set). The legacy programmatic API stays callable for non-CLI consumers (the @symbo.ls/cli, the MCP HTTP worker, web/edge clients):

const {
  auditContent,         // audit one component string (delegates to frank-audit)
  auditFiles,           // audit a list of {path, content}
  auditDirectory,       // walk a symbols/ dir via `frank-audit audit <dir>`
  mergeFindings,        // preserve status across runs
  summarize,            // breakdown by severity / category / origin
} = require('@symbo.ls/mcp/lib/audit')

Findings drift vs the old regex output is expected and correct — frank-audit detects more issues with higher accuracy. Field names stay the same (file, line, rule, severity, category, snippet, suggested_fix). To inspect the rule registry, query frank-audit directly: npx frank-audit explain <id>.

Project Management & Publishing

Tool

Description

login

Log in to Symbols platform — returns a JWT token.

list_projects

List the user's projects (names, keys, IDs) to choose from.

create_project

Create a new Symbols project on the platform.

get_project

Get a project's current data (components, pages, design system, state).

save_to_project

Save components/pages/data to a project — creates a new version with change tuples, granular changes, orders, and auto-generated schema entries.

publish

Publish a version (make it live).

push

Deploy a project to an environment (production, staging, dev).

End-to-End Flow (from any MCP client)

1. get_project_context  → resolve owner/key/env/auth state from cwd's symbols.json
2. generate_component   → JS source code
3. audit_component      → inline check (saves a roundtrip if violations exist)
4. convert_to_json      → platform JSON
5. login                → only if token_present was false in step 1
6. create_project       → (if new project needed)
   list_projects        → (or pick existing)
7. save_to_project      → push JSON to platform (creates version)
8. publish              → make version live
7. push                → deploy to environment

Related MCP server: symbols-mcp-server

Resources

Skills (documentation)

URI

Description

symbols://skills/framework

Authoritative framework reference — project structure, plugins, theming, SSR, publish pipeline (mirrors smbls/FOR_MCP.md)

symbols://skills/rules

62 strict rules for AI agents working in Symbols/DOMQL projects

symbols://skills/syntax

Complete DOMQL syntax language reference (flat API, signal reactivity)

symbols://skills/modern-stack

Modern smbls stack — fetch, polyglot, helmet (full metadata catalog), router, scratch theme runtime, brender SSR

symbols://skills/components

DOMQL component reference (flat props on element, flat onX events)

symbols://skills/project-structure

Project folder structure and file conventions

symbols://skills/shared-libraries

sharedLibraries pattern — config, runtime merge, precedence

symbols://skills/design-system

Design system contract + token catalog (colors, theme, typography, spacing, etc.)

symbols://skills/design

UI/UX direction + design-to-code translator + 7 specialist personas (consolidated)

symbols://skills/patterns

UI patterns, accessibility, AI optimization

symbols://skills/migration

Migration guide for legacy projects + React/Angular/Vue → Symbols

symbols://skills/audit

Full audit playbook (Phase 0–5, executable end-to-end)

symbols://skills/common-mistakes

Wrong vs correct DOMQL patterns with zero-tolerance enforcement

symbols://skills/frankability

Patterns that survive frank.toJSON — every @symbo.ls/frank-audit rule with wrong vs canonical examples

symbols://skills/learnings

Framework internals, technical gotchas, deep runtime knowledge

symbols://skills/cookbook

Cookbook of small reactive recipes (toggle, fetch, modal, tabs, etc.)

symbols://skills/snippets

Production-ready component snippets (nav, hero, pricing card, footer, etc.)

symbols://skills/default-project

Default starter — library catalog (127+ components) + pre-configured design system tokens

symbols://skills/default-components

Complete source code of 130+ default template components (heavy reference, on demand)

symbols://skills/running-apps

4 ways to run Symbols apps (local, CDN, JSON, remote)

symbols://skills/cli

Symbols CLI (@symbo.ls/cli) complete command reference

symbols://skills/sdk

Symbols SDK (@symbo.ls/sdk) complete API reference

Reference (inline)

URI

Description

symbols://reference/spacing-tokens

Spacing token table (golden-ratio scale)

symbols://reference/atom-components

Built-in atom/primitive components

symbols://reference/event-handlers

Event handler signatures and patterns

Prompts

Prompt

Description

symbols_component_prompt

Generate a component from a description

symbols_migration_prompt

Migrate code from React/Angular/Vue

symbols_project_prompt

Scaffold a complete project

symbols_review_prompt

Review code for compliance

symbols_convert_html_prompt

Convert HTML/CSS to DOMQL

symbols_design_review_prompt

Visual/design audit against the design system


Quickstart

Two commands and a one-line config — works for every major MCP client.

1. Install

Pick whichever runtime you have:

uvx symbols-mcp           # uv  — recommended, zero install
pip install symbols-mcp   # pip — global binary
npx -y @symbo.ls/mcp      # npm — Node-friendly wrapper

2. Configure your editor

The standard MCP config snippet (works for Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Continue, Zed, Goose, Gemini CLI — wrap it in whatever shape that editor expects):

{
  "mcpServers": {
    "symbols-mcp": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--refresh", "symbols-mcp"]
    }
  }
}

--refresh pulls the latest from PyPI on every launch (~1–2s startup tax — drop it for pinned/offline runs).

3. Verify

In your editor's chat, ask the assistant:

Use symbols-mcp to call get_project_rules, then summarize the modern stack rules.

If that returns a long ruleset, you're set. Try audit_component on a deliberately broken snippet to confirm Rule 62 (the banned inline-SVG-for-icon rule) fires.


Auto-bootstrapping a Symbols project — no more "use symbols-mcp" reminders

Once symbols-mcp is configured in your editor, drop project-level rule files so every editor auto-loads the framework rules on every chat:

# from your Symbols project root
npx -y @symbo.ls/mcp init-rules

Writes CLAUDE.md, .cursor/rules/symbols.md, .windsurfrules, .clinerules, and AGENTS.md — each tailored to its editor, all pointing at the symbols-mcp tools (get_project_context, get_project_rules, generate_component, audit_component, etc.). Idempotent; pass --force to overwrite or --only=cursor,claude to scope.

Agent skills — one-shot install for every agent on your machine

The wrangler-style path: detect which AI coding agents are installed (Claude Code, Cursor, Codex, GitHub Copilot, Gemini CLI, Windsurf, Cline, Goose, Warp, Antigravity, Zed, Aider) and install the Symbols rules + skills for exactly those:

npx -y @symbo.ls/mcp skills          # detect agents → install rules + skills for them
# equivalent: npx -y @symbo.ls/mcp init-rules --detect
# from the Symbols CLI: smbls skills

For Claude Code this also installs a proper agent skill at .claude/skills/symbols/SKILL.md — it auto-loads whenever the agent works on Symbols/DOMQL (its description triggers on symbols.json projects, DOMQL components, design tokens, the smbls CLI), carrying the must-do tool sequence and the hard-rules digest. --global installs it once at ~/.claude/skills/ for every project; --no-skills opts out.

Combined with the MCP server's instructions field (auto-loaded on connect by every MCP-aware editor — Claude Code, Cursor, GitHub Copilot, Windsurf, Cline, Continue, Roo, Zed, Goose, Gemini CLI, Codex, Antigravity, Cody), this means you never have to remind the agent to "use symbols-mcp" — the workflow is bootstrapped on first interaction.

Claude Code: enforcement hooks (installed by default)

Project-level rule files (CLAUDE.md, AGENTS.md, etc.) are best-effort — long contexts dilute them and the agent can drift. For Claude Code, init-rules also installs a hooks layer that the harness enforces directly:

Hook

Trigger

What it does

symbols-mcp-require.sh

PreToolUse Edit|Write|MultiEdit

BLOCKS Edit/Write on *.js/*.ts/*.tsx inside any directory tree containing symbols.json, until the session has called mcp__symbols-mcp__get_project_rules (or get_project_context/generate_component/audit_component).

symbols-mcp-reminder.sh

UserPromptSubmit

Injects the MUST-DO sequence + frankability FA-rule cheatsheet on every turn when cwd is inside a Symbols project. Per-turn injection isn't diluted by long contexts the way CLAUDE.md is.

symbols-mcp-audit.sh

PostToolUse Edit|Write|MultiEdit

After every JS edit inside a Symbols project, runs frank-audit plus an inline FA-rule pattern check (FA101/102/103/105/106/206/207/513/514) and surfaces violations back to Claude.

Files installed:

.claude/settings.json                       # wires the three hooks
.claude/hooks/symbols-mcp-require.sh        # PreToolUse  — block edit until rules loaded
.claude/hooks/symbols-mcp-reminder.sh       # UserPromptSubmit — inject directive
.claude/hooks/symbols-mcp-audit.sh          # PostToolUse — frank-audit + FA-rule check

Skip hooks: npx -y @symbo.ls/mcp init-rules --no-hooks. Disable a single hook at runtime: SYMBOLS_MCP_REQUIRE_RULES=0, SYMBOLS_MCP_REMINDER=0, SYMBOLS_MCP_POST_AUDIT=0.

Hooks require bash and jq on PATH (already standard on macOS / most Linux distros). frank-audit is invoked via npx -y --no-install @symbo.ls/frank-audit — if not installed, the inline pattern check still runs.

See SETUP.md → Bootstrapping for the layered model and verification steps.


What about /symbols-audit?

The /symbols-audit slash command is Claude Code-only, but the underlying capability works in every MCP-aware editor — Cursor, GitHub Copilot, Windsurf, Cline, Continue, Roo, Zed, Goose, Gemini CLI, Codex, Antigravity (Google), Cody, Claude.ai web, and any custom MCP client.

Three patterns:

  1. Natural language (zero setup) — just say "Run a full Symbols audit on this project using symbols-mcp." The agent calls get_project_contextaudit_project (playbook) → bin/symbols-audit.cjs CLI → iterates fixes with audit_component.

  2. Custom command — register a Cursor rule, Continue customCommand, Windsurf workflow, etc. for one-keystroke parity. Templates in SETUP.md.

  3. Pure shellnpx -y @symbo.ls/mcp symbols-audit ./symbols works from any terminal, no editor needed. Strict by default, exit 1 on findings.


Full setup guide

See SETUP.md for:

  • Per-editor configs: Claude Code · Claude Desktop · Claude.ai (web) · Cursor · GitHub Copilot (VS Code / CLI) · Windsurf · Zed · Cline · Continue · Roo · Cody · Gemini CLI · OpenAI Codex · Goose · Antigravity · generic clients

  • Per-tool quick-starts with workspace connection (s1m0ne Bridge + MCP + rules): docs.symbols.app/simone

  • Local development: clone the repo, run from source, .mcp.json template

  • Using /symbols-audit & other tools in non-Claude-Code editors: natural language, custom commands per editor, shell fallback, sourcing the bundled venv directly

  • Transport modes: stdio (default) and SSE (for claude.ai web / remote clients)

  • Audit CLI: standalone bin/symbols-audit.cjs for CI / pre-commit

  • Updating and Troubleshooting (PATH issues, stale versions, missing tools)

Available Tools

28 tools
apply_frankability_edit_opsA

Apply LLM-generated edit ops to a Symbols project with verify-or-rollback.

Pass ops_json as a JSON string of either:

  • { "ops": [...] }

  • or just an array of op objects.

Each op must be one of the 8 strict kinds (see prescribe_frankability_fixes). The applier validates every op, snapshots affected files, applies, runs frank.toJSON to verify, and rolls back if the result regresses against the pre-apply state.

Args: symbols_dir: Absolute path to the symbols/ directory. ops_json: JSON string containing the edit ops.

Returns: JSON with applied/skipped/rolledBack/baseline/finalState.

ParametersJSON Schema
NameRequiredDescriptionDefault
ops_jsonYes
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: validates every op, snapshots files, applies, verifies via frank.toJSON, and rolls back on regression. It also mentions the return payload includes applied/skipped/rolledBack/baseline/finalState.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but structured with a summary line followed by details. It's front-loaded and every section adds value, though it could be tightened. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers input format, validation/apply/verify/rollback behavior, and return value. It references prescribe_frankability_fixes for op kinds, which is acceptable since that's a sibling tool. No output schema was provided, but the return fields are described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains ops_json format in detail (either wrapped in {'ops': [...]} or bare array) and clarifies symbols_dir is the absolute path to the symbols/ directory. This adds meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Apply LLM-generated edit ops to a Symbols project with verify-or-rollback.' This clearly distinguishes it from siblings like prescribe_frankability_fixes (which generates ops) and rollback_frankability (which reverts).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when you have LLM-generated edit ops to apply. It references prescribe_frankability_fixes for the op kinds, but doesn't explicitly state exclusions or alternatives like audit_and_fix_frankability. Still, context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_and_fix_frankabilityA

Run frank-audit and optionally apply fixes — supports a sampling-driven LLM loop that resolves findings the mechanical fixer can't safely handle.

Modes: 'report' — run audit, list findings, do not modify files 'safe-fix' — apply mechanical fixes with verify-or-rollback safety (every applied fix is verified against frank.toJSON; regressions roll back) 'full' — run safe-fix first, THEN drive an LLM loop via MCP sampling over the remaining prescriptions: 1. prescribe_frankability_fixes(dir) → JSON prescriptions 2. for each prescription (capped by max_iterations): a. ctx.session.create_message() with the strict edit-op contract prompt b. parse the LLM's JSON response c. apply_frankability_edit_ops with verify-or-rollback d. one retry on malformed JSON 3. report aggregate (mechanical + LLM fixes) Requires the host to support MCP sampling (Claude Code does; some hosts don't — falls back gracefully to safe-fix mode with a warning when ctx.session is unavailable).

Args: symbols_dir: Absolute path to the symbols/ directory. mode: 'report' | 'safe-fix' | 'full' aggressive: With safe-fix or full, also apply medium-confidence fixes. max_iterations: Cap on LLM-driven prescriptions in 'full' mode (default 20).

Returns: JSON-stringified result with schema, opId, findings, applied/skipped, rolledBack, baseline, finalState, and (in 'full' mode) llmRounds[].

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoreport
aggressiveNo
symbols_dirYes
max_iterationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It details file modification behavior, verify-or-rollback safety, the sampling-driven LLM loop, retry logic, and the exact return fields (schema, opId, findings, applied/skipped, rolledBack, baseline, finalState, llmRounds). This is comprehensive and accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is well-structured with clear mode headers and numbered steps. Every sentence either defines behavior, gives constraints, or explains mode execution. The length is warranted given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex (multi-mode, LLM integration, rollback), but the description covers all aspects: prerequisites, step-by-step flow, edge cases (retry, fallback), and return schema. No gaps are evident, even with no annotations and minimal schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates richly: symbols_dir is defined as absolute path to symbols/ directory, mode enumerates valid values, aggressive is tied to medium-confidence fixes, and max_iterations caps prescriptions. It adds meaning far beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs frank-audit and optionally applies fixes, with explicit modes for report, safe-fix, and full. It references the specific resource (symbols dir) and distinct operations, distinguishing it from sibling tools that only audit, prescribe, or apply edits individually.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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 each mode, including the difference between 'report' (no modifications), 'safe-fix' (mechanical fixes with rollback), and 'full' (adds LLM loop). It also notes prerequisites like MCP sampling support and explains graceful fallback when unavailable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_componentA

Inline VALIDATOR for a single Symbols/DOMQL component string.

Runs the deterministic ruleset (flat element API, signal reactivity, design system tokens, declarative fetch/polyglot/helmet/router, no DOM manipulation, Rule 62 icon ban) against an in-memory string of code. Returns a tight report with violations + warnings.

Use this:

  • During generation, to verify a freshly-generated component before saving

  • In any client without shell access (claude.ai web, hosted MCP) where the CLI is unreachable

  • On a single file's contents, not a whole project

Adjacent tools — call these for different scopes:

  • audit_project() — returns the MULTI-PHASE PROJECT AUDIT PLAYBOOK (instructions for the agent to follow). Use when the user asks for a full project audit.

  • bin/symbols-audit <symbols-dir> (CLI, ships with this package) — filesystem regex sweep across an entire project. Use during the playbook's static-audit phase.

By default returns ONLY the findings (≈1–2K chars). Pass include_playbook=True to also dump the AUDIT.md playbook in the same response when you don't already have it.

Args: component_code: The JavaScript/DOMQL source string to validate. include_playbook: Append the full audit playbook to the response. Default False to keep responses small. Default agents should NOT set this — call audit_project() separately if the playbook is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
component_codeYes
include_playbookNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that validation happens 'against an in-memory string of code' (implying no side effects), that it returns 'a tight report with violations + warnings', and that by default it returns 'ONLY the findings (≈1–2K chars)' unless include_playbook=True. It also warns default agents should not set include_playbook. This is strong, though it doesn't explicitly state whether any external state is modified or if authentication is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than the minimal example, but it is well-structured with bolded headers, bullet lists, and distinct sections for usage and args. Every section earns its place, though some redundancy exists (e.g., repeating that include_playbook defaults to False). It is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (a deterministic ruleset) and the presence of an output schema (not shown), the description provides enough context: it names the rule categories, describes the return report, explains output size, and references the audit playbook. It also integrates well with sibling tools and the CLI, making the overall usage context complete. The output schema can handle formal return details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description's Args section fully explains both parameters. component_code is defined as 'The JavaScript/DOMQL source string to validate,' and include_playbook is described with its default, effect ('Append the full audit playbook to the response'), and guidance to keep it False. This fully compensates for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is an 'Inline VALIDATOR for a single Symbols/DOMQL component string' and lists exactly what the deterministic ruleset checks. It distinguishes itself from sibling tools by explicitly naming adjacent tools and their different scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this' section provides specific scenarios (during generation, in clients without shell access, on a single file) and the 'Adjacent tools' section explicitly names audit_project and bin/symbols-audit as alternatives for different scopes. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_projectA

Returns the multi-phase PROJECT AUDIT PLAYBOOK (instructions for the agent).

Strict mode is the default. Strict means EXHAUSTIVE — the agent does not stop until every finding is resolved, framework_bug (in framework_audit_results.md), or an active 🟢 ASK USER block awaiting user input. No finding stays open.

Two CLI flags (default ON in strict mode, both opt-out via --no-...):

  • --deep-fix: agent does NOT stop at first blocker (missing project key, auth-protected route, missing CLI subcommand). Surfaces ASK-USER blocks or runs documented fallbacks (e.g. publish blocked → local frank+brender preview).

  • --deep-framework-audit: every framework_bug entry includes a Read+Grep trace into smbls/ source identifying the suspected function, plus a suggested patch.

Two report files the CLI emits + the agent appends to:

  • audit/symbols_audit_results.md — PROJECT findings + resolutions

  • audit/framework_audit_results.md — FRAMEWORK bugs + repro + smbls/ trace + suggested patch (each entry must be debuggable by someone who's never seen the code; vague "doesn't work" entries are not acceptable in strict mode)

Findings have an origin field (project | framework | shared) classified by bin/symbols-audit heuristically, then refined by the agent during Phase 2.

This tool is a playbook getter, not an executor. The agent runs the playbook itself using:

  • get_project_context — call FIRST to resolve owner/key/env. Missing values surface as 🟢 ASK USER blocks (NEVER hardcoded).

  • bin/symbols-audit <symbols-dir> — deterministic regex sweep + dual-report template emission. Strict + deep modes default ON.

  • audit_component(code) — inline single-component validator (no filesystem).

  • chrome-mcp tools — for the Phase 3c local-vs-remote UI testing protocol.

Phase summary:

  • Phase 0: setup + baseline metrics + project-context resolution. Missing owner/key resolved here via ASK-USER (not deferred).

  • Phase 1: static audit via bin/symbols-audit (creates findings.json + symbols_audit_results.md + framework_audit_results.md templates).

  • Phase 2: fix loop with self-test. 3 failed fix attempts → finding becomes framework_bug with deep-audit trace. Continue, never stop on first bug.

  • Phase 3a: build gates with fallbacks for missing CLI subcommands.

  • Phase 3b: publish to staging WITH FALLBACK LADDER. If publish is blocked (missing key, AUTH_REQUIRED, env doesn't exist), agent surfaces ASK-USER AND/OR falls back to local frank to-json + brender + http.server preview so Phase 3c still has a viewable artifact. NEVER silently skip publish.

  • Phase 3c: STRICT UI testing — local-vs-(remote OR localfallback) side-by-side, click every clickable, icon rendering verification per Rule 62, theme/lang/ active-nav/forms/responsive.

  • Phase 4: iterate until two consecutive runs converge — zero open findings, zero pending ASK-USER, viewable artifact exists. Deep-fix loop re-visits framework_bug entries to strengthen them and retries blockers.

  • Phase 5: report = record of resolutions, NOT a TODO list. Strict mode forbids "Recommended follow-up tasks" as a terminal state.

Transport awareness: this playbook assumes stdio MCP transport (filesystem access). For SSE/HTTPS/CDN, the agent surfaces filesystem-dependent steps as shell commands the user runs locally, then resumes Phase 2/3 with pasted output. audit_component and audit_project are stateless and work over any transport; get_project_context and bin/symbols-audit are stdio-only.

Output artifacts created in /audit/: findings.json, symbols_audit_results.md (framework bugs), runs/, report.md.

Use this when the user asks to audit, validate, refactor for compliance, or 'make my project publish-ready in one shot'. Returns the entire playbook so the agent has the full context. Pair with the bundled bin/symbols-audit CLI for the deterministic regex pass.

Args: phase: 'all' (full playbook — default) | '0' | '1' | '2' | '3' | '4' | '5' (just one phase's section)

ParametersJSON Schema
NameRequiredDescriptionDefault
phaseNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and exceeds expectations. It discloses strict mode defaults, exhaustive behavior, deep-fix and deep-framework-audit flags, fallback ladders, transport awareness, output artifacts, phase specifics, and the rule that reports must not be TODO lists. No contradictions with annotations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but well-structured with headers and bullets, and nearly every sentence delivers critical operational detail. It is front-loaded with the core purpose. Slight verbosity in repeated references to strict mode reduces the conciseness score, but the density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is exceptionally complete for a complex tool: it covers the full phase lifecycle, transport considerations, CLI companions, output artifacts, fallback behaviors, and parameters. No gaps in context remain for effective agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has a single 'phase' parameter with schema description coverage of 0%, but the description fully compensates: 'Args: phase: "all" (full playbook — default) | "0" | "1" | "2" | "3" | "4" | "5" (just one phase's section)'. This adds complete meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Returns the multi-phase PROJECT AUDIT PLAYBOOK (instructions for the agent).' It explicitly distinguishes itself from siblings by noting it is 'a playbook getter, not an executor' and references sibling tools like `audit_component` and `get_project_context` as complementary roles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Use this when the user asks to audit, validate, refactor for compliance, or "make my project publish-ready in one shot"'. It also gives alternatives and sequencing: 'get_project_context — call FIRST' and 'Pair with the bundled bin/symbols-audit CLI'. This clearly orients the agent among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_htmlA

Convert raw HTML/CSS to Symbols.app DOMQL components.

Provide HTML code and receive the conversion context including component catalog, syntax reference, and design system tokens.

Args: source_code: The HTML/CSS source code to convert.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior. It explains the tool returns a 'conversion context including component catalog, syntax reference, and design system tokens,' which suggests a read-only pure function. Yet it lacks details on side effects, prerequisites, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient, with a clear first sentence and an Args block that adds value beyond the schema. The phrase 'Provide HTML code and receive...' is slightly redundant but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and one simple parameter, the description is reasonably complete. It describes the output context (catalog, syntax reference, tokens) without needing to explain return values in detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only lists 'source_code' with a title, but the description adds 'The HTML/CSS source code to convert,' clarifying the expected input. For a single parameter, this is sufficient compensation for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Convert raw HTML/CSS to Symbols.app DOMQL components' with a specific verb and resource. It differentiates from siblings like convert_react and convert_to_json by naming the target format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It instructs the user to 'Provide HTML code' and describes the output, which implies usage. However, it does not explicitly state when to use this tool over alternatives like convert_react or provide any exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_reactA

Convert React/JSX code to Symbols.app DOMQL.

Provide React component code and receive the conversion context including migration rules, syntax reference, and examples.

Args: source_code: The React/JSX source code to convert.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions that the user will 'receive the conversion context including migration rules, syntax reference, and examples,' which partially discloses the output format. No annotations are present, so the description carries the burden, but it doesn't discuss edge cases, errors, or limitations, leaving some ambiguity about whether actual converted code is returned or just supporting context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences plus an Args block, with no filler. The first sentence states the purpose, the second explains the output, and the third lists the parameter—all essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a single parameter and an output schema, so the description doesn't need to detail return values. However, the phrase 'conversion context' is somewhat ambiguous—it suggests the tool provides guidance rather than the converted DOMQL directly—and no details on how the conversion is performed or what limitations exist. Overall, it's a minimal viable description but has gaps for a tool with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required parameter, source_code, and the description adds meaning by specifying 'The React/JSX source code to convert,' clarifying the expected input beyond the schema's basic title. With 0% schema coverage, this compensation is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Convert React/JSX code to Symbols.app DOMQL,' a specific verb+resource pairing that clearly distinguishes it from sibling tools like convert_html and convert_to_json. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the required input ('Provide React component code') and the target output, which implies the tool is for React-to-DOMQL conversions. However, it doesn't explicitly compare with convert_html or provide exclusions, so it's clear context but not full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_to_jsonA

Convert DOMQL JavaScript source code to platform JSON format.

Parses export statements from generated component/page code and converts them into the structured JSON the Symbols platform expects. Functions are automatically stringified (as the platform stores them as strings).

Use this after generate_component or generate_page to get JSON that can be passed directly to save_to_project.

Mirrors the @symbo.ls/frank toJSON + stringifyFunctions pipeline that the CLI uses when running smbls push.

Args: source_code: JavaScript source code with export const/default statements. section: Target section — "components", "pages", "functions", "snippets", "designSystem", "state". Determines how exports are categorized.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNocomponents
source_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals a key non-obvious behavior: 'Functions are automatically stringified (as the platform stores them as strings).' It also mentions that the tool mirrors the @symbo.ls/frank toJSON + stringifyFunctions pipeline, which sets accurate expectations for the output shape. It does not cover error cases, but overall it adds significant transparency beyond the basic purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. Each paragraph adds value: usage guidance, pipeline mirroring, and parameter explanations. It is concise without being terse, and no sentence is wasted. The Args format is clean and organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to detail return values. It covers purpose, usage timing, a key behavioral transformation, and parameter semantics. It is complete enough for an AI to select and invoke the tool correctly, though it could mention potential limitations or prerequisites (e.g., that exports must be present) for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description compensates with an 'Args' section. It explains source_code as 'JavaScript source code with export const/default statements' and section as 'Target section — "components", "pages", "functions", "snippets", "designSystem", "state"' including how it determines categorization. This adds meaning beyond the raw schema, though the source_code description could be more detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Convert DOMQL JavaScript source code to platform JSON format.' It clearly distinguishes from sibling tools like convert_react and convert_html, and further explains it parses export statements and stringifies functions, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Use this after generate_component or generate_page to get JSON that can be passed directly to save_to_project.' It gives clear context for the intended pipeline position, though it does not explicitly mention when not to use it or name alternatives (those are implied by sibling tools).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectA

Create a new Symbols project on the platform.

Use this when the user wants to save generated components to a new project. Returns the project ID and key for use with save_to_project and publish.

Args: name: Project display name. key: Project key (pr_xxxx format). Auto-generated from name if empty. token: JWT access token from login. api_key: API key (sk_live_...) from project integration settings. visibility: Project visibility — "private", "public", or "password-protected". language: Project language (default: "javascript").

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
nameYes
tokenNo
api_keyNo
languageNojavascript
visibilityNoprivate

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden. It discloses authentication requirements through the token and api_key parameters, explains that key is auto-generated if empty, and mentions the return value (project ID and key). This goes beyond the raw schema, though it does not cover failure modes or permissions explicitly, so a perfect score is not warranted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear one-sentence purpose, a usage context sentence, a sentence about the return value, and a concise Args list. It is front-loaded with the most important information and contains no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the output schema is not shown, the signal confirms one exists. The description explains the tool's role, when to use it, all parameters with their semantics, and what is returned (project ID and key). It also references downstream tools, giving a complete picture for a creation tool with six parameters and one required field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 so thoroughly with an Args section explaining every parameter, including formats (pr_xxxx for key, sk_live_ for api_key), defaults (language: 'javascript', visibility: 'private'), and the auto-generation behavior for key. This adds substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new Symbols project on the platform' with a specific verb and resource, and distinguishes this from sibling tools like save_to_project and publish by specifying it creates a new project rather than saving to or publishing an existing one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Use this when the user wants to save generated components to a new project.' It also mentions the returned ID and key are for use with save_to_project and publish, implying these are follow-up actions. However, it does not explicitly state when not to use this tool or name alternatives directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_environmentA

[Legacy] Detect Symbols environment from caller-supplied file flags.

Prefer get_project_context — it does the same classification by inspecting the filesystem directly (no caller-supplied flags needed) AND returns project owner/key/auth state in the same call.

Kept for backward compatibility with older agent prompts. New code should call get_project_context(cwd) instead — its response includes env_type, env_evidence, and env_guidance fields equivalent to this tool's output, plus owner, key, token_present, and next_step guidance.

Args: has_symbols_json: Whether symbols.json exists in the project root. has_symbols_dir: Whether a symbols/ directory exists with components/, pages/, etc. has_package_json: Whether package.json exists with smbls dependency. has_cdn_import: Whether HTML files contain CDN imports (esm.sh/smbls, etc.). has_iife_script: Whether HTML files use script src smbls (IIFE global). has_json_data: Whether the project uses frank-generated JSON data files. has_mermaid_config: Whether mermaid/wrangler config or GATEWAY_URL/JSON_PATH env vars are present. file_list: Comma-separated list of key files in the project root.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_listNo
has_json_dataNo
has_cdn_importNo
has_iife_scriptNo
has_symbols_dirNo
has_package_jsonNo
has_symbols_jsonNo
has_mermaid_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses that the tool is legacy and depends on caller-supplied file flags rather than inspecting the filesystem. It also implies the output structure by referencing equivalent fields in `get_project_context`. However, it does not explicitly discuss side effects, read-only behavior, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a legacy notice, a preference for an alternative, and a clear Args list. It includes some extra detail about `get_project_context`'s output, which is useful for migration but slightly extends length. Overall, every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 8 parameters and no annotations, the description covers input semantics thoroughly and provides migration guidance. Since an output schema exists, the description doesn't need to detail return values, but it still hints at the output fields by comparing to `get_project_context`. This is adequate for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates. Every parameter (has_symbols_json, has_symbols_dir, etc.) is explained with a clear, specific meaning, e.g., 'Whether symbols.json exists in the project root.' The `file_list` parameter is also described as a comma-separated list. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Detect[s] Symbols environment from caller-supplied file flags,' specifying both the action and the resource. It distinguishes itself from the sibling tool `get_project_context` by explicitly noting it relies on caller-supplied flags and is a legacy alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Prefer `get_project_context`' and 'New code should call `get_project_context(cwd)` instead.' It also explains that this tool is 'Kept for backward compatibility with older agent prompts,' giving clear when-to-use and 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.

explain_frankability_ruleA

Return the documentation block for a specific frank-audit rule.

Each rule (FA001 through FA902) has an explain() method that returns a human-readable description, examples of the bad/good patterns, and the rationale. Use this when an agent encounters an unfamiliar finding and needs context before deciding on a fix.

Args: rule_id: The rule ID (e.g. 'FA301', 'FA806').

Returns: JSON with { ok, ruleId, name, severity, description, explanation }.

ParametersJSON Schema
NameRequiredDescriptionDefault
rule_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the behavioral burden. It explains that each rule has an `explain()` method returning human-readable descriptions, examples, and rationale, and specifies the return JSON fields. It doesn't state error behavior but is adequate for a read-only lookup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with an opening purpose sentence, usage context, and clear Args/Returns sections. It avoids verbose language and front-loads the key action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description provides sufficient context about usage, parameter format, and return value. It doesn't explain possible error cases, but with a clear return signature and usage, it's complete enough for an agent to invoke successfully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines rule_id as a string, but the description's Args section elaborates with a description and concrete examples ('FA301', 'FA806'), making the parameter's meaning clear despite 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the tool returns the documentation block for a specific frank-audit rule, using the verb 'Return' and a specific resource. It distinguishes from sibling tools like audit_component or apply_frankability_edit_ops by focusing on rule documentation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a usage scenario: 'Use this when an agent encounters an unfamiliar finding and needs context before deciding on a fix.' This gives clear context, though it doesn't mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

frankability_logA

Tail the audit log for a Symbols project.

Returns the most recent NDJSON entries from <symbols_dir>/.frank-audit/log. Each entry records audit/fix/apply-edits/rollback events with opId, timestamp, and outcome — useful for understanding history without re-running ops.

Args: symbols_dir: Absolute path to the symbols/ directory. limit: Maximum number of entries to return (default 50).

Returns: JSON with { ok, entries: [...] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the log file path, entry format (NDJSON with opId, timestamp, outcome), and that it returns the most recent entries. It also explains the limit parameter. However, it does not describe behavior on missing files or errors, leaving a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary line, a context paragraph, and an Args section. Every sentence provides necessary information, with no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple log-tail tool, the description is complete. It specifies the log location, entry contents, parameters, and return shape ('{ ok, entries: [...] }'), enabling correct invocation and interpretation without needing to see the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates. It explains symbols_dir as 'Absolute path to the symbols/ directory' and limit as 'Maximum number of entries to return (default 50),' adding meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Tail the audit log for a Symbols project.' This uses a specific verb ('tail') and resource (audit log), and the explanation of returning most recent NDJSON entries distinguishes it from sibling tools like rollback or snapshot tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides usage context: 'useful for understanding history without re-running ops.' This implies when it should be used, but it does not explicitly name alternative tools or state when not to use it. Still, it gives clear context for its intended purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_componentA

Generate a Symbols.app DOMQL component from a description.

Returns the rules, syntax reference, component catalog, cookbook examples, and default library reference as context. The calling LLM uses this context to generate a correct, compliant component.

Args: description: What the component should do and look like. component_name: PascalCase name for the component.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionYes
component_nameNoMyComponent

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It clearly discloses that the tool returns reference material and that the calling LLM performs the actual generation, which is a key behavioral nuance. It does not mention side effects, but the described behavior is transparent and consistent with a generation-context tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary purpose, and uses a clear structured Args section. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description need not detail return values. It sufficiently explains the tool's purpose, parameters, and the caller's role, making it complete for an agent to select and invoke the tool correctly. No significant gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides semantic explanations for both parameters, enriching the minimal schema. 'What the component should do and look like' clarifies the 'description' parameter, and 'PascalCase name for the component' adds a naming convention for 'component_name'. This compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Generate') and the specific resource ('a Symbols.app DOMQL component') derived from a description. This distinguishes it from sibling tools like generate_page and convert_react, which target different outputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to obtain reference context for generating a compliant component, but it does not explicitly state when to prefer this over alternatives or when not to use it. The distinction from siblings is inferable but not articulated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_pageA

Generate a Symbols.app DOMQL page with routing + helmet metadata + fetch integration.

Returns rules, project structure, patterns, snippets, and default library reference as context for page generation.

Args: description: What the page should contain and do. page_name: camelCase name for the page (used in route map).

ParametersJSON Schema
NameRequiredDescriptionDefault
page_nameNohome
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return value ('Returns rules, project structure, patterns, snippets...') but does not address side effects, prerequisites, or whether it persists any changes. The ambiguity between 'Generate' and 'Returns' could confuse agents.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no redundancy. It front-loads the purpose, then summarizes return content, and finally lists the arguments. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the presence of an output schema, the description covers the essential context: purpose, key features, input parameters, and return content. It does not detail the output schema, but that is presumably captured in the schema itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining both parameters: description ('What the page should contain and do') and page_name ('camelCase name for the page (used in route map)'). This adds meaning beyond the bare schema properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action: 'Generate a Symbols.app DOMQL page' and elaborates with routing, helmet metadata, and fetch integration. This distinguishes it from sibling tools like generate_component, which target components.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for page generation but does not explicitly mention alternatives or exclusions. It provides clear context—'page' with routing, helmet, and fetch—but lacks an explicit 'when not to use' statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cli_referenceA

Returns the complete smbls CLI reference (@symbo.ls/cli).

Mirrors smbls/CLI_FOR_MCP.md. Covers: configuration files (symbols.json, .symbols_local/), API URL resolution order + env-var overrides, common flag conventions, full command map (project lifecycle, auth, sync, project mgmt, workspace ops, files & assets, integrations, GitHub, Frank JSON↔FS, dev/build/deploy, code transformation, SDK proxy, ask), publish flow (one-shot + granular), MCP/agent usage rules (--non-interactive + --yes

  • NODE_ENV + SYMBOLS_AUTH_TOKEN), error-handling contracts (AUTH_REQUIRED, ECONNREFUSED, missing app key), source-file map, and CLI-specific anti-patterns.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that it mirrors `smbls/CLI_FOR_MCP.md` and details the exact content areas, including error-handling contracts and anti-patterns. It does not explicitly state side-effect safety, but the read-only nature is strongly implied by 'Returns' and 'Mirrors'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but each listed item adds distinct value. It is front-loaded with the core purpose, but the single-sentence structure with a massive list could be clearer. It earns its length given the breadth of content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no annotations, the description fully compensates by explaining the complete return content, including coverage areas and error contracts. The presence of an output schema reduces the need to detail return values, but the description goes beyond what is necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description correctly focuses on what the tool returns rather than parameter details, as none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the complete `smbls` CLI reference, a specific resource. It also enumerates the covered topics, distinguishing it from sibling tools like get_sdk_reference (SDK vs CLI) and search_symbols_docs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: if you need the CLI reference, this is the tool. However, there is no explicit guidance on when to use this tool versus alternatives, nor any exclusions or when-not scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectA

Get a Symbols project's current data (components, pages, designSystem, state).

Use this to inspect what's already in a project before saving changes.

Args: project: Project key (pr_xxxx) or project ID. token: JWT access token from login. api_key: API key (sk_live_...) from project integration settings. branch: Branch to read from (default: "main").

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenNo
branchNomain
api_keyNo
projectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It implies a read-only operation via 'Get' and 'inspect,' but it doesn't explicitly state that no modifications occur or disclose potential error behaviors or side effects. It does mention branch and auth parameters, adding some useful context, but not rich behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a usage hint, then an Args block. It front-loads the key information and contains no filler. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema is present, so return-value details are not needed. The description covers the purpose, usage context, and all parameters, making it sufficient for an agent to select and invoke this tool correctly. It's a straightforward read tool, and the description is complete for that complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions (0% coverage), but the description provides meaningful explanations for all four parameters: project key/ID, JWT token, API key, and branch with a default. This fully compensates for the schema gap and gives agents the necessary context for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get a Symbols project's current data (components, pages, designSystem, state),' which is a specific verb+resource statement that clearly differentiates this tool from siblings like get_project_rules or get_project_context. The additional note about inspecting before saving changes reinforces its distinct purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool: 'Use this to inspect what's already in a project before saving changes.' This gives a clear context, but it doesn't name alternatives or provide explicit when-not-to-use scenarios. Still, the context is strong enough to guide an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_contextA

Read the current Symbols project context — START HERE for any Symbols task.

Walks up from cwd (or the MCP process's working directory) looking for symbols.json, parses it, classifies the environment from filesystem signals, and returns a single JSON payload with everything an agent needs to begin work.

Returns:

  • owner, key, dir, bundler, sharedLibraries, brender — from symbols.json

  • project_root — absolute path of the project root

  • symbols_dir — absolute path of the symbols/ source dir (or null)

  • env_typelocal | cdn | json_runtime | remote_server | unknown

  • env_evidence — the filesystem signals that produced the classification

  • env_guidance — one-line guidance for that env type

  • token_present — whether SYMBOLS_TOKEN env var or ~/.smblsrc token exists

  • api_base — the Symbols API base URL (defaults to https://api.symbols.app)

  • next_step — what the agent should do next (ask user / log in / proceed)

ALWAYS call this first for any Symbols-project task. It replaces the older detect_environment tool (which required the caller to pre-compute file flags).

Use this BEFORE calling any auth-required tool (save_to_project, publish, push, get_project) — combine with token_present to know whether to prompt for login.

Never hardcode owner/key/credentials. If next_step says "ask the user", ASK.

Args: cwd: Directory to start searching from. Defaults to the MCP server's process cwd. Pass an absolute path when the agent's cwd differs from the project root.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool walks up from cwd, parses symbols.json, classifies the environment from filesystem signals, and returns a payload. It also gives operational behavior like checking for token presence and instructing the agent to ask the user when next_step says so. However, it doesn't explicitly state whether the tool is read-only or has side effects, though 'Read' implies it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a main sentence, a section explaining return values in bullet points, and usage guidance in bold. It is somewhat long but every section adds value. Minor redundancy exists ('START HERE' and 'ALWAYS call this first' repeat similar guidance), but overall it is efficiently organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and that an output schema exists, the description is complete. It enumerates all return fields with meanings, explains the environment classification, gives actionable next_step guidance, and covers authentication-related context. No important aspect of the tool's behavior is left undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only a 'cwd' property with a default and no description (0% coverage). The description fully compensates by explaining the meaning of cwd, its default behavior (MCP server's cwd), and when to pass an absolute path. This is exactly the kind of semantic enrichment needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the current Symbols project context and is the starting point for any Symbols task. It names specific resources (symbols.json, filesystem signals) and explicitly distinguishes it from the sibling tool detect_environment, which it replaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'ALWAYS call this first' for any Symbols-project task, and instructs to use it before auth-required tools like save_to_project, publish, push, and get_project. It also names the alternative detect_environment and explains when to use this tool instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_rulesA

ALWAYS call this first before any generate_* tool.

Returns the mandatory Symbols.app rules that MUST be followed:

  • FRAMEWORK.md (authoritative — project structure, plugins, theming, SSR, publish)

  • DESIGN_SYSTEM.md (authoritative — design-system contract + token catalog)

  • RULES.md (62 strict rules — flat API, signal reactivity, design tokens, polyglot, fetch, helmet, theme, reusability, icons)

  • COMPONENTS.md (built-in component catalog from @symbo.ls/default-config — REUSE these via bare PascalCase keys; do NOT redefine)

  • DEFAULT_COMPONENTS.md (full source/structure of every built-in — what they look like, what props they expose, how to compose them)

  • SYNTAX.md (DOMQL v3.14 syntax reference — flat element API, signal reactivity, factory patterns)

  • PATTERNS.md (canonical compositional patterns)

  • SNIPPETS.md (project-level snippet patterns)

  • SHARED_LIBRARIES.md (when to read/never edit cross-package code)

  • WORKSPACE.md (multi-app monorepo topology — two project shapes, two-file contract, no-transitive-resolution, onboarding checklist)

  • FRANKABILITY.md (every @symbo.ls/frank-audit rule with wrong vs canonical examples — patterns that survive frank.toJSON serialization, so generated code is provably frankable from the start)

  • FRANK_FIX_WORKFLOW.md (LLM reference card for the prescription → edit-op flow — the strict 8-kind contract for apply_frankability_edit_ops)

  • COMMON_MISTAKES.md + LEARNINGS.md (hard-won failure cases — read these to avoid replaying them)

  • DEFAULT_PROJECT.md (recommended baseline design-system values + the default-library catalog)

Violations cause silent failures — black page, nothing renders, or a working app with degraded UX you'll later have to rebuild.

Call this before: generate_component, generate_page, convert_react, convert_html, or any code generation task.

READ ALL SECTIONS — do NOT skim past COMPONENTS.md / DEFAULT_COMPONENTS.md / PATTERNS.md. The single most-violated rule is reusing built-in components. Skipping the catalog leads to redefining Avatar, Button, Dialog, etc. from scratch when a bare Avatar: {} would have rendered the canonical built-in.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the consequences of violations ('silent failures — black page, nothing renders...'), emphasizes the most-violated rule about reusing built-ins, and instructs the agent to read all sections. This goes well beyond a simple 'Returns rules' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and uses a bulleted list to enumerate files, which is appropriate for the complexity of the returned rules. It is well-structured and front-loaded with the 'ALWAYS call this first' imperative. While lengthy, each entry serves a purpose and the content is not wasted, though a more compact summary could be added.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex, returning a rich set of rule documents. The description thoroughly explains the content and purpose of each file, and provides clear, actionable guidance on how to use the returned information. An output schema exists, so return value details are not needed; the description is complete for the tool's context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description adds no parameter-related meaning (none needed), and the schema is empty, so there is nothing to elaborate on. No deduction is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Returns the mandatory Symbols.app rules' and is explicitly positioned as the first call before any generate_* tool. It distinguishes itself from siblings by focusing on the authoritative rule set for code generation, not just general context or reference material.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit, actionable usage instructions: 'ALWAYS call this first before any generate_* tool' and lists specific tools ('generate_component, generate_page, convert_react, convert_html, or any code generation task'). It also explains the consequences of not using it, which is strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sdk_referenceA

Returns the complete @symbo.ls/sdk API reference (3.14.0).

Mirrors sdk/SDK_FOR_MCP.md. Covers all 24 services with full method lists: auth, collab, project, plan, subscription, file, payment, dns, branch, pullRequest, admin, screenshot, tracking, waitlist, metrics, integration, featureFlag, organization, workspace, workspaceData (typed wrapper for /workspace/*), kv, allocationRule, sharedAsset, credits. Plus: SDK class lifecycle, BaseService contract, TokenManager (singleton, auto-refresh), environment matrix (channel URLs), root event bus (sdk.rootBus with last-payload replay), validation surface, federation primitive (multi-Supabase registry), permissions reference (ROLE_PERMISSIONS, PROJECT_ROLE_PERMISSIONS, TIER_FEATURES), error handling contract, and MCP integration notes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Returns' and 'Mirrors sdk/SDK_FOR_MCP.md', implying a read-only operation, but does not explicitly confirm no side effects, authentication requirements, or caching behavior. The description focuses on content coverage rather than operational behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured, front-loading the primary purpose and then enumerating coverage areas in a clear list. Each service and section listed adds value for an agent deciding whether this reference contains the needed information, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description covers all necessary context: version, source file, and an exhaustive list of covered services and sections. It is complete for a reference retrieval tool, leaving no ambiguity about what the agent will get.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema fully describes its interface. The description adds no parameter-specific information, which is acceptable given there are no parameters to describe. Per the rubric, 0 parameters sets a baseline of 4, and the description meets that baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Returns the complete @symbo.ls/sdk API reference (3.14.0).' This specifies the verb, resource, and version, distinguishing it from sibling tools like get_cli_reference. The detailed enumeration of services and sections further clarifies exactly what the agent will receive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to retrieve the SDK API reference but does not explicitly state when to use it versus alternatives like get_cli_reference or search_symbols_docs. It mentions that it mirrors a specific file, which gives some context, but lacks explicit when-not-to-use or alternative tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA

List the user's Symbols projects.

Returns project names, keys, and IDs so the user can choose which project to save to or publish. Requires authentication.

Args: token: JWT access token from login. api_key: API key (sk_live_...) from project integration settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenNo
api_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the authentication requirement and the output fields. However, it does not explicitly state that the operation is read-only, nor does it mention error behavior or rate limits. The word 'List' implies safety, but the description does not make it explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and well-structured: purpose, return info, authentication note, then argument details. Every sentence adds value with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with two parameters and an output schema, the description covers the essential purpose, usage context, authentication, and parameter semantics. It does not detail error handling, but that is reasonably left to runtime behavior. It is sufficient for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions (coverage 0%), but the description's Args section compensates by explaining token as 'JWT access token from login' and api_key as 'API key (sk_live_...) from project integration settings.' This adds meaningful format and source context, though it doesn't clarify whether both parameters are required or how they interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List the user's Symbols projects', a clear verb and resource. It specifies the return values (project names, keys, IDs) and positions the tool as a prerequisite for choosing where to save/publish, distinguishing it from get_project or create_project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides the intended use context: 'so the user can choose which project to save to or publish.' This clearly indicates when to call the tool. It does not explicitly name alternatives or exclusion criteria, but the use case is specific and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

loginA

Log in to the Symbols platform and get an access token.

Use this when the user needs to authenticate before any project operation. Returns a JWT token that can be used with all project tools.

Args: email: Symbols account email address. password: Symbols account password.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
passwordYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry transparency. It discloses the JWT token return and its applicability to all project tools, but omits details like token expiration, security implications, or credential handling. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short paragraphs: purpose, usage, and Args. Every sentence is informative, no repetition or fluff. Front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple login tool with an output schema, the description covers the essential actions and expected return. It lacks details on failure modes or prerequisites, but overall it is complete enough for an agent to select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining email and password as 'Symbols account email address' and 'Symbols account password.' This adds minimal value beyond the schema's parameter titles, but is sufficient for simple auth parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Log in to the Symbols platform and get an access token' with specific verb and resource. It uniquely identifies the authentication purpose, distinguishing it from all sibling tools which are project operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use this when the user needs to authenticate before any project operation.' This provides clear when-to-use context, though it does not mention when-not-to-use or alternative authentication methods.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prescribe_frankability_fixesA

Generate LLM-ready prescriptions for frank-audit findings that can't be auto-fixed.

Each prescription contains:

  • finding (rule, file, line, refusal reason)

  • sourceContext (~30 lines around the finding)

  • relatedFiles (other places that mention the same symbol)

  • proposedOps — array of edit ops the rule's helper logic produced (e.g. FA304 already mapped 36px → 'C2' from the project's spacing scale; FA301 already matched the closest palette token). The agent can submit these verbatim to apply_frankability_edit_ops, or modify before submitting.

  • explanation (the rule's docs)

  • safetyCheck (verify command run after apply)

Workflow for the agent:

  1. Call this tool to get prescriptions.

  2. Inspect each proposedOps array. Either submit verbatim or modify. For findings with no proposedOps (structural refactors like FA2xx multifile-helpers, FA5xx DOM bans), construct your own ops from the 12 strict op kinds: removeImport | moveFile | addToIndexFile | addToGlobalScope | removeTopLevelDecl | addElementScope | replaceTokenValue | renameObjectKey | removeObjectKey | setObjectProperty | addDesignToken | skip

  3. Call apply_frankability_edit_ops(symbols_dir, ops) — frank-audit validates every op, snapshots, applies, runs verify, rolls back on regression. Failed ops return structured details (E_OLDVALUE_NOT_FOUND with actualLine, E_KEY_NOT_FOUND with availableKeys, etc.) so you can retry intelligently.

  4. Repeat until prescriptions are exhausted or no progress.

Args: symbols_dir: Absolute path to the symbols/ directory.

Returns: JSON with schema version, opId, list of prescriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the tool generates prescriptions and that the agent must apply them via a separate tool, implying no mutation happens here. It also describes the return shape (JSON with schema version, opId, prescriptions). However, it does not explicitly state side effects, permissions, or error behavior of this specific tool, and spends significant space describing the sibling apply tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and uses clear headings/bullets, but it is fairly long. It includes a full list of op kinds and detailed behavior of the follow-up apply tool; these are useful in context but could be trimmed if those details live in sibling tool descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter, an output schema, and a complex workflow, the description is highly self-contained. It explains what the prescription contains, how to handle findings with and without proposedOps, what the follow-up tool does, and when to stop—covering all the information an agent needs to invoke and use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required string param with 0% schema description coverage. The description fully compensates by saying 'symbols_dir: Absolute path to the symbols/ directory', which gives the agent precise, actionable semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Generate') and a clear resource ('LLM-ready prescriptions for frank-audit findings that can't be auto-fixed'), immediately distinguishing this tool from adjacent siblings like apply_frankability_edit_ops. It also enumerates the prescription contents, which further clarifies the tool's role as a planning/proposal generator.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit 4-step workflow: call this tool, inspect/modify proposedOps, call apply_frankability_edit_ops, and repeat. It clearly states the intended use case (findings that can't be auto-fixed) and gives specific instructions for the no-proposedOps case, including a list of valid op kinds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publishA

Publish a version of a Symbols project to the platform.

Makes the specified version (or latest) the published/live version. Call save_to_project first to save your changes, then publish to make them live.

Requires authentication — provide either token or api_key.

Args: project: Project ID (MongoDB ObjectId) or project key (pr_xxxx). token: JWT access token from login or ~/.smblsrc. api_key: API key (sk_live_...) from project integration settings. Alternative to token. version: Version string or version ID to publish. Leave empty for latest. branch: Branch to publish from (default: "main").

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenNo
branchNomain
api_keyNo
projectYes
versionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that authentication is required (token or api_key) and that the action makes a version live, implying a state change. It does not mention reversibility or side effects on previous versions, but the core behavior is transparent enough for a publish operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the main purpose. The opening sentence is immediately informative, followed by a short clarification, authentication note, and a cleanly formatted argument list. Every sentence contributes value, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters and no annotations, the description covers purpose, usage flow, authentication, and all parameter semantics. Since an output schema exists, the absence of return-value details is acceptable. The description is complete enough for an agent to invoke the tool correctly in the intended write-then-publish workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description includes an 'Args' section that explains every parameter: project (ID or key), token (JWT), api_key (sk_live_...), version (empty for latest), and branch (default main). This fully compensates for the schema's lack of descriptions and adds meaningful guidance beyond raw property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Publish a version of a Symbols project to the platform.' It further clarifies that this makes the specified version (or latest) the published/live version, which clearly distinguishes it from sibling tools like save_to_project (which saves changes) and push (which likely pushes code). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to 'Call save_to_project first to save your changes, then publish to make them live,' providing a clear workflow context. It also states authentication requirements, but it does not explicitly enumerate when not to use this tool or compare to all siblings. Still, the guidance is sufficient for an agent to select it for publishing after saving.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pushA

Push/deploy a Symbols project to a specific environment.

Deploys the project to a target environment (production, staging, dev). Call publish first to set the live version, then push to deploy.

Requires authentication — provide either token or api_key.

Args: project: Project ID (MongoDB ObjectId) or project key (pr_xxxx). token: JWT access token from login or ~/.smblsrc. api_key: API key (sk_live_...) from project integration settings. Alternative to token. environment: Target environment key (e.g. "production", "staging", "dev"). mode: Deploy mode — "latest" (newest from branch), "published" (current published version), "version" (specific version), or "branch" (track a branch). version: Required when mode is "version" — the version string or ID to deploy. branch: Branch to deploy from when mode is "latest" or "branch" (default: "main").

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNopublished
tokenNo
branchNomain
api_keyNo
projectYes
versionNo
environmentNoproduction

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It reveals authentication needs, parameter dependencies (e.g., version required when mode is 'version'), and the publish-before-push ordering. However, it does not explicitly mention potential side effects like overwriting existing deployments or whether deploys are reversible. This is above average but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a concise summary followed by a structured Args list. Every sentence adds value, and the format makes it easy for an agent to scan. It includes all necessary detail without unnecessary fluff, striking an ideal balance between completeness and brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 7-parameter complexity and zero schema descriptions, the description is thoroughly complete. It covers authentication, sequencing with publish, all parameter semantics, and environment targets. Since there is an output schema, not describing return values is appropriate. This description fully equips an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must fully compensate. It does so with a detailed Args section explaining every parameter: project, token, api_key, environment, mode, version, and branch. It also adds conditional logic (e.g., 'Required when mode is version') that goes beyond the schema, providing complete semantic clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Push/deploy a Symbols project to a specific environment.' The verb is specific, the resource is identified, and the scope is defined with examples (production, staging, dev). It also distinguishes itself from the sibling `publish` tool by stating that publish sets the live version first, then push deploys it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Call publish first to set the live version, then push to deploy.' It also gives clear authentication requirements, stating 'provide either token or api_key.' This directly informs when and how to use the tool, and the sequencing with publish helps avoid misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rollback_frankabilityA

Restore a Symbols project to its state before a specific op ran.

Every apply-edits run snapshots affected files under <symbols_dir>/.frank-audit/snapshots/<opId>/ before mutating. Use this to undo a specific op (or a chain by walking backwards through opIds listed by snapshots_frankability).

Args: symbols_dir: Absolute path to the symbols/ directory. op_id: The opId to roll back to (from a prior apply-edits result).

Returns: JSON with { ok, restored: [...filePaths], opId }.

ParametersJSON Schema
NameRequiredDescriptionDefault
op_idYes
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well by explaining the snapshot mechanism and the return format. However, it does not explicitly warn about the destructive nature of the operation (e.g., overwriting current files) or mention error/failure cases. Still, it adds significant behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: a clear purpose statement, a contextual explanation of snapshots, usage guidance, parameter definitions, and return format. Every sentence serves a purpose with no fluff, making it highly readable and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters and an output schema (as signaled), the description covers the core functionality, parameters, return shape, and references a sibling for listing opIds. It lacks edge-case behavior (e.g., invalid op_id, rollback failure) but is generally complete for a well-understood operation. The presence of an output schema reduces the need to describe return details, but the description already includes them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no parameter descriptions in the schema), so the description must compensate. It does: 'symbols_dir: Absolute path to the symbols/ directory' and 'op_id: The opId to roll back to (from a prior apply-edits result).' This adds meaning beyond the bare titles 'Symbols Dir' and 'Op Id', earning a strong score, though it could include more detail about validation or format requirements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Restore a Symbols project to its state before a specific op ran.' This uses a specific verb ('restore') and resource ('Symbols project'), and distinguishes it from siblings like apply_frankability_edit_ops and snapshots_frankability by focusing on undoing a previous operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'Use this to undo a specific op (or a chain by walking backwards through opIds listed by snapshots_frankability).' This clearly indicates when to use the tool and references a sibling for discovering opIds. The description also mentions the snapshot mechanism, giving context for how the undo works.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_to_projectA

Save components, pages, or design system data to a Symbols project.

This applies changes to the project and creates a new version. Use after generate_component/generate_page to persist the output.

The changes parameter is a JSON string with the data to merge into the project. Structure mirrors the project data format:

{
  "components": {
    "Header": {
      "extends": "Flex",
      "props": { "flow": "x", "gap": "B", "padding": "A B" },
      "Logo": { "extends": "Icon", "props": { "name": "logo" } },
      "Nav": { "extends": "Flex", "gap": "A" }
    }
  },
  "pages": {
    "home": {
      "extends": "Page",
      "Header": {},
      "Hero": { "extends": "Flex" }
    }
  },
  "designSystem": { ... },
  "state": { ... },
  "functions": { ... }
}

Only include the sections you want to update — omitted sections are left unchanged.

Args: project: Project key (pr_xxxx) or project ID. changes: JSON string with project data to save (components, pages, designSystem, state, functions). token: JWT access token from login. api_key: API key (sk_live_...) from project integration settings. message: Version commit message describing the changes. branch: Branch to save to (default: "main").

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenNo
branchNomain
api_keyNo
changesYes
messageNo
projectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses side effects ('applies changes to the project and creates a new version'), merge behavior ('omitted sections are left unchanged'), and auth requirements via token/api_key parameters. This goes beyond minimal safety declarations to explain how the tool behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long due to the necessary JSON example, but every part serves a purpose: overview, usage, behavioral notes, parameter details, and example. It is well-front-loaded with the core purpose and not overly verbose, though the JSON block makes it less scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no annotations, and an output schema (which covers return values), the description is remarkably complete. It covers purpose, usage context, parameter semantics, merge behavior, and even versioning side effects. No major gaps are evident for an agent to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates fully with an 'Args:' section explaining each of the 6 parameters. It also provides a detailed JSON example for the 'changes' parameter, clarifying its structure and optional sections, which is far more than a plain schema would offer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Save components, pages, or design system data to a Symbols project' with a specific verb and resource. It further distinguishes from siblings by noting 'Use after generate_component/generate_page to persist the output,' clarifying its role as a persistence step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: 'Use after generate_component/generate_page to persist the output.' It also explains merge semantics ('Only include the sections you want to update — omitted sections are left unchanged'), but does not provide explicit exclusions or alternatives beyond the generation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_symbols_docsA

Search the Symbols documentation knowledge base for relevant information.

Args: query: Natural language search query about Symbols/DOMQL. max_results: Maximum number of results to return (1-5).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It is a search tool, implying read-only behavior, and mentions max_results limitation. However, it does not explicitly state that it does not modify anything or describe any request/response behavior, which is minimal but adequate for a straightforward search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a single opening sentence plus a compact Args list. Every sentence earns its place, with no redundant or filler content. It is front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple search tool with only two parameters and an output schema, the description covers purpose and parameter semantics adequately. It does not need to explain return values because the output schema exists. It could mention broader scope (e.g., whether search is full-text or semantic), but the description is sufficient for a basic search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema properties have no descriptions (0% coverage), but the description provides clear semantics for both parameters: query is described as 'Natural language search query about Symbols/DOMQL' and max_results is described with a range. This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Search the Symbols documentation knowledge base for relevant information.' It uses a specific verb (search) and a specific resource (Symbols documentation knowledge base), effectively distinguishing it from sibling tools like get_cli_reference or audit_component.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Search the Symbols documentation knowledge base for relevant information' and the query description 'about Symbols/DOMQL' imply the tool is for looking up documentation. It provides clear context for when to use it, but it does not explicitly mention alternatives or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshots_frankabilityA

List recent snapshotted opIds for a Symbols project.

Each entry corresponds to a frank-audit op that wrote files. Pass an opId to rollback_frankability to restore that op's pre-state.

Returns: JSON with { ok, opIds: [{ opId, timestamp, files }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the return format (JSON with ok and opIds array including opId, timestamp, files), clarifies that entries correspond to frank-audit ops that wrote files, and explains their role in rollback. It doesn't mention ordering or time window, but for a simple list tool, this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and efficient: three sentences plus a return format line. The purpose is front-loaded, and every sentence adds value without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list tool, the description is complete: it explains what the tool does, what each entry contains, how the result is used with rollback, and provides the return structure. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage, and the only parameter, symbols_dir, is not explicitly described. The description indirectly refers to it by saying 'for a Symbols project,' which hints at the parameter's purpose, but it doesn't state the parameter name or format directly. Minimal compensation is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'List recent snapshotted opIds for a Symbols project.' It specifies the resource (snapshotted opIds) and scope (Symbols project), and differentiates from the sibling tool rollback_frankability by explaining that the opIds can be passed to rollback to restore pre-state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it lists snapshotted opIds from audit ops that wrote files, and explicitly mentions the next step of passing an opId to rollback_frankability. It doesn't state exclusions or when not to use, but the usage scenario is apparent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_frankabilityA

Verify a Symbols project bundles cleanly via frank.toJSON.

Independent of audit/fix — runs the same round-trip that apply-edits uses after every mutation, but as a standalone check. Useful for the agent to confirm a project is in a known-good state before starting a fix loop, or after a series of manual edits.

Returns: JSON with { ok, bundleable, scanIssues, ... }.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbols_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that the tool runs the same round-trip as apply-edits, that it is a standalone check, and that it returns JSON with 'ok, bundleable, scanIssues.' This implies a non-mutating verification operation. It doesn't explicitly state it is read-only, but the context strongly suggests it. Minor gaps like error behavior are not covered, but overall the behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (four sentences) and well-structured: it opens with the core purpose, then explains independence and usage context, and ends with the return value. Every sentence adds value, and key information is front-loaded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single parameter and an output schema, the description is fairly complete. It explains why the tool exists, when to use it, and what it returns. The output schema exists, so the explicit return listing is a bonus. Missing elements like prerequisites (e.g., does symbols_dir need to be absolute?) or potential error conditions, but these are not critical given the simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one parameter, symbols_dir, but with no description (0% coverage). The description does not explicitly explain the parameter; it only implies that the tool operates on a Symbols project. Since schema coverage is low, the description should compensate, but it fails to elaborate on what symbols_dir should contain (e.g., a path to the project root, expected format). The parameter is somewhat inferable from the tool name and purpose, but not explicitly described.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific purpose: 'Verify a Symbols project bundles cleanly via frank.toJSON.' It uses a specific verb (Verify) and resource (Symbols project), and further distinguishes itself from audit/fix by noting it is an independent standalone check. This sufficiently separates it from sibling tools like audit_component or apply_frankability_edit_ops.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Useful for the agent to confirm a project is in a known-good state before starting a fix loop, or after a series of manual edits.' It also states it is 'independent of audit/fix,' implying that for actual auditing or fixing, other tools should be used. It does not explicitly name alternative tools, but the guidance is clear and practical.

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. Dates show when Glama detected each change.

  1. 28 tool updatesv3.14.653
    • First observedapply_frankability_edit_ops
    • First observedaudit_and_fix_frankability
    • First observedaudit_component
    • First observedaudit_project
    • First observedconvert_html
    • First observedconvert_react
    • First observedconvert_to_json
    • First observedcreate_project
    • First observeddetect_environment
    • First observedexplain_frankability_rule
    • First observedfrankability_log
    • First observedgenerate_component
    • First observedgenerate_page
    • First observedget_cli_reference
    • First observedget_project
    • First observedget_project_context
    • First observedget_project_rules
    • First observedget_sdk_reference
    • First observedlist_projects
    • First observedlogin
    • First observedprescribe_frankability_fixes
    • First observedpublish
    • First observedpush
    • First observedrollback_frankability
    • First observedsave_to_project
    • First observedsearch_symbols_docs
    • First observedsnapshots_frankability
    • First observedverify_frankability

TDQS

A4/5.0
Disambiguation4/5

Most tools have clearly distinct scopes—generation, conversion, audit, fix, and project operations are well-separated. However, a few pairs could confuse an agent: `detect_environment` is explicitly superseded by `get_project_context`, and `get_project` vs `get_project_context` have nearly identical names despite pointing to different data.

Naming Consistency3/5

Snake_case is used throughout, but the pattern is inconsistent: most tools are verb_noun (`generate_component`, `list_projects`), yet some are noun-first (`snapshots_frankability`, `frankability_log`) or bare verbs (`publish`, `push`). The `_frankability` suffix creates a recognizable family, but word order varies, making the convention less predictable.

Tool Count2/5

At 28 tools, the server exceeds the 25+ threshold that starts to feel like too many. The count is inflated by combining several distinct subdomains—generation, conversion, audit/fix, and platform project management—into one surface. Several reference/context tools (get_project_rules, search_symbols_docs, get_cli_reference, get_sdk_reference) could be consolidated or split into separate servers.

Completeness4/5

The server covers the full lifecycle: generate/convert, audit/fix with comprehensive rollback and verification, then save/publish/push to the platform. Minor gaps exist—there is no update/delete project endpoint or direct component deletion, and `detect_environment` duplicates `get_project_context`—but agents can work around these, and the audit-fix loop is exceptionally thorough.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    A comprehensive MCP server providing tools for AI agents to interact with code, including reading symbols, importing modules, replacing text, and sending OS notifications.
    3
    25
    10
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that exposes the Symbols/DOMQL v3 AI assistant capabilities to any MCP-compatible platform. Enables generating components, pages, projects, and more from natural language, as well as searching documentation and reviewing code.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for semantic codebase navigation that builds an AST index of symbols, imports, and exports, providing AI agents with tools to search, explore, and understand code.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for syntx.ai AI platform that enables chat, image generation, model catalog, and account management through any MCP-compatible assistant.
    28
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/symbo-ls/symbols-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server