🚀 MCP Ahrefs
Ahrefs MCP Server for SAAGA
🚀 Quick Start
Quick Start with AI Assistant
Need help getting started? Have your AI coding assistant guide you!
Simply tell your AI assistant: "I have a MCP Ahrefs project. Please read and follow WORKING_WITH_SAAGA_PROMPT.md to help me understand and work with this MCP server."
For quick reference, the .ai-prompts.md file contains a condensed version of key patterns.
For detailed technical documentation, see docs/DECORATOR_PATTERNS.md.
Testing with MCP Inspector
Ready to test your MCP server? The MCP Inspector Guide provides:
- Step-by-step setup instructions with virtual environment troubleshooting
- Test examples for all included tools
- JSON mode instructions for parallel tools
- Common issues and solutions
Quick start:
source .venv/bin/activate
uv run mcp dev mcp_ahrefs/server/app.py
Testing with Claude CLI
This project includes a convenient test script for testing your MCP server with Claude:
./test_mcp_with_claude.sh "List all available tools"
./test_mcp_with_claude.sh "Run the echo_tool with message 'Hello World'"
./test_mcp_with_claude.sh "Test calculate_fibonacci with n=10 and echo_tool with message 'Done'"
.\test_mcp_with_claude.ps1 "List all available tools"
The script automatically:
- Uses the generated
mcp.integration_test.json configuration (created by cookiecutter)
- Runs Claude with the Sonnet model
- Includes proper MCP configuration flags
- Provides colored output for better readability
MCP Integration Testing
This project includes comprehensive integration tests that validate tools work correctly with real MCP client interactions:
Running Integration Tests
test-mcp-integration
test-mcp-integration --verbose
test-mcp-integration --tool echo_tool
test-mcp-integration --list
./test_mcp_integration.sh
.\test_mcp_integration.ps1
What's Tested
The integration tests validate:
- Tool Discovery: All tools are discoverable with correct schemas (no "kwargs" parameters)
- Parameter Conversion: String parameters from MCP are converted to appropriate types
- Error Handling: Invalid parameters and exceptions return proper error responses
- SAAGA Integration: Decorators work correctly in the full MCP protocol flow
- Protocol Compliance: Tools work with real MCP client connections
Generating Tests for New Tools
When you add a new tool, generate integration tests for it:
generate-mcp-tests my_new_tool
Integration vs Unit Tests
- Unit Tests (
test_decorators.py): Test SAAGA decorators in isolation
- Integration Tests (
test_mcp_integration.py): Test complete MCP protocol flow with real client
Run both test suites to ensure full coverage:
pytest
pytest tests/test_decorators.py
test-mcp-integration
✨ Features
This MCP server was generated using the SAAGA MCP Server Cookie Cutter template. It includes:
- FastMCP Integration: Modern MCP framework with dual transport support
- SAAGA Decorators: Automatic exception handling, logging, and parallelization
- Platform-Aware Configuration: Cross-platform configuration management
- Streamlit Admin UI: Web-based configuration and monitoring interface
- SQLite Logging: Comprehensive logging with database persistence
📦 Installation
Prerequisites
- Python 3.12 or higher
- UV - An extremely fast Python package manager
Install from Source
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone <your-repository-url>
cd mcp_ahrefs
uv venv
uv sync
Development Installation
git clone <your-repository-url>
cd mcp_ahrefs
uv venv
uv sync --extra dev
💻 Usage Examples
Running the MCP Server
The server can be run in two modes:
1. STDIO Mode (for MCP clients like Claude Desktop)
uv run python -m mcp_ahrefs.server.app
uv run python -m mcp_ahrefs.server.app --log-level DEBUG
uv run python mcp_ahrefs/server/app.py
uv run mcp_ahrefs-server
2. SSE Mode (for web-based clients)
uv run python -m mcp_ahrefs.server.app --transport sse --port 3001
uv run python -m mcp_ahrefs.server.app --transport sse --host 0.0.0.0 --port 8080
Command Line Options
uv run python -m mcp_ahrefs.server.app --help
Available options:
--transport: Choose between "stdio" (default) or "sse"
--host: Host to bind to for SSE transport (default: 127.0.0.1)
--port: Port to bind to for SSE transport (default: 3001)
--log-level: Logging level - DEBUG, INFO, WARNING, ERROR (default: INFO)
MCP Client Configuration
Claude Desktop Configuration
Add the following to your Claude Desktop MCP settings (claude_desktop_config.json):
{
"mcpServers": {
"mcp_ahrefs": {
"command": "uv",
"args": ["run", "python", "-m", "mcp_ahrefs.server.app"],
"cwd": "/Users/jakub/Ragnarson/saaga/mcp_ahrefs"
}
}
}
Advanced Configuration Options
{
"mcpServers": {
"mcp_ahrefs": {
"command": "uv",
"args": [
"run", "python", "-m", "mcp_ahrefs.server.app",
"--log-level", "DEBUG"
],
"cwd": "/Users/jakub/Ragnarson/saaga/mcp_ahrefs",
"env": {
"UV_PROJECT_ENVIRONMENT": "/Users/jakub/Ragnarson/saaga/mcp_ahrefs/.venv"
}
}
}
}
Using with System Python (Alternative)
{
"mcpServers": {
"mcp_ahrefs": {
"command": "/Users/jakub/Ragnarson/saaga/mcp_ahrefs/.venv/bin/python",
"args": ["-m", "mcp_ahrefs.server.app"]
}
}
}
Using with uv tool
{
"mcpServers": {
"mcp_ahrefs": {
"command": "uv",
"args": ["--directory=/Users/jakub/Ragnarson/saaga/mcp_ahrefs", "run" ,"mcp_ahrefs-server"]
}
}
}
Configuration File Locations
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Linux:
~/.config/Claude/claude_desktop_config.json
- Windows:
%APPDATA%/Claude/claude_desktop_config.json
Admin UI
Launch the Streamlit admin interface:
uv run streamlit run mcp_ahrefs/ui/app.py
Dashboard
The dashboard provides:
- Real-time server status monitoring
- Project information and configuration overview
- Quick access to common actions
- System resource usage
Configuration Editor
The configuration editor features:
- Live configuration editing with validation
- Diff preview showing pending changes
- Export/import functionality (JSON & YAML formats)
- Reset to defaults with confirmation dialog
- Automatic server restart notifications
Log Viewer
The log viewer includes:
- Date range filtering for historical analysis
- Status filtering (success/error/all)
- Tool-specific filtering
- Export capabilities for further analysis
- Real-time log updates
📚 Documentation
AI Assistant Instructions
When working with this MCP Ahrefs MCP server in an AI coding assistant (like Claude, Cursor, or GitHub Copilot):
Understanding the Server Architecture
This server uses SAAGA decorators that automatically wrap all MCP tools with:
- Exception handling: All errors are caught and returned as structured error responses
- Comprehensive logging: All tool invocations are logged with timing and parameters
- Optional parallelization: Tools marked for parallel execution run concurrently
Key Points for AI Assistants
- Tool Registration Pattern: Tools are registered with decorators already applied. Do NOT manually wrap tools with decorators - this is handled automatically in
server/app.py.
- Parameter Types: MCP passes all parameters as strings from the client. Ensure your tools handle type conversion:
def my_tool(count: str) -> dict:
count_int = int(count)
return {"result": count_int * 2}
- Error Handling: Tools can raise exceptions freely - the exception_handler decorator will catch them and return proper error responses.
- Async Support: Both sync and async tools are supported. The decorators automatically detect and handle both patterns.
- Logging: Check logs at the platform-specific data directory for debugging:
- macOS:
~/Library/Application Support/mcp_ahrefs/logs.db
- Linux:
~/.local/share/mcp_ahrefs/logs.db
- Windows:
%APPDATA%/mcp_ahrefs/logs.db
Common Tasks
Adding a new tool:
def my_new_tool(param: str) -> dict:
"""Description of what this tool does."""
return {"result": "processed"}
from .my_new_tool import my_new_tool
example_tools.append(my_new_tool)
Testing with MCP Inspector:
uv run mcp dev mcp_ahrefs/server/app.py
Debugging a tool:
- Check the SQLite logs for error messages
- Run with
--log-level DEBUG for verbose output
- Test directly with MCP Inspector to see parameter handling
Configuration
Configuration files are stored in platform-specific locations:
- macOS:
~/Library/Application Support/mcp_ahrefs/
- Linux:
~/.local/share/mcp_ahrefs/
- Windows:
%APPDATA%/mcp_ahrefs/
Configuration Options
log_level: Logging level (INFO)
log_retention_days: Days to retain logs (30)
server_port: HTTP server port (3001)
Development
Project Structure
mcp_ahrefs/
├── mcp_ahrefs/
│ ├── config.py # Platform-aware configuration
│ ├── server/
│ │ └── app.py # FastMCP server with decorators
│ ├── tools/ # Your MCP tools
│ ├── decorators/ # SAAGA decorators
│ └── ui/ # Streamlit admin UI
├── tests/ # Test suite
├── docs/ # Documentation
└── pyproject.toml # Project configuration
Adding New Tools
- Create a new Python file in
mcp_ahrefs/tools/
- Define your tool function
- Import and register it in
server/app.py
Example:
def my_tool(message: str) -> str:
"""Example MCP tool."""
return f"Processed: {message}"
Running Tests
pytest tests/
Code Quality
This project uses several code quality tools:
black mcp_ahrefs/
isort mcp_ahrefs/
flake8 mcp_ahrefs/
mypy mcp_ahrefs/
SAAGA Decorators
This server automatically applies three key decorators to your MCP tools:
- Exception Handler: Graceful error handling with logging
- Tool Logger: Comprehensive logging to SQLite database
- Parallelize: Optional parallel processing for compute-intensive tools
Logging
Logs are stored in a SQLite database with the following schema:
timestamp: When the tool was called
tool_name: Name of the MCP tool
duration_ms: Execution time in milliseconds
status: Success/failure status
input_args: Tool input arguments
output_summary: Summary of tool output
error_message: Error details (if any)
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
For issues and questions:
- Create an issue on GitHub
- Check the documentation in the
docs/ directory
- Review the test suite for usage examples
Acknowledgments