MCP endpoint mismatch when connecting Claude Web to self-hosted Metabase v0.60.1.1
Environment
Metabase Version: v0.60.1.1
Self-hosted behind Cloudflare
Claude Web App (Anthropic)
Native Metabase MCP server enabled
Claude integration enabled
Agent API enabled
Summary
I'm attempting to connect our self-hosted Metabase instance to the Claude Web app using the built-in MCP support.
After resolving several Cloudflare issues affecting OAuth, the OAuth flow now appears to complete successfully. However, after authorization Claude repeatedly attempts to connect to:
https:///api/metabase-mcp
which returns HTTP 404:
API endpoint does not exist
This is the endpoint format Claude accepts and the endpoint documented by Metabase.
The confusing part is that manually testing:
https:///api/mcp
returns the expected JSON-RPC authentication response, suggesting that our MCP server is actually running at that endpoint.
I'm trying to determine whether this is expected behavior, a configuration issue, a known compatibility issue with Claude Web, or a bug.
Claude Connector Behavior
Claude Web accepts the documented Metabase MCP endpoint:
https:///api/metabase-mcp
However, after OAuth completes, Claude attempts to connect to that same endpoint and Metabase returns HTTP 404.
If I attempt to use:
https:///api/mcp
Claude rejects it as an invalid URL format, so I do not appear to have a way to force Claude to use the endpoint that is responding correctly on our server.
What we've verified
OAuth Discovery
These endpoints all work correctly:
GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-protected-resource/api/metabase-mcp
GET /.well-known/oauth-authorization-server
OAuth Registration
Dynamic client registration succeeds:
POST /oauth/register
HTTP 201 Created
Authorization
Authorization completes successfully:
GET /oauth/authorize
HTTP 200
POST /oauth/authorize/decision
HTTP 302
At this point the user has authenticated and approved access.
MCP Endpoint Behavior
Manual request:
POST /api/mcp
returns a valid JSON-RPC response:
{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Authentication required"
}
}
This appears to indicate that the MCP server is active.
However:
POST /api/metabase-mcp
returns:
HTTP 404
API endpoint does not exist
Questions
Should the MCP endpoint in Metabase v0.60.1.1 be /api/metabase-mcp or /api/mcp?
Is there a configuration option that controls which endpoint is exposed?
Is there a known compatibility issue between Claude Web and the Metabase MCP implementation?
Is there anything unusual about seeing /api/mcp respond correctly while /api/metabase-mcp returns 404?
Is there any recommended workaround, such as routing /api/metabase-mcp internally to /api/mcp?
I'm happy to provide additional logs if needed.
Logs
Relevant log excerpt (redacted for security)
=== OAuth / MCP Connection Attempt ===
POST /oauth/register
→ HTTP 201 Created
GET /oauth/authorize
→ HTTP 200 OK
POST /oauth/authorize/decision
→ HTTP 302 Redirect
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
GET /.well-known/oauth-protected-resource/api/metabase-mcp
→ HTTP 200 OK
GET /.well-known/oauth-protected-resource
→ HTTP 200 OK
GET /.well-known/oauth-authorization-server
→ HTTP 200 OK
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
GET /.well-known/oauth-protected-resource/api/metabase-mcp
→ HTTP 200 OK
GET /.well-known/oauth-protected-resource
→ HTTP 200 OK
GET /.well-known/oauth-authorization-server
→ HTTP 200 OK
POST /oauth/register
→ HTTP 201 Created
GET /oauth/authorize
→ HTTP 200 OK
POST /oauth/authorize/decision
→ HTTP 302 Redirect
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
Additional context:
-
A manual POST to /api/mcp returns a valid JSON-RPC response:
{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Authentication required"
}
}
-
This suggests the MCP server is active and responding at /api/mcp, while /api/metabase-mcp consistently returns HTTP 404.
-
Claude Web only accepts the documented endpoint (https://<my-server>/api/metabase-mcp) when configuring the connector. If I specify https://<my-server>/api/mcp, Claude rejects it as an invalid URL format, so there is no way to direct Claude to the endpoint that appears to be responding correctly.
Metabase Diagnostic Info
{
"browser-info": {
"language": "en-US",
"platform": "Win32",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
"vendor": "Google Inc."
},
"metabase-info": {
"databases": [
"postgres",
"clickhouse"
],
"run-mode": "prod",
"plan-alias": "",
"version": {
"date": "2026-04-15",
"tag": "v0.60.1.1",
"hash": "3abe29e"
},
"settings": {
"report-timezone": "America/Chicago"
},
"hosting-env": "unknown",
"application-database": "postgres",
"application-database-details": {
"database": {
"name": "PostgreSQL",
"version": "18.3 (Debian 18.3-1.pgdg11+1)"
},
"jdbc-driver": {
"name": "PostgreSQL JDBC Driver",
"version": "42.7.8"
}
}
},
"system-info": {
"file.encoding": "UTF-8",
"java.runtime.name": "OpenJDK Runtime Environment",
"java.runtime.version": "21.0.11+10-1-24.04.2-Ubuntu",
"java.vendor": "Ubuntu",
"java.vendor.url": "https://ubuntu.com/",
"java.version": "21.0.11",
"java.vm.name": "OpenJDK 64-Bit Server VM",
"java.vm.version": "21.0.11+10-1-24.04.2-Ubuntu",
"os.name": "Linux",
"os.version": "6.8.0-101-generic",
"user.language": "en",
"user.timezone": "Etc/UTC"
}
}
MCP endpoint mismatch when connecting Claude Web to self-hosted Metabase v0.60.1.1
Environment
Metabase Version: v0.60.1.1
Self-hosted behind Cloudflare
Claude Web App (Anthropic)
Native Metabase MCP server enabled
Claude integration enabled
Agent API enabled
Summary
I'm attempting to connect our self-hosted Metabase instance to the Claude Web app using the built-in MCP support.
After resolving several Cloudflare issues affecting OAuth, the OAuth flow now appears to complete successfully. However, after authorization Claude repeatedly attempts to connect to:
https:///api/metabase-mcp
which returns HTTP 404:
API endpoint does not exist
This is the endpoint format Claude accepts and the endpoint documented by Metabase.
The confusing part is that manually testing:
https:///api/mcp
returns the expected JSON-RPC authentication response, suggesting that our MCP server is actually running at that endpoint.
I'm trying to determine whether this is expected behavior, a configuration issue, a known compatibility issue with Claude Web, or a bug.
Claude Connector Behavior
Claude Web accepts the documented Metabase MCP endpoint:
https:///api/metabase-mcp
However, after OAuth completes, Claude attempts to connect to that same endpoint and Metabase returns HTTP 404.
If I attempt to use:
https:///api/mcp
Claude rejects it as an invalid URL format, so I do not appear to have a way to force Claude to use the endpoint that is responding correctly on our server.
What we've verified
OAuth Discovery
These endpoints all work correctly:
GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-protected-resource/api/metabase-mcp
GET /.well-known/oauth-authorization-server
OAuth Registration
Dynamic client registration succeeds:
POST /oauth/register
HTTP 201 Created
Authorization
Authorization completes successfully:
GET /oauth/authorize
HTTP 200
POST /oauth/authorize/decision
HTTP 302
At this point the user has authenticated and approved access.
MCP Endpoint Behavior
Manual request:
POST /api/mcp
returns a valid JSON-RPC response:
{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Authentication required"
}
}
This appears to indicate that the MCP server is active.
However:
POST /api/metabase-mcp
returns:
HTTP 404
API endpoint does not exist
Questions
Should the MCP endpoint in Metabase v0.60.1.1 be /api/metabase-mcp or /api/mcp?
Is there a configuration option that controls which endpoint is exposed?
Is there a known compatibility issue between Claude Web and the Metabase MCP implementation?
Is there anything unusual about seeing /api/mcp respond correctly while /api/metabase-mcp returns 404?
Is there any recommended workaround, such as routing /api/metabase-mcp internally to /api/mcp?
I'm happy to provide additional logs if needed.
Logs
Relevant log excerpt (redacted for security)
=== OAuth / MCP Connection Attempt ===
POST /oauth/register
→ HTTP 201 Created
GET /oauth/authorize
→ HTTP 200 OK
POST /oauth/authorize/decision
→ HTTP 302 Redirect
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
GET /.well-known/oauth-protected-resource/api/metabase-mcp
→ HTTP 200 OK
GET /.well-known/oauth-protected-resource
→ HTTP 200 OK
GET /.well-known/oauth-authorization-server
→ HTTP 200 OK
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
GET /.well-known/oauth-protected-resource/api/metabase-mcp
→ HTTP 200 OK
GET /.well-known/oauth-protected-resource
→ HTTP 200 OK
GET /.well-known/oauth-authorization-server
→ HTTP 200 OK
POST /oauth/register
→ HTTP 201 Created
GET /oauth/authorize
→ HTTP 200 OK
POST /oauth/authorize/decision
→ HTTP 302 Redirect
POST /api/metabase-mcp
→ HTTP 404
API endpoint does not exist.
Additional context:
A manual POST to
/api/mcpreturns a valid JSON-RPC response:{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Authentication required"
}
}
This suggests the MCP server is active and responding at
/api/mcp, while/api/metabase-mcpconsistently returns HTTP 404.Claude Web only accepts the documented endpoint (
https://<my-server>/api/metabase-mcp) when configuring the connector. If I specifyhttps://<my-server>/api/mcp, Claude rejects it as an invalid URL format, so there is no way to direct Claude to the endpoint that appears to be responding correctly.Metabase Diagnostic Info
{
"browser-info": {
"language": "en-US",
"platform": "Win32",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
"vendor": "Google Inc."
},
"metabase-info": {
"databases": [
"postgres",
"clickhouse"
],
"run-mode": "prod",
"plan-alias": "",
"version": {
"date": "2026-04-15",
"tag": "v0.60.1.1",
"hash": "3abe29e"
},
"settings": {
"report-timezone": "America/Chicago"
},
"hosting-env": "unknown",
"application-database": "postgres",
"application-database-details": {
"database": {
"name": "PostgreSQL",
"version": "18.3 (Debian 18.3-1.pgdg11+1)"
},
"jdbc-driver": {
"name": "PostgreSQL JDBC Driver",
"version": "42.7.8"
}
}
},
"system-info": {
"file.encoding": "UTF-8",
"java.runtime.name": "OpenJDK Runtime Environment",
"java.runtime.version": "21.0.11+10-1-24.04.2-Ubuntu",
"java.vendor": "Ubuntu",
"java.vendor.url": "https://ubuntu.com/",
"java.version": "21.0.11",
"java.vm.name": "OpenJDK 64-Bit Server VM",
"java.vm.version": "21.0.11+10-1-24.04.2-Ubuntu",
"os.name": "Linux",
"os.version": "6.8.0-101-generic",
"user.language": "en",
"user.timezone": "Etc/UTC"
}
}