Skip to content

Docker

Run MCP Server Mattermost in a Docker container.

Quick Start

docker pull legard/mcp-server-mattermost

Stdio Mode (Default)

Standard mode for MCP clients like Claude Desktop:

docker run -i --rm \
  -e MATTERMOST_URL=https://your-mattermost.com \
  -e MATTERMOST_TOKEN=your-token \
  legard/mcp-server-mattermost

Claude Desktop Configuration

{
  "mcpServers": {
    "mattermost": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MATTERMOST_URL=https://your-mattermost.com",
        "-e", "MATTERMOST_TOKEN=your-token",
        "legard/mcp-server-mattermost"
      ]
    }
  }
}

HTTP Mode (Production)

For production deployments with health checks:

docker run -d -p 8000:8000 \
  -e MCP_TRANSPORT=http \
  -e MCP_HOST=0.0.0.0 \
  -e MATTERMOST_URL=https://your-mattermost.com \
  -e MATTERMOST_TOKEN=your-token \
  legard/mcp-server-mattermost

Health check endpoint:

curl http://localhost:8000/health

HTTP Mode with Mattermost OAuth Proxy

For production deployments where each user signs in with their own Mattermost identity, run with MATTERMOST_AUTH_MODE=oauth_proxy:

docker run -d -p 8000:8000 \
  -e MCP_TRANSPORT=http \
  -e MCP_HOST=0.0.0.0 \
  -e MATTERMOST_AUTH_MODE=oauth_proxy \
  -e MATTERMOST_URL=https://mattermost.internal \
  -e MATTERMOST_OAUTH_MATTERMOST_PUBLIC_URL=https://mattermost.example.com \
  -e MATTERMOST_OAUTH_MCP_PUBLIC_URL=https://mcp.example.com \
  -e MATTERMOST_OAUTH_CLIENT_ID=your-mattermost-oauth-app-id \
  -e MATTERMOST_OAUTH_CLIENT_TYPE=confidential \
  -e MATTERMOST_OAUTH_CLIENT_SECRET=your-mattermost-oauth-app-secret \
  legard/mcp-server-mattermost

See Authentication / oauth_proxy for Mattermost OAuth App registration, the public-client variant, and MCP client connection.

Environment Variables

For authentication-related variables (MATTERMOST_AUTH_MODE, MATTERMOST_TOKEN, all MATTERMOST_OAUTH_*), see Authentication.

Mattermost Settings

Variable Required Default Description
MATTERMOST_URL Yes Mattermost server URL
MATTERMOST_TIMEOUT No 30 Request timeout in seconds
MATTERMOST_MAX_RETRIES No 3 Max retry attempts
MATTERMOST_VERIFY_SSL No true Verify SSL certificates
MATTERMOST_EXTRA_CA_CERTS No Path to mounted PEM CAs appended to the default trust store
MATTERMOST_LOG_LEVEL No INFO Logging level
MATTERMOST_LOG_FORMAT No json Log format: json or text

For private or corporate CAs, mount the PEM bundle and point MATTERMOST_EXTRA_CA_CERTS at the in-container path:

docker run -i --rm \
  -v /etc/ssl/certs/corporate-ca.pem:/certs/corporate-ca.pem:ro \
  -e MATTERMOST_URL=https://your-mattermost.com \
  -e MATTERMOST_TOKEN=your-token \
  -e MATTERMOST_EXTRA_CA_CERTS=/certs/corporate-ca.pem \
  legard/mcp-server-mattermost

Transport Settings

Variable Default Description
MCP_TRANSPORT stdio Transport mode: stdio or http
MCP_HOST 127.0.0.1 HTTP bind host (use 0.0.0.0 in Docker)
MCP_PORT 8000 HTTP port

Healthcheck Behavior

The Dockerfile includes a healthcheck that probes /health endpoint. This only works in HTTP mode (MCP_TRANSPORT=http).

In stdio mode:

  • Healthcheck fails (no HTTP server running)
  • Container status shows unhealthy
  • This is harmless for normal docker run — the container works fine

When this becomes a problem:

  • Docker Compose with restart: on-failure or restart: always
  • Docker Swarm (restarts unhealthy containers automatically)

Solution: Add --no-healthcheck flag:

docker run -i --rm --no-healthcheck \
  -e MATTERMOST_URL=https://your-mattermost.com \
  -e MATTERMOST_TOKEN=your-token \
  legard/mcp-server-mattermost

Or override in compose file:

services:
  mattermost-mcp:
    image: legard/mcp-server-mattermost
    healthcheck:
      disable: true

Build from Source

git clone https://github.com/cloud-ru-tech/mcp-server-mattermost
cd mcp-server-mattermost
docker build -t mcp-server-mattermost .