Skip to content

MCP endpoint mismatch when connecting Claude Web to self-hosted Metabase v0.60.1.1 #75756

Description

@Lochsa89

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"
}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions