A Single Endpoint for Every Environment

A Flux API's MCP server can be reached two ways. Each API has its own address, https://{environment_key}.fxns.io/{api_prefix}/_mcp. The other is a single endpoint — one address that works for every environment and every API, because it reads both out of the API key rather than out of the URL.

https://mcp.foxnose.net/_mcp

Both addresses work.


Connecting

The key is the whole configuration.

curl -sS -i -X POST https://mcp.foxnose.net/_mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Simple $PUBLIC_KEY:$PRIVATE_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'

No environment key. No API prefix. No X-Host.


Choosing the API

The URL does not name an API, so one has to be chosen. The rule is deliberately boring:

  • The key can read exactly one API → that API is used, and you send nothing extra.
  • The key can read several → say which, with the x-foxnose-prefix header.

There is no third case. When several APIs are readable and no header is sent, the endpoint refuses rather than guessing — guessing would silently expose a different set of collections than you expected.

curl -sS -X POST https://mcp.foxnose.net/_mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Simple $PUBLIC_KEY:$PRIVATE_KEY" \
  -H "x-foxnose-prefix: blog" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

The refusal tells you what to pick, so an agent can correct itself in one turn:

{
  "message": "This key can read more than one API. Choose one with the x-foxnose-prefix header.",
  "error_code": "prefix_required",
  "detail": {
    "available_prefixes": ["blog", "shop"],
    "header": "x-foxnose-prefix"
  }
}

Every response carries x-foxnose-prefix back, so you can always see which API you reached.


Authentication

Simple and Bearer work exactly as they do on the tenant address.

Two differences, both deliberate.

Secure is not supported here. Its signature covers the request path, the body and the date — and on this endpoint every API shares the path /_mcp, while x-foxnose-prefix is not part of the signed material. A captured request could therefore be replayed against a different API the key can read. Use Simple or a bearer token here, or keep using Secure on your environment's own address, where the signed path names the API.

A credential is always required, including for APIs with is_auth_required: false. A public API accepts anonymous MCP calls on its own address; here there is no credential to resolve an environment from, so an anonymous request is a 401.


What the errors mean

  • Name
    401
    Description

    No credential, an unusable one, or one this endpoint cannot resolve. A revoked key, a key whose environment was deleted or disabled, and a key that has never been seen all return the same body — deliberately, so the endpoint cannot be used to probe which keys exist.

  • Name
    403
    Description

    Authenticated, but not permitted: the requested x-foxnose-prefix names an API this key cannot read, or the key can read none at all.

  • Name
    400 prefix_required
    Description

    The key can read more than one API and none was named. detail.available_prefixes lists the ones it can read.

  • Name
    404
    Description

    The single endpoint is not enabled on this deployment, or MCP is switched off for the resolved API.

  • Name
    503
    Description

    Credential lookup is momentarily saturated. Retry; Retry-After says when. This is never an authentication verdict — a 503 does not mean your key is wrong.


Server card

curl -sS https://mcp.foxnose.net/.well-known/mcp/server-card.json

Unauthenticated, and always reflects the live tool registry, so it matches what tools/list returns.

It lists all seven tools, which is a superset of what any given caller receives: the two write tools appear in a real tools/list only when the key grants create/update on the selected API. The card's notes field says so.


Which address to use

SituationAddress
A catalogue or marketplace listingsingle
A hosted connector with one URL fieldsingle
Signing each request with Securetenant
Anonymous access to a public APItenant
Anything elseeither

Both addresses are fully supported.

Was this page helpful?