Skip to content

Support variables in remote URLs not working #503

@chucknthem

Description

@chucknthem

Describe the bug
We're a SaaS company that have customers at subdomains like {domain}.chronosphere.io, so we host our remote mcp server at {domain}.chronosphere.io/api/mcp/mcp. According to the spec, the url parameter for remote server definitions should be a template string that support {variable} substitutions, but we're failing validation when publishing the server.

description: "URL template for the streamable-http transport. Variables in {curly_braces} reference argument value_hints, argument names, or environment variable names. After variable substitution, this should produce a valid URI.",

There's also no where to define variables in a remote server. The only place seems to be inside headers.

To Reproduce
Steps to reproduce the behavior:
Our server.json looks like this:

{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
  "name": "io.github.chronosphereio/chronosphere-mcp",
  "description": "MCP Server for Chronosphere observability platform",
  "website_url": "https://chronosphere.io",
  "status": "active",
  "repository": {
    "url": "https://github.com/chronosphereio/chronosphere-mcp",
    "source": "github"
  },
  "version": "0.3.3",
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://{CHRONOSPHERE_ORG_NAME}.chronosphere.io/api/mcp/mcp",
      "headers": [
        {
          "name": "Authorization",
          "description": "The auth header containing the service account token or personal access token for Chronosphere",
          "value": "Bearer {CHRONOSPHERE_API_TOKEN}",
          "is_required": true,
          "is_secret": true,
          "variables": {
            "CHRONOSPHERE_ORG_NAME": {
              "description": "The name of the Chronosphere organization or subdomain",
              "is_required": true,
              "is_secret": false
            },
            "CHRONOSPHERE_API_TOKEN": {
              "description": "The service account token or personal access token for Chronosphere",
              "is_required": true,
              "is_secret": true
            }
          }
        }
      ]
    }
  ]
}

importantly, the URL looks like this:

"url": "https://{CHRONOSPHERE_ORG_NAME}.chronosphere.io/api/mcp/mcp",

I put the CHRONOSPHERE_ORG_NAME "variables" needed for the URL inside one of the headers which seems to be the only place we can put variables in a StreamableHttpTransport type.

mcp-publisher publish is failing with the error:

 publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"invalid remote URL: https://{CHRONOSPHERE_ORG_NAME}.chronosphere.io/api/mcp/mcp"}]}

Expected behavior
Based on the spec, I was expecting this to publish successfully, but it seems variables in the remote url aren't actually supported or there's some undocumented way to specify variables for remote urls.

Logs

 publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"invalid remote URL: https://{CHRONOSPHERE_ORG_NAME}.chronosphere.io/api/mcp/mcp"}]}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions