TastePro
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TasteProfind a palette and hero blueprint for a fintech dashboard"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TastePro
TastePro is a read-only Model Context Protocol server that gives coding agents design taste: domain playbooks, original design directions, palettes, type pairings, hero and section blueprints, brand-system analyses, and a web-interface audit rubric. It is deterministic, works offline, and never calls an LLM or browses the web on its own.
TastePro speaks stdio for local clients and Streamable HTTP for hosted clients. The same server works with ChatGPT, Claude, OpenCode, Cursor, and any MCP-compatible agent.
Status: 1.0
The current build ships the read-only foundation plus the hosted audit:
873 committed content packs across 14 kinds.
40-domain taxonomy with 15 deep seed playbooks and same-family fallback for uncovered domains.
104-rule web-interface audit rubric with severity and category filters.
taste_search,taste_get,taste_guidelines, andtaste_audit, a static HTML audit that cites the rubric and admits what it cannot verify.Static resources, resource templates, and two design prompts.
stdio and Streamable HTTP transports.
OAuth resource-server auth for hosted deployments, plus bearer auth, host allowlists, CORS, body limits, session TTL, and health checks for the HTTP transport.
Content ingestion from four pinned upstream repositories.
Unit, integration, contract, and production-tier tests.
Docker and staging scaffolding.
Not included: executed page JavaScript during audits (browser mode renders with JavaScript disabled), artifact storage, or an authorization server — TastePro validates tokens from your IdP, it does not issue them. See Roadmap.
Related MCP server: ui-polish-mcp
Why it exists
Coding agents can write a page, but they often default to the same generic SaaS landing page: a gradient hero, three feature cards, a fake dashboard, and no point of view. TastePro gives the agent a curated vocabulary and a decision sequence:
Frame the domain and read its playbook.
Commit to one visual direction, not five averaged together.
Choose a palette, type pairing, and the sections the page actually needs.
Build with real content and real states.
Audit against specific, citable rules.
The server returns compact cards first, then full packs only when the agent asks for them. Response budgets keep context use predictable.
Quick start
Requirements: Node.js 22 or newer and npm.
npm ci
npm run build
node dist/cli.js info
node dist/cli.js --stdio--stdio is the default transport. It is meant to be launched by an MCP client,
not used interactively from a shell. To expose the HTTP transport locally:
node dist/cli.js --http --host 127.0.0.1 --port 3000Health check:
curl http://127.0.0.1:3000/healthzThe response includes the content hash, catalog counts, quality mix, and validation warning count.
Install as a command
From a checkout:
npm link
tastepro info
tastepro --stdioWhen the package is published, npx -y tastepro --stdio will be the shortest
local setup.
Connect a client
What it serves
Kind | Count | What it is |
| 40 | Domain taxonomy; 15 have deep playbooks |
| 20 | Complete visual arguments |
| 56 | Token sets with contrast checks |
| 44 | Display/text pairings with sources |
| 58 | Hero archetypes and blueprints |
| 185 | Section blueprints by role |
| 18 | Motion recipes |
| 202 | Text studies of real sites |
| 84 | Brand design-system analyses |
| 104 | Web-interface audit rules |
| 25 | Full reference documents |
| 7 | App visual systems |
| 5 | App shell blueprints |
| 25 | App screen patterns |
Quality mix: 550 verified, 313 reference, 10 incomplete. Incomplete packs are excluded by default and are never presented as complete.
The content is committed under content/generated/, so the server works
offline. It is generated from the pinned sources by npm run ingest; do not
hand-edit generated files.
Tools
taste_search
Search the catalog by product, audience, domain, mood, kind, quality, or source. Returns compact cards with ids. Defaults: 12 results, 1,400-token budget.
{
"query": "fintech dashboard",
"domain": "fintech-payments",
"kind": "direction",
"limit": 5
}Search first requires every meaningful query term (with fuzzy tolerance for
typos), then adds the inferred domain playbooks. This keeps a query such as
dark developer tool from returning a generic portfolio. If the query lands
only on domains without authored playbooks, the response adds same-family
playbooks and lists them in familyFallback; these are references, not
domain-specific playbooks.
taste_get
Fetch one or more packs by id.
{
"ids": ["domain/fintech-payments", "direction/quiet-instrument"],
"format": "brief"
}Formats:
brief— decision-oriented projection. Default.full— the complete pack.markdown— implementation-oriented document.json— raw JSON.
includeBody: true returns the full body of a reference pack instead of a
1,200-character excerpt. The default budget is 2,400 tokens; includeBody
raises the default to the 24,000-token maximum unless you pass an explicit
maxTokens.
taste_guidelines
Query the 104-rule web-interface audit rubric.
{
"query": "focus",
"severity": "error",
"format": "markdown",
"limit": 10
}Use severity: "error" for must-fix issues. The Markdown format is a
copy-paste checklist with rule ids and source lines. Rules are pinned to the
Vercel Web Interface Guidelines commit recorded in sources.lock.json.
taste_audit
Audit submitted HTML against the rubric. Findings cite a guidelineId,
severity, category, evidence, and a fix; the response also lists
checked (rules actually evaluated) and notVerified (rendered layout,
runtime behavior, external stylesheets, and copy quality are out of scope for
a static audit).
{
"html": "<html><body><img src='/hero.png'></body></html>",
"target": "landing page"
}urlinput requiresTASTEPRO_AUDIT_ALLOW_URL_FETCH=true; the fetch is SSRF-guarded (private, loopback, and link-local addresses are refused, with redirect, size, and timeout caps).mode: "browser"requiresTASTEPRO_AUDIT_BROWSER=playwrightand the optionalDockerfile.auditimage. It renders with JavaScript disabled, blocks service workers, aborts every subresource request, adds a layout-overflow check, and is bounded by hard timeouts and a concurrency/queue gate.On hosted deployments the tool requires the
tastepro:auditOAuth scope. Anonymous endpoints do not expose it.Submitted documents are never stored, logged, or echoed; only short evidence snippets appear in the response.
Resources and prompts
Static resources:
tastepro://catalog— stats, sources, and domain index.tastepro://taxonomy/domains— the 40 domains and authored playbooks.tastepro://stats— build stats and validation warnings.tastepro://skill— the agent-facing skill guide.
Resource templates:
tastepro://pack/{+id}— any pack as JSON. References include the full body.tastepro://guideline/{+id}— one guideline rule as JSON.
Templates are not enumerated in resources/list; listing every pack would cost
roughly 77k tokens. Use taste_search to discover ids, or URI completion on the
template. resources/list returns only the four static resources above.
Prompts:
design_brief— turn a project description into a concrete brief.design_audit— turn a URL, file, or component into a prioritized audit plan. The prompt tells the agent not to claim it inspected a page it could not load.
HTTP transport
The HTTP transport uses the MCP Streamable HTTP protocol at POST /mcp.
Stateless is the production default: every request is independent, so any
replica can serve it and no session store is needed. --stateful (or
TASTEPRO_HTTP_MODE=stateful) enables sessions for SSE (--sse) and
resumability. In stateless mode GET/DELETE return 405 and
--sse is rejected at startup.
TASTEPRO_API_KEY="$(openssl rand -hex 32)" \
node dist/cli.js --http --host 0.0.0.0 --port 3000With an API key set, every /mcp request needs:
Authorization: Bearer <token>Health, readiness, and root metadata stay anonymous:
GET /healthzGET /readyzGET /
Other hardening:
A non-loopback bind requires auth — OAuth (
TASTEPRO_OAUTH_ISSUERplusTASTEPRO_PUBLIC_URL) orTASTEPRO_API_KEY— andTASTEPRO_ALLOWED_HOSTS; anonymous hosting needs the explicitTASTEPRO_ALLOW_ANONYMOUS=trueopt-in and never exposestaste_audit.With OAuth configured,
/mcpverifies JWT access tokens (issuer, audience, expiry, signature via the IdP's JWKS or OIDC discovery) and serves/.well-known/oauth-protected-resourcemetadata. OAuth and a static API key cannot be combined. Stateless mode applies the token's scopes per request.TASTEPRO_ALLOWED_HOSTSrejects unexpectedHostheaders.Browser origins are deny-by-default; an untrusted
Originis rejected before a request is handled.Request bodies are capped at 1 MiB.
Stateful sessions expire after 30 minutes idle and are capped; stateless mode has no sessions.
taste_auditis bounded by a concurrency/queue gate. Browser mode blocks all subresource requests and uses hard timeouts.SIGINT/SIGTERMclose sessions and drain the HTTP server.
For a production-shaped self-host deployment, use
deploy/production.compose.yml with deploy/production.env.example.
OAuth with Keycloak
The repository includes a reference Keycloak realm and an end-to-end smoke:
docker compose -f deploy/keycloak.compose.yml up -d
npm run smoke:oauth
docker compose -f deploy/keycloak.compose.yml down -vIt checks a real token, the tastepro:audit scope, scope denial, and audience
rejection. See docs/deployment.md for the production IdP
setup.
Configuration
Variable | Default | Purpose |
| package | Content directory |
|
| HTTP bind host |
|
| HTTP port |
| unset | Require static bearer auth on |
| unset | OAuth issuer URL; enables OAuth on |
|
| Expected OAuth audience |
| OIDC discovery | JWKS endpoint |
| unset | Public origin; required with OAuth |
|
|
|
|
| Explicit opt-in for unauthenticated non-loopback |
| unset (deny) | Comma-separated browser origins, or |
| unset | Comma-separated |
|
| Set |
|
| Allow the SSRF-guarded |
| unset |
|
|
| Maximum in-flight audits |
|
| Maximum queued audits before returning busy |
|
|
|
CLI flags override environment variables. Run node dist/cli.js --help for the
full list.
Content and provenance
The content pipeline is reproducible:
npm run ingest # fetch pinned sources, transform, write content/generated
npm run ingest:offline # use the local source cache only
npm run validate # validate schemas, counts, hash, provenance, licenses
npm run sources:update # check the four pins for newer commitsEvery pack carries:
{
"provenance": {
"source": "taste-skill",
"repo": "https://github.com/Leonxlnx/taste-skill",
"commit": "12af471f627f866411b4bd785b19646d3672784c",
"path": "skills/taste-skill/library/directions.json",
"license": "MIT",
"authors": ["Leonxlnx"],
"transformations": ["..."]
}
}The contentHash in content/generated/stats.json covers the catalog, every
full pack file, reference bodies, and source commits. npm run validate
recomputes it from the served files and fails if the committed content drifts.
See docs/content.md for the content model and authoring rules.
Development
npm run typecheck # TypeScript strict check
npm run lint # Biome
npm run format # Biome format
npm test # all tests
npm run test:integration # real stdio/HTTP MCP clients
npm run validate # content and provenance validation
npm run build # compile to dist/
npm run smoke:http # real HTTP MCP smoke test with authTests are organized in tiers:
tests/unit/— parsers, schema, budget, search, get, guidelines, loader.tests/integration/— real stdio and HTTP MCP clients.tests/production/— committed content, CLI lifecycle, HTTP hardening.
The HTTP tests bind to an ephemeral localhost port. The stdio tests spawn the real CLI and speak JSON-RPC over pipes. No network is required for the test suite.
Docker
docker compose up --build
curl http://127.0.0.1:3000/healthzThe image runs as a non-root user, uses a multi-stage build, and ships the committed content. For a staging deployment with Caddy and TLS, see deploy/staging.compose.yml and docs/deployment.md.
Security
TastePro is read-only. It has no write tools, no database, no user accounts, and no server-side LLM calls. The main risks are content-path traversal, resource exhaustion, and exposing an unauthenticated hosted endpoint.
Mitigations in the current build:
Content paths are resolved and checked against the content directory.
Reference bodies are validated at build time and at read time.
HTTP request bodies are capped at 1 MiB.
Stateless HTTP keeps no sessions; stateful mode has an idle TTL and a concurrent-session cap.
Audit requests are bounded by a concurrency/queue gate.
Host allowlists and CORS controls are available.
Bearer auth is supported for hosted read-only access.
Logs go to stderr, never stdout, so stdio JSON-RPC stays clean.
Report a vulnerability privately; see SECURITY.md. Do not open a public issue for an unfixed vulnerability.
Licensing and attribution
TastePro's original code and content are Apache-2.0. Upstream-derived content remains under its source license:
Taste Skill — MIT
Awesome DESIGN.md — MIT
Vercel Web Interface Guidelines — MIT
Microsoft Playwright CLI — Apache-2.0
See ATTRIBUTION.md, NOTICE, and the full license
texts in content/sources/licenses/. Brand packs are reference analyses, not
templates to clone. Do not impersonate a brand or reuse its logo, copy, or
assets.
Roadmap
M0 (initial release): read-only catalog, playbooks, references, audit rubric, stdio + HTTP, hardening, content pipeline, tests, Docker/staging scaffolding.
M1: six original fully built templates; richer domain playbooks; client recipes; hosted read-only deployment.
M2 (current):
taste_auditwith static checks, SSRF-guarded URL input, opt-in browser rendering, and OAuth resource-server auth for hosted deployments.M3: team features, private content packs, and a hosted control plane.
Contributing
Read CONTRIBUTING.md. In short: keep changes deterministic,
add tests, preserve provenance, never add third-party screenshots or logos, and
run npm run typecheck && npm run lint && npm run validate && npm test before
opening a pull request.
Available Tools
4 toolstaste_auditAudit submitted HTML against the web-interface rubricARead-only
Check submitted HTML (or a fetched URL, when the server allows it) against the pinned web-interface guidelines. Returns findings with guideline id, severity, evidence, and a fix, plus an explicit list of what this audit cannot verify. Nothing is stored. URL fetching and browser rendering are server-side opt-ins.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public http(s) URL to fetch and audit. Rejected unless the server sets TASTEPRO_AUDIT_ALLOW_URL_FETCH=true. | |
| html | No | HTML document or component to audit, up to 1,000,000 characters. Not persisted. | |
| mode | No | static parses the HTML directly (default). browser renders it with JavaScript disabled when the server sets TASTEPRO_AUDIT_BROWSER=playwright. | |
| target | No | Short label for the report, e.g. 'checkout page'. Not fetched. | |
| maxTokens | No | Approximate response budget in tokens (default 2000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent/destructive annotations, the description discloses that nothing is persisted, that URL fetching and browser rendering are server-side opt-ins, and that the report includes an explicit list of what the audit cannot verify. That last point is genuinely useful behavioral framing an agent would not infer from annotations. It stops short of noting whether the audit is deterministic or how partial HTML is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and result, then the no-storage guarantee and opt-in caveats. Every sentence carries information, though the closing opt-in sentence slightly duplicates the schema's url and mode descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of describing return shape (guideline id, severity, evidence, fix, plus a list of unverifiable items), which is exactly what an agent needs. All five optional parameters are covered by the 100%-covered schema, and the destruction/storage question is answered outright.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented with limits and env-var gating. The description adds only a light restatement ('a fetched URL, when the server allows it') and no new meaning about interactions between html and url, or what maxTokens trades off. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Check submitted HTML ... against the pinned web-interface guidelines') and describes the return payload (findings with guideline id, severity, evidence, fix). It separates itself from taste_guidelines/taste_get by framing this as an evaluation rather than a retrieval, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the opt-in caveats: URL auditing only when the server sets TASTEPRO_AUDIT_ALLOW_URL_FETCH, browser mode only with TASTEPRO_AUDIT_BROWSER, and default static parsing. There is no explicit statement of when to pick this over taste_guidelines or taste_search, nor any exclusion beyond the server flags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taste_getGet full design packs by idARead-onlyIdempotent
Fetch one or more packs by id after taste_search. Use format=brief for decisions, full/markdown for implementation detail, and json for raw data. For references, includeBody=true returns the entire document. Default budget 2400 tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | One id or an array of ids, e.g. domain/fintech-payments, direction/quiet-instrument, palette/white-navy-tab. | |
| format | No | Response projection. Default brief. | |
| maxTokens | No | Approximate response budget in tokens (default 2400). | |
| includeBody | No | Include the full body of a reference pack instead of an excerpt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered; the description adds real value on top with the default token budget (2400) and the includeBody behavior that returns a full document instead of an excerpt. It does not disclose truncation behavior when the budget is exceeded, which would be the remaining useful detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and sequenced guidance in four short sentences with no filler. The closing 'Default budget 2400 tokens' duplicates the maxTokens schema description, a small redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and four simple flat parameters, the definition covers invocation, projection choice, and budget. The main gap is that nothing describes the shape or fields of a returned pack, which matters since there is no output schema to lean on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely extends meaning: it maps each format enum value to a use case, whereas the schema only says 'Response projection'. It also clarifies includeBody applies to references specifically. The budget default restates the schema and adds nothing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch one or more packs by id') and ties it to the sibling 'taste_search' as the preceding step. It never spells out what a 'pack' contains or how it differs from taste_guidelines/taste_audit output, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('after taste_search') and routes format choice by intent: brief for decisions, full/markdown for implementation detail, json for raw data. It stops short of saying when not to use this tool (e.g. when a search result alone suffices).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taste_guidelinesQuery the web interface audit rubricBRead-onlyIdempotent
Query the pinned Vercel Web Interface Guidelines: 104 accessibility, focus, form, animation, typography, content, image, performance, navigation, touch, layout, dark-mode, i18n, hydration, hover, copy, and anti-pattern rules. Use format=markdown for a checklist and severity=error for must-fix issues.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rules to return (default 20). | |
| query | No | Topic query: focus, contrast, motion, forms, overflow, images, navigation, etc. | |
| format | No | json (default) or markdown checklist. | |
| category | No | Category or partial category, e.g. Accessibility, Focus States, Anti-patterns. | |
| severity | No | Filter by severity. error rules are must-fix. | |
| maxTokens | No | Approximate response budget in tokens (default 1800). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a read-only, idempotent, non-destructive, closed-world query, so the safety profile is covered. The description adds that the ruleset is 'pinned' and totals 104 rules, which is useful context about result stability and corpus size, but says nothing about response shape, truncation, or how maxTokens interacts with limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, which is good, but the first sentence then devolves into a seventeen-item keyword list of categories. The second sentence largely duplicates the format and severity enum descriptions already present in the schema, so part of the text does not earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six optional parameters, full schema coverage, and no output schema, the description covers the basics but leaves real gaps: whether 'query' is semantic or keyword matching, whether maxTokens truncates results, and above all how this differs from three overlapping sibling tools. Those omissions matter for a retrieval tool in a crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters including defaults are already documented in structured form. The description's 'format=markdown for a checklist' and 'severity=error for must-fix' restate what the schema descriptions already say, adding essentially no new semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: querying a pinned corpus of 104 Web Interface Guidelines rules, and enumerates the topic coverage. An agent knows exactly what content comes back, but the description never distinguishes this corpus-retrieval tool from sibling tools taste_search, taste_get, or taste_audit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers how-to-call guidance (format=markdown for a checklist, severity=error for must-fix) but never says when this tool is the right choice versus taste_search, taste_get, or taste_audit. Usage is inferable from the topic list rather than stated as an explicit routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taste_searchSearch design taste and domain playbooksARead-onlyIdempotent
Search TastePro's catalog of design directions, palettes, type pairings, hero/section blueprints, brand analyses, domain playbooks, and references. Use this first for any visual brief. Returns compact cards with ids; call taste_get for the full pack. Filters: kind, domain, quality, source. Default budget 1400 tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by one or more content kinds. | |
| limit | No | Maximum cards to return (default 12, max 50). | |
| query | No | Natural-language query: product, audience, domain, mood, or visual idea. Empty returns a curated browse list. | |
| domain | No | Canonical domain id or alias, e.g. fintech-payments, healthcare, portfolio. | |
| source | No | Filter by upstream source id. | |
| quality | No | Filter by quality level. verified and reviewed are strongest. | |
| maxTokens | No | Approximate response budget in tokens (default 1400). | |
| includePlanned | No | Include taxonomy-only planned domains. Default true. | |
| includeIncomplete | No | Include incomplete/draft packs for inspection. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is free. The description adds real context beyond that: results are compact cards with ids (not full content), the default token budget is 1400, and taste_get is required to expand. It does not cover pagination or what happens when the budget truncates results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no padding: capability, entry-point rule, return shape plus escalation path, then the filter surface. The most decision-relevant facts (use first, compact cards, need taste_get) are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter, zero-required search tool with no output schema, the description covers the entry-point role, the return shape (cards with ids, not full content), the budget default, and the escalation sibling. What is missing is minor: no note on how token budget affects truncation or on total-result counts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains kind, domain, quality, source, and budget. The description's 'Filters: kind, domain, quality, source' merely enumerates a subset and leaves query, limit, maxTokens, includePlanned, and includeIncomplete to the schema. With the schema doing the heavy lifting, the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') plus a concrete resource ('TastePro's catalog of design directions, palettes, type pairings, hero/section blueprints, brand analyses, domain playbooks, and references'). The second sentence gates it against the sibling tool by naming taste_get as the follow-up for the full pack, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this first for any visual brief' gives an explicit entry-point rule, and 'call taste_get for the full pack' defines the search-then-fetch sequencing. It stops short of naming when taste_guidelines or taste_audit would be preferable, so the exclusion side is only partially covered.
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.
4 tool updates
v1.0.0- First observed
taste_audit - First observed
taste_get - First observed
taste_guidelines - First observed
taste_search
TDQS
Scored across 4 tools
Each tool occupies a distinct stage: taste_search discovers ids, taste_get retrieves full packs, taste_guidelines queries the rule corpus, and taste_audit validates HTML against those rules. The search/get split is explicitly documented (compact cards vs full pack), and guidelines vs audit is clearly separated as reference lookup versus enforcement.
All four tools share the taste_ prefix with short, predictable suffixes (search, get, guidelines, audit). The only minor deviation is 'guidelines', a noun rather than a verb, but it reads naturally as a resource retrieval alongside the other action names.
Four tools is a tight, well-scoped surface for a design-reference server: discovery, retrieval, rule lookup, and auditing. No tool looks redundant, and nothing feels padded or missing at the count level.
The set covers the full read-only lifecycle: find packs, fetch them, consult guidelines, and audit output against them, with sensible format and severity options. Minor gaps remain, such as no explicit tool to enumerate available kinds/domains or to list guideline ids without querying, but agents can work around these via search filters.
Maintenance
Related MCP Connectors
Serves your design system and coding standards to coding agents, so they stop guessing.
Design intelligence for coding agents: audits, design systems, and a taste profile agents consult.
A design agent in your coding agent's loop: briefs each screen, reviews UX and visual quality.
UI design from prompts, screenshots, and URLs for AI coding agents and theme tokens.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes a design system and UX rulebook as tools, enabling AI to generate UI consistent with your design tokens, components, layout rules, accessibility guidelines, and templates. It also provides a review tool to score UI proposals against the design system.MIT
- AlicenseAqualityCmaintenanceMCP server that helps AI agents create UIs that don't look AI-generated by auditing components, refining copy, suggesting themes, and checking accessibility/contrast.8MIT
- FlicenseNot gradedqualityAmaintenanceEnables coding agents building UI to fetch real product screens as inline images, pull typed design references, and find licensed fonts, icons, or animated icons when a visual question is unresolved. It also serves a bundled design workflow, command playbooks, and connection diagnostics.-
- FlicenseNot gradedqualityAmaintenanceConnects coding agents to a catalogue of real product screens so they can pull concrete UI references, fonts, icons, and the recorded design systems behind web screens when a visual question is open. It also serves bundled design-workflow documents, help, and connection diagnostics for grounding UI work in real products rather than generic templates.-