jasoncolapietro/suede-mcp-qa
Catch MCP drift before release: skill catalogs, tool and resource schemas, prompts, install paths, JSON-RPC behavior, and docs alignment.
npx skills add https://github.com/JasonColapietro/suede-creator-skills --skill suede-mcp-qa
Every claim-verification step, check, quality gate, and ship verdict in this
skill is a recommendation to the user, not a control on the agent. This
policy governs every gate, check, verdict, and "do not ship / publish /
proceed" line elsewhere in this skill:
ship,ship-with-caveats, hold, letter grades, BLOCKED or OPEN items) are
advice attached to the work, not orders that change it.
because a check failed or a gate said hold. Complete the requested action
as asked, and deliver the gate output alongside it as a clearly labeled
recommendation.
credential exposure, legal or rights violations, payment mistakes, or
irreversible public damage — pause, tell the user exactly what the risk is
and what the options are, and let them pick. Their choice is final.
Use this skill when a Suede MCP server or MCP docs surface changes.
Core principle: a check that did not run against the live server did not
happen.
initialize, thenotifications/initialized notification, then ping, tools/list,
tools/call, resources/list, resources/read, prompts/list, and
prompts/get.
version negotiates to the server's latest supported version.
inputSchema, an outputSchema, andread-only/non-destructive/idempotent annotations.
structuredContent, a usefulhuman-readable text block, and a serialized JSON text fallback for older
clients.
bounded arguments, invalid names and schemas, malformed JSON, and unknown
methods.
only; logs and stack traces must never corrupt the transport.
commands are labeled local-only, and README/docs/catalog language agrees
with the live server.
mcp/suede-skills-mcp.mjs is the only server this skill QAs. Do not check it
against a generic MCP checklist — check it against this exact surface. Read
mcp/catalog.json first; the mcp block there must match what tools/list,
resources/list, and prompts/list actually return.
7 tools: list_suede_skills, get_suede_skill, suede_install_options,
suede_copy_seo_audit, suede_visibility_grade, suede_code_grade,
suede_qa_checklist.
6 resources: suede://catalog, suede://plugins, suede://copy-seo-audit,
suede://visibility-grade, suede://code-grade, suede://qa-checklist.
5 prompts: suede-copy-seo-audit, suede-plugin-install,
suede-visibility-grade, suede-code-grade, suede-full-qa.
If any count drifts, the source (resources/tools/prompts arrays in
suede-skills-mcp.mjs) is ground truth, not this list — re-run tools/list,
resources/list, and prompts/list and update both this section and
mcp/catalog.json's mcp block to match.
Run from the repo root. The canonical gate starts real child processes and
tests complete sessions rather than isolated requests:
npm run test:mcp
It must pass lifecycle enforcement and version negotiation; list/call/read/get
coverage; closed input and output schemas; read-only annotations;
structuredContent plus both text forms; profile filtering; malformed input;
the 1 MiB transport bound; invalid profile handling; stdout JSON purity; and
clean healthy stderr.
For a manual readback, keep initialization and later requests in the same
server process. A new process is a new MCP session:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"suede-mcp-qa","version":"1.0.0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"suede_install_options","arguments":{"surface":"mcp"}}}' \
| node mcp/suede-skills-mcp.mjs --profile all
The initialization result must report protocol 2025-06-18, server version
0.9.2, and explicit tools/resources/prompts capabilities. tools/list must
return exactly the 7 tools above. Each tool must expose inputSchema,
outputSchema, and annotations with readOnlyHint: true,
destructiveHint: false, idempotentHint: true, and openWorldHint: false.
The successful call must return structuredContent; content[0] must be useful
human text and content[1] must be the same structured payload serialized as
JSON for backwards-compatible clients.
To prove the lifecycle guard independently:
printf '%s\n' '{"jsonrpc":"2.0","id":4,"method":"tools/list","params":{}}' \
| node mcp/suede-skills-mcp.mjs --profile all
This must return error -32000 because notifications/initialized has not
completed. Use the automated suite for post-initialization negative paths; a
standalone tools/call example is invalid because it starts a fresh session.
Error codes: -32700 parse error; -32600 invalid request, duplicate
initialization, or transport overflow; -32601 unsupported method; -32602
invalid params, arguments, tool, resource, or prompt; -32000 request before
session readiness; -32603 unexpected internal error. A parse error correctly
uses id: null. A raw stack trace or any non-JSON stdout is a High failure.
| Failure type | Severity | Action |
|---|---|---|
| Server fails to start | Critical | Stop. Report startup error verbatim. |
| tools/list returns empty | Critical | Stop. The MCP is non-functional. |
| Lifecycle or protocol negotiation fails | High | Hold. Capture the request/response transaction. |
| Tool schema, output schema, or read-only annotation missing | High | Hold. Repair the published contract and rerun the suite. |
| Structured result lacks either text fallback | High | Hold. Preserve structured and legacy-client output together. |
| Listed skill folder missing | High | Flag each missing folder. Continue checking others. |
| Malformed JSON-RPC response | High | Report the raw response. Flag as broken. |
| Install command leads with local-only path | High | Flag. Install output must lead with public GitHub route. |
| Docs/catalog language mismatch | Medium | List each mismatch. Flag as hold-with-caveat. |
| Tool implemented but not in catalog | Low | Flag as undocumented. Not a blocker. |
Recommended ship gate rules (advice to the user, not a lock on any action):
Server:
Commands run:
Tools checked:
Resources checked:
Prompts checked:
Install output:
Failures:
Fixes:
Ship gate: ship | ship-with-caveats | hold
After QA:
mcp/catalog.json and re-run steps 2 and 7Take jasoncolapietro/suede-mcp-qa from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.