How-to · Setup

How to connect Claude and ChatGPT to your own files, apps and data with MCP

MCP is how Claude and ChatGPT reach our files, databases and apps. The setup is five lines of JSON, and the first attempt fails for most people. This is the config, the quit-and-relaunch rule, the log to open, and the differences between the three clients.

SansserTested by us
Advanced30 min9 steps
You'll useClaudeChatGPTMCP
The problem

My MCP server does not show up. Connect Claude and ChatGPT to your apps and data with MCP: config file paths, remote custom connectors, OAuth, plan limits and the log to open when it fails.

Step 1

Know which of the two kinds we are setting up

MCP, the Model Context Protocol, is a standard way for an AI client to call tools that live outside it. A server exposes tools, such as read a file, run a query or search a mailbox. The client, Claude Desktop, Claude Code, claude.ai or ChatGPT, lists those tools and the model calls them. There are two kinds of server and they are set up in different places, which is where most confusion starts.

A local server is a program on our own computer. The client launches it and talks to it over standard input and output, which the docs call stdio. It goes in a config file, and it can reach anything on our machine, which is why we give it only the folders it needs. A remote server is a URL on the internet, usually ending in /mcp, speaking what the spec calls Streamable HTTP. It goes in as a custom connector, signs us in with OAuth, and never sees our disk.

Claude Desktop takes both. Claude Code takes both. claude.ai in the browser takes only remote. ChatGPT takes only remote, and only with developer mode on. If we remember just one thing, it is this: a URL never goes in the local config file, and a local command never goes in the connectors screen.

Where does the thing we want to connect live?
Step 2

Install a runner and start the server by hand once

Most published local servers are run with npx (Node.js packages) or uvx (Python packages). Install Node.js from nodejs.org for the first and uv from astral.sh for the second. Then run the server once from a terminal before touching any config. If it does not start here, no client will start it either, and the terminal shows the error in plain text instead of a greyed-out menu.

The filesystem server from the MCP project is the right first server. It takes the folders it may touch as arguments and refuses everything else. Pick one folder we would be fine with a stranger reading. It starts, prints a line, and waits. That waiting is correct, it is listening for a client. Ctrl+C to stop it.

Note the full path of npx or uvx while we are here. Desktop apps on macOS and Windows do not always see the PATH that our terminal sees, and the full path is the fix in step 6.

Terminal
$ node --version
$ npx -y @modelcontextprotocol/server-filesystem /Users/you/Desktop
# starts and waits for a client. Ctrl+C to stop.
$ which npx
# note this path. Windows: where npx (it ends in npx.cmd)
Step 3

Open the config file from Claude Desktop

Claude Desktop reads local servers from one file: claude_desktop_config.json. The way in is Claude menu, Settings..., Developer, Edit Config. That opens the folder with the file, and creates an empty one if it is missing. We can also go straight there.

On macOS the file is ~/Library/Application Support/Claude/claude_desktop_config.json. On Windows it is %APPDATA%\Claude\claude_desktop_config.json, which is C:\Users\you\AppData\Roaming\Claude once expanded. The Library and AppData folders are hidden by default, so paste the path into the Finder Go to Folder box or the Explorer address bar.

Open it in a real text editor, not TextEdit with smart quotes or Notepad with a hidden .txt suffix. Curly quotes are the most common reason a config refuses to parse, and the app does not tell us; it just shows no server.

If the Developer section is missing, update Claude Desktop first, older builds do not have it. If Edit Config opens an empty file, that is normal, we fill it in the next step. Once the file holds more than one server, copy it somewhere before each edit. The app does not back it up and does not warn when it cannot read it, so a bad edit silently removes every server at once, not just the new one.

ClaudeClaude Desktop · Settings
Claude menuSettings...Developer
DeveloperLocal MCP servers live here
Edit ConfigOpens the folder that holds claude_desktop_config.json
Edit Config
macOS
~/Library/Application Support/Claude/
Windows
%APPDATA%\Claude\
Recreated from Claude Desktop, October 2026. Labels as they appear in the app.
Step 4

Write the config, with absolute paths and nothing else

The file is one JSON object with an mcpServers key. Each server is a name we choose, a command, and an args list where every argument is its own string. The name becomes the log filename, so keep it short and lowercase.

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/you/Desktop"]
    }
  }
}

Rules that save an hour. Paths are absolute: /Users/you/Desktop, not ~/Desktop or ./docs, because the app does not expand them. On Windows every backslash is doubled inside JSON, C:\\Users\\you\\Desktop. No trailing commas and no comments, JSON allows neither. A second server is a second key inside mcpServers, not a second mcpServers. Secrets such as API keys go in an env object on the server, never in args, because args show up in the process list.

The generator below writes the JSON and, under it, the matching Claude Code one-liner from step 7. It cannot know whether we picked npx or uvx when it writes the -y flag, so with uvx delete that one argument. For the claude.ai connector option, read the comment it prints: local servers cannot be added there at all.

MCP config generator
Your text
Step 5

Fully quit, relaunch, and ask it to use the server

Claude Desktop reads the config once, at launch. Closing the window does not relaunch anything, the app is still running in the menu bar or the tray. Quit it from the Claude menu on macOS (or Cmd+Q), or from the tray icon on Windows, then open it again. This one rule explains about half of the "it does not show up" reports.

After the relaunch, the server appears in the tools list under the chat input and its tools can be turned on and off there. Ask something that needs it, plainly: list the files on my Desktop. The first call asks for permission to use the tool. Allow it for this chat, read what it did, then widen the permission if we are happy.

The logs are where we go when the list is empty. On macOS they are in ~/Library/Logs/Claude/: mcp.log for the app's view of all servers, and mcp-server-NAME.log for what each server printed. On Windows they are in %APPDATA%\Claude\logs. Open the server's own log first; a startup error is on the first few lines.

ClaudeChat
List the files on my Desktop and tell me which ones are PDFs.
I used the filesystem server to read /Users/you/Desktop. There are 14 files. Three are PDFs: invoice-0922.pdf, lease-2026.pdf and handbook-2026.pdf. Do you want me to open any of them?
Recreated. The first tool call shows a permission prompt. If the model answers from memory and never mentions the server, the server is not loaded.

TipKeep a terminal open with tail -f ~/Library/Logs/Claude/mcp*.log during the first setup. Errors appear there the moment the app launches, long before the UI gives any hint.

Step 6

When the server does not show up

The failures are the same for everyone, and they come in a fixed order. We check them in that order and stop at the first one that applies. A full quit first, because it is free. Then the JSON, because a single curly quote or trailing comma makes the app ignore the whole file in silence. Then the kind of server, because a URL in the local config can never work. Then the server's own log.

The log tells us which of three things happened. ENOENT or a spawn error means the app could not find the command. On Windows this is nearly always because the app launched without the PATH or the APPDATA variable that npx needs, and the fix is to put the full path to npx.cmd in command and add an env object with APPDATA set to the expanded path, C:\\Users\\you\\AppData\\Roaming. On macOS, use the full path from which npx. A log that is missing or empty means the app never tried, so the problem is upstream: JSON or a path. A server that starts and then fails on the first call is usually a relative path or a folder it was not given.

For remote servers the question is different: can Anthropic's cloud reach the URL? A connector is contacted from Anthropic's servers, not from our laptop, so localhost, a LAN address or a VPN-only host will time out, and an OAuth flow that completes but returns 403 means the token is valid but the server is refusing that account.

Step 7

Claude Code: one command, three scopes

Claude Code does not use claude_desktop_config.json. It has its own command that writes the right file for us, and it takes both kinds of server.

# a local stdio server
claude mcp add --transport stdio filesystem -- npx -y @modelcontextprotocol/server-filesystem /Users/you/Desktop

# a remote server, with a token if it needs one
claude mcp add --transport http docs https://host.example/mcp --header "Authorization: Bearer ..."

claude mcp list

The --scope flag decides who gets it. local is the default: this project, this machine, our user only, stored in ~/.claude.json. user is every project on this machine, also in ~/.claude.json. project writes a .mcp.json in the repo so the whole team gets the server when they pull; commit it, and keep secrets out of it by using headers that read environment variables or a server that does OAuth. Inside a session, /mcp lists the servers, shows which are connected, and runs the OAuth sign-in for a remote one. If a remote server needs a login, run /mcp before asking for anything that uses it.

Project scope is the one to be careful with in both directions. A .mcp.json we commit lets everyone who clones the repo launch that command on their machine, so Claude Code asks for approval before it uses a repo's project servers the first time. Read the file before saying yes to one in a repo we did not write, the same way we would read a script before running it.

Terminal · Claude Code
$ claude mcp add --transport stdio filesystem --scope project -- npx -y @modelcontextprotocol/server-filesystem /Users/you/Desktop
$ claude mcp list
filesystem: npx -y @modelcontextprotocol/server-filesystem /Users/you/Desktop (stdio)
$ claude
> /mcp
# shows each server, connected or not, and signs in to remote ones
Step 8

Remote servers in claude.ai and Claude Desktop: a custom connector

A remote server is added from the connectors screen, and it is the same screen in the browser and in the desktop app. Customize, Connectors, + Add, Add custom connector. We give it a name, the URL (https://host/mcp, speaking Streamable HTTP), and an authentication choice: Sign in now, Sign in when needed, or No sign in. If the server hands out its own OAuth client, there is a field for that, and there is an optional request headers section for an API key. Then Add.

As of 28 October 2026 custom connectors are on every plan including Free, with Free limited to one custom connector. On Team and Enterprise plans only Owners can add them, so if the button is missing that is why. One quirk to know before we type: a connector cannot be edited. To change the URL or the auth, remove it and add it again.

Sign in when needed is the safe default. The first tool call opens the server's OAuth page in a browser tab, we approve, and the token is stored with the connector. If the sign-in page never loads, or completes and the tools still fail, go back to the tree in step 6: Anthropic's cloud has to reach the server, and the server has to accept the account.

ClaudeClaude · Add custom connector
CustomizeConnectors+ AddAdd custom connector
Name
Docs search
Remote MCP server URLStreamable HTTP, usually ends in /mcp
https://host.example/mcp
AuthenticationSign in now / Sign in when needed / No sign in
Sign in when needed
OAuth client ID and secretOnly if the server gave us one
Request headersOptional, for an API key
Add
Add
Recreated from the help centre steps. Connectors cannot be edited after this screen; remove and add again to change anything.
Step 9

ChatGPT: developer mode and a public server

ChatGPT connects to MCP servers only as remote connectors, and only after developer mode is switched on. Settings, Connectors (the section is called Apps in some builds), Advanced, Developer mode. Back on the connectors page a + appears with Add custom MCP server. The server needs a public HTTPS endpoint, usually /mcp, with OAuth or no auth, and ChatGPT shows a warning about unverified servers that we accept before it is added.

Which plans get it is the part we could not pin down. As of 28 October 2026 OpenAI's own pages say custom MCP servers with write actions are for Business and Enterprise and Edu, Pro accounts are limited to read and fetch style tools, and sources disagree about Plus. Check in the app: if Developer mode is not under Advanced, the plan does not have it. We will update this line when the help centre settles.

The security warning is not boilerplate. A connector sees whatever the server lets it see, and a server we did not write can return text that tries to steer the model. The same rule as for Claude applies: start with a server we run or a vendor we trust, read-only tools first, and widen once we have watched it work for a week.

ChatGPTChatGPT · Settings
SettingsConnectorsAdvanced
Developer modeAllows custom MCP servers. Not on every plan.
Add custom MCP serverPublic https endpoint, OAuth or no auth
+ Add
Unverified server warningRead it, then accept
Recreated. Menu labels as of 28 October 2026; the Connectors section appears as Apps in some builds.
Check

You're done when

Questions

Questions people are asking

Why is my MCP server not showing up in Claude Desktop? In order of likelihood: the app was closed but not quit, so the config was never re-read; the JSON has a curly quote or a trailing comma; a path is relative; or a remote URL was put in the local config. Open mcp-server-NAME.log in the Claude logs folder and work through the tree in step 6.

Where is claude_desktop_config.json on Windows? In %APPDATA%\Claude\claude_desktop_config.json, which expands to C:\Users\you\AppData\Roaming\Claude. The quickest route is Claude menu, Settings..., Developer, Edit Config, which opens that folder. Inside the JSON, every backslash in a path is doubled.

Can I use MCP in ChatGPT on Plus? As of 28 October 2026 OpenAI's pages disagree. Custom MCP servers with write actions are documented for Business, Enterprise and Edu, Pro is limited to read and fetch tools, and Plus varies by source. Open Settings, Connectors, Advanced: if Developer mode is there, the plan has it.

What is the difference between a local MCP server and a custom connector? A local server is a program on your computer that the client launches and talks to over stdio; it goes in the config file or the claude mcp add command. A custom connector is a remote server at an https URL that Anthropic's cloud contacts on your behalf, with OAuth. Local servers can read your disk; connectors cannot.

Is it safe to give Claude access to my files? Safe enough if the server only gets the folders it needs. The filesystem server refuses anything outside the paths in its args, so start with one folder and never the home directory. Every tool call asks for permission the first time, and a server you did not write should start read-only until you have watched it work.

Sources

  1. Model Context Protocol, Connect to local MCP servers modelcontextprotocol.io/docs/2026-07-28/develop/connect-local-servers.md
  2. Claude Help Center, Building custom connectors via remote MCP servers support.claude.com/en/articles/11175166
  3. Claude Code docs, Connect Claude Code to tools via MCP code.claude.com/docs/en/mcp
  4. OpenAI Help Center, Custom MCP servers and developer mode in ChatGPT help.openai.com/en/articles/12584461
  5. OpenAI Developers, Connect your MCP server to ChatGPT developers.openai.com/apps-sdk/deploy/connect-chatgpt
  6. OpenAI Developer Community, MCP server tools now in ChatGPT: developer mode community.openai.com/t/mcp-server-tools-now-in-chatgpt-developer-mode/1357233
  7. GitHub, anthropics/claude-ai-mcp issue 664, tool calls never reach Filesystem servers after Desktop update github.com/anthropics/claude-ai-mcp/issues/664
  8. GitHub, anthropics/claude-ai-mcp issue 326, custom connector fails with authorization error github.com/anthropics/claude-ai-mcp/issues/326
Newsletter

One email a week. Written by people.

New how-tos, the tools we tested and what we think, in one short email.

Free · Unsubscribe anytime