This guide walks you through running the MCP-Atlas evolve loop using uv for environment management and setup API keys for different servers.
The MCP-Atlas benchmark evaluates agents on tool-calling tasks via the Model Context Protocol (MCP). The benchmark provides a Docker image (ghcr.io/scaleapi/mcp-atlas) that bundles all MCP server binaries and their dependencies. MCP servers communicate over stdio transport, routed through Docker via docker exec -i.
| Requirement | Why |
|---|---|
| Python ≥ 3.11 | Runtime |
| uv | Fast Python env & package manager |
| Docker | MCP-Atlas runs MCP servers inside Docker containers |
AWS credentials or ANTHROPIC_API_KEY |
LLM access for both the MCP agent (solver) and the evolver |
The MCP agent uses strands-agents with Bedrock Claude Sonnet (us.anthropic.claude-sonnet-4-20250514) by default. If you prefer the Anthropic API directly, pass --provider anthropic.
# Clone the repo (if you haven't)
git clone <repo-url> && cd agent-evolve
# Create a virtual environment
uv venv .venv --python 3.11
# Install with MCP dependencies
uv pip install -e ".[mcp,dev]"
# Verify
uv run python -c "import agent_evolve; print('OK')"MCP-Atlas requires a Docker image that bundles all MCP server binaries and their dependencies.
# Verify Docker is running
docker info > /dev/null 2>&1 && echo "Docker OK" || echo "Docker not running"
# Pull the MCP-Atlas image
docker pull ghcr.io/scaleapi/mcp-atlas:latest
# Verify the image is available
docker image inspect ghcr.io/scaleapi/mcp-atlas:latest > /dev/null 2>&1 && echo "Image OK"The image is pulled automatically by the agent if not present locally, but pre-pulling avoids delays during your first run.
The MCP agent calls Bedrock via strands-agents. The evolver also defaults to Bedrock.
# Either use AWS CLI profiles or export directly:
export AWS_DEFAULT_REGION=us-west-2
# Verify Bedrock access
aws bedrock-runtime invoke-model \
--model-id us.anthropic.claude-sonnet-4-20250514-v1:0 \
--content-type application/json \
--accept application/json \
--body "$(echo -n '{"messages":[{"role":"user","content":[{"type":"text","text":"hi"}]}],"max_tokens":10,"anthropic_version":"bedrock-2023-05-31"}' | base64 -w 0)" \
/dev/stdout 2>&1 | head -20 && echo "Bedrock OK"Many MCP-Atlas tasks require third-party API keys for the MCP servers they use (Brave Search, GitHub, Slack, Google Maps, etc.). The KeyRegistry loads keys from multiple sources and injects them into the Docker container at startup. Tasks whose keys are missing are automatically filtered out.
The full mapping lives in agent_evolve/agents/mcp/server_keys.yaml and covers all 36 official MCP-Atlas servers. The 16 servers that require API keys are listed below (sorted by task frequency in the benchmark):
| MCP Server | Required Env Var(s) | % Tasks | Notes |
|---|---|---|---|
exa |
EXA_API_KEY |
13% | Exa Search |
airtable |
AIRTABLE_API_KEY |
12% | Airtable MCP |
mongodb |
MONGODB_CONNECTION_STRING |
12% | Append ?tls=true for Docker. |
oxylabs |
OXYLABS_USERNAME, OXYLABS_PASSWORD |
11% | Oxylabs Scraper API |
brave-search |
BRAVE_API_KEY |
10% | Brave Search API |
alchemy |
ALCHEMY_API_KEY |
8% | Alchemy API |
national-parks |
NPS_API_KEY |
8% | National Park Service API |
twelvedata |
TWELVE_DATA_API_KEY |
8% | Twelve Data API |
lara-translate |
LARA_ACCESS_KEY_ID, LARA_ACCESS_KEY_SECRET |
7% | Lara Translate API |
notion |
NOTION_TOKEN |
6% | Notion MCP Server |
weather-data |
WEATHER_API_KEY |
6% | WeatherAPI |
github |
GITHUB_TOKEN |
5% | GitHub PAT |
slack |
SLACK_MCP_XOXC_TOKEN, SLACK_MCP_XOXD_TOKEN |
5% | Slack MCP Server |
google-maps |
GOOGLE_MAPS_API_KEY |
5% | Google Maps Platform |
e2b-server |
E2B_API_KEY |
5% | E2B Code Interpreter |
google-workspace |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN |
4% | Google Workspace Server |
The remaining 20 servers (arxiv, calculator, cli-mcp-server, context7, ddg-search, desktop-commander, fetch, filesystem, git, mcp-code-executor, mcp-server-code-runner, memory, met-museum, open-library, osm-mcp-server, pubmed, weather, whois, wikipedia, clinicaltrialsgov-mcp-server) require no API keys.
You can extend the mapping by editing server_keys.yaml directly or providing a custom YAML file (see Custom server-key map below).
Create a .env file in the project root (already in .gitignore):
# .env
BRAVE_API_KEY=brv-xxxxxxxxxxxx
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
SLACK_MCP_XOXC_TOKEN=xoxc-xxxxxxxxxxxx
SLACK_MCP_XOXD_TOKEN=xoxd-xxxxxxxxxxxx
GOOGLE_MAPS_API_KEY=AIzaxxxxxxxxxxxx
GOOGLE_CLIENT_ID=xxxxxxxxxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxx
GOOGLE_REFRESH_TOKEN=1//xxxxxxxxxxxx
NOTION_TOKEN=ntn_xxxxxxxxxxxx
MONGODB_CONNECTION_STRING=mongodb+srv://user:pass@cluster.mongodb.net/?tls=true
ALCHEMY_API_KEY=xxxxxxxxxxxx
E2B_API_KEY=e2b_xxxxxxxxxxxx
EXA_API_KEY=xxxxxxxxxxxx
LARA_ACCESS_KEY_ID=xxxxxxxxxxxx
LARA_ACCESS_KEY_SECRET=xxxxxxxxxxxx
NPS_API_KEY=xxxxxxxxxxxx
OXYLABS_USERNAME=xxxxxxxxxxxx
OXYLABS_PASSWORD=xxxxxxxxxxxx
TWELVE_DATA_API_KEY=xxxxxxxxxxxx
WEATHER_API_KEY=xxxxxxxxxxxxThen pass it via the --env-file flag or the MCP_ENV_FILE environment variable:
# Via CLI flag
uv run python examples/mcp_examples/adaptive_evolve_all.py \
--env-file .env \
--docker-image ghcr.io/scaleapi/mcp-atlas:latest
# Or via environment variable
export MCP_ENV_FILE=.env
uv run python examples/mcp_examples/adaptive_evolve_all.py \
--docker-image ghcr.io/scaleapi/mcp-atlas:latestExport keys directly in your shell. These take the highest priority and override .env and AWS values:
export BRAVE_API_KEY=brv-xxxxxxxxxxxx
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
export NOTION_TOKEN=ntn_xxxxxxxxxxxx
uv run python examples/mcp_examples/adaptive_evolve_all.py \
--docker-image ghcr.io/scaleapi/mcp-atlas:latestStore keys as a JSON secret in AWS Secrets Manager:
{
"BRAVE_API_KEY": "brv-xxxxxxxxxxxx",
"GITHUB_TOKEN": "ghp-xxxxxxxxxxxx",
"SLACK_MCP_XOXC_TOKEN": "xoxc-xxxxxxxxxxxx",
"SLACK_MCP_XOXD_TOKEN": "xoxd-xxxxxxxxxxxx",
"NOTION_TOKEN": "ntn_xxxxxxxxxxxx",
"GOOGLE_MAPS_API_KEY": "AIzaxxxxxxxxxxxx"
}Then reference it in your YAML config:
# evolve_config.yaml
mcp_aws_secret_name: my-org/mcp-api-keys
mcp_aws_region: us-west-2When the same key exists in multiple sources, the highest-priority source wins:
- Process environment variables (highest)
.envfile- AWS Secrets Manager (lowest)
To add servers not in the built-in defaults, create a YAML file:
# mcp_server_keys.yaml
brave-search:
- BRAVE_API_KEY
github:
- GITHUB_TOKEN
my-custom-server:
- MY_CUSTOM_API_KEY
- MY_CUSTOM_SECRETPass it via config:
# evolve_config.yaml
mcp_server_key_map: mcp_server_keys.yamlWhen keys are loaded, the benchmark automatically filters tasks:
- Tasks whose MCP servers have all required keys available → included
- Tasks whose servers need no keys (e.g.
filesystem,fetch) → always included - Tasks with missing keys → filtered out with an INFO log
If all tasks are filtered out, a WARNING is logged listing every missing env var.
| Key | Type | Default | Description |
|---|---|---|---|
mcp_env_file |
str |
".env" |
Path to .env file (also settable via MCP_ENV_FILE env var) |
mcp_aws_secret_name |
str |
None |
AWS Secrets Manager secret name |
mcp_aws_region |
str |
None |
AWS region for Secrets Manager |
mcp_server_key_map |
str |
None |
Path to custom YAML server-to-key mapping |
There are five servers require both API keys AND sample data to be uploaded to your account. Please refer to MCP-Atlas GitHub: https://github.com/scaleapi/mcp-atlas/blob/main/data_exports/README.md for the details.
- MCP-Atlas GitHub: https://github.com/scaleapi/mcp-atlas
- MCP-Atlas HuggingFace Dataset:
ScaleAI/MCP-Atlas - Model Context Protocol: https://modelcontextprotocol.io