---
name: mcp-development
description: Use when building "MCP server", "Model Context Protocol", creating "Claude tools", "MCP tools", or asking about "FastMCP", "MCP SDK", "tool development for LLMs", "external API integration for Claude"
version: 1.0.0
---
# MCP Server Development Guide
Build high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services.
---
## Core Design Principles
### Build for Workflows, Not Just APIs
| Principle | Why |
|-----------|-----|
| Consolidate operations | Single tool for complete tasks |
| Return high-signal data | Agents have limited context |
| Provide format options | "concise" vs "detailed" modes |
| Use human-readable IDs | Not technical codes |
| Make errors actionable | Guide toward correct usage |
**Key concept**: Don't just wrap API endpoints. Design tools that enable complete workflows agents actually need.
---
## Development Phases
### Phase 1: Research
| Step | Action |
|------|--------|
| Study MCP Protocol | Read `modelcontextprotocol.io/llms-full.txt` |
| Study SDK docs | Python or TypeScript SDK README |
| Study target API | Read ALL available documentation |
| Create implementation plan | Before writing code |
### Phase 2: Design
| Decision | Options |
|----------|---------|
| **Language** | Python (FastMCP) or TypeScript |
| **Tool granularity** | Atomic vs workflow-oriented |
| **Response format** | JSON, Markdown, or both |
| **Error handling** | What errors can occur, how to recover |
### Phase 3: Implementation
| Component | Purpose |
|-----------|---------|
| **Input validation** | Pydantic (Python) or Zod (TypeScript) |
| **Tool descriptions** | Clear, with examples |
| **Error messages** | Include suggested next steps |
| **Response formatting** | Consistent across tools |
### Phase 4: Testing
**Critical**: MCP servers are long-running processes. Never run directly in main process.
| Approach | How |
|----------|-----|
| Evaluation harness | Recommended |
| tmux session | Run server separately |
| Timeout wrapper | `timeout 5s python server.py` |
| MCP Inspector | Official debugging tool |
---
## Tool Annotations
| Annotation | Meaning | Default |
|------------|---------|---------|
| **readOnlyHint** | Doesn't modify state | false |
| **destructiveHint** | Can cause damage | true |
| **idempotentHint** | Repeated calls safe | false |
| **openWorldHint** | Interacts externally | true |
**Key concept**: Annotations help the LLM decide when and how safely to use tools.
---
## Input Design
### Validation Patterns
| Pattern | Use Case |
|---------|----------|
| Required fields | Core parameters |
| Optional with defaults | Convenience parameters |
| Enums | Limited valid values |
| Min/max constraints | Numeric bounds |
| Pattern matching | Format validation (email, URL) |
### Parameter Naming
| Good | Bad | Why |
|------|-----|-----|
| `user_email` | `e` | Self-documenting |
| `limit` | `max_results_to_return` | Concise but clear |
| `include_archived` | `ia` | Descriptive boolean |
---
## Response Design
### Format Options
| Format | Use Case |
|--------|----------|
| **JSON** | Programmatic use, structured data |
| **Markdown** | Human readability, reports |
| **Hybrid** | JSON in markdown code blocks |
### Response Guidelines
| Guideline | Why |
|-----------|-----|
| ~25,000 token limit | Context constraints |
| Truncate with indicator | Don't silently cut |
| Support pagination | `limit` and `offset` params |
| Include metadata | Total count, has_more |
---
## Error Handling
### Error Message Structure
| Element | Purpose |
|---------|---------|
| What failed | Clear description |
| Why it failed | Root cause if known |
| How to fix | Suggested next action |
| Example | Correct usage |
**Key concept**: Error messages should guide the agent toward correct usage, not just diagnose problems.
---
## Quality Checklist
### Code Quality
| Check | Description |
|-------|-------------|
| No duplicated code | Extract shared logic |
| Consistent formats | Similar ops return similar structure |
| Full error handling | All external calls wrapped |
| Type coverage | All inputs/outputs typed |
| Comprehensive docstrings | Every tool documented |
### Tool Quality
| Check | Description |
|-------|-------------|
| Clear descriptions | Model knows when to use |
| Good examples | In docstring |
| Sensible defaults | Reduce required params |
| Consistent naming | Group related with prefixes |
---
## Best Practices
| Practice | Why |
|----------|-----|
| One tool = one purpose | Clear mental model |
| Comprehensive descriptions | LLM selection accuracy |
| Include examples in docstrings | Show expected usage |
| Return actionable errors | Enable self-correction |
| Test with actual LLM | Real-world validation |
| Version your server | Track compatibility |
## Resources
- MCP Protocol:
- Python SDK:
- TypeScript SDK: