/mcp/troubleshooting
Troubleshooting
Common failures wiring up the MCP server, and how to fix them.
Server doesn’t appear in Claude Desktop
- Validate the config JSON. A trailing comma or unbalanced brace silently disables all MCP servers. python -c "import json,sys; json.load(open(sys.argv[1]))" \ ~/Library/Application\ Support/Claude/claude_desktop_config.json
Text
python -c "import json,sys; json.load(open(sys.argv[1]))" \ ~/Library/Application\ Support/Claude/claude_desktop_config.json
- Confirm uvx is on PATH. macOS launches GUI apps with a minimal PATH (no shell profile loaded). If which uvx prints ~/.local/bin/uvx, that path may not be visible to Claude. Use the absolute path in your config: { "mcpServers": { "mireye-earth": { "command": "/Users/you/.local/bin/uvx", "args": ["mireye-mcp"] } } } Don’t have uv at all? Install it: curl -LsSf https://astral.sh/uv/install.sh | sh
{
"mcpServers": {
"mireye-earth": {
"command": "/Users/you/.local/bin/uvx",
"args": ["mireye-mcp"]
}
}
}- Check the Claude logs. Logs live at ~/Library/Logs/Claude/mcp-server-mireye-earth.log. On startup you should see one line: [mireye-mcp] starting base_url=https://api.mireye.com timeout_s=120.0 If you see a Python ImportError, mireye-mcp was launched against an interpreter that doesn’t have the mcp SDK installed. With uvx, this shouldn’t happen — uvx provisions a managed environment per call. If you switched to plain pip, make sure pip show mcp returns >= 1.27.2 in the same interpreter the binary lives in.
JSON
[mireye-mcp] starting base_url=https://api.mireye.com timeout_s=120.0
Tools not appearing in the picker
- Old mcp SDK. The package pins mcp >= 1.27.2, < 2.0. If you installed an older version manually, upgrade: pip install --upgrade 'mcp>=1.27.2,<2.0'.
- Import failure. Run uvx mireye-mcp from a terminal. It should sit silently waiting for stdio input — anything printed to stderr beyond the starting … line is a real error.
ConnectError / ReadTimeout on the first call
- The default already covers this. MIREYE_TIMEOUT_S defaults to 120 s, above the server’s ~110 s /v1/ask deadline, so a cold start completes within it. Only raise it further (never set it below 120 — that would abandon requests the server still completes) if you still time out: { "mcpServers": { "mireye-earth": { "command": "uvx", "args": ["mireye-mcp"], "env": { "MIREYE_TIMEOUT_S": "180" } } } }
JSON
{
"mcpServers": {
"mireye-earth": {
"command": "uvx",
"args": ["mireye-mcp"],
"env": { "MIREYE_TIMEOUT_S": "180" }
}
}
}- Pre-warm with a cheap call. Hit https://api.mireye.com/healthz before your first user-facing call (e.g. in your agent’s session-start hook).
HTTP 400 coord_out_of_bounds
JSON
{
"detail": {
"error": "coord_out_of_bounds",
"message": "lng=-0.1 outside US envelope [-180.0, -65.0]"
}
} HTTP 400 fields_unknown
JSON
{
"detail": {
"error": "fields_unknown",
"message": "Unknown field names: ['elevation_m']",
"fields_unknown": ["elevation_m"]
}
}- elevation_m → elevation
- slope → slope_degrees
- floodplain → within_floodplain_polygon
- power_plant → nearest_power_plant_name
HTTP 400 fields_too_many
- Drop the preset and pick fields explicitly.
- Split into multiple fetch calls (e.g. one per layer).
401 / 403 errors
- Stored credentials bound to a different URL. Stored logins only attach to the MIREYE_BASE_URL they were created against. If you changed MIREYE_BASE_URL after logging in, tool calls behave as logged out and the error names both the stored and the active URL. Re-run mireye-mcp login against the new URL, or set MIREYE_BEARER_TOKEN.
- insecure_base_url. Tokens are never sent over plain http:// except to loopback hosts (localhost / 127.0.0.1 / [::1]). login also refuses to run against a remote plain-http URL. Use https for any non-local deployment.
Unexplained 500s
JSON
[mireye-mcp] tool_call path=/v1/ask status=500 request_id=req_a1b2c3d4e5f6
Server keeps restarting
Shell
uvx mireye-mcp # should hang waiting on stdin; ctrl-c to exit