Connecting the chat client you already use
Getting started § connect an MCP client states the two facts every client
needs — the Streamable HTTP endpoint at /mcp, and the key as a bearer credential — and that is the complete answer for
a client you configure by writing a file. This page answers what comes next and what no reference page can answer,
because the answer belongs to somebody else: where the dialog is in the product I actually use, what it accepts as an
address, and what it accepts as a credential.
The interesting part is not the URL. Three things differ per client, and each decides whether the connection is possible at all rather than how tidy it is:
- Where the client runs. A client on your own machine reaches a loopback address; a client that runs in its vendor's cloud reaches only an address published on the public internet.
- Whether it can send a static
Authorizationheader. Two of the clients below cannot, which means a deployment authenticated by an API key cannot be connected from them at all — no address and no header spelling changes that. - Which transport it speaks. The endpoint serves Streamable HTTP and nothing else, so a client limited to the legacy HTTP+SSE transport is blocked here.
A reader who does not know the second one reads a 401, or a connector that lists no tool, as a MailFathom defect.
Two claims this page does not make
Presence is a check at a point in time, not a supported-client list. Every entry below is what that product's own current documentation said on the date the entry carries. None of these products is under this project's control, and any of them may change its dialog, its authentication choices, or its transports next week without anybody here touching anything. An entry that has stopped being true is a defect in this page rather than in the deployment that trusted it.
Absence is not a refusal. A client missing from this page is not blocked, unsupported, or known to fail — it is unchecked. MailFathom serves any client that speaks the MCP Streamable HTTP transport, and any other client that speaks Streamable HTTP is the section for one.
What the evidence column means
Each entry says which of two kinds of evidence it rests on, because they are not the same claim:
- Documented — the product's own current documentation was read on the date the entry carries. It establishes what the vendor publishes about the dialog, the address, and the credential. It does not establish that a connection was made.
- Observed — a MailFathom deployment was genuinely connected from that client and behaved as the entry says.
Every entry on this page today is Documented. That is deliberate rather than a gap waiting to be filled: none of
these clients is something this repository can run in a test, and an entry claiming otherwise would be asserting a
verification that nothing here performs.
What is the same for every client
Four things hold whichever client is being configured, and each is stated in full on the page that owns it rather than repeated per client below:
- The address ends in
/mcp, which is a constant rather than a setting. What precedes it is where the deployment is served:http://127.0.0.1:8080under the Compose defaults, or the public HTTPS address your proxy or MailFathom's own TLS serves. - An API key travels as
Authorization: Bearer <the key material>, and nothing else about it is client-specific. The MCP endpoint § API keys records what a key is, how it rotates, and what every refusal looks like. - A browser-based client is also subject to the origin policy. A client that runs as a web page sends an
Originheader, and a deployment that narrowedMcpEndpoint:Cors:AllowedOriginshas to list that client's origin; CORS and theOriginheader holds the rule. A client that is a desktop application or a command-line tool sends none and is unaffected. - Enabling the endpoint at all, and choosing what protects it, is one decision made before any of this. Getting started § enable the MCP endpoint is the short form and the MCP endpoint is the whole contract.
The clients, in one table
| Client | Where it runs | The address it needs | Authentication it offers | Evidence |
|---|---|---|---|---|
| The ChatGPT web application | The vendor's cloud | Public HTTPS | OAuth, or none — no static header | Documented, 2026-08-12 |
| The Claude applications | The vendor's cloud | Public HTTPS | OAuth, or none — no static header | Documented, 2026-08-12 |
| The Claude Code command-line tool | Your machine | Loopback or public | Static header, or OAuth | Documented, 2026-08-12 |
| Visual Studio Code with GitHub Copilot | Your machine | Loopback or public | Static header, or OAuth | Documented, 2026-08-12 |
| The Cursor editor | Your machine | Loopback or public | Static header, or OAuth | Documented, 2026-08-12 |
Every client in the table speaks the MCP Streamable HTTP transport, which is the one MailFathom serves, so none of them is blocked on transport today. That column would only be worth a table of its own for a client that speaks the legacy HTTP+SSE transport alone; MailFathom serves no such endpoint, and a client limited to it cannot connect at all.
The two no static header rows are the finding this page exists for. Both products connect a remote MCP server
through a dialog that offers OAuth or nothing, so the deployment shape most readers start from — one API key, one
client — has no way to present its credential there. Neither is a MailFathom limitation and neither has a workaround
worth writing down: the endpoint's answer for those clients is
an OAuth entry beside or instead of the key, and
MCP client OAuth is the sequence that gets one working — the identity provider's
side, which is where nearly all of that work is.
The ChatGPT web application, in developer mode
OpenAI documents connecting a remote MCP server of your own as a developer mode app rather than through the ordinary connector list, and states the feature is available to Pro, Plus, Business, Enterprise, and Education accounts on the web.
Where the dialog is. Turn the feature on under Settings → Security and login → Developer mode, then open ChatGPT Plugins, select the plus button, and create a developer-mode app pointing at your server URL. A created app appears under Drafts, where its tools can be toggled individually and refreshed to pull the current tool list from the server.
The address has to be public. The app is connected by OpenAI's own infrastructure rather than by the browser in front of you, so a loopback address reaches nothing and a deployment on a private network is unreachable however well it works from your desk. Serve the endpoint over HTTPS on an address that resolves publicly before starting here.
An API key cannot be presented. OpenAI documents three authentication modes for a developer-mode app — OAuth, no
authentication, and a mixed mode combining the two — and no field for a static header or an API key. So a MailFathom
deployment whose McpEndpoint:Authentication list holds only ApiKey entries cannot be connected from this client, and
the two shapes that can are an OAuth entry and
an endpoint requiring no credential — the second of which is
the wrong answer on a public address, and says so in a startup warning.
Transport. OpenAI documents SSE and streaming HTTP as the supported MCP protocols, so the Streamable HTTP endpoint is served as-is.
This is the one client the endpoint documentation carries a worked certificate profile for. OpenAI publishes a managed client certificate for its connector, and a deployment can require it in addition to whatever credential it asks for; the ChatGPT connector profile is the configuration and the reason it composes with OAuth rather than replacing it.
Sources: ChatGPT developer mode, Building MCP servers for plugins and API integrations.
The Claude applications, on the web and on the desktop
Anthropic calls a remote MCP server a custom connector, and documents the feature as available on Claude, Cowork, and Claude Desktop for Free, Pro, Max, Team, and Enterprise plans. A connector belongs to the account rather than to one application: Anthropic's own documentation for the command-line tool below records that connectors added on the web load there too, for whoever is signed in with that account.
Where the dialog is. On an individual plan, Customize → Connectors → + → Add custom connector, then enter the remote MCP server URL. On a Team or Enterprise plan an owner adds it instead, under Organization settings → Connectors, and members reach it from their own Customize → Connectors.
The address has to be public. Anthropic documents that the server must be reachable over the public internet from its own IP ranges, and that a server on a private corporate network, behind a VPN, or blocked by a firewall will not connect even when it is reachable from your own machine. A loopback address cannot be a custom connector.
An API key cannot be presented. The dialog takes the URL, and an Advanced settings panel taking an OAuth client identifier and client secret. There is no field for a static header, so — exactly as with the client above — an API-key deployment cannot be connected from here, and an OAuth entry is what this client is served with.
The desktop application's configuration file is a different thing. claude_desktop_config.json configures local
stdio servers that the application starts as processes on your machine. MailFathom is a service reached over HTTP rather
than a process to start, so it is a connector rather than an entry in that file.
Transport. Anthropic documents both Streamable HTTP and SSE as valid transports for a custom connector, so the endpoint is served as-is.
Sources: Get started with custom connectors using remote MCP, Build custom connectors via remote MCP servers.
The Claude Code command-line tool
This client runs on your machine, so it reaches a loopback address, and it takes a static header on the command line — which makes it the shortest path from an API-key deployment to a working tool call.
claude mcp add --transport http mailfathom http://127.0.0.1:8080/mcp \
--header "Authorization: Bearer $(cat mcp-workstation-key)"
What each part is. --transport http is the Streamable HTTP transport; mailfathom is a name you choose, and it is
what labels the tools in a session; the URL is the endpoint. The server is registered for the current project by
default — add --scope user to register it once for every project, or --scope project to write it into the
repository's own .mcp.json.
Verify it before opening a session. claude mcp list reports the server as ✔ Connected once it has answered. Two
other statuses are worth reading rather than retrying: ! Needs authentication means the endpoint answered 401 or
403 and no credential was configured for it, and ✘ Failed to connect covers a rejected header as well as an
unreachable address — Anthropic documents that a server which rejects a configured headers.Authorization is a failed
connection rather than falling back to an OAuth flow, so a mistyped key looks like a broken address until you read the
detail on the status.
OAuth instead of a key. Add the server without --header, then run /mcp inside a session and choose
Authenticate, or run claude mcp login mailfathom from the shell. The endpoint's protected-resource metadata is what
directs the client at your authorization server.
Sources: Connect to MCP servers, Connect Claude Code to tools via MCP.
Visual Studio Code with the GitHub Copilot chat agent
MCP servers are configured for the chat agent in an mcp.json file, reachable from the command palette as MCP: Add
Server, which asks whether the entry belongs to the workspace or to your user profile. The editor runs on your
machine, so a loopback address works.
Write the key as an input rather than into the file, so the file itself carries no credential:
{
"inputs": [
{
"type": "promptString",
"id": "mailfathom-key",
"description": "MailFathom MCP API key",
"password": true
}
],
"servers": {
"mailfathom": {
"type": "http",
"url": "http://127.0.0.1:8080/mcp",
"headers": { "Authorization": "Bearer ${input:mailfathom-key}" }
}
}
}
"type": "http" is the Streamable HTTP transport. Microsoft's own guidance is the reason for the inputs block:
hardcoding an API key in the file is what it tells you to avoid, and a workspace mcp.json is commonly committed.
OAuth instead of a key. Replace the headers block with an oauth block naming the client identifier your
authorization server issued; Microsoft documents that the editor then runs the flow itself.
One thing to check in a remote workspace. A server defined in workspace settings runs where the workspace does, so a deployment on your laptop is not reached from a workspace opened on a remote machine. Define the entry in the settings of whichever side can actually reach the address.
Sources: Use MCP servers in VS Code, MCP configuration reference.
The Cursor editor
Cursor reads ~/.cursor/mcp.json for every project and .cursor/mcp.json for one, and its own documentation lists
stdio, SSE, and Streamable HTTP as the transports it speaks. It runs on your machine, so a loopback address works.
{
"mcpServers": {
"mailfathom": {
"url": "http://127.0.0.1:8080/mcp",
"headers": { "Authorization": "Bearer ${env:MAILFATHOM_MCP_KEY}" }
}
}
}
${env:NAME} is Cursor's own interpolation, resolved in url and headers among other fields, which is how the key
stays out of a file that is commonly committed with the project.
OAuth instead of a key. Cursor takes an auth block carrying a client identifier, a client secret, and the scopes
to request, in place of the headers block.
Sources: Model Context Protocol (MCP).
Any other client that speaks Streamable HTTP
There is no entry to look up here, and that is the point: MailFathom serves the MCP Streamable HTTP transport at /mcp
and asks for whatever its Authentication list configures, so any client implementing that transport connects with the
two facts getting started already states. Three questions decide whether a
given client is one of them, and each has an answer above rather than a setting to find:
- Can it send a header you choose? If yes, an API key is the whole configuration. If no, the deployment needs an OAuth entry, whatever the client is called.
- Where does it run? A client in somebody else's cloud needs an address published on the public internet, and serving a mailbox there is a decision about TLS and authentication rather than about the client.
- Does it speak Streamable HTTP? A client limited to the legacy HTTP+SSE transport connects to nothing here.
What a working connection looks like
Whichever client was configured, a connected one lists at least four tools — list_accounts, list_emails,
get_email_content, and search_emails — each advertising itself as read-only, non-destructive, and idempotent. Where
that list is shown is the one client-specific part: claude mcp list or the /mcp panel for the command-line tool, the
server's entry in the editor's MCP view for Visual Studio Code and for Cursor, the connector's own settings page for the
two cloud clients.
A fifth tool, ask_mail, appears only once a chat model and an embedding model are both configured and working. Its
absence is the deployment saying it cannot answer questions yet rather than a connection fault, and no client setting
changes it.
Then ask the assistant to list recent mail, and read folderFreshness in the result before reading the emails:
getting started § make the first call is what that
field means, and using the tools is the day-to-day surface.
When the connection is refused
Every refusal below comes from the endpoint rather than from the client, so it means the same thing in all five products — what differs is only where each one shows it. Verifying an enabled endpoint gives the same reading for a request made by hand.
| What the client reports | What it is | Where to look |
|---|---|---|
401, or a prompt to authenticate |
No credential, a credential that is not a bearer one, a key matching no entry, or a key whose Lifetime has passed |
API keys |
403 from a browser-based client |
The client's origin is outside McpEndpoint:Cors:AllowedOrigins |
CORS and the Origin header |
403 with no body, on an HTTPS deployment |
A configured client-certificate profile refused the certificate, or none was presented to a Required profile |
Client certificates |
429 where 401 was expected |
The shared anonymous rate-limit partition is exhausted, so the request never reached the point where a challenge is written | Rate limiting |
404, or nothing at all |
The address is wrong, the endpoint is not enabled, or a proxy in front of it does not route /mcp |
The endpoint is off by default |
| A connection that never establishes, from a cloud client | The address is not reachable from the vendor's network — loopback, a private network, or a firewall | The two cloud sections above |
A client refusing to accept the configuration at all — no field for a header, a transport it does not speak — is the other kind of failure, and it is the per-client section rather than this table that answers it.
Related
- Getting started — the whole path from an installed instance to a first tool call
- The MCP endpoint — every setting named here, with its rules: keys, OAuth, origins, TLS, client certificates, rate limits, and timeouts
- Using the tools — what each tool answers, what it bounds, and what its errors mean
- Configuring a mailbox at your provider — the other half of a working deployment
Trademarks. The product, service, and company names on this page are their owners' trademarks and are used solely to identify the client applications a MailFathom deployment can be connected from. Their use implies no affiliation with, sponsorship by, endorsement by, or certification from those owners, in either direction, and this page reproduces no third-party logo, icon, wordmark, or screenshot.
OpenAI and ChatGPT are trademarks of OpenAI, Inc. Anthropic, Claude, and Claude Code are trademarks of Anthropic, PBC.
Microsoft, Visual Studio Code, GitHub, and GitHub Copilot are trademarks of the Microsoft group of companies. Cursor is
a trademark of Anysphere, Inc.
THIRD_PARTY_LICENSES.md
records the per-owner review this statement comes out of, and why it sits here rather than in NOTICE.