Vendors could not agree on the word. Connector, app, custom app, plugin, MCP server. The Dutch search is MCP koppeling. The object is the same: a host attaches a server that speaks MCP.
MCP is the dictionary. MCP explained for founders is the ceiling. This page is the plug.
What a koppeling actually is
The host (Claude Desktop, ChatGPT, Grok, Gemini CLI, VS Code, this site’s own tools) creates one client per server. The server exposes tools (actions), resources (reads), and prompts (templates).
Two transports matter in daily work:
- Local stdio. The host starts a process on your machine and talks JSON-RPC over its standard input and output. Claude Desktop’s
claude_desktop_config.jsonis the usual example. No network and no public URL. The files it can see are the files on that machine, running as your user. - Remote HTTPS. Streamable HTTP or SSE. A cloud host can reach it. ChatGPT custom MCP needs this (or OpenAI’s Secure MCP Tunnel). Grok custom connectors reject localhost; you tunnel. Gemini managed agents attach a remote
mcp_serverURL.
That one split decides almost every “why will this not connect” question:
| Host | Local stdio | Remote HTTPS | Where it is configured |
|---|---|---|---|
| Claude Desktop | Yes | Yes | claude_desktop_config.json, or reviewed Extensions |
| ChatGPT (custom MCP) | No | Yes, required | Developer mode, then a public HTTPS URL or OpenAI’s tunnel |
| Grok (grok.com connectors) | No, localhost rejected | Yes, required | Connector settings, public URL or an xAI tunnel |
| Grok CLI | Yes | Yes | grok mcp add |
| Gemini (managed agents, CLI) | CLI only | Yes | Agent config or CLI settings, Google credentials or API key |
If the setup starts with npx and no public URL, ChatGPT will not see it until you bridge it. That is not a bug in your JSON. It is the remote-only rule.
Easy connectors, four hosts
Menus move. Recheck the first-party link before you treat a path as law. The split above is the durable part.
Claude. Desktop can install reviewed Extensions, or you paste a local server into claude_desktop_config.json and fully quit the app. The official MCP walkthrough and Anthropic’s help article both use a filesystem server: npx -y @modelcontextprotocol/server-filesystem plus the directories you allow. That is the easiest real connector: one folder, then a restart. Note what the argument list is doing. The allowed directories define the file boundary. Write tools still need a review.
ChatGPT. Built-in apps (OpenAI also still says connectors) are packaged integrations: Gmail, Drive, and similar, clicked and signed in. Custom MCP is different: developer mode, then create an app or connector pointing at a public HTTPS MCP URL, scan the tools, authenticate. OpenAI documents the connect flow and describes full write MCP as a beta for Business, Enterprise, and Edu. Plan access and workspace admin policy still apply. Do not paste an npx stdio command into ChatGPT and expect it to boot.
Gemini. Managed agents in the Gemini API can take a remote mcp_server tool at interaction time (Google’s July 2026 agent update). Gemini CLI and Cloud Agent Platform speak HTTP MCP with Google credentials or an API key. Consumer Gemini chat UI labels change; use Google’s current docs, not a screenshot from a roundup blog.
Grok. Custom connectors on grok.com need a public HTTPS URL. xAI’s tunneling doc says localhost and RFC1918 addresses are rejected. The Grok CLI can add local stdio (grok mcp add filesystem -- npx …) or remote HTTP. Same contract, two surfaces.
The MCP Registry lists published servers. It is a catalogue, not a safety review. Official reference servers (filesystem, fetch, git, memory, time, sequential thinking, everything) teach the protocol. They are educational, not production-ready. This site’s ReasonKit is a specialised reasoning server, not an official reference.
When it does not connect
The failures are boring and they repeat. Work them in this order before you blame the model.
The server never appears after you edited the config. Quit the desktop app completely, not just the window. On macOS, closing the window leaves it running. Then validate the JSON. A trailing comma is a common cause of a config the app silently ignores.
The server appears and immediately dies. Run the exact command from the config in a terminal, as the same user. Common causes are a binary missing from the app’s PATH (the app does not inherit your shell profile) and a relative path resolving somewhere unexpected. Use absolute paths in the config.
A local server connects, then behaves strangely. On stdio, standard output is the transport. Anything a server prints there that is not a valid protocol message corrupts the stream. Logs go to stderr. If you wrote the server, check for a stray print before you check anything else.
A remote server 404s or hangs. Confirm the URL is the MCP endpoint, not the marketing page, and that it is reachable from outside your network. A tunnel that expired looks exactly like a broken server.
Auth loops. Remote connectors that use OAuth need a callback the host can actually reach, and a token whose audience is that server. A token issued for something else is not a substitute.
Tools are listed but never called. That is not a connection failure. Check the host allowlist, then the tool names and descriptions. Fix those before you rewrite the prompt.
Before you attach someone else’s server
A remote connector is an integration with somebody else’s infrastructure, holding credentials you issued.
Five questions, in writing, before you click connect:
- Who runs it? A named company or maintainer, not a GitHub handle you found in a thread.
- Whose credentials does it hold, and at what scope? One credential per server. Never a shared admin token.
- What does it log, and can you get your own trail out?
- Read or write? Attach the read-only version first, always, even when the write version is one checkbox away.
- What happens when you revoke it at 17:00? If nobody knows, you have not attached a tool. You have taken a dependency.
One more thing that gets skipped. Tool descriptions and tool output are untrusted input. A server describes its own tools, and a fetched page can contain text that looks like an instruction. The specification tells clients not to trust tool annotations unless the server itself is trusted, and the same logic runs downstream: content a tool returns is data, not orders. A connector that reads the open web and can also write somewhere is the shape of the problem, not a convenience.
Daily workflow without a hole
- Decide read vs write. Attach a read-only connector first.
- Name an owner in the repo or the settings note.
- Fill the three reads: visibility, mutation, log. If you cannot reconstruct Tuesday, do not enable send.
- Review the first ten write calls in full. Then use the log to decide whether any reversible gate can be relaxed. Keep irreversible writes gated.
- Re-read the host’s help article when the Settings tree moves. It will.
A koppeling that “just works” with write access is a junior hire with root. The plug is easy. The ceiling is the work.