Hosting any custom or third-party MCP (not only eurovdc-mcp) on Sofia VPS? See Host your MCP server on EuroVDC Sofia VPS.
Running a Model Context Protocol (MCP) server on a EuroVDC Cloud VPS in Sofia lets you expose Claude, Cursor, or your own agent stack over HTTPS without a tunnel product. This guide walks through a production-minded setup of the open-source eurovdc-mcp repository.
EuroVDC already operates a public MCP endpoint at /mcp. When you self-host on your VPS, you control the domain, TLS certificate, process lifecycle, and logs. The steps below target Sofia NVMe cloud plans and apply to other EuroVDC VPS sizes as well.
Who this is for
- Teams that want to give Claude Desktop or Cursor their own MCP URL
- Operators who prefer EU hosting in Sofia without third-party tunnels
- Builders who expose domain, hosting, and cart tools from their own infrastructure
1. Order a Sofia Cloud / VPS plan
Start with a static-IP Sofia Cloud Server. You will run the Node MCP process plus Nginx or Caddy, so 1 vCPU and 2 GB RAM is a comfortable baseline. After provisioning, SSH in and update the system.
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs git nginx certbot python3-certbot-nginx
node -v && npm -v2. Clone the repo and install dependencies
sudo mkdir -p /opt/eurovdc-mcp
sudo chown $USER:$USER /opt/eurovdc-mcp
cd /opt/eurovdc-mcp
git clone https://github.com/eurovdceu/eurovdc-mcp .
npm install
npm run buildFill environment variables from the repository README into a .env file. If you call EuroVDC public APIs, set keys and language parameters as documented. Never commit secrets.
3. Keep it running with systemd
sudo tee /etc/systemd/system/eurovdc-mcp.service > /dev/null <<'EOF'
[Unit]
Description=EuroVDC MCP server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/eurovdc-mcp
EnvironmentFile=/opt/eurovdc-mcp/.env
ExecStart=/usr/bin/node dist/index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now eurovdc-mcp
sudo systemctl status eurovdc-mcp --no-pagerConfirm the local listen port in the README (for example 3100) before you proxy it.
4. Put TLS reverse proxy in front
Most MCP clients expect https://your-domain.com/mcp. Example Nginx site:
server {
listen 80;
server_name mcp.your-domain.com;
location / {
proxy_pass http://127.0.0.1:3100;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
}
}sudo certbot --nginx -d mcp.your-domain.comPoint the DNS A record to your Sofia VPS IP. For local development you can use stdio with Claude Desktop; for live traffic prefer HTTPS.
5. Connect Claude or Cursor
For streamable HTTP, set the client MCP URL to https://mcp.your-domain.com/mcp, save the config, and confirm the tool list loads. Stdio remains available for local runs as described in the README.
6. Check latency with Sofia Looking Glass
Measure RTT for European users with Sofia Looking Glass. MCP calls are short JSON-RPC requests, so Sofia egress latency shapes the agent experience.
Verify readiness
After the service is up, run AI Readiness Checker on your hostname. /.well-known/mcp.json and an optional initialize check affect the score. See also the For AI Agents documentation.
Frequently asked questions
Do I need a tunnel product?
No. A TLS reverse proxy on your own VPS is enough. Locally, stdio works without any tunnel.
What is the minimum server size?
A small Sofia cloud plan is enough for a single MCP process. Scale vCPU and RAM when traffic grows.
How is this different from EuroVDC public /mcp?
The public endpoint is EuroVDC-managed shared MCP. Self-hosting gives you full control of domain, logs, and capacity.
Is systemd required?
No, but it is recommended. PM2 or Docker also work as long as the process restarts cleanly.
Why cannot Claude connect?
Check DNS, certificate, firewall ports 80/443, and the app port. systemctl status and Nginx error logs usually pinpoint the issue.
Why is the MCP row red in AI readiness?
The manifest or initialize response may be missing. Publish /.well-known/mcp.json and confirm initialize returns success over HTTPS.