387 lines
6.7 KiB
Markdown
387 lines
6.7 KiB
Markdown
# MCP Integration
|
|
|
|
Model Context Protocol (MCP) integration for connecting Claude Code to external tools and services.
|
|
|
|
## What is MCP?
|
|
|
|
Model Context Protocol enables Claude Code to:
|
|
- Connect to external tools and services
|
|
- Access resources (files, databases, APIs)
|
|
- Use custom tools
|
|
- Provide prompts and completions
|
|
|
|
## Configuration
|
|
|
|
MCP servers are configured in `.claude/mcp.json`:
|
|
|
|
### Basic Configuration
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"server-name": {
|
|
"command": "command-to-run",
|
|
"args": ["arg1", "arg2"],
|
|
"env": {
|
|
"VAR_NAME": "value"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Example Configuration
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"filesystem": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"],
|
|
"env": {}
|
|
},
|
|
"github": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
"env": {
|
|
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
|
|
}
|
|
},
|
|
"postgres": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-postgres"],
|
|
"env": {
|
|
"DATABASE_URL": "postgresql://user:pass@localhost:5432/db"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Common MCP Servers
|
|
|
|
### Filesystem Access
|
|
```json
|
|
{
|
|
"filesystem": {
|
|
"command": "npx",
|
|
"args": [
|
|
"-y",
|
|
"@modelcontextprotocol/server-filesystem",
|
|
"/path/to/allowed/files"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Capabilities:**
|
|
- Read/write files
|
|
- List directories
|
|
- File search
|
|
- Path restrictions for security
|
|
|
|
### GitHub Integration
|
|
```json
|
|
{
|
|
"github": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
"env": {
|
|
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Capabilities:**
|
|
- Repository access
|
|
- Issues and PRs
|
|
- Code search
|
|
- Workflow management
|
|
|
|
### PostgreSQL Database
|
|
```json
|
|
{
|
|
"postgres": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-postgres"],
|
|
"env": {
|
|
"DATABASE_URL": "${DATABASE_URL}"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Capabilities:**
|
|
- Query execution
|
|
- Schema inspection
|
|
- Transaction management
|
|
- Connection pooling
|
|
|
|
### Brave Search
|
|
```json
|
|
{
|
|
"brave-search": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
|
|
"env": {
|
|
"BRAVE_API_KEY": "${BRAVE_API_KEY}"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Capabilities:**
|
|
- Web search
|
|
- News search
|
|
- Local search
|
|
- Result filtering
|
|
|
|
### Puppeteer (Browser Automation)
|
|
```json
|
|
{
|
|
"puppeteer": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-puppeteer"]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Capabilities:**
|
|
- Browser automation
|
|
- Screenshots
|
|
- PDF generation
|
|
- Web scraping
|
|
|
|
## Remote MCP Servers
|
|
|
|
Connect to MCP servers over HTTP/SSE:
|
|
|
|
### Basic Remote Server
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"remote-service": {
|
|
"url": "https://api.example.com/mcp"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### With Authentication
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"remote-service": {
|
|
"url": "https://api.example.com/mcp",
|
|
"headers": {
|
|
"Authorization": "Bearer ${API_TOKEN}",
|
|
"X-Custom-Header": "value"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### With Proxy
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"remote-service": {
|
|
"url": "https://api.example.com/mcp",
|
|
"proxy": "http://proxy.company.com:8080"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
Use environment variables for sensitive data:
|
|
|
|
### .env File
|
|
```bash
|
|
# .claude/.env
|
|
GITHUB_TOKEN=ghp_xxxxx
|
|
DATABASE_URL=postgresql://user:pass@localhost/db
|
|
BRAVE_API_KEY=BSAxxxxx
|
|
API_TOKEN=token_xxxxx
|
|
```
|
|
|
|
### Reference in mcp.json
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"github": {
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
"env": {
|
|
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Testing MCP Servers
|
|
|
|
### Inspector Tool
|
|
```bash
|
|
npx @modelcontextprotocol/inspector
|
|
```
|
|
|
|
Opens web UI for testing MCP servers:
|
|
- List available tools
|
|
- Test tool invocations
|
|
- View resources
|
|
- Debug connections
|
|
|
|
### Manual Testing
|
|
```bash
|
|
# Test server command
|
|
npx -y @modelcontextprotocol/server-filesystem /tmp
|
|
|
|
# Check server output
|
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{}}' | \
|
|
npx -y @modelcontextprotocol/server-filesystem /tmp
|
|
```
|
|
|
|
## Creating Custom MCP Servers
|
|
|
|
### Python Server
|
|
```python
|
|
from mcp.server import Server
|
|
from mcp.server.stdio import stdio_server
|
|
|
|
server = Server("my-server")
|
|
|
|
@server.tool()
|
|
async def my_tool(arg: str) -> str:
|
|
"""Tool description"""
|
|
return f"Result: {arg}"
|
|
|
|
if __name__ == "__main__":
|
|
stdio_server(server)
|
|
```
|
|
|
|
### Configuration
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"my-server": {
|
|
"command": "python",
|
|
"args": ["path/to/server.py"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Node.js Server
|
|
```javascript
|
|
import { Server } from "@modelcontextprotocol/server-node";
|
|
|
|
const server = new Server("my-server");
|
|
|
|
server.tool({
|
|
name: "my-tool",
|
|
description: "Tool description",
|
|
parameters: { arg: "string" }
|
|
}, async ({ arg }) => {
|
|
return `Result: ${arg}`;
|
|
});
|
|
|
|
server.listen();
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
### Filesystem Access
|
|
- Restrict to specific directories
|
|
- Use read-only access when possible
|
|
- Validate file paths
|
|
- Monitor access logs
|
|
|
|
### API Credentials
|
|
- Use environment variables
|
|
- Never commit credentials
|
|
- Rotate keys regularly
|
|
- Implement least-privilege access
|
|
|
|
### Network Access
|
|
- Whitelist allowed domains
|
|
- Use HTTPS only
|
|
- Implement timeouts
|
|
- Rate limit requests
|
|
|
|
### Remote Servers
|
|
- Validate server certificates
|
|
- Use authentication
|
|
- Implement request signing
|
|
- Monitor for anomalies
|
|
|
|
## Troubleshooting
|
|
|
|
### Server Not Starting
|
|
```bash
|
|
# Check server command
|
|
npx -y @modelcontextprotocol/server-filesystem /tmp
|
|
|
|
# Verify environment variables
|
|
echo $GITHUB_TOKEN
|
|
|
|
# Check logs
|
|
cat ~/.claude/logs/mcp-*.log
|
|
```
|
|
|
|
### Connection Errors
|
|
```bash
|
|
# Test network connectivity
|
|
curl https://api.example.com/mcp
|
|
|
|
# Verify proxy settings
|
|
echo $HTTP_PROXY
|
|
|
|
# Check firewall rules
|
|
```
|
|
|
|
### Permission Errors
|
|
```bash
|
|
# Verify file permissions
|
|
ls -la /path/to/allowed/files
|
|
|
|
# Check user permissions
|
|
whoami
|
|
groups
|
|
```
|
|
|
|
### Tool Not Found
|
|
- Verify server is running
|
|
- Check server configuration
|
|
- Inspect server capabilities
|
|
- Review tool registration
|
|
|
|
## Best Practices
|
|
|
|
### Configuration Management
|
|
- Use environment variables for secrets
|
|
- Document server purposes
|
|
- Version control mcp.json (without secrets)
|
|
- Test configurations thoroughly
|
|
|
|
### Performance
|
|
- Use local servers when possible
|
|
- Implement caching
|
|
- Set appropriate timeouts
|
|
- Monitor resource usage
|
|
|
|
### Maintenance
|
|
- Update servers regularly
|
|
- Monitor server health
|
|
- Review access logs
|
|
- Clean up unused servers
|
|
|
|
## See Also
|
|
|
|
- MCP specification: https://modelcontextprotocol.io
|
|
- Creating MCP servers: `references/api-reference.md`
|
|
- Security best practices: `references/best-practices.md`
|
|
- Troubleshooting: `references/troubleshooting.md`
|