Documentation Search MCP Server - Tutorial
Complete guide to using the documentation-search-enhanced MCP server for documentation search, security scanning, and project generation.
Table of Contents
- What is MCP?
- Installation & Setup
- Available Tools
- Documentation Search
- Security Scanning
- Project Generation
- Learning & Examples
- Advanced Usage
- Troubleshooting
What is MCP?
Model Context Protocol (MCP) is a standard for connecting AI assistants to external tools and data sources. Think of it as a plugin system that lets Claude, Cursor, and other AI assistants use specialized tools.
How it works:
- You install an MCP server (like documentation-search-enhanced)
- Configure your AI client (Claude Desktop, Codex CLI, Cursor, etc.)
- The AI can now call tools from the server to answer your questions
Example workflow:
You: "Search FastAPI docs for authentication examples"
↓
Claude Desktop sees you need documentation
↓
Claude calls the semantic_search tool from documentation-search-enhanced
↓
Tool fetches and searches FastAPI documentation
↓
Claude receives results and explains them to you
Installation & Setup
Prerequisites
- Python 3.12+ (3.13 supported for core features)
- uv package manager: https://docs.astral.sh/uv
- One of: Claude Desktop, Codex CLI, Cursor, or another MCP client
Step 1: Install uv
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with Homebrew
brew install uv
# Verify installation
which uvx
# Expected: /Users/yourusername/.local/bin/uvx
Step 2: Test the Package
# This will download and cache the package
uvx documentation-search-enhanced@1.6.3
# You'll see JSON-RPC errors - this is normal (server needs a client)
# Press Ctrl+C to exit
Step 3: Configure Your MCP Client
Option A: Claude Desktop
- Find your uvx path:
which uvx
# Copy this path
- Edit Claude Desktop config:
# macOS
open ~/Library/Application\ Support/Claude/claude_desktop_config.json
# Linux
nano ~/.config/Claude/claude_desktop_config.json
- Add this configuration (replace paths with your actual paths):
{
"mcpServers": {
"documentation-search-enhanced": {
"command": "/Users/yourusername/.local/bin/uvx",
"args": ["documentation-search-enhanced@1.6.3"],
"env": {
"SERPER_API_KEY": "your_api_key_here_or_leave_empty"
}
}
}
}
Restart Claude Desktop
Look for the 🔌 icon in Claude Desktop - it shows connected MCP servers
Option B: Codex CLI
# Get your uvx path
which uvx
# Add the MCP server (with SERPER API key)
codex mcp add documentation-search-enhanced \
--env SERPER_API_KEY=your_key_here \
-- /Users/yourusername/.local/bin/uvx documentation-search-enhanced@1.6.3
# Or without SERPER API key (uses prebuilt index)
codex mcp add documentation-search-enhanced \
-- /Users/yourusername/.local/bin/uvx documentation-search-enhanced@1.6.3
# Verify
codex mcp list
# Start interactive session
codex
Option C: Cursor
In Cursor settings, add to MCP configuration:
{
"mcpServers": {
"documentation-search-enhanced": {
"command": "/Users/yourusername/.local/bin/uvx",
"args": ["documentation-search-enhanced@1.6.3"]
}
}
}
Optional: Enable Semantic Search
For AI-powered semantic search (adds ~600MB, Python 3.12 only):
# Create a virtual environment
python3.12 -m venv ~/.venv-doc-search
source ~/.venv-doc-search/bin/activate
# Install with vector search
pip install documentation-search-enhanced[vector]==1.6.3
# Update your MCP config to use this Python instead of uvx
# Replace "command" with: "/Users/yourusername/.venv-doc-search/bin/python"
# Replace "args" with: ["-m", "documentation_search_enhanced.main"]
Available Tools
Core Tools
| Tool | Purpose | Use When |
|---|---|---|
semantic_search |
Search documentation across 100+ sources | Finding docs, tutorials, API references |
get_docs |
Fetch specific documentation URLs | Getting full doc pages |
get_learning_path |
Generate learning roadmap | Learning new technology |
get_code_examples |
Find code snippets | Need implementation examples |
scan_project_dependencies |
Scan for vulnerabilities | Check project security |
snyk_scan_project |
Detailed Snyk security analysis | Deep security audit |
generate_project_starter |
Create project boilerplate | Starting new project |
manage_dev_environment |
Generate docker-compose files | Setting up development environment |
compare_library_security |
Compare library vulnerabilities | Choosing between libraries |
Documentation Search
Basic Search
Example 1: Simple Documentation Query
You: "How do I set up authentication in FastAPI?"
What happens:
- Claude calls semantic_search(query="FastAPI authentication", libraries=["fastapi"])
- Tool searches FastAPI documentation
- Returns relevant sections about OAuth2, JWT, security
- Claude explains the concepts and provides code examples
Example 2: Multi-Library Search
You: "Compare authentication approaches in FastAPI vs Flask"
What happens:
- Claude calls semantic_search(query="authentication", libraries=["fastapi", "flask"])
- Tool searches both documentation sets
- Returns authentication docs from both frameworks
- Claude provides comparative analysis
Example 3: Specific Topic Search
You: "Show me React hooks documentation for useEffect"
What happens:
- Claude calls semantic_search(query="useEffect hook lifecycle", libraries=["react"])
- Tool finds React docs on useEffect
- Claude explains usage patterns and common pitfalls
Advanced Search Features
Version-Specific Documentation:
You: "How does async/await work in Python 3.11?"
What happens:
- Claude calls semantic_search(query="async await", libraries=["python"], version="3.11")
- Tool fetches Python 3.11 specific documentation
- Returns version-specific syntax and features
With Vector Search (if installed):
You: "Find documentation about database connection pooling"
What happens:
- Claude calls semantic_search(query="...", use_vector_rerank=True)
- Tool uses semantic embeddings for better relevance
- Results ranked by: 50% semantic similarity + 30% keywords + 20% source authority
- More contextually relevant results than keyword-only search
Supported Documentation Sources
Web Frameworks:
- FastAPI, Flask, Django, Express.js, NestJS, Spring Boot
Frontend:
- React, Vue, Angular, Svelte, Next.js, Nuxt
Data Science:
- NumPy, Pandas, Scikit-learn, TensorFlow, PyTorch
Cloud & DevOps:
- AWS, Azure, GCP, Docker, Kubernetes, Terraform
Languages:
- Python, JavaScript, TypeScript, Go, Rust, Java
And 70+ more sources
Security Scanning
Scan Local Project
Example 1: Quick Vulnerability Check
You: "Scan my project for vulnerabilities"
You: "The project is at /Users/me/myapp"
What happens:
- Claude calls scan_project_dependencies(project_path="/Users/me/myapp")
- Tool detects package manager (requirements.txt, package.json, etc.)
- Scans with Safety, pip-audit, and OSV
- Returns list of vulnerabilities with CVSS scores
- Claude summarizes critical issues and suggests fixes
Example output:
Found 3 vulnerabilities:
CRITICAL (CVSS 9.8):
- Package: requests==2.25.1
- CVE-2023-32681: Unintended leak of Proxy-Authorization header
- Fix: Upgrade to requests>=2.31.0
HIGH (CVSS 7.5):
- Package: flask==1.1.2
- CVE-2023-30861: Cookie parsing vulnerability
- Fix: Upgrade to flask>=2.3.2
MEDIUM (CVSS 5.3):
- Package: pyyaml==5.3.1
- CVE-2020-14343: Arbitrary code execution
- Fix: Upgrade to pyyaml>=5.4
Example 2: Detailed Snyk Analysis
You: "Run a detailed security audit on my project"
What happens:
- Claude calls snyk_scan_project(project_path="/Users/me/myapp")
- Snyk performs deep dependency tree analysis
- Checks for outdated packages, licensing issues, and security vulnerabilities
- Returns detailed remediation advice
Example 3: Security Report Generation
You: "Generate a security report for my project and save it to a file"
What happens:
- Claude scans your project
- Formats results as markdown or JSON
- Uses Write tool to save report
- You get a shareable security audit document
Compare Library Security
Example: Choosing Between Libraries
You: "Should I use requests or httpx? Which is more secure?"
What happens:
- Claude calls compare_library_security(libraries=["requests", "httpx"])
- Tool fetches CVE data for both packages
- Compares vulnerability counts, severity, and patching history
- Claude provides recommendation based on security posture
Example output:
Security Comparison: requests vs httpx
requests:
- 12 known CVEs (5 critical, 4 high, 3 medium)
- Last critical CVE: 6 months ago (patched)
- Active maintenance: Yes
- Security score: 7.5/10
httpx:
- 2 known CVEs (0 critical, 1 high, 1 medium)
- Last critical CVE: Never
- Active maintenance: Yes
- Security score: 9.0/10
Recommendation: httpx has a better security track record
Project Generation
Generate Project Starters
Example 1: FastAPI Project
You: "Create a new FastAPI project called 'my-api'"
What happens:
- Claude calls generate_project_starter(
project_type="fastapi",
project_name="my-api"
)
- Tool generates:
- Project structure (app/, tests/, config/)
- main.py with example endpoints
- requirements.txt with dependencies
- .env.example for configuration
- README.md with setup instructions
- Dockerfile and docker-compose.yml
Generated structure:
my-api/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI app with example routes
│ ├── models.py # Pydantic models
│ ├── database.py # Database connection
│ └── routers/
│ ├── __init__.py
│ └── users.py # Example user routes
├── tests/
│ ├── __init__.py
│ └── test_main.py # Example tests
├── requirements.txt # Dependencies
├── .env.example # Environment variables template
├── Dockerfile # Production-ready container
├── docker-compose.yml # Local development setup
└── README.md # Setup and usage instructions
Example 2: React Project
You: "Generate a React project with TypeScript"
What happens:
- Claude calls generate_project_starter(
project_type="react",
project_name="my-react-app",
options={"typescript": true}
)
- Tool generates:
- Vite-based React setup
- TypeScript configuration
- Example components
- Routing setup (React Router)
- State management boilerplate
- Testing setup (Vitest)
Example 3: Full-Stack Project
You: "Create a full-stack app with FastAPI backend and React frontend"
What happens:
- Claude generates both projects
- Creates shared docker-compose.yml
- Sets up API proxy configuration
- Configures CORS
- Provides unified development workflow
Development Environment Setup
Example: Docker Compose Generation
You: "Set up a development environment with PostgreSQL, Redis, and my FastAPI app"
What happens:
- Claude calls manage_dev_environment(
services=["postgresql", "redis", "fastapi"],
project_path="/Users/me/myapp"
)
- Tool generates docker-compose.yml:
version: '3.8'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
- redis
environment:
DATABASE_URL: postgresql://user:password@db:5432/myapp
REDIS_URL: redis://redis:6379
volumes:
postgres_data:
To use:
docker-compose up -d
Learning & Examples
Get Learning Path
Example 1: Learning New Framework
You: "I want to learn FastAPI. Create a learning roadmap"
What happens:
- Claude calls get_learning_path(
technology="fastapi",
skill_level="beginner",
goals=["Build REST API", "Deploy to production"]
)
- Tool generates structured learning path
Example output:
FastAPI Learning Path (Beginner → Intermediate)
Week 1: Fundamentals
✓ Python basics (async/await, type hints)
✓ HTTP protocols and REST APIs
✓ Install FastAPI and Uvicorn
✓ First "Hello World" API
Resources: FastAPI Tutorial - First Steps
Week 2: Core Concepts
✓ Path parameters and query parameters
✓ Request body with Pydantic models
✓ Response models and status codes
✓ Data validation
Resources: FastAPI Tutorial - Request Body
Week 3: Database Integration
✓ SQLAlchemy basics
✓ Database models and relationships
✓ CRUD operations
✓ Async database queries
Resources: FastAPI SQL Databases
Week 4: Authentication & Security
✓ OAuth2 with Password flow
✓ JWT tokens
✓ Password hashing
✓ Dependency injection
Resources: FastAPI Security
Week 5: Advanced Features
✓ Background tasks
✓ WebSockets
✓ File uploads
✓ Testing with pytest
Resources: FastAPI Advanced User Guide
Week 6: Deployment
✓ Docker containerization
✓ Environment configuration
✓ Logging and monitoring
✓ Deploy to AWS/Railway/Render
Resources: FastAPI Deployment
Example 2: Code Examples
You: "Show me examples of JWT authentication in FastAPI"
What happens:
- Claude calls get_code_examples(
topic="JWT authentication",
language="python",
framework="fastapi"
)
- Tool finds relevant code snippets
- Claude explains and adapts to your needs
Example output:
# JWT Authentication in FastAPI
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta
# Configuration
SECRET_KEY = "your-secret-key-here"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
app = FastAPI()
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
async def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="Invalid token")
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")
return username
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# Verify user credentials (check database)
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=401, detail="Incorrect credentials")
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}
Advanced Usage
Combining Multiple Tools
Example: Complete Project Setup Workflow
You: "I'm starting a new FastAPI project with authentication. Set up everything for me."
What happens (multi-step workflow):
1. Claude generates FastAPI starter
2. Searches FastAPI auth docs
3. Adds authentication code
4. Generates docker-compose with PostgreSQL
5. Scans dependencies for vulnerabilities
6. Provides setup instructions
Example: Security-First Development
You: "I need to choose between Flask, FastAPI, and Django for a new API. Consider security."
What happens:
1. Claude compares security records of all three
2. Searches current best practices for each
3. Provides recommendation based on your requirements
4. Generates starter for chosen framework
5. Pre-configures security best practices
Customizing Search
Disable vector search for faster results:
# Claude will use: use_vector_rerank=False
# Results in <100ms response time vs ~500ms with vector search
Search specific versions:
You: "Find Python 3.12 specific features for asyncio"
# Claude searches: version="3.12" parameter
Filter by source type:
You: "Search only official documentation, no blog posts"
# Claude filters for official doc sources
Troubleshooting
MCP Server Won't Start
Error: MCP startup failed: No such file or directory (os error 2)
Solution:
# 1. Find your actual uvx path
which uvx
# 2. Update config with FULL path (not just "uvx")
# Wrong: "command": "uvx"
# Right: "command": "/Users/yourusername/.local/bin/uvx"
JSON-RPC Errors When Testing
Error: Invalid JSON: EOF while parsing a value
This is normal! MCP servers need a client (Claude Desktop, Codex). You can't run them directly. Just test with your MCP client instead.
Vector Search Not Working
Symptoms: Search results seem basic, no semantic ranking
Causes:
- Vector dependencies not installed (Python 3.13 or missing
[vector]extra) - First run is building index (takes a few seconds)
Solutions:
# Check if vector search is available
python3.12 -m pip show sentence-transformers
# If not installed, install with vector extra (Python 3.12 only)
pip install documentation-search-enhanced[vector]==1.6.3
Slow Performance
If searches take >5 seconds:
- Check SERPER_API_KEY: Without it, the tool crawls documentation in real-time (slower)
- Prebuilt index: The tool downloads a prebuilt index from GitHub Releases automatically
- Vector search: Adds ~200-500ms. Disable with
use_vector_rerank=Falseif not needed
Speed comparison:
- With SERPER + prebuilt index: 100-200ms
- With prebuilt index only: 500-1000ms
- Live crawling (no index): 3-10 seconds
- Vector search enabled: +200-500ms
Package Installation Fails
Error: Could not find a version that satisfies the requirement
Solution:
# 1. Check Python version
python --version # Need 3.12+
# 2. Use uvx (recommended) instead of pip
uvx documentation-search-enhanced@1.6.3
# 3. If using pip, upgrade pip first
pip install --upgrade pip
Can't Find Documentation
If search returns no results:
- Check spelling of library name
- Try broader search terms
- Check if source is supported (see Available Tools section)
- Use
get_docswith direct URL if you know the doc location
Real-World Workflows
Workflow 1: Secure API Development
1. Generate FastAPI starter
You: "Create a FastAPI project called 'secure-api'"
2. Add authentication
You: "Add JWT authentication to this project"
3. Security scan
You: "Scan this project for vulnerabilities"
4. Fix issues
Claude: "Found 2 vulnerabilities in dependencies"
You: "Update the requirements.txt with secure versions"
5. Set up development environment
You: "Add PostgreSQL and Redis to docker-compose"
6. Deploy
You: "How do I deploy this to AWS?"
Workflow 2: Learning New Technology
1. Get learning path
You: "I want to learn React. Create a learning roadmap"
2. Start with basics
You: "Explain React hooks with examples"
3. Build project
You: "Generate a React project with routing and state management"
4. Find specific examples
You: "Show me examples of useEffect for data fetching"
5. Add features
You: "How do I add authentication to this React app?"
Workflow 3: Library Selection
1. Compare options
You: "Compare FastAPI, Flask, and Django for building REST APIs"
2. Check security
You: "Which has the best security track record?"
3. Review documentation
You: "Search each framework's docs for authentication"
4. Generate starter
You: "Create a starter project with the recommended framework"
5. Verify setup
You: "Scan the generated project for vulnerabilities"
Tips & Best Practices
Writing Effective Queries
Good queries:
- "Search FastAPI docs for database migrations with Alembic"
- "Find React documentation about performance optimization"
- "Show me examples of async/await in Python"
Less effective queries:
- "docs" (too vague)
- "help" (unclear what you need)
- "fix my code" (AI can't access your code without you sharing it)
Security Scanning Best Practices
- Scan regularly: Before each deployment
- Fix critical issues immediately: CVSS 9.0+ vulnerabilities
- Keep dependencies updated: Use
pip list --outdated - Document exceptions: If you can't update, document why
Project Generation Tips
- Customize after generation: Templates are starting points
- Review generated code: Understand what it does
- Update dependencies: Check for newer versions
- Follow the README: Generated projects include setup instructions
Getting Help
Check Logs
Claude Desktop logs:
# macOS
tail -f ~/Library/Logs/Claude/mcp*.log
# Look for errors from documentation-search-enhanced
Codex CLI:
codex --verbose
# Enables detailed logging
Common Issues
| Issue | Solution |
|---|---|
| "MCP server failed to start" | Check uvx path is absolute, not relative |
| "No results found" | Try broader search terms, check library name spelling |
| "Timeout error" | First run downloads index (~50MB), wait 30s and retry |
| "Vector search not working" | Only works on Python 3.12, needs [vector] extra |
| "Slow searches" | Add SERPER_API_KEY for faster results |
Report Issues
GitHub Issues: https://github.com/anton-prosterity/documentation-search-mcp/issues
Include:
- Python version (
python --version) - Package version (
uvx documentation-search-enhanced@1.6.3 --version) - MCP client (Claude Desktop / Codex / Cursor)
- Error messages or logs
What's Next?
Explore more:
- Try semantic search with the
[vector]extra - Generate different project types (React, Django, NestJS)
- Set up security scanning in CI/CD
- Create custom learning paths
- Compare libraries before choosing dependencies
Advanced topics:
- Custom documentation sources (coming soon)
- Private repository scanning
- Team collaboration features
- CI/CD integration examples
Quick Reference
Most Common Commands
Search documentation:
"Search [framework] docs for [topic]"
"Find examples of [feature] in [language]"
Security scanning:
"Scan my project for vulnerabilities"
"Compare security of [library1] vs [library2]"
Project generation:
"Create a [framework] project called [name]"
"Generate docker-compose with [services]"
Learning:
"Create a learning path for [technology]"
"Show me examples of [concept]"
Environment Variables
| Variable | Purpose | Default |
|---|---|---|
SERPER_API_KEY |
Enable live web search | None (uses prebuilt index) |
DOCS_SITE_INDEX_AUTO_DOWNLOAD |
Auto-download doc index | true |
DOCS_SITE_INDEX_PATH |
Custom index location | ~/.cache/doc-search/ |
Supported Project Types
fastapi- FastAPI REST APIreact- React frontend appdjango- Django web applicationflask- Flask APInextjs- Next.js full-stack appvue- Vue.js frontend app
Supported Scan Tools
- Safety: Python CVE database
- pip-audit: PyPI advisory database
- OSV: Google's Open Source Vulnerabilities DB
- Snyk: Commercial-grade security scanning
Happy coding with documentation-search-enhanced! 🚀