Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build MCP (Model Context Protocol) servers including tool definition, schema design, authentication, error handling, and Claude Code integration. Use this skill when the user needs to create an MCP server, expose APIs or databases to AI agents, design tool schemas, or integrate with Claude Code — even if they say 'build an MCP server', 'connect Claude to our database', 'expose our API to AI', or 'create a tool for Claude Code'.
.claude/skills/asgard-ai-platform-tech-mcp-server-dev/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -36% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 31% | 0% |
IRON LAW: Tools Must Be Self-Describing
Every MCP tool must have a clear name, description, and input schema
that allows the AI model to understand WHEN and HOW to use it without
any external documentation. If the model can't figure out when to call
your tool from its name and description alone, the tool is poorly designed.Claude Code / AI Agent
↓ (stdio JSON-RPC 2.0)
MCP Server (your code)
↓
Your Data Source (DB, API, file system, etc.)| Concept | What It Is | |---------|-----------| | Transport | stdio (stdin/stdout) — most common for local servers | | Protocol | JSON-RPC 2.0 | | Tools | Functions the model can call (read data, take actions) | | Resources | Data the model can read (files, database records) | | Prompts | Pre-built prompt templates the model can use |
json{ "name": "search_customers", "description": "Search for customers by name, email, or phone number. Use when the user asks to find or look up a specific customer.", "inputSchema": { "type": "object", "properties": { "query": { "type": "string", "description": "Search term — can be customer name, email, or phone" }, "limit": { "type": "number", "description": "Maximum results to return (default: 10)", "default": 10 } }, "required": ["query"] } }
Phase 1: Setup
@modelcontextprotocol/sdk (TypeScript) or mcp (Python)mcp dev or claude mcp addPhase 2: Data Connection
Phase 3: Integration
.mcp.json for Claude Codejson{ "mcpServers": { "my-server": { "command": "node", "args": ["path/to/server.js"], "env": { "DATABASE_URL": "${DATABASE_URL}" } } } }
Tool handler should:
1. Validate input (check required fields, types)
2. Try the operation
3. On success: return structured data (JSON)
4. On error: return { "error": "Human-readable message", "code": "ERROR_CODE" }
- NOT stack traces or internal error details
- The MODEL needs to understand the error to retry or inform the usermarkdown# MCP Server Spec: {Server Name} ## Purpose {What data/capability this server exposes} ## Tools | Tool | Description | Parameters | Returns | |------|-----------|-----------|---------| | {name} | {when to use} | {params} | {return type} | ## Data Source - Type: {database / API / file system} - Connection: {how to connect} - Auth: {env vars needed} ## .mcp.json
{config}
## Testing Plan
1. {test case for each tool}env in .mcp.json to pass secrets from environment variables.references/mcp-sdk.mdreferences/mcp-advanced.md| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 30,423 | 27,220 | -11% | 1 | 1 | 0% | 5,019 | 5,531 | +10% | 0 | 0 | — |
case-02 | fail→pass | 39,302 | 24,448 | -38% | 1 | 1 | 0% | 8,272 | 5,309 | -36% | 0 | 0 | — |
case-03 | fail→fail | 31,544 | 23,168 | -27% | 1 | 1 | 0% | 6,285 | 4,849 | -23% | 0 | 0 | — |
case-04 | pass→pass | 12,655 | 11,146 | -12% | 1 | 1 | 0% | 2,363 | 3,463 | +47% | 0 | 0 | — |
case-05 | pass→fail | 16,466 | 12,244 | -26% | 1 | 1 | 0% | 2,430 | 3,291 | +35% | 0 | 0 | — |
case-06 | pass→pass | 11,645 | 8,839 | -24% | 1 | 1 | 0% | 1,948 | 2,760 | +42% | 0 | 0 | — |
case-07 | fail→pass | 12,433 | 10,042 | -19% | 1 | 1 | 0% | 2,296 | 3,079 | +34% | 0 | 0 | — |
case-08 | fail→fail | 14,877 | 12,830 | -14% | 1 | 1 | 0% | 2,256 | 3,595 | +59% | 0 | 0 | — |
case-09 | fail→pass | 8,213 | 6,038 | -26% | 1 | 1 | 0% | 1,446 | 2,297 | +59% | 0 | 0 | — |
case-10 | pass→pass | 11,422 | 6,342 | -44% | 1 | 1 | 0% | 1,876 | 2,206 | +18% | 0 | 0 | — |
case-11 | pass→pass | 15,334 | 16,845 | +10% | 1 | 1 | 0% | 2,492 | 3,900 | +57% | 0 | 0 | — |
case-12 | fail→fail | 21,003 | 13,559 | -35% | 1 | 1 | 0% | 3,222 | 3,788 | +18% | 0 | 0 | — |
case-13 | pass→pass | 14,045 | 8,937 | -36% | 1 | 1 | 0% | 2,178 | 2,947 | +35% | 0 | 0 | — |
case-22 | pass→pass | 11,604 | 8,283 | -29% | 1 | 1 | 0% | 1,867 | 2,916 | +56% | 0 | 0 | — |
case-14 | pass→pass | 8,770 | 3,542 | -60% | 1 | 1 | 0% | 1,509 | 1,819 | +21% | 0 | 0 | — |
case-15 | fail→pass | 11,579 | 7,877 | -32% | 1 | 1 | 0% | 1,968 | 2,575 | +31% | 0 | 0 | — |
case-16 | pass→pass | 15,569 | 12,028 | -23% | 1 | 1 | 0% | 2,596 | 3,383 | +30% | 0 | 0 | — |
case-17 | fail→pass | 16,186 | 7,457 | -54% | 1 | 1 | 0% | 2,628 | 2,573 | -2% | 0 | 0 | — |
case-18 | pass→pass | 16,151 | 18,661 | +16% | 1 | 1 | 0% | 2,639 | 4,129 | +56% | 0 | 0 | — |
case-19 | pass→pass | 13,104 | 10,049 | -23% | 1 | 1 | 0% | 2,319 | 3,104 | +34% | 0 | 0 | — |
case-20 | pass→pass | 9,604 | 8,045 | -16% | 1 | 1 | 0% | 1,434 | 2,523 | +76% | 0 | 0 | — |
case-21 | pass→pass | 25,650 | 16,878 | -34% | 1 | 1 | 0% | 4,063 | 4,542 | +12% | 0 | 0 | — |
case-23 | pass→pass | 12,543 | 7,617 | -39% | 1 | 1 | 0% | 2,063 | 2,673 | +30% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.