--- title: "Add STDIO MCP servers" description: "Register stdio transport-based MCP servers in mcpjungle using CLI. Expose them via the mcp gateway." --- Mcpjungle supports MCP servers that use the [STDIO transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#stdio). These servers run as child processes on the same host as the Mcpjungle server and communicate through standard input and output. Common examples include [filesystem](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem) and [time](https://github.com/modelcontextprotocol/servers/tree/main/src/time). Because STDIO servers run as local processes, you must register them using a JSON config file — the CLI flags only cover Streamable HTTP registration. ## Register a STDIO server Create a JSON file describing your server. Here is an example for the official MCP filesystem server: ```json { "name": "filesystem", "transport": "stdio", "description": "Filesystem MCP server", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "."] } ``` Pass the file to the `register` command with the `-c` flag: ```bash mcpjungle register -c ./filesystem.json ``` Mcpjungle spawns the process, initializes the connection, loads its tool list, and registers the server. ## Config file format The full set of fields for a STDIO server config: ```json { "name": "", "transport": "stdio", "description": "", "command": "", "args": ["", ""], "session_mode": "stateless", "env": { "KEY": "value" } } ``` | Field | Required | Description | | ------------- | -------- | ---------------------------------------------------------------------------------------------- | | `name` | Yes | Unique identifier. No spaces, special characters, or consecutive underscores. | | `transport` | Yes | Must be `"stdio"`. Other possible values are `"streamable_http"` and `"sse"`. | | `description` | No | Human-readable description surfaced in the CLI and API. | | `command` | Yes | The executable to run — typically `"npx"` or `"uvx"`. | | `args` | No | List of arguments passed to `command` when Mcpjungle spawns the process. | | `session_mode`| No | `stateless` (default) creates a new process/connection per tool call. `stateful` reuses a persistent session. | | `env` | No | Map of environment variables injected into the process environment at startup. | ## Examples ```json npx (filesystem) { "name": "filesystem", "transport": "stdio", "description": "Filesystem MCP server", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "."], "session_mode": "stateless" } ``` ```json uvx (custom server) { "name": "my-stdio-server", "transport": "stdio", "description": "Custom uvx-based server", "command": "uvx", "args": ["my-server", "--workspace", "${WORKSPACE_ID}"], "session_mode": "stateful", "env": { "API_TOKEN": "${API_TOKEN}" } } ``` ## Environment variable substitution JSON config files support `${VAR_NAME}` placeholders in string fields, including command args and `env` values. See the [configuration file reference](/reference/config-file#$var_name-placeholder-substitution) for the full substitution rules and examples. ## Running in Docker: filesystem access When Mcpjungle runs inside a Docker container, the container process does not have access to your host filesystem by default. To use the `filesystem` MCP server from inside Docker, you need to mount the host directory you want to expose. The default `docker-compose.yaml` provided by Mcpjungle mounts your current working directory as `/host` inside the container. Use `/host` as the target directory in your config: ```json { "name": "filesystem", "transport": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/host"] } ``` This gives the `filesystem` server access to your current working directory on the host machine, mounted at `/host` inside the container. If you need to expose a different directory, add a volume mount to your `docker-compose.yaml` and update the path in `args` accordingly. ## Using the stdio Docker image STDIO-based servers that rely on `npx` or `uvx` require those tools to be present in the Mcpjungle container. The default `mcpjungle` Docker image is minimal and does not include `npx` or `uvx`. You must use the `latest-stdio` tagged image when registering STDIO servers that use these commands. Start Mcpjungle with the `stdio` image using the `MCPJUNGLE_IMAGE_TAG` environment variable: ```bash MCPJUNGLE_IMAGE_TAG=latest-stdio docker compose up -d ``` If you are using the development `docker-compose.yaml`, the `latest-stdio` tag is already the default. You only need to set `MCPJUNGLE_IMAGE_TAG` explicitly when using `docker-compose.prod.yaml`. If your STDIO server depends on a tool other than `npx` or `uvx`, create a custom Docker image that builds on the Mcpjungle base image and installs the additional dependency. ## Debugging STDIO servers If a STDIO server fails to start or throws errors during a tool call, check the Mcpjungle server logs. The server captures `stderr` output from child processes and writes it to its own log stream, making it the primary place to diagnose STDIO server issues. ## Related pages Use stateful mode when a STDIO server's cold start cost becomes a bottleneck. Choose the right image and understand container filesystem access. Register remote MCP servers over streamable HTTP. See the exact JSON schema for STDIO registration files.