stdio MCP servers only run as local child processes — remote clients can't reach them. Here's how to import any MCP server (stdio/SSE/HTTP) into MCP2Skill and expose it as a unified HTTP MCP gateway endpoint with API-key auth, safe for external networks. No code required.
stdio is the most common MCP transport, and also the most restricted: the server runs as a child process of whichever client launched it, so no client on another machine can ever connect to it. Converting a stdio MCP server to HTTP MCP turns it into a standard endpoint with a URL, authentication, and remote reachability — without changing a single line of server code.
That is exactly what MCP2Skill does: a desktop app that imports MCP services of any protocol (stdio, SSE, Streamable HTTP), runs them once, and exposes them through a unified HTTP MCP gateway endpoint. You can enable API-key authentication on that endpoint and use it safely across external networks. This guide walks through the whole conversion.
Why a stdio MCP server needs to become HTTP
The stdio transport works like this: the client launches the MCP server as its own child process and communicates over stdin/stdout. The design is simple and reliable, but it imposes three hard constraints.
Local-machine only
Child-process communication requires the client and server to be on the same machine. Your filesystem MCP, your local database MCP, the MCP wrapping an internal script — all invisible to a client on another laptop, a cloud agent, or a CI runner. stdio has no URL, no port, and no concept of "remote".Every client spawns its own copy
Whoever connects to a stdio server has to start it. Three clients using the same filesystem server means three independent processes in memory. When the server updates, each client restarts its own copy too.Secrets scattered across client configs
A stdio server's API keys are injected as environment variables — stored in every client's config file. Rotating a credential means hunting down every copy. And there is no central log of who called the server with what.
HTTP flips this around: the server is a long-running process with a URL, and any client that can reach that URL can connect — while "who can reach it" becomes something you can enforce with authentication. This is why the MCP specification made Streamable HTTP the recommended HTTP transport and defined authorization (an OAuth 2.1 subset) for HTTP transports only: the network boundary is where a security boundary belongs.
What "stdio to HTTP" actually converts
The conversion is a transport translation, not a server rewrite. The gateway plays two roles at once: to the upstream stdio server, it is an MCP client — spawning the process, speaking stdin/stdout; to your AI clients, it is an HTTP MCP server — exposing a URL, enforcing auth, serving tool lists.
MCP2Skill gateway (desktop app)
Claude Code ─┐ ┌────────────────────┐ ┌─► filesystem MCP (stdio child process)
Cursor ─┼─ HTTP ─► transport + auth ──stdio─┼─► github MCP (stdio child process)
cloud agent ─┘ one URL└────────────────────┘ as-is └─► internal API MCP (SSE/HTTP forwarded)
The translation is bidirectional and protocol-transparent: tools/list and tools/call requests from clients pass through the gateway to the stdio server unchanged, and responses come back the same way. Tool behavior doesn't change at all — what changes is who can reach the server and how.
The same mechanism is universal: remote MCP services over SSE or Streamable HTTP can be imported too and land behind the same HTTP gateway endpoint. So the more precise framing is — any protocol in, unified HTTP out.
Prerequisites
A machine running MCP2Skill (download from mcp2skill.com); your stdio servers run on this machine
At least one existing stdio MCP server (an existing Claude Code / Cursor config is the fastest start — you can import it directly)
For external-network use: an API key you intend to enable (step 3 below), and the gateway port allowed through your firewall
Step 1: Import the stdio server into MCP2Skill
Open the MCP page in MCP2Skill, add a service, choose the STDIO type, and fill in four things: the command (e.g. npx), the arguments (e.g. -y @modelcontextprotocol/server-filesystem /path), the environment variables (put this server's API keys here — client configs will no longer need them), and the working directory.
If the server already exists in one of your client configs, skip the typing: MCP2Skill imports existing configurations from Claude Desktop, Claude Code, Cursor, Gemini CLI, and Codex, plus clipboard and local JSON files. Commands, arguments, and keys come over in one pass. See MCP service management for details.
After saving and enabling, MCP2Skill launches the stdio process and fetches its tool list — from that point the process is run once by the gateway, and clients stop spawning their own copies.
Step 2: Get the unified HTTP endpoint
With the service enabled, the gateway (listening on 127.0.0.1:3571 by default) generates an HTTP endpoint for it. Three granularities to choose from:
Endpoint Path shape Best for
Single service /mcp/{service} Exposing or debugging exactly one stdio server
Workspace /workspace/{name} Long-term use: a curated set of services with tool scoping per project/client
ALL /all Connectivity checks and troubleshooting; not for permanent exposure
On the service or workspace detail page, click "Copy JSON" to get a ready-made client config with the URL and headers filled in. For a service named filesystem (auth disabled):
{
"mcpServers": {
"filesystem": {
"type": "http",
"url": "http://127.0.0.1:3571/mcp/filesystem",
"headers": {
"X-Title": "Claude Code"
}
}
}
}
At this point, local clients already work: paste the JSON into ~/.claude.json, Cursor's ~/.cursor/mcp.json, or any MCP-capable client. They now connect to an HTTP URL instead of a child process. The stdio → HTTP conversion is done; the remaining two steps answer "can other machines use it, and is it safe to let them".
Step 3: Enable API-key authentication
By default the gateway binds to 127.0.0.1 only — nothing outside the machine can reach it. That default is deliberately conservative. Before opening anything up, the first move is authentication, not networking.
Enable API-key auth in the Settings page. Every request must then carry an Authorization: Bearer header, or the gateway rejects it. Copy the JSON again after enabling — the auth header is now included automatically:
{
"mcpServers": {
"filesystem": {
"type": "http",
"url": "http://127.0.0.1:3571/mcp/filesystem",
"headers": {
"X-Title": "Claude Code",
"Authorization": "Bearer mcp_your_key"
}
}
}
}
Two things to note: the key can be regenerated at any time (old configs stop working immediately — redistribute the JSON), and the upstream server's real secrets (your GitHub token and friends) live only in MCP2Skill's service config. Clients receive a gateway key, nothing more — upstream credentials never leave with the endpoint.
Step 4: Turn on remote access for external networks
With the Remote Access switch enabled in Settings, the gateway switches from 127.0.0.1:3571 to listening on 0.0.0.0:3571 — machines on your LAN (or the public internet, if you forward the port through a firewall or reverse proxy) can now reach the same endpoint at http://:3571/....
Swap the hostname in the URL, and the same JSON works for cloud agents, CI pipelines, or a teammate's laptop. When exposing externally, follow this checklist:
Enable the API key before enabling remote access — the reverse order leaves a window where the endpoint is open.
Allow the port through a firewall allowlist, or put TLS in front via a reverse proxy (stdio-derived traffic can contain file contents and query results; sending it across the public internet in plaintext is a bad idea).
For long-term external use, expose a workspace endpoint with destructive tools filtered out — not /all.
Regenerate the key periodically; update the JSON in each client after every regeneration.
Full settings reference: General & MCP settings.
Verify: let the calls leave evidence
Make one real call (listing tools from the client counts), then check MCP2Skill's dashboard and call logs: call counts, success rate, every request and response body, and which client they came from should all be there. If the call shows up in the log, the chain client → gateway → stdio server works end to end. If it doesn't, the problem is between client and gateway — the two usual suspects are an unreachable hostname and a missing auth header. See Logs & diagnostics for the troubleshooting path.
Before and after
Direct stdio usage Via MCP2Skill as HTTP
Reach Same-machine clients only Local, LAN, external networks (with remote access on)
Processes One copy per client One copy, run by the gateway
Upstream secrets One copy per client config file One place: MCP2Skill service config
Auth None (file permissions only) Gateway-level API key, revocable any time
Call logs None Full request/response for every call
Server code changes — None
FAQ
Can a stdio MCP server become an HTTP MCP server without code changes?
Yes. The transport translation happens at the gateway layer: it spawns the stdio child process as a client would, while serving an HTTP MCP endpoint to your clients, forwarding requests and responses unchanged in both directions. The server process, its tool definitions, and its behavior stay identical. All you do is import it into MCP2Skill and copy a JSON snippet.
Is it safe to use over the internet after converting?
Safe, if configured in the right order. MCP2Skill binds to loopback by default — unreachable from outside. For remote use, enable API-key auth before switching on remote access; every request then requires a valid Bearer key. For public-internet exposure, add TLS (a reverse proxy is enough) and expose only tool-filtered workspace endpoints.
Can remote MCP services (SSE / Streamable HTTP) be imported too?
Yes. MCP2Skill supports three service types: STDIO, SSE, and Streamable HTTP (URL plus custom headers, with a full OAuth flow for services that need it). All of them land behind the same authenticated, logged HTTP gateway endpoint — so scattered local and remote MCP servers collapse into a single entry point.
Does the conversion add latency?
It adds one gateway hop, which is on the order of milliseconds locally — negligible next to model response times. What you gain: one process instead of many, per-call logs, and an endpoint you can authenticate and reach remotely. If a particular tool call is extremely latency-sensitive, keeping direct stdio alongside is perfectly fine — the two aren't mutually exclusive.
How is this different from converting MCP to Skills?
Converting to HTTP solves the connection problem: who can connect, how, and what logs you get. Converting to Skills solves the token problem: when tool definitions enter the context window. The two stack — a Skill generated from a workspace still calls that workspace's HTTP endpoint. See How to convert any MCP into a Skill for that path.
Next steps
Download MCP2Skill and import your existing MCP configs.
Copy the endpoint JSON and verify connectivity with a local client.
For remote use: enable the API key → turn on remote access → swap the hostname and redistribute the JSON.
Watch the first remote call land in the dashboard.
For the broader picture on the gateway pattern — aggregation, tool filtering, namespaces, proxies vs. registries — read the MCP Gateway complete guide.
Top comments (0)