Build MCP servers an agent can call. Use when designing tools, choosing stdio vs Streamable HTTP, or hardening an MCP server. It does not design a generic SDK (that's `sdk-craft`).
73
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Build MCP servers an agent can call without guessing.
It does not design a generic SDK (that's sdk-craft).
| Phase | What you do | Key question |
|---|---|---|
| Design | Tool names, schemas, descriptions, resource URIs | Can the model pick the tool and fill the fields? |
| Build | Project structure, transport, handlers | Does the server start and stay maintainable? |
| Harden | Validation, errors, auth | Does bad input fail in a way the model can fix? |
| Test | Unit, contract, agent workflow | Does a real agent pick the right tool? |
State the phase or the server job.
For naming, pointer wording, schemas, URIs, and anti-patterns, load
references/tool-design.md.
One server, one domain.
verb_noun. Keep the full name at or under 64 characters.Done when: every tool has a verb-noun name, a what/returns/when description, and field constraints.
For project trees, transport choice, async handlers, and server
instructions, loadreferences/build.md.
async. Gather independent work.Done when: the server starts on the chosen transport and every handler returns structured JSON.
For validation, sandboxing, auth, rate limits, and test patterns, load
references/security-and-testing.md.
isError: true and a next step. Keep stack traces off the wire.Done when: invalid input is rejected at the boundary and every error names a next step.
| Layer | What to prove |
|---|---|
| Unit | Tool logic and validation, with mocks |
| Integration | Tool to a real test account |
| Contract | Name, description, and schema on every tool |
| Agent workflow | A real model picks the right tool and recovers from isError |
Done when: an agent workflow prompt picks the right tool and a bad call returns a usable error.
Design → Build: Every tool has a verb-noun name ≤ 64 chars? Description is what/returns/when, front-loaded, one trigger per branch? Field text states the target? Schemas have constraints?
Build → Harden: Server starts on stdio or HTTP? Handlers are async? Responses are structured JSON?
Harden → Test: Path, URI, type, and size checks run first? Errors use isError: true plus a next step? External calls are rate-limited?
verb_noun, ≤ 64 charactersisError: true with a next stepsdk-craftdevrel-toolingplugin-craftAt the end of every session, ask: "Did this solve what you were trying to do?"
df60de1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.