MCP isn’t magic. Most people are using it wrong.
Everyone’s treating MCP Explained like a new religion. USB-C for AI! Plug anything into Claude! I’ve watched friends paste ten servers into a config file, approve every tool call on autopilot, then wonder why their context window exploded or a random npm package just got filesystem rights.
MCP (Model Context Protocol) is useful. It’s also just a protocol. Anthropic open-sourced it on 25 November 2024. On 9 December 2025 they donated it to the Agentic AI Foundation under the Linux Foundation (co-founded with Block and OpenAI) so it wouldn’t stay single-vendor. As of that donation post: 10,000+ active public servers and 97M+ monthly SDK downloads across Python and TypeScript. The hype is earned. Careful setup is what most posts skip.
I figured this out the hard way after a half-working filesystem connector and a silent hang that only made sense once I read the stdio rules. Here’s the version I wish I’d had on day one.
Hands-on: give Claude real folders in about ten minutes
Local and boring on purpose. No custom Python server yet. Official filesystem server only – so you feel the approval loop and see tools appear.
You need Claude Desktop (latest) and Node.js (LTS is fine; check with node --version). Per the official connect-local-servers guide, open Claude’s system menu → Settings → Developer → Edit Config. That opens or creates claude_desktop_config.json here:
- macOS:
~/Library/Application Support/Claude/ - Windows:
%APPDATA%Claude
Drop in a minimal block. Swap the username. Keep paths to folders you’re actually okay letting the model touch:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/Desktop",
"/Users/yourname/Downloads"
]
}
}
}
On Windows use doubled backslashes or forward slashes, e.g. C:\Users\yourname\Desktop. A single is a JSON escape and will silently wreck the path.
Save. Then fully quit Claude Desktop – menu/tray quit, not the red X. Restart. In a new chat hit the connectors control, manage connectors, and you should see filesystem with its tools (read, write, move, search, and the rest).
Try: “Write a short poem and save it as poem.txt on my Desktop.” Claude proposes a tool call. You approve or deny. That consent step is the security model for local tools. Don’t train yourself to click yes forever.
Pro tip: One or two sandbox directories only. The server runs as you. Anything you can delete, it can delete after you approve the call.
What actually moved when you did that
Host, not magic. Claude Desktop spun up one client for this server. The npx process speaks JSON-RPC over stdio and advertises tools; the model never dials the server directly – the host brokers every call. Spec shape people still cite (current docs widely reference the 2025-2026 protocol line on modelcontextprotocol.io): tools are model-controlled, resources are app-pulled context, prompts are user-picked templates. You just used tools.
Docs still push the USB-C line. Fair enough as a slogan. Same pattern shows up for remote servers over Streamable HTTP, and once configured the same server can appear in Cursor, VS Code, ChatGPT-compatible clients, Gemini, and others (ecosystem picture as of late 2025).
Ever notice how the setup feels too small for the amount of blog ink spilled on “agentic architecture”? That’s the point – the protocol is thin; your allowlist and approval habits are the real product.
Common pitfalls that waste an afternoon
These bit me or show up constantly in community threads – not the polished “restart and try again” list.
- Stdout is sacred on stdio. The transport reserves stdout for newline-delimited JSON-RPC only. One
console.log,print(), or library banner corrupts the stream and the client drops. Spec language is blunt (stdio transport): the server MUST NOT write non-message data to stdout; logging goes to stderr (console.error,print(..., file=sys.stderr)). Still the top “it connected then died” failure for first-time server authors. - Config only loads on a full restart. Closing the window is not enough. Quit completely, reopen, then check connectors if the server is missing.
- Remote ≠ your laptop’s network. Custom/remote connectors in Claude are dialed from Anthropic’s cloud, not from your device. A server only reachable on your VPN or LAN fails even when local
curlworks. Local stdio is the path that uses your machine – see Claude’s custom connectors help article. - Path and package hygiene. Absolute paths only. On Windows watch JSON escaping. Prefer maintained packages; deprecated reference servers can still rank in agent suggestions and keep drawing downloads long after they stop getting security patches. Treat community servers like any other executable you didn’t write.
What “good” feels like once it works
Tight filesystem allowlist: Claude stops asking you to paste folder listings. It proposes a read, you approve, it answers from real files. Multi-step jobs – sort Desktop images, draft a note from two downloads – work when each tool call stays small.
Open every tool or dump a giant schema and context burns for no gain. Latency is mostly spawn + model think + your approval. Local stdio is snappy for file ops; remote adds network and auth. Neither is free if the model loops tool calls. You are the rate limiter via consent.
When you should not reach for MCP
Default no: if a single REST call or the host’s built-in file picker already finishes the job, skip MCP. Same if you can’t sit on the approval prompt (unattended agents with write/delete), or if the only server on offer is an unmaintained npx package with broad privileges.
Stacking ten servers “just in case” makes the tool list noise; the model gets worse at picking. MCP is worth it when one well-scoped capability must work across Claude, Cursor, and friends without rewriting integrations. One sharp server beats a junk drawer.
FAQ
Is MCP free?
The protocol and reference SDKs are open. Your Claude/Cursor plan and any third-party API keys behind a server are separate. No MCP tax on the wire format itself.
Do I need to build a server to try MCP Explained hands-on?
No. Start with @modelcontextprotocol/server-filesystem exactly as above. Once that approval loop feels normal, pick one hosted connector your plan supports or follow the Python/TypeScript SDK quickstarts on modelcontextprotocol.io. Building comes second. Feeling the consent UX comes first.
Why did my remote MCP work in the browser but not from home?
Wrong mental model. Claude’s remote connectors leave Anthropic’s infrastructure, not your Wi-Fi – so home-lab and VPN-only boxes reject them even when a browser test looked fine. Public + proper auth, or stay on local stdio for private tools.
Next action: one throwaway folder, filesystem server, full quit, relaunch, ask it to list that folder, stop. When that loop is boring, add the second tool you actually need – nothing else.