Every ferrlabs-fleet tool fails with API error: HTTP 404. The bearer is accepted (a rejected token would give 401, as ferrlabs-track and ferrlabs-growth do), so this is not auth: the routes the MCP calls are not served.
Reproduction
Authorize ferrlabs-fleet, then call list_agents -> API error: HTTP 404.
Probing the API directly
api.ferrfleet.com answers on /health but 404s on every /v1 path tried, unauthenticated:
/health -> 200 {"status":"ok"}
/v1/agents -> 404
/v1/runs -> 404
/agents -> 404
/v1/fleet/agents -> 404
/v1/marketplace/agents -> 404
/v1/runs matters: it is the other half of the sub-MCP surface (packages/mcp-fleet/src/tools/runs.ts), so this is not one mistyped path in agents.ts. Nothing under /v1 responds.
An unauthenticated request to a route that exists but requires auth should return 401. Returning 404 on every one suggests the router never reaches the application, which points at deployment or ingress rather than at the handler code.
Two candidate causes
api.ferrfleet.com is not serving the FerrFleet API. Health is answered by something upstream (ingress or a placeholder) while the application is not routed, not deployed, or mounted under a different prefix.
- The API is up but mounts its routes under a prefix
packages/mcp-fleet does not use. In that case FLEET_API_URL in packages/mcp-fleet/src/api-base.ts:1 and the paths in agents.ts / runs.ts need to match whatever is actually served.
Confirm which before changing anything here: if the API is simply not deployed, no client change is correct.
Why it went unnoticed
scripts/smoke.ts only boots @ferrlabs/mcp (#246), and the sub-MCP tools have no tests (#160). Nothing in CI would have caught an entire product API being unreachable.
Every
ferrlabs-fleettool fails withAPI error: HTTP 404. The bearer is accepted (a rejected token would give 401, asferrlabs-trackandferrlabs-growthdo), so this is not auth: the routes the MCP calls are not served.Reproduction
Authorize
ferrlabs-fleet, then calllist_agents->API error: HTTP 404.Probing the API directly
api.ferrfleet.comanswers on/healthbut 404s on every/v1path tried, unauthenticated:/v1/runsmatters: it is the other half of the sub-MCP surface (packages/mcp-fleet/src/tools/runs.ts), so this is not one mistyped path inagents.ts. Nothing under/v1responds.An unauthenticated request to a route that exists but requires auth should return 401. Returning 404 on every one suggests the router never reaches the application, which points at deployment or ingress rather than at the handler code.
Two candidate causes
api.ferrfleet.comis not serving the FerrFleet API. Health is answered by something upstream (ingress or a placeholder) while the application is not routed, not deployed, or mounted under a different prefix.packages/mcp-fleetdoes not use. In that caseFLEET_API_URLinpackages/mcp-fleet/src/api-base.ts:1and the paths inagents.ts/runs.tsneed to match whatever is actually served.Confirm which before changing anything here: if the API is simply not deployed, no client change is correct.
Why it went unnoticed
scripts/smoke.tsonly boots@ferrlabs/mcp(#246), and the sub-MCP tools have no tests (#160). Nothing in CI would have caught an entire product API being unreachable.