> For the complete documentation index, see [llms.txt](https://docs.flowcp.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flowcp.ai/guides/custom-domain.md).

# Custom domain

By default, your published MCP servers are served on FlowCP's host (`https://runtime.flowcp.io/mcp/<server-id>`). With a **custom domain** you can serve them on your own hostname instead — for example `https://mcp.yourcompany.com/mcp/<server-id>` — so the URL your customers configure in their AI client is fully branded as yours.

> This is different from the Bubble **Custom domain** setting, which points at your app's *upstream backend*. The custom domain here is the public **MCP endpoint** that AI clients connect to.

## How it works

You bring your own domain and point it at FlowCP with a CNAME record. FlowCP verifies you control the domain and provisions a TLS certificate for it automatically (via Cloudflare for SaaS). Once the domain is **verified** and its certificate is **active**, your app's published MCP servers are served on it.

* **One domain per app.** The domain is bound to an app and serves every published branch of that app under the same `/mcp/<server-id>` path.
* **Verified + active before it serves.** Until both ownership verification and certificate issuance complete, traffic continues on the default host. FlowCP never advertises your domain in OAuth metadata until it can terminate TLS.

## Add a custom domain

1. Open your app and go to **Settings**.
2. Find the **MCP server domain** card.
3. Enter your hostname (for example `mcp.yourcompany.com`) and click **Add domain**.

FlowCP shows the DNS records you need to publish:

* A **CNAME** record pointing your hostname at FlowCP's target host.
* One or more **ownership / certificate validation** records (a `TXT` record, or an HTTP token) when required.

## Publish the DNS records

Add the records shown in the card at your DNS provider. A typical setup is:

| Type  | Name                   | Value                 |
| ----- | ---------------------- | --------------------- |
| CNAME | `mcp.yourcompany.com`  | `mcp.flowcp.io`       |
| TXT   | `_cf-custom-hostname…` | *(value from FlowCP)* |

DNS propagation and certificate issuance usually take a few minutes. The card polls automatically while it's open, or you can click **Refresh status**. You don't have to keep the page open: a background job also re-checks still-provisioning domains periodically, so a domain that finishes verifying overnight flips to **Active** on its own.

## When it's active

Once the status badge reads **Active**:

* The card confirms the live host.
* The **Publish** page's config snippet (and the `auth.md` URL) automatically switch to your domain, so the JSON you hand to AI clients targets `https://mcp.yourcompany.com/mcp/<server-id>`.

Already-connected clients pointed at the default host keep working; new configs use the custom domain.

## Remove a custom domain

Click **Remove** on the card and confirm. Published servers immediately revert to the default host, and FlowCP de-registers the domain and its certificate. You can add the domain again later.

## Troubleshooting

* **Stuck on&#x20;*****Pending*****.** Confirm the CNAME and any validation records exactly match what the card shows. Some DNS providers flatten or proxy CNAMEs at the apex — use a subdomain like `mcp.` rather than the root domain.
* ***Failed*****&#x20;status.** Certificate provisioning failed (often a missing or proxied validation record). Fix the DNS records, then **Remove** and re-add the domain to retry.
* **That domain is reserved / already in use.** A hostname can be bound to only one workspace, and platform hosts can't be claimed. Pick a hostname you control.
