Docker

Deploy the vCon MCP Server using Docker for consistent, portable deployments.

Quick Start

Pull from ECR Public

# Pull the latest image
docker pull public.ecr.aws/r4g1k2s3/vcon-dev/vcon-mcp:main

# Run the server
docker run -p 3000:3000 \
  -e SUPABASE_URL=https://your-project.supabase.co \
  -e SUPABASE_SERVICE_ROLE_KEY=your-service-role-key \
  -e SUPABASE_ANON_KEY=your-anon-key \
  -e MCP_HTTP_STATELESS=true \
  public.ecr.aws/r4g1k2s3/vcon-dev/vcon-mcp:main

Build Locally

# Clone and build
git clone https://github.com/vcon-dev/vcon-mcp.git
cd vcon-mcp
docker build -t vcon-mcp .

# Run
docker run -p 3000:3000 --env-file .env vcon-mcp

Image Tags

Tag
Description

main

Latest stable build from main branch

main-<sha>

Specific commit (e.g., main-abc1234)

1.2.3

Semantic version release

1.2

Minor version (latest patch)

1

Major version (latest minor/patch)

Running the Server

Basic Usage

With Environment File

Multi-Client Support

For multiple clients to connect simultaneously, enable stateless mode:

Note: Without MCP_HTTP_STATELESS=true, only one MCP client can connect at a time due to session tracking limitations in the MCP SDK.

Running Scripts

The Docker image includes all utility scripts from the /scripts directory:

List Available Scripts

Run a Script

Run TypeScript Directly

Environment Variables

Required

Variable
Description

SUPABASE_URL

Your Supabase project URL

SUPABASE_SERVICE_ROLE_KEY

Supabase service role key (full database access, bypasses RLS)

SUPABASE_ANON_KEY

Supabase anonymous key (restricted access with RLS)

Note: You need at least one of SUPABASE_SERVICE_ROLE_KEY or SUPABASE_ANON_KEY. The service role key is recommended for server-side deployments as it provides full database access.

MCP Transport

Variable
Default
Description

MCP_TRANSPORT

http

Transport type: http or stdio

MCP_HTTP_HOST

0.0.0.0

HTTP host to bind

MCP_HTTP_PORT

3000

HTTP port to listen on

MCP_HTTP_STATELESS

false

Enable stateless mode for multi-client

MCP_HTTP_JSON_ONLY

false

Disable SSE, JSON responses only

Tool Configuration

Variable
Default
Description

MCP_TOOLS_PROFILE

full

Preset: full, readonly, user, admin, minimal

MCP_ENABLED_CATEGORIES

(all)

Comma-separated: read,write,schema,analytics,infra

MCP_DISABLED_TOOLS

(none)

Comma-separated tool names to disable

Optional Services

Variable
Description

REDIS_URL

Redis URL for caching (e.g., redis://localhost:6379)

OPENAI_API_KEY

OpenAI API key for embeddings

OTEL_ENABLED

Enable OpenTelemetry (true/false)

OTEL_ENDPOINT

OTLP collector endpoint

Docker Compose

Basic Setup

With Redis Caching

With Observability

Connecting to Local Services

When running in Docker and connecting to services on your host machine (like local Supabase), use host.docker.internal:

Note: host.docker.internal works on Docker Desktop (Mac/Windows). On Linux, use --network host or the host's actual IP.

Health Checks

The image includes a built-in health check:

Production Deployment

Kubernetes

AWS ECS

Image Details

  • Base Image: Node.js 20 Alpine

  • Size: ~680 MB

  • Platforms: linux/amd64, linux/arm64

  • User: Non-root (vcon:nodejs)

  • Working Directory: /app

Troubleshooting

Container Exits Immediately

Check logs for missing environment variables:

Common causes:

  • Missing SUPABASE_URL or Supabase keys (SUPABASE_SERVICE_ROLE_KEY / SUPABASE_ANON_KEY)

  • Invalid credentials

Connection Refused to Database

If connecting to local Supabase:

Multiple Clients Failing

Enable stateless mode:

View Container Logs

Building Custom Images

Build and run:

Last updated