v0.4.3 — MCP Bridge base URL paths
Fixed: MCP Bridge connectors ignored the path in the base URL
An MCP Bridge connector whose base URL carried a path was always called at <origin>/mcp. The path was silently discarded, so any remote MCP server not hosted at the root of its host was unreachable — it 404'd on every request.
Reported in #501 against Snowflake's managed MCP servers, which live at /api/v2/databases/<db>/schemas/<schema>/mcp-servers/<name>. The same bug also broke:
- Zoho MCP —
https://<workspace>.zohomcp.com/mcp/<token>/message - LinkedIn MCP —
https://app.linkmcp.io/api/mcp - Bridging to another AnythingMCP instance — each server is served at
/mcp/<serverId>, so those connectors hit a route that does not exist
The base URL is now the endpoint. Paste the complete URL of the remote MCP server, path included. A bare host with no path still defaults to /mcp, so every existing connector keeps working — verified against every MCP connector in AnythingMCP Cloud: 17 of 20 resolve to a byte-identical URL, and the 3 that change had never discovered a tool or completed a call.
| Remote server | Base URL to enter |
|---|---|
| Most hosted servers | https://mcp.example.com/mcp |
| Snowflake managed MCP server | https://<account>.snowflakecomputing.com/api/v2/databases/<db>/schemas/<schema>/mcp-servers/<name> |
| Another AnythingMCP instance | https://your-anythingmcp.example.com/mcp/<serverId> |
A per-tool endpointMapping.path still overrides the connector's base URL when you need one tool to go elsewhere: a leading / resolves against the host, a relative value is appended to the base path, and a full https://… URL is used verbatim.
Behaviour change
If you had left an unrelated path in an MCP connector's base URL and relied on it being discarded, set the base URL back to the bare host. The backend logs a one-off warning naming the old and new address for any connector whose resolved URL changes.
Fixed: OAuth discovery for MCP servers hosted under a path
Discovery only ever probed <origin>/.well-known/oauth-authorization-server, so it missed the path-inserted metadata that RFC 8414 §3.1 and RFC 9728 require — including the protected-resource documents AnythingMCP serves for its own per-server endpoints. It now walks a candidate chain, with the origin-level document last so existing setups resolve exactly as before.
Endpoints are no longer rewritten onto the MCP server's origin when a protected-resource document deliberately names an external authorization server. This repairs providers that delegate auth to another host: for one connector the old rewrite pointed the browser at a 404 page instead of the working authorization endpoint.
Security: SSRF guard on tool discovery
listTools() reached a user-supplied URL without the SSRF guard that tool execution already applied. Discovery is reachable from tool discovery, connector import, Test Connection and the OAuth callback; all four are now guarded.
Test Connection also offers the "add to SSRF allowlist" deep-link for every blocked-host message — a private IP, localhost and an unresolvable Docker service name previously produced a dead end, which is what an MCP bridge to a server on the local network hits.
Upgrading
No migration and no configuration change. Self-hosted:
docker compose pull && docker compose up -d