Agent skill
mcp-builder
Comprehensive guide for creating Model Context Protocol (MCP) servers. Use when building MCP servers, integrating external APIs, or creating tool interfaces for LLMs.
Install this agent skill to your Project
npx add-skill https://github.com/LangConfig/langconfig/tree/main/backend/skills/builtin/mcp-builder
SKILL.md
Instructions
You are an expert MCP server developer. Follow this four-phase process when creating MCP servers:
Phase 1: Research and Planning
Before writing code, thoroughly understand:
-
API Analysis
- Study the target API documentation completely
- Identify authentication methods (OAuth, API keys, tokens)
- Map out rate limits and pagination patterns
- Note any webhooks or real-time features
-
Tool Design Principles
- Balance comprehensive endpoint coverage with specialized workflow tools
- Use action-oriented naming:
get_,create_,update_,delete_,list_,search_ - Group related operations logically
- Design for agent flexibility, not just human convenience
-
Framework Selection
- TypeScript (Recommended): Superior SDK support, better type safety
- Python: Good for data-heavy integrations, familiar to ML engineers
Phase 2: Implementation
TypeScript Project Structure
my-mcp-server/
├── src/
│ ├── index.ts # Entry point
│ ├── tools/ # Tool implementations
│ │ ├── index.ts
│ │ └── [feature].ts
│ ├── types/ # Type definitions
│ └── utils/ # Helpers (auth, pagination)
├── package.json
└── tsconfig.json
Core Implementation Patterns
1. Tool Definition with Zod Schema:
import { z } from "zod";
const GetUserSchema = z.object({
userId: z.string().describe("The unique user identifier"),
includeDetails: z.boolean().optional().describe("Include extended profile")
});
server.tool(
"get_user",
"Retrieve user profile by ID",
GetUserSchema,
async ({ userId, includeDetails }) => {
// Implementation
}
);
2. Error Handling:
try {
const response = await api.request(endpoint);
return { content: [{ type: "text", text: JSON.stringify(response) }] };
} catch (error) {
if (error.status === 429) {
return { content: [{ type: "text", text: "Rate limited. Retry in 60s." }] };
}
throw new McpError(ErrorCode.InternalError, error.message);
}
3. Pagination Helper:
async function* paginate<T>(fetcher: (cursor?: string) => Promise<PageResponse<T>>) {
let cursor: string | undefined;
do {
const page = await fetcher(cursor);
yield* page.items;
cursor = page.nextCursor;
} while (cursor);
}
4. Tool Annotations:
server.tool("delete_resource", "Permanently delete a resource", schema, handler, {
annotations: {
destructiveHint: true,
idempotentHint: false,
readOnlyHint: false
}
});
Python Project Structure
my-mcp-server/
├── src/
│ └── my_mcp_server/
│ ├── __init__.py
│ ├── server.py # Main server
│ └── tools/ # Tool modules
├── pyproject.toml
└── README.md
Python Tool Definition:
from mcp.server import Server
from pydantic import BaseModel, Field
class GetUserInput(BaseModel):
user_id: str = Field(description="The unique user identifier")
@server.tool()
async def get_user(input: GetUserInput) -> str:
"""Retrieve user profile by ID."""
user = await api.get_user(input.user_id)
return json.dumps(user)
Phase 3: Testing and Validation
-
Build Verification:
bash# TypeScript npm run build # Python python -m py_compile src/**/*.py -
MCP Inspector Testing:
bashnpx @anthropic/mcp-inspector -
Integration Testing:
- Test each tool with valid inputs
- Test error cases (invalid IDs, auth failures)
- Verify pagination works correctly
- Check rate limit handling
Phase 4: Documentation and Evaluation
-
README Requirements:
- Clear installation instructions
- Environment variable documentation
- Example usage for each tool
- Troubleshooting section
-
Evaluation Questions: Create 10 complex, realistic questions that verify LLM effectiveness:
- Questions must be read-only (no mutations)
- Answers must be verifiable
- Cover different tool combinations
- Test edge cases
Examples
User asks: "Help me build an MCP server for the GitHub API"
Response approach:
- Identify key GitHub operations: repos, issues, PRs, users
- Design tools:
list_repos,get_issue,search_code,get_pr_diff - Implement OAuth or PAT authentication
- Add pagination for list operations
- Include rate limit handling (5000 req/hour)
- Test with MCP Inspector
- Document required scopes for each tool
User asks: "I need to integrate Slack with my agents"
Response approach:
- Map Slack Web API endpoints needed
- Design tools:
send_message,list_channels,search_messages,upload_file - Implement Bot Token authentication
- Handle Slack's cursor-based pagination
- Add socket mode for real-time events (optional)
- Test message formatting (blocks, attachments)
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
langgraph-workflows
Expert guidance for designing LangGraph state machines and multi-agent workflows. Use when building workflows, connecting agents, or implementing complex control flow in LangConfig.
python-testing
Expert guidance for writing Python tests with pytest and unittest. Use when writing tests, debugging test failures, or improving test coverage for Python projects.
debugging
Expert guidance for debugging code, analyzing errors, and systematic problem-solving. Use when troubleshooting bugs, understanding error messages, or investigating unexpected behavior.
langconfig-builder
Complete guide for building agents and workflows in LangConfig. Use when users need help configuring nodes, connecting agents, setting up tools, or designing multi-agent systems within the LangConfig platform.
code-review
Systematic code review guidance covering best practices, security, performance, and maintainability. Use when reviewing code, checking PRs, or analyzing code quality.
langchain-agents
Expert guidance for building LangChain agents with proper tool binding, memory, and configuration. Use when creating agents, configuring models, or setting up tool integrations in LangConfig.
Didn't find tool you were looking for?