A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
Run any dockerized MCP Server in a sandboxed container and connect to it remotely
A secure, isolated platform for running MCP (Model Context Protocol) servers in Docker containers with GVisor runtime. Built with NestJS and TypeScript, this service provides ephemeral, multi-tenant deployments of MCP servers with robust security isolation.
This project solves key challenges when integrating with MCP servers:
Perfect for developers building applications that need to integrate with various MCP servers, especially untrusted or locally-running ones like Wikipedia MCP.
Copyright (C) 2025 Tangier AI, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
The secure MCP runner operates through several layers of isolation:
runsc)Security is enforced through multiple layers:
runsc runtime for kernel-level isolationSYS_ADMIN, NET_ADMIN, SYS_PTRACE, SYS_MODULE)no-new-privileges, apparmor:docker-default, seccomp:unconfinedCreate a new Ubuntu 24.04 VM (minimum 2GB RAM recommended) and run:
# Download and run the setup script
wget https://raw.githubusercontent.com/tangier-ai/mcp-runner/refs/heads/main/setup.sh
sudo bash setup.sh
Or using curl:
# Download and run the setup script
curl -O https://raw.githubusercontent.com/tangier-ai/mcp-runner/refs/heads/main/setup.sh
sudo bash setup.sh
This setup script is the setup.sh file in this repository.
Start the MCP runner service:
docker run -d \
--privileged \
--network=host \
--name mcp-runner-container \
--restart=always \
-e NODE_ENV=production \
-e API_KEY=your-secure-api-key \
-e BIND_IP=0.0.0.0 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc:/etc \
-v /var/mcp-runner:/var/mcp-runner \
tangierai/mcp-runner:latest
The service will start on localhost:3000 by default.
--privileged: Required for the service to create users and perform Docker in Docker operations--network=host: Uses the host network stack so the mcp-runner can appropriately forward requests to the ip addresses of the containers--restart=always: Automatically restarts the container if it stops or on system reboot-v /var/run/docker.sock:/var/run/docker.sock: Mounts the Docker socket to allow container management-v /etc:/etc: Mounts system configuration for user management, mounting /etc/passwd is insufficient-v /var/mcp-runner:/var/mcp-runner: Persistent storage for the application database| Variable | Description | Default | Required |
|---|---|---|---|
PORT | Server port | 3000 | No |
BIND_IP | Interface to bind to (use 0.0.0.0 for public access) | 127.0.0.1 | No |
API_KEY | Authentication key | Auto-generated | No |
SENTRY_DSN | Sentry error reporting endpoint | - | No |
NODE_ENV | Environment mode (production/development) | - | No |
If no API_KEY is provided, one will be auto-generated and logged to the console.
By default, the service binds to localhost only. For external access:
Option 1: Direct binding
docker run -d \
--privileged \
--network=host \
--name mcp-runner-container \
--restart=always \
-e NODE_ENV=production \
-e API_KEY=your-secure-api-key \
-e BIND_IP=0.0.0.0 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc:/etc \
-v /var/mcp-runner:/var/mcp-runner \
tangierai/mcp-runner:latest
Option 2: Nginx proxy
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
client_max_body_size 0;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
All API requests require an X-API-Key header:
curl -H "X-API-Key: your-api-key" http://localhost:3000/api/deployment
curl -X POST http://localhost:3000/api/deployment \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"image": "mcp/sequentialthinking:latest",
"transport": {
"type": "stdio"
},
"maxMemory": 512,
"maxCpus": 1,
"deleteAfterSeconds": 3600
}'
curl -H "X-API-Key: your-api-key" http://localhost:3000/api/deployment
Once deployed, connect to your MCP server via the provided SSE or HTTP endpoints.
Enable error reporting with Sentry, include a SENTRY_DSN environment variable when starting the service:
docker run -d \
--privileged \
--network=host \
--name mcp-runner-container \
--restart=always \
-e NODE_ENV=production \
-e SENTRY_DSN=your-sentry-dsn \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc:/etc \
-v /var/mcp-runner:/var/mcp-runner \
tangierai/mcp-runner:latest
Privacy: Environment variables and arguments from deployment requests are automatically stripped from Sentry error reports to prevent data leakage.
To publish source maps to Sentry for better error tracking:
docker run -d \
-e SENTRY_ORG=your-org \
-e SENTRY_PROJECT=your-project \
-e SENTRY_AUTH_TOKEN=your-auth-token \
tangierai/mcp-runner:latest \
publish:sourcemap
Install dependencies:
npm install
Start development server:
npm run start:dev
Build and run locally:
npm run build
npm run start:prod
Once running, visit http://localhost:3000/api for interactive Swagger documentation.
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
MCP server integration for DaVinci Resolve Studio
A Jetbrains IDE IntelliJ plugin aimed to provide coding agents the ability to leverage intelliJ's indexing of the codeba