Install MCP Self-hosted with Docker Compose
To install MCP Self-hosted, download the bundle for your license from My Account → MCP Self-hosted, fill in the .env file and run ./mcp-update.sh. The script logs in to the AddoCore container registry, pulls the image and starts the mcp-core container. The same command handles every later update.
What do you need before you install MCP Self-hosted?
You need a host with Docker and Docker Compose (the docker compose command), a bash shell to run the script, and an active MCP Self-hosted license. Node.js runs inside the image, so nothing else has to be installed on the host. The container needs outbound HTTPS to two places: the AddoCore license endpoint and the container registry at registry.gitlab.com. If your firewall uses an allowlist, add both before you start.
You cannot install MCP Self-hosted without a license. The MCP Self-hosted product page lists what MCP Self-hosted includes.
What is in the zip you use to install MCP Self-hosted?
The zip is generated for your license. It contains no source code, only what Docker needs to pull and run the published image:
docker-compose.yml: one service,mcp-core, with the image tag taken fromMCP_VERSION..env: pre-filled with your license key, the license endpoint, the auth strategy, your first seat’s token and a block of empty variables per tool on your license..env.registry: the read-only credentials for the container registry.mcp-update.sh: the install and update script.README.mdandINSTALL-CLAUDE-PLUGIN.md, plus theclaude-plugin/folder with a ready-made Claude Code plugin.- Empty
vault/,state/andlogs/folders that are mounted into the container.
Keep .env and .env.registry out of version control. Both contain secrets.
Which .env values do you fill in?
The top of .env is already filled in and normally stays as it is. Leave LICENSE_ENDPOINT at this address: from version 1.2.0 mcp-core only accepts license answers signed by AddoCore.
LICENSE_KEY=...
LICENSE_ENDPOINT=https://addocore.com/wp-json/mcpl/v1/check
AUTH_STRATEGY=apikey
BEARER_TOKEN=...
MCP_VERSION=<version in your bundle>
SEAT_ID=...
HOSTED_SECRETS_ENDPOINT=https://addocore.com/wp-json/mcpl/v1/secrets
Below that, every tool on your license has its own block. Required variables are empty lines, optional ones are commented out:
# Missive
MISSIVE_API_TOKEN=
# MISSIVE_MODE=
# MISSIVE_FROM_ADDRESS=
Fill in the required values for each tool before you install MCP Self-hosted. The exact variables per tool are in the MCP setup guides. You can also leave them empty here and enter them later under the Tools tab of your license in My Account; they are stored encrypted and the running container picks them up on the next license check.
What does ./mcp-update.sh do?
When you install MCP Self-hosted, the script runs four steps from the folder you unzipped:
- It reads
.env.registryand runsdocker loginwith--password-stdin, so the registry token never appears in your shell history. - It pulls the image for the version in
MCP_VERSION. - If that version does not exist in the registry (a typo, or an old version that was cleaned up), it sets
MCP_VERSION=latestin.envand pulls again. Any other pull error is shown as-is and the script stops. - It starts the container in the background.
cd /path/to/unzipped-bundle
chmod +x mcp-update.sh
./mcp-update.sh
The container is called mcp-core, restarts automatically unless you stop it, has a 128 MB memory limit and listens on 127.0.0.1:3200. Only the host itself can reach that port. To reach it from other machines, put a reverse proxy with HTTPS in front of it.
How do you check the license after you install MCP Self-hosted?
Read the container logs. On start, mcp-core prints a summary and then checks its license with AddoCore:
docker logs -f mcp-core
Look for the HTTP/MCP: http://localhost:3200/mcp line and a line that starts with Check OK, followed by valid=true and the entitlements on your license, for example tool:missive. The very first summary can show Active tools: (none entitled), because the license check runs just after the server starts. Without an AI client you can get the same information as JSON:
curl http://localhost:3200/health
The response contains status, the transports, the auth strategy, the license state and the active tool ids. If the license line reports a failure, check LICENSE_KEY and LICENSE_ENDPOINT first.
How do you update mcp-core?
Run ./mcp-update.sh again from the folder you used to install MCP Self-hosted. It pulls whatever MCP_VERSION points to and restarts the container. Your .env, vault, state and logs live on the host, so they are not touched. MCP_VERSION is pinned to the version in your bundle by default, which means a plain rerun gives you that same version back. Set it to latest to always get the newest release, or to a specific version number to pin or roll back.
What changes when you buy an add-on later?
Nothing on disk. Every tool is already inside the image; an add-on only adds an entitlement to your license. You get an email that lists the variables the tool needs. Enter them in .env or on the Tools tab, then pick up the new entitlement right away:
docker exec mcp-core npm run refresh-license
Without that command the change arrives with the next scheduled check, within 72 hours.
What about the Claude Code plugin bundle?
The claude-plugin/ folder is already configured for http://localhost:3200/mcp with the token from .env. Connect Claude to an MCP server covers the two install commands and the setup for Claude Desktop.
Which mistakes are common when you install MCP Self-hosted?
- Running the script from another folder. It reads
./.env.registry, so run it from the bundle folder. - Pulling the image by hand. The registry needs a login first; the script does that for you.
- Port 3200 already in use on the host. Stop the other service or change the host side of the port mapping.
- A second install on the same license. MCP Self-hosted includes one activation; a second container gets the message that the license has reached its maximum number of active installations. Release the old one under the Advanced tab.
With these steps you install MCP Self-hosted once and update it with the same script. Next, set up your MCP seats so every person or device gets its own token.