About fastmcp-builder
fastmcp-builder is a skill for developing Python MCP servers with FastMCP. It includes implementation references, runnable examples, and patterns for authentication, testing, project structure, and deployment.
Key features
- 01FastMCP server development guides
- 02Runnable server examples
- 03Patterns for tools, resources, and prompts
- 04OAuth integration guidance
- 05In-memory client testing patterns
- 06Project structure and deployment guidance
Use cases
- 01Create a Python MCP server
- 02Add OAuth authentication for remote access
- 03Test server tools and resources
- 04Organize and prepare a server for deployment
MCP support
The skill teaches how to build MCP servers with FastMCP, covering tools, resources, and prompts exposed to MCP clients. It also includes FastMCP Client testing patterns.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ husniadil/ fastmcp-builder --skill fastmcp-builderAfter installing, type/fastmcp-builderin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
LICENSE.gitignoreREADME.md.claude-plugin/marketplace.jsonexamples/minimal_server.pytest_examples.pycomplete_server_structure.pyreference-project/.gitignoreREADME.md.env.examplereference-project/app/common.pymain.py__init__.pymain_noauth.pyconfig.pyreference-project/app/prompts/__init__.pyexplain.pyreference-project/app/resources/__init__.pystatic.pyuserinfo.pywelcome.pydocs.pyreference-project/app/tools/__init__.pyping.pycounter.pyrequest_info.pyget_forecast.pyanalyze_text.pyreference-project/tests/conftest.pytest_config.pyDetails
From the project READMEFastMCP Builder - Production MCP Server Development
Overview
This skill provides comprehensive, production-ready patterns for building MCP (Model Context Protocol) servers using FastMCP, the official high-level Python framework. It includes complete reference implementations, working examples, and best practices proven in production.
FastMCP is the recommended approach for building MCP servers in Python - it's simpler, faster to develop, and more maintainable than the low-level MCP SDK.
What's Included
This skill contains:
- Reference Documentation (
reference/) - 6 comprehensive guides covering all aspects of FastMCP development - Code Examples (
examples/) - Runnable examples from minimal to complete servers - Complete Reference Project (
reference-project/) - Full production implementation with:- 6 production-ready tools
- 7 resource instances (4 types)
- 1 universal prompt
- 145 passing tests
- OAuth integration
- Complete documentation
💡 Tip: When in doubt, look at the reference-project for real-world implementation examples.
When to Use This Skill
Use this skill when you need to:
✅ Build MCP servers with FastMCP - Python-based MCP server development ✅ Add OAuth authentication - Especially Google OAuth for remote access ✅ Implement production patterns - Tools, resources, prompts with best practices ✅ Set up comprehensive testing - Using FastMCP Client for fast, in-memory tests ✅ Structure larger projects - Proper organization and separation of concerns ✅ Deploy to production - With authentication, error handling, monitoring
Don't use this skill for:
- ❌ TypeScript/Node.js MCP servers (use mcp-builder skill instead)
- ❌ Low-level MCP protocol work (use MCP SDK directly)
- ❌ Non-FastMCP Python servers (this is FastMCP-specific)
Consulting Official Documentation
IMPORTANT: When encountering questions or issues not covered in this skill's reference materials, you should:
Primary Method: Use WebSearch (Recommended)
The most reliable way to find FastMCP documentation is using WebSearch with site-specific queries:
WebSearch(
query="site:gofastmcp.com [your specific topic]"
)
This will search the official FastMCP documentation site and return relevant pages.
Alternative: Direct Page Access
If you know the general documentation structure, you can fetch specific pages directly:
WebFetch(
url="https://gofastmcp.com/[section]/[topic]",
prompt="Your specific question about this topic"
)
Common documentation sections:
/getting-started/- Installation, quickstart, welcome/servers/- Tools, resources, prompts, context, logging/deployment/- Running servers, HTTP deployment, configuration/integrations/- Auth0, AWS Cognito, Azure, GitHub, Google, WorkOS, OpenAI, etc./testing/- Testing guides and best practices
Tip: Any page can be accessed as markdown by appending .md to the URL.
When to Consult Official Docs
Consult official documentation when:
- You encounter a feature or API not covered in this skill's references
- You need the latest updates or breaking changes
- User asks about FastMCP capabilities you're unsure about
- You're implementing advanced patterns not in the reference materials
- There are version-specific behaviors or deprecations
- You need clarification on authentication providers beyond Google OAuth
- You want to verify current best practices
Example Workflows
-
User asks about OpenAI integration:
WebSearch(query="site:gofastmcp.com openai integration") → Find https://gofastmcp.com/integrations/openai → Fetch that page for details -
User asks about AWS Cognito authentication:
WebSearch(query="site:gofastmcp.com aws cognito oauth") → Find relevant auth documentation → Implement based on official guidance -
User asks about testing patterns:
WebSearch(query="site:gofastmcp.com testing") → Find testing documentation → Apply patterns from official docs -
Exploring what's available:
WebSearch(query="site:gofastmcp.com deployment options") WebSearch(query="site:gofastmcp.com authentication providers") → Browse results to see available topics
Note: Always try the reference materials in this skill first, then consult official docs if needed.
Workflow - Building a FastMCP Server
Phase 1: Planning & Setup
Step 1.1: Review FastMCP Overview
- Load fastmcp_overview.md
- Understand FastMCP vs MCP SDK
- Confirm FastMCP is right choice (it usually is)
Step 1.2: Understand Requirements
- What tools does the server need?
- Do you need OAuth authentication?
- Will you have resources? Prompts?
- What's the deployment target?
Step 1.3: Review Project Structure
- Load project_structure.md
- Understand the recommended directory layout
- Learn about the common.py pattern (DRY principle)
- Understand dual-mode pattern (with/without OAuth)
Step 1.4: Set Up Project
Create project structure:
mkdir my-mcp-server
cd my-mcp-server
# Create directories
mkdir -p app/tools app/resources app/prompts tests
# Create initial files
touch app/__init__.py
touch app/main.py
touch app/main_noauth.py
touch app/common.py
touch app/config.py
touch tests/__init__.py
touch pyproject.toml
touch .env.example
touch README.md
Initialize with uv:
# Install FastMCP
uv add fastmcp==2.13.0.1
uv add python-dotenv==1.2.1
# Add test dependencies
uv add --optional test pytest==8.4.2 pytest-asyncio==1.2.0 pytest-mock==3.15.1 httpx==0.28.1
Phase 2: Core Implementation
Step 2.1: Implement Configuration
Create app/config.py based on patterns in project_structure.md:
- Environment variable loading
- Configuration class with validation
- OAuth settings (if needed)
- Server metadata
Step 2.2: Implement Tools
Load tool_patterns.md for comprehensive patterns:
-
Identify tool patterns needed:
- Basic sync tools (health checks, simple queries)
- Data processing tools (analysis, transformation)
- Tools with Context (logging, progress)
- Stateful tools (if state management needed)
- API integration tools (external services)
-
Create tools in
app/tools/:- One file per tool or logical group
- Follow patterns from tool_patterns.md
- Use proper error handling
- Add comprehensive docstrings
-
Example tool structure:
# app/tools/my_tool.py
async def my_tool(param: str, ctx: Context | None = None) -> dict:
"""
Tool description
Args:
param: Parameter description
ctx: FastMCP context (auto-injected)
Returns:
dict: Result structure
"""
try:
if ctx:
await ctx.info("Processing...")
# Tool logic here
result = process(param)
if ctx:
await ctx.info("Completed!")
return {"status": "success", "data": result}
except Exception as e:
if ctx:
await ctx.error(f"Failed: {e}")
return {"status": "error", "error": str(e)}
Step 2.3: Implement Resources (if needed)
Load resource_patterns.md for all resource types:
-
Choose resource types:
- Static resources (status, features, documentation)
- Dynamic resources (generated content)
- Template resources (with path parameters)
- Wildcard resources (multi-segment paths)
-
Create resources in
app/resources/:- static.py for static resources
- Separate files for dynamic/template/wildcard
-
Example resource:
# app/resources/welcome.py
def get_welcome_message() -> str:
"""Welcome message resource"""
return "Welcome to my MCP server!"
Step 2.4: Implement Prompts (if needed)
Create reusable prompt templates:
# app/prompts/explain.py
def explain_concept(
concept: str,
audience_level: str = "intermediate",
) -> str:
"""Generate explanation prompt"""
return f"Explain {concept} for {audience_level} audience..."
Step 2.5: Create Common Registration
In app/common.py, register all components:
from fastmcp import FastMCP
# Import tools
from app.tools.my_tool import my_tool
# Import resources
from app.resources.welcome import get_welcome_message
# Import prompts
from app.prompts.explain import explain_concept
def register_all(mcp: FastMCP) -> None:
"""Register all components - DRY principle"""
# Tools
mcp.tool()(my_tool)
# Resources
mcp.resource("greeting://welcome")(get_welcome_message)
# Prompts
mcp.prompt()(explain_concept)
Step 2.6: Create Server Entry Points
app/main_noauth.py (for local development):
from fastmcp import FastMCP
from app.config import Config
from app.common import register_all
mcp = FastMCP(Config.SERVER_NAME)
register_all(mcp)
if __name__ == "__main__":
mcp.run()
app/main.py (with OAuth - if needed): Load oauth_integration.md for complete OAuth setup.
Phase 3: OAuth Integration (if needed)
Only if you need remote access with authentication.
Step 3.1: Set Up Google OAuth
Follow oauth_integration.md:
- Create OAuth Client in Google Cloud Console
- Configure environment variables (.env)
- Implement GoogleProvider in main.py
- Set up ngrok for testing
- Configure Claude Desktop Connectors
Step 3.2: Test OAuth Flow
- Start ngrok
- Start server with base-url
- Connect Claude Desktop
- Verify authentication works
Phase 4: Testing
Step 4.1: Set Up Test Structure
Load testing_guide.md for comprehensive testing patterns.
Create tests/conftest.py:
import pytest
from fastmcp import Client
from app.main_noauth import mcp
@pytest.fixture
async def client():
"""Provide FastMCP client for testing"""
async with Client(mcp) as c:
yield c
Step 4.2: Write Tool Tests
# tests/test_tools.py
@pytest.mark.asyncio
async def test_my_tool(client):
"""Should execute my_tool successfully"""
result = await client.call_tool("my_tool", {"param": "test"})
assert result.data["status"] == "success"
Step 4.3: Write Resource Tests
# tests/test_resources.py
@pytest.mark.asyncio
async def test_welcome_resource(client):
"""Should read welcome resource"""
content = await client.read_resource("greeting://welcome")
assert "Welcome" in content
Step 4.4: Write Integration Tests
# tests/test_integration.py
@pytest.mark.asyncio
async def test_complete_workflow(client):
"""Should execute complete workflow"""
# Test multiple components working together
pass
Step 4.5: Run Tests
# Run all tests
uv run pytest tests/ -v
# Run with coverage
uv run pytest tests/ --cov=app --cov-report=html
Phase 5: Documentation & Deployment
Step 5.1: Write README
Document:
- Project description
- Features
- Quick start guide
- OAuth setup (if applicable)
- Usage examples
- Testing instructions
- Deployment guide
Step 5.2: Prepare for Deployment
-
Environment Variables:
- Create .env.example template
- Document all required variables
- Never commit .env to git
-
Testing:
- Ensure all tests pass
- Test OAuth flow (if applicable)
- Test in production-like environment
-
Deployment:
- Choose platform (Railway, Fly.io, VPS)
- Set up HTTPS (required for OAuth)
- Configure environment variables
- Deploy and test
Reference Documentation
Load these as needed during development:
Core References
- fastmcp_overview.md - FastMCP introduction, when to use, key features
- project_structure.md - Recommended structure, file organization, patterns
Implementation Guides
- tool_patterns.md - 6 tool patterns with complete examples
- resource_patterns.md - 4 resource types (static, dynamic, template, wildcard)
- oauth_integration.md - Complete Google OAuth setup guide
- testing_guide.md - FastMCP Client testing, patterns, best practices
Example Code
Run or reference these complete examples:
- minimal_server.py - Absolute simplest FastMCP server
- complete_server_structure.py - Full-featured single-file example
- test_examples.py - Comprehensive testing examples
Quick Start Examples
Example 1: Minimal Server
from fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def greet(name: str) -> str:
"""Greet someone"""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run()
Example 2: Server with Multiple Components
from fastmcp import FastMCP, Context
mcp = FastMCP("my-server")
# Tool
@mcp.tool()
async def process(text: str, ctx: Context | None = None) -> dict:
if ctx:
await ctx.info("Processing...")
return {"result": text.upper()}
# Resource
@mcp.resource("greeting://hello")
def get_greeting() -> str:
return "Hello from resource!"
# Prompt
@mcp.prompt()
def explain(topic: str) -> str:
return f"Explain {topic} in detail"
if __name__ == "__main__":
mcp.run()
Example 3: With OAuth
from fastmcp import FastMCP
from fastmcp.server.auth.providers.google import GoogleProvider
import os
auth = GoogleProvider(
client_id=os.getenv("GOOGLE_CLIENT_ID"),
client_secret=os.getenv("GOOGLE_CLIENT_SECRET"),
base_url="https://your-server.com",
)
mcp = FastMCP("my-server", auth=auth)
# ... add tools, resources, prompts ...
if __name__ == "__main__":
mcp.run(transport="http", host="0.0.0.0", port=8000)
Best Practices Summary
- ✅ Use FastMCP - Simpler than MCP SDK for most use cases
- ✅ Follow project structure - Use common.py pattern (DRY)
- ✅ Dual-mode servers - main.py (OAuth) + main_noauth.py (local)
- ✅ Comprehensive testing - Use FastMCP Client, aim for >80% coverage
- ✅ Clear documentation - Docstrings, README, usage examples
- ✅ Error handling - Graceful failures, informative error messages
- ✅ Context usage - Logging, progress for better UX
- ✅ Security - Environment variables, never commit secrets
Common Workflows
Creating a New Tool
- Create
app/tools/my_tool.py - Implement tool function
- Add to
app/common.pyregistration - Write tests in
tests/test_tools.py - Run tests:
uv run pytest tests/test_tools.py -v
Adding OAuth
- Review oauth_integration.md
- Set up Google OAuth credentials
- Update
app/config.pywith OAuth settings - Modify
app/main.pyto use GoogleProvider - Test with ngrok
- Configure Claude Desktop Connectors
Debugging
- Use
main_noauth.pyfor faster local testing - Add logging with Context:
await ctx.debug(...) - Write tests to isolate issues
- Check tool/resource registration in
common.py - Verify environment variables loaded
Additional Resources
- FastMCP Documentation: https://gofastmcp.com/
- FastMCP GitHub: https://github.com/jlowin/fastmcp
- MCP Specification: https://modelcontextprotocol.io/
- Google OAuth Guide: https://developers.google.com/identity/protocols/oauth2
Notes
- This skill focuses on FastMCP, not the low-level MCP SDK
- All examples use Python 3.11+
- OAuth examples use Google OAuth (other providers possible)
- Testing uses FastMCP Client (in-memory, fast)
- Deployment examples are production-ready
Happy building! 🚀