The first MCP servers everyone copied were local processes. command, args, npx -y something@latest. That matched the spec's stdio transport: Cursor spawns a subprocess and talks over stdin and stdout.
Vendors then started hosting the same protocol on a URL. GitHub, Figma, Notion, Linear, Supabase, Sentry, Stripe, Context7. You put "url": "https://..." in mcp.json and finish OAuth. Cursor's docs call that Streamable HTTP (and still mention SSE for older endpoints).
In this directory, eight of ten are that URL shape. Two are still npx.
The split in this list
Remote HTTP:
- Context7
https://mcp.context7.com/mcp - GitHub
https://api.githubcopilot.com/mcp/ - Figma
https://mcp.figma.com/mcp - Notion
https://mcp.notion.com/mcp - Linear
https://mcp.linear.app/mcp - Supabase
https://mcp.supabase.com/mcp - Sentry
https://mcp.sentry.io/mcp - Stripe
https://mcp.stripe.com
Local stdio:
- Playwright
npx -y @playwright/mcp@latest - Firecrawl
npx -y firecrawl-mcpplusFIRECRAWL_API_KEY
GitHub still publishes a local Docker path. Figma still has a desktop server on 127.0.0.1:3845. The pages here lead with the hosted URL because that is what Cursor users can paste without babysitting a process.
When the URL is enough
If the data already lives on someone else's servers, a URL is enough. GitHub issues are not on your laptop. Neither is Stripe. Neither is Figma's file (unless you insist on the desktop app).
Remote MCP also behaves better when Cursor itself is not a simple local window. stdio is a child process of the editor. SSH, remote workspaces, and "Node is not on PATH in the environment Cursor launched" are how those child processes die. A URL does not care whether npx works.
Auth is usually OAuth in a browser, which is less ugly than pasting a PAT into chat. GitHub's Cursor install doc still shows a Bearer PAT on the hosted URL if you go that way. Restricted keys beat "I dumped the secret key in the prompt."
When you still want stdio
Playwright has to drive a browser you can see, against localhost. Microsoft's server is explicit about that. Node 18 or newer. First run may download browsers. Their README also says it is not a security boundary.
Firecrawl could theoretically be a hosted MCP. The install this site documents is the local npx server with an API key, because that is what their MCP docs led with when these pages were written. If they publish a URL later, match their page.
stdio is also how you talk to something that only exists as a file on disk. That is not this directory.
The first time npx hangs on train Wi-Fi, you will convert to the URL and you will not convert back.
What Cursor puts in the JSON
Remote, from Cursor's docs, is a url and optional headers. Local is command, args, optional env. Do not mix them on one server.
Older snippets still say "type": "sse" and a trailing /sse. Linear in particular has been documented both ways. If the URL 404s, open the vendor's current page and copy that path. Guessing /mcp vs /sse is a sport I have already lost.
A boring rule
If the vendor hosts it, use the URL. If the tool needs your browser or your filesystem, use stdio, and read Stdio and the trust dialog before you click through.
