What changed, and where did it start? A read-only MCP server and CLI that ranks changes across metrics, logs and traces and tells causes from echoes.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add spoor --env SPOOR_METRICS_URL='<SPOOR_METRICS_URL>' --env SPOOR_LOGS_URL='<SPOOR_LOGS_URL>' --env SPOOR_TRACES_URL='<SPOOR_TRACES_URL>' --env SPOOR_METRICS_TOKEN='<SPOOR_METRICS_TOKEN>' --env SPOOR_LOGS_TOKEN='<SPOOR_LOGS_TOKEN>' --env SPOOR_TRACES_TOKEN='<SPOOR_TRACES_TOKEN>' -- docker run -i --rm -e SPOOR_METRICS_URL -e SPOOR_LOGS_URL -e SPOOR_TRACES_URL -e SPOOR_METRICS_TOKEN -e SPOOR_LOGS_TOKEN -e SPOOR_TRACES_TOKEN ghcr.io/asinha07/spoor:0.2.1~/.codex/config.toml
[mcp_servers.spoor]
command = "docker"
args = ["run", "-i", "--rm", "-e", "SPOOR_METRICS_URL", "-e", "SPOOR_LOGS_URL", "-e", "SPOOR_TRACES_URL", "-e", "SPOOR_METRICS_TOKEN", "-e", "SPOOR_LOGS_TOKEN", "-e", "SPOOR_TRACES_TOKEN", "ghcr.io/asinha07/spoor:0.2.1"]
env = { SPOOR_METRICS_URL = "<SPOOR_METRICS_URL>", SPOOR_LOGS_URL = "<SPOOR_LOGS_URL>", SPOOR_TRACES_URL = "<SPOOR_TRACES_URL>", SPOOR_METRICS_TOKEN = "<SPOOR_METRICS_TOKEN>", SPOOR_LOGS_TOKEN = "<SPOOR_LOGS_TOKEN>", SPOOR_TRACES_TOKEN = "<SPOOR_TRACES_TOKEN>" }
# codex mcp add spoor --env SPOOR_METRICS_URL='<SPOOR_METRICS_URL>' --env SPOOR_LOGS_URL='<SPOOR_LOGS_URL>' --env SPOOR_TRACES_URL='<SPOOR_TRACES_URL>' --env SPOOR_METRICS_TOKEN='<SPOOR_METRICS_TOKEN>' --env SPOOR_LOGS_TOKEN='<SPOOR_LOGS_TOKEN>' --env SPOOR_TRACES_TOKEN='<SPOOR_TRACES_TOKEN>' -- docker run -i --rm -e SPOOR_METRICS_URL -e SPOOR_LOGS_URL -e SPOOR_TRACES_URL -e SPOOR_METRICS_TOKEN -e SPOOR_LOGS_TOKEN -e SPOOR_TRACES_TOKEN ghcr.io/asinha07/spoor:0.2.1~/.cursor/mcp.json
{
"mcpServers": {
"spoor": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SPOOR_METRICS_URL",
"-e",
"SPOOR_LOGS_URL",
"-e",
"SPOOR_TRACES_URL",
"-e",
"SPOOR_METRICS_TOKEN",
"-e",
"SPOOR_LOGS_TOKEN",
"-e",
"SPOOR_TRACES_TOKEN",
"ghcr.io/asinha07/spoor:0.2.1"
],
"env": {
"SPOOR_METRICS_URL": "<SPOOR_METRICS_URL>",
"SPOOR_LOGS_URL": "<SPOOR_LOGS_URL>",
"SPOOR_TRACES_URL": "<SPOOR_TRACES_URL>",
"SPOOR_METRICS_TOKEN": "<SPOOR_METRICS_TOKEN>",
"SPOOR_LOGS_TOKEN": "<SPOOR_LOGS_TOKEN>",
"SPOOR_TRACES_TOKEN": "<SPOOR_TRACES_TOKEN>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"spoor": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SPOOR_METRICS_URL",
"-e",
"SPOOR_LOGS_URL",
"-e",
"SPOOR_TRACES_URL",
"-e",
"SPOOR_METRICS_TOKEN",
"-e",
"SPOOR_LOGS_TOKEN",
"-e",
"SPOOR_TRACES_TOKEN",
"ghcr.io/asinha07/spoor:0.2.1"
],
"env": {
"SPOOR_METRICS_URL": "<SPOOR_METRICS_URL>",
"SPOOR_LOGS_URL": "<SPOOR_LOGS_URL>",
"SPOOR_TRACES_URL": "<SPOOR_TRACES_URL>",
"SPOOR_METRICS_TOKEN": "<SPOOR_METRICS_TOKEN>",
"SPOOR_LOGS_TOKEN": "<SPOOR_LOGS_TOKEN>",
"SPOOR_TRACES_TOKEN": "<SPOOR_TRACES_TOKEN>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"spoor": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SPOOR_METRICS_URL",
"-e",
"SPOOR_LOGS_URL",
"-e",
"SPOOR_TRACES_URL",
"-e",
"SPOOR_METRICS_TOKEN",
"-e",
"SPOOR_LOGS_TOKEN",
"-e",
"SPOOR_TRACES_TOKEN",
"ghcr.io/asinha07/spoor:0.2.1"
],
"env": {
"SPOOR_METRICS_URL": "<SPOOR_METRICS_URL>",
"SPOOR_LOGS_URL": "<SPOOR_LOGS_URL>",
"SPOOR_TRACES_URL": "<SPOOR_TRACES_URL>",
"SPOOR_METRICS_TOKEN": "<SPOOR_METRICS_TOKEN>",
"SPOOR_LOGS_TOKEN": "<SPOOR_LOGS_TOKEN>",
"SPOOR_TRACES_TOKEN": "<SPOOR_TRACES_TOKEN>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"spoor": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SPOOR_METRICS_URL",
"-e",
"SPOOR_LOGS_URL",
"-e",
"SPOOR_TRACES_URL",
"-e",
"SPOOR_METRICS_TOKEN",
"-e",
"SPOOR_LOGS_TOKEN",
"-e",
"SPOOR_TRACES_TOKEN",
"ghcr.io/asinha07/spoor:0.2.1"
],
"env": {
"SPOOR_METRICS_URL": "<SPOOR_METRICS_URL>",
"SPOOR_LOGS_URL": "<SPOOR_LOGS_URL>",
"SPOOR_TRACES_URL": "<SPOOR_TRACES_URL>",
"SPOOR_METRICS_TOKEN": "<SPOOR_METRICS_TOKEN>",
"SPOOR_LOGS_TOKEN": "<SPOOR_LOGS_TOKEN>",
"SPOOR_TRACES_TOKEN": "<SPOOR_TRACES_TOKEN>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"spoor": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SPOOR_METRICS_URL",
"-e",
"SPOOR_LOGS_URL",
"-e",
"SPOOR_TRACES_URL",
"-e",
"SPOOR_METRICS_TOKEN",
"-e",
"SPOOR_LOGS_TOKEN",
"-e",
"SPOOR_TRACES_TOKEN",
"ghcr.io/asinha07/spoor:0.2.1"
],
"env": {
"SPOOR_METRICS_URL": "<SPOOR_METRICS_URL>",
"SPOOR_LOGS_URL": "<SPOOR_LOGS_URL>",
"SPOOR_TRACES_URL": "<SPOOR_TRACES_URL>",
"SPOOR_METRICS_TOKEN": "<SPOOR_METRICS_TOKEN>",
"SPOOR_LOGS_TOKEN": "<SPOOR_LOGS_TOKEN>",
"SPOOR_TRACES_TOKEN": "<SPOOR_TRACES_TOKEN>"
}
}
}
}Environment variables
SPOOR_METRICS_URLSPOOR_LOGS_URLSPOOR_TRACES_URLSPOOR_METRICS_TOKENSPOOR_LOGS_TOKENSPOOR_TRACES_TOKEN
Replace the placeholders with your own credentials and keep them out of version control.