Skip to content
Guide · Start here

Local vs remote MCP servers: stdio vs Streamable HTTP

How stdio and Streamable HTTP MCP servers differ on setup, auth, latency and security, when to use each, and how to find remote servers on MCPpedia.

Updated 6 min read

Every MCP server reaches its client through a transport, and the MCP specification defines two of them. stdio is for local servers that your client starts as a program on your machine. Streamable HTTP is for remote servers that live at a URL. This guide explains how each works, how they differ on auth, latency and security, how to configure both in popular clients, and how to tell them apart on MCPpedia.

A third transport, HTTP with Server-Sent Events (SSE), was deprecated when Streamable HTTP arrived in the 2025-03-26 revision of the spec. Many clients still accept it for older servers, but new servers should use Streamable HTTP.

How stdio works

With stdio, the client launches the server as a child process, usually with a command such as npx, uvx or docker run -i. The two sides exchange JSON-RPC messages over the process's standard input and output, one message per line. Anything the server wants to log goes to standard error.

Two consequences follow:

  • Stdout is reserved for the protocol. A stray print or console.log corrupts the stream. This is one of the most common reasons a local server fails, and it's covered in the troubleshooting guide.
  • The server lives and dies with the client. It starts when the client connects, runs with your user's permissions, and stops when the client closes it. Only that one client can talk to it.

How Streamable HTTP works

With Streamable HTTP, the server is a web endpoint, typically a path like https://example.com/mcp. The client sends each JSON-RPC message as an HTTP POST. The server answers with a single JSON response or streams events back on the same response when an operation takes longer.

Because it is plain HTTPS, a remote server can sit behind a load balancer, serve many users, and run on the vendor's infrastructure instead of yours. Remote servers usually authenticate with OAuth, so you approve access in a browser instead of pasting a key into a file.

Side-by-side comparison

Local (stdio)Remote (Streamable HTTP)
Where it runsYour machine, as your userThe operator's servers
Who starts itYour client, as a child processAlready running at a URL
Typical installnpx, uvx, Docker, a binaryA URL in your client config
CredentialsEnvironment variables in your configOAuth sign-in, or a header token
Reaches local files and networksYesNo, unless exposed publicly
Works offlineYes, if the tool itself doesNo
UpdatesWhen you change the versionWhenever the operator deploys
Hosted clients such as ChatGPTNot supportedSupported

Authentication

Local servers get credentials from their environment. The authorization part of the spec is written for HTTP transports. It says stdio implementations should not follow the OAuth flow and should read credentials from the environment instead. In practice you put an API key in the server's env block, ideally as a variable reference rather than a literal secret.

Remote servers use OAuth 2.1. The client discovers the authorization server from the MCP server's metadata, opens a browser for you to sign in, and stores the token. Many servers also accept a static bearer token in an Authorization header, which is simpler for automation but means a long-lived secret sits in a config file. Read the scopes on the consent screen, and see the security best practices guide for what to grant.

Latency and reliability

We aren't aware of a neutral benchmark comparing the two, so here are the mechanics rather than numbers.

  • stdio has no network hop between client and server, but the process has to start. The first run of an npx or uvx server may download the package, which can take long enough to hit a client's startup timeout.
  • Streamable HTTP adds a network round trip to every call, plus OAuth discovery the first time you connect. Once connected there is nothing to install or start.

For servers that wrap a third-party API, the API call usually dominates either way. Reliability differs more than speed. A local server breaks when your PATH, Node version or environment is wrong. A remote one breaks when the network or the operator's service is down.

Configuring each kind

The config shape differs by client. In Claude Code, choose the transport with a flag:

# Remote server over Streamable HTTP
claude mcp add --transport http notion https://mcp.notion.com/mcp

# Local server over stdio
claude mcp add --env API_KEY=YOUR_KEY --transport stdio example -- npx -y example-mcp-server

In Cursor's mcp.json, a remote entry has a url and a local entry has a command:

{
  "mcpServers": {
    "remote-example": { "url": "https://example.com/mcp" },
    "local-example": { "command": "npx", "args": ["-y", "example-mcp-server"] }
  }
}

VS Code uses .vscode/mcp.json with a top-level servers key and an explicit "type": "http" for remote entries. Claude Desktop runs local servers from claude_desktop_config.json and adds remote servers as connectors in its settings. ChatGPT accepts remote URLs only. The client pages list the file and format for each app, and the step-by-step guides for Claude Code and Cursor go further.

If a client can only start local commands, the mcp-remote package can bridge it to a remote URL. Most current clients connect to URLs natively, so use the bridge only when you have to.

How MCPpedia marks remote servers

Every listing records whether the server has a hosted endpoint, an installable package, or both.

  • The Remote badge. A globe badge on cards and server pages means the listing has a remote endpoint.
  • The remote list. Remote MCP servers collects every listing you can install with a URL, which is what ChatGPT and other hosted clients need.
  • The Transport filter. In the directory, the Transport filter splits listings into Remote (a URL only), Local (no remote endpoint) and Hybrid (both).
  • The install panel. For a remote server it generates a URL-based config for each client. For a local one it generates the command, arguments and environment variables.

Each server page's FAQ also answers whether that server supports remote connections, and over which transport.

Which should you choose?

  1. The tool needs your machine: files, a local database, a browser, a device on your network. Use a local server.
  2. A vendor runs a server for a service you already use: Notion, Linear, Sentry and Atlassian all do. Prefer the vendor's remote server over a community wrapper.
  3. You need offline use or a private network: local.
  4. You use ChatGPT or another hosted client: remote is the only option.
  5. You manage a team: remote servers are easier to approve, update and revoke centrally. For local ones, pin versions and allow-list exact commands.
  6. You're publishing a server: offer both if you can. A package for local use plus a hosted URL covers every client.

Neither kind is safer by default. A local server runs code as you. A remote server sees the data you send it. Our blog post on remote vs local MCP servers looks at how the directory splits between the two.

Frequently asked questions

What is the difference between a local and a remote MCP server?

A local server is a program your client starts on your machine and talks to over stdio. A remote server is already running at a URL and is reached over Streamable HTTP, usually with an OAuth sign-in instead of an API key in your config.

Is the SSE transport still supported?

HTTP with Server-Sent Events was deprecated in the 2025-03-26 revision of the MCP specification, when Streamable HTTP replaced it. Many clients still accept SSE for older servers, but new servers should use Streamable HTTP.

Can ChatGPT use local MCP servers?

No. ChatGPT connects to remote servers by URL only, and calls them from OpenAI's network, so the server needs a public HTTPS endpoint. The remote servers list shows every listing you can add with a URL.

Can one MCP server support both stdio and HTTP?

Yes. Many servers publish a package for local use and also run a hosted endpoint. MCPpedia calls these hybrid listings, and the directory's Transport filter can show them on their own.

Servers mentioned

  • Trust score 38 of 100, Limited

    mcp

    Unknown author

    Official Notion MCP server

    OfficialRegistryRemote
    LicenseQualityMaintenanceLicense: Not graded. No license is recorded for this server.Quality: Not graded. No README or tool list has been captured yet.Maintenance: Not graded. No commit or release date has been recorded.
    — stars—/wk weekly downloads— tools
  • Linear logo
    Trust score 60 of 100, Good

    Linear

    Unknown author

    Find and manage issues, projects, and documents in your Linear workspace.

    OfficialRegistryRemote
    LicenseQualityMaintenanceLicense: Not graded. No license is recorded for this server.Quality: Not graded. No README or tool list has been captured yet.Maintenance: Not graded. No commit or release date has been recorded.
    — stars—/wk weekly downloads— tools
  • Trust score 63 of 100, Good

    MCP server for Sentry - error monitoring, issue tracking, and debugging for AI assistants

    OfficialRegistryRemote
    LicenseQualityMaintenanceLicense: Not graded. No license is recorded for this server.Quality: Not graded. No README or tool list has been captured yet.Maintenance: Not graded. No commit or release date has been recorded.
    — stars—/wk weekly downloads— tools
  • Atlassian Rovo MCP Server logo
    Trust score 59 of 100, Fair

    Connect to Atlassian Jira, Confluence, Loom, and more to search, create, and manage your work.

    OfficialRegistryRemote
    LicenseQualityMaintenanceLicense: A. Apache-2.0 is a permissive open source license.Quality: D. 48/100 for listing completeness. Lost points: short README, no listed tools, short summary.Maintenance: A. Last commit or release 13 days ago.
    1.1K stars—/wk weekly downloads— tools