Claude Code MCP stdio: Complete Guide
Many developers configuring Claude Code MCP servers eventually encounter the term stdio. It appears in examples throughout the Model Context Protocol ecosystem, yet many developers are unsure what it actually does or why it is the default transport for local MCP servers.
Unlike traditional APIs that communicate over HTTP, a stdio-based MCP server runs as a local process. Claude Code launches the server when needed and exchanges JSON-RPC messages through the process's standard input (stdin) and standard output (stdout). No web server, network port, or HTTP endpoint is required.
This design makes local integrations simpler, faster to configure, and less exposed to network-related security risks. Whether you're connecting a GitHub server, a filesystem server, or your own custom MCP implementation, understanding stdio transport is essential for building reliable local integrations.
In this guide, you'll learn:
- what MCP stdio is
- why Claude Code uses stdio transport
- how communication works between Claude Code and an MCP server
- how a typical stdio server is configured
- when to choose stdio instead of HTTP
- common mistakes and security considerations
By the end of this guide, you'll understand exactly how Claude Code starts local MCP servers, how stdio communication works, and when this transport is the right choice for your projects.
Quick answer: Claude Code typically communicates with local MCP servers using the stdio transport. It starts the server as a local process and exchanges JSON-RPC messages through standard input (
stdin) and standard output (stdout). This eliminates the need for HTTP servers or open network ports while providing a simple and secure communication channel.
What Is MCP stdio?
In the Model Context Protocol (MCP), stdio is a transport mechanism that allows Claude Code to communicate with an MCP server through a local process rather than over a network.
The name stdio comes from the operating system's standard input (stdin) and standard output (stdout) streams.
Instead of sending HTTP requests to a web server, Claude Code starts the MCP server as a child process and exchanges JSON-RPC messages directly through these streams.
A simplified communication flow looks like this:
Claude Code
│
│ starts process
▼
+----------------------+
| MCP Server |
| (local process) |
+----------------------+
▲
│
stdin │ JSON-RPC │ stdout
│
▼
Claude Code
From the developer's perspective, the transport layer is largely transparent. Claude Code is responsible for launching the process, sending requests, receiving responses, and shutting the server down when appropriate.
Because communication occurs directly between two local processes, no HTTP server, reverse proxy, or network configuration is required.
Why Claude Code Uses stdio
The majority of MCP servers are designed to run locally alongside Claude Code.
For these scenarios, stdio provides several important advantages over network-based communication.
Simple Setup
A stdio server does not need to expose an HTTP endpoint or listen on a TCP port.
Instead, Claude Code simply launches the executable defined in the server configuration and immediately begins communicating with it.
This makes installation significantly easier for both developers and end users.
Better Security
Since communication stays entirely within the local machine, there is no need to expose a service over the network.
This reduces the attack surface by eliminating concerns such as:
- open network ports
- firewall configuration
- accidental public exposure
- network authentication for local development
While stdio does not replace proper authentication where external services are involved, it avoids many of the risks associated with locally hosted HTTP servers.
Better Performance
Communication through standard input and output avoids the overhead of establishing HTTP connections.
For local tools, this generally results in lower latency and a simpler architecture.
Easier Distribution
Most official and community MCP servers can be distributed as ordinary command-line applications.
Claude Code only needs to know how to start the executable, making installation straightforward across different operating systems and development environments.
Want to analyze your API security?
Import your OpenAPI spec and generate a Security Report automatically.
How stdio Transport Works
Although stdio communication happens automatically, understanding the lifecycle makes it easier to troubleshoot configuration issues.
Step 1: Claude Code Starts the Server
When a tool provided by an MCP server is needed, Claude Code launches the configured executable.
Depending on the server, this may be a binary, a Node.js package, a Python script, or another command-line application.
At this point, no HTTP server is created.
Step 2: Communication Happens Through stdin and stdout
Once the process is running, Claude Code sends JSON-RPC requests to the server through stdin.
The MCP server processes each request and writes its response to stdout.
This exchange continues for as long as the server remains active.
Conceptually, the communication looks like this:
Claude Code
│
│ JSON-RPC request
▼
stdin
│
▼
MCP Server
│
│ JSON-RPC response
▼
stdout
│
▼
Claude Code
The transport mechanism is responsible only for moving messages between processes. The actual request and response format is defined by the Model Context Protocol.
Step 3: The Server Terminates
When Claude Code no longer requires the MCP server, the process can be shut down.
From the user's perspective, this lifecycle is automatic. Developers typically only need to provide a valid server configuration and ensure the executable can be started successfully.
Typical stdio MCP Configuration
A stdio MCP server is typically defined by describing how Claude Code should start the server process. Rather than specifying a network address, the configuration tells Claude Code which executable to run and what information should be supplied when launching it.
Although the exact configuration varies between MCP servers, most stdio definitions include the same core concepts.
command
The command field specifies the executable Claude Code should launch.
Depending on the server, this might be:
nodepythonuvnpx- a compiled executable
- another command-line program
Claude Code starts this command whenever it needs to communicate with the MCP server.
args
Arguments provide additional command-line parameters passed to the executable during startup.
For example, arguments may specify:
- the server package
- a script to execute
- startup options
- configuration files
The exact arguments depend entirely on the MCP server implementation.
env
Many MCP servers require runtime configuration, such as API credentials or service endpoints.
Environment variables allow these values to be supplied without embedding sensitive information directly into the server implementation.
Common examples include:
- API keys
- authentication tokens
- organization identifiers
- cloud service credentials
Using environment variables also makes it easier to rotate credentials without modifying source code.
Working Directory
Some MCP servers expect to start inside a particular project directory.
The working directory determines where relative file paths are resolved and which project files are available when the server starts.
Not every MCP server requires a custom working directory, but it can be important for servers that analyze source code or interact with files in a repository.
Example stdio MCP Server
The following example illustrates the general structure of a locally executed stdio MCP server.
{
"mcpServers": {
"github": {
"command": "npx",
"args": [
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}
In this example:
- Claude Code launches the server using
npx - the GitHub MCP server package is passed as an argument
- the server receives a GitHub personal access token through an environment variable
- communication takes place entirely over stdio rather than HTTP
The exact configuration will differ between MCP servers, but the overall structure remains similar: Claude Code starts a local process, supplies any required configuration, and communicates through standard input and standard output.
stdio vs HTTP Transport
Both stdio and HTTP are valid transport mechanisms within the Model Context Protocol, but they are designed for different deployment scenarios.
| Feature | stdio | HTTP |
|---|---|---|
| Communication | Standard input and output | Network requests |
| Server location | Local process | Local or remote service |
| Requires open port | No | Yes |
| Local development | Excellent | Good |
| Remote deployment | Limited | Excellent |
| Network configuration | Not required | Required |
| Typical use case | Local tools | Shared or hosted services |
Neither transport is universally better.
The right choice depends on where the MCP server runs and how it will be used.
When Should You Use stdio?
Stdio is generally the preferred transport whenever an MCP server runs on the same machine as Claude Code.
Typical examples include:
- local filesystem tools
- GitHub integrations
- database development tools
- project automation
- code generation utilities
- personal development assistants
Because Claude Code manages the server lifecycle automatically, stdio provides an excellent developer experience with very little setup.
HTTP becomes a better choice when the server must be shared across multiple users, deployed centrally, or accessed from machines other than the one running Claude Code.
Security Considerations
Using stdio eliminates many of the networking concerns associated with HTTP-based services, but it does not remove the need for secure configuration.
Developers should still follow standard security practices when configuring local MCP servers.
Protect Environment Variables
Many MCP servers rely on API keys, access tokens, or other credentials supplied through environment variables.
These values should never be hardcoded into source code or committed to version control.
Instead, store sensitive information in the appropriate configuration scope and rotate credentials regularly.
Only Install Trusted MCP Servers
When Claude Code launches an MCP server, it executes the configured command on your machine.
For this reason, you should install MCP servers only from trusted sources and understand what software you are running.
Review project documentation, verify package names, and keep dependencies up to date.
Use the Principle of Least Privilege
If an MCP server only needs access to one external service, provide only the permissions required for that task.
For example, use a read-only API token whenever possible instead of granting full administrative access.
Limiting permissions reduces the impact of accidental credential exposure.
Keep Dependencies Updated
Like any software, MCP servers may receive bug fixes, performance improvements, and security updates.
Regularly updating dependencies helps ensure your local development environment benefits from the latest fixes while reducing exposure to known vulnerabilities.
Common Mistakes
Most stdio-related problems are caused by configuration issues rather than problems with the transport itself.
Understanding the most common mistakes can make troubleshooting much easier.
Confusing stdio with HTTP
One of the most common misconceptions is assuming that a stdio server should expose an HTTP endpoint.
A stdio server communicates only through standard input and standard output. If you are looking for a network address or open port, you are using the wrong transport model.
Using the Wrong Command
Claude Code can only start a server if the configured executable exists.
Incorrect command names, missing packages, or unavailable runtimes are among the most common causes of startup failures.
Always verify that the command can be executed successfully outside Claude Code before troubleshooting the MCP configuration.
Missing Required Environment Variables
Many MCP servers depend on authentication credentials or service configuration.
If required environment variables are missing or incorrectly configured, the server may start successfully but fail when attempting to access external services.
Carefully review the documentation for the specific MCP server you are using.
Assuming Every MCP Server Uses the Same Configuration
Although most stdio servers follow a similar structure, each server defines its own startup requirements.
Some require additional arguments, others expect specific environment variables, and some support optional configuration fields.
Always use the documentation provided by the server's author rather than assuming every MCP server is configured identically.
Conclusion
Understanding how Claude Code MCP stdio works makes it much easier to configure, troubleshoot, and build reliable local MCP integrations.
Rather than communicating over HTTP, stdio allows Claude Code to launch an MCP server as a local process and exchange JSON-RPC messages through standard input and standard output. This approach simplifies installation, avoids unnecessary network configuration, and provides an efficient transport for local development.
For most local workflows, stdio is the recommended transport because it requires minimal setup while allowing Claude Code to manage the server lifecycle automatically. HTTP remains a valuable alternative for remotely hosted or shared MCP servers, but local tools generally benefit from the simplicity of stdio.
If you're continuing to explore the Model Context Protocol, our guides on Claude Code MCP Servers, Claude Code Environment Variables, and Claude Code config.json explain how these pieces fit together to create secure and maintainable Claude Code workflows.