Οι MCP servers που φιλοξενείτε μόνοι σας πολλαπλασιάζονται. Πρώτα υπάρχει ένας για την εσωτερική τεκμηρίωση, μετά ένας για τη βάση δεδομένων, μετά κάποιος γράφει έναν μικρό για το pipeline του deploy. Ο καθένας έχει δική του θύρα, δικό του URL και δικό του μυστικό, και κάθε μέλος της ομάδας τα επικολλά και τα τρία στη ρύθμιση του client του. Η αλλαγή ενός token σημαίνει να ειδοποιήσετε όλους.
Ένα gateway τα μετατρέπει σε μία διεύθυνση και ένα token. Οι clients συνδέονται στο https://mcp.example.com/docs/mcp, στο .../db/mcp και ούτω καθεξής. Το gateway ελέγχει το token, στέλνει κάθε διαδρομή στον σωστό server στο localhost, και οι ίδιοι οι servers δεν εκτίθενται ποτέ. Χρειάζεται πολύ λίγο: ένας μικρός VPS με δική του IPv4 και το Caddy.
Στήσαμε τη ρύθμιση παρακάτω σε server δοκιμών και την ελέγξαμε με πραγματικούς clients πριν τη γράψουμε.
Τι χρειάζεστε
- Έναν VPS με δημόσια IPv4, ώστε οι clients να φτάνουν στη 443. Το Nano-IP αρκεί, εκτός αν οι MCP servers σας κάνουν βαριά δουλειά.
- Ένα domain με εγγραφή A προς τον server, εδώ
mcp.example.com. - Ubuntu 24.04 ή Debian 12/13. Το Caddy υπάρχει στα τυπικά αποθετήρια και των δύο.
1. Τρέξτε τους MCP servers στο localhost
Κάθε server τρέχει ως υπηρεσία systemd. Εδώ χρησιμοποιούμε δύο φορές τον server αναφοράς server-everything ώστε το παράδειγμα να είναι αυτοτελές· βάλτε τους δικούς σας. Χρειάζεται Node.js 20 ή νεότερο:
mkdir -p /opt/mcp && cd /opt/mcp
npm install @modelcontextprotocol/server-everything
# /etc/systemd/system/mcp-everything-1.service
[Unit]
Description=MCP server everything #1
After=network.target
[Service]
WorkingDirectory=/opt/mcp
Environment=PORT=3101
ExecStart=/opt/mcp/node_modules/.bin/mcp-server-everything streamableHttp
Restart=always
User=nobody
[Install]
WantedBy=multi-user.target
Ένα δεύτερο αντίγραφο χρησιμοποιεί τη θύρα 3102. Μετά:
systemctl daemon-reload
systemctl enable --now mcp-everything-1 mcp-everything-2
Κάτι που προσέξαμε στις δοκιμές: αυτός ο server ακούει σε όλες τις διεπαφές, όχι μόνο στο 127.0.0.1, και πολλοί άλλοι κάνουν το ίδιο. Το βήμα 3 το τακτοποιεί.
2. Caddy: πρώτα έλεγχος token, μετά δρομολόγηση ανά διαδρομή
Δημιουργήστε ένα token και δώστε το στο Caddy μέσω αρχείου περιβάλλοντος:
apt install -y caddy
echo "MCP_GATEWAY_TOKEN=$(openssl rand -hex 32)" > /etc/caddy/gateway.env
chmod 600 /etc/caddy/gateway.env
mkdir -p /etc/systemd/system/caddy.service.d
printf '[Service]\nEnvironmentFile=/etc/caddy/gateway.env\n' > /etc/systemd/system/caddy.service.d/env.conf
systemctl daemon-reload
Το Caddyfile:
mcp.example.com {
route {
@unauthorized not header Authorization "Bearer {$MCP_GATEWAY_TOKEN}"
respond @unauthorized 401
handle_path /everything/* {
reverse_proxy 127.0.0.1:3101 {
flush_interval -1
}
}
handle_path /tools2/* {
reverse_proxy 127.0.0.1:3102 {
flush_interval -1
}
}
respond 404
}
}
caddy validate --config /etc/caddy/Caddyfile && systemctl restart caddy
Το Caddy παίρνει μόνο του το πιστοποιητικό για το mcp.example.com.
Το μπλοκ route δεν είναι διακοσμητικό. Η πρώτη μας έκδοση είχε τον έλεγχο του token και τα μπλοκ handle_path δίπλα δίπλα στο ανώτερο επίπεδο, και τα αιτήματα χωρίς token περνούσαν κατευθείαν με 200. Το Caddy ταξινομεί τις οδηγίες με τη δική του σειρά, και το handle_path εκτελείται πριν από το respond. Μέσα στο route εκτελούνται με τη σειρά που γράφτηκαν. Αν προσαρμόσετε αυτή τη ρύθμιση, δοκιμάστε πρώτα την περίπτωση «χωρίς token».
Το handle_path αφαιρεί το πρόθεμα, οπότε το /everything/mcp φτάνει στον server ως /mcp. Το flush_interval -1 περνά τα ρέοντα γεγονότα μόλις φτάνουν.
3. Κλείστε τα πάντα εκτός από SSH και HTTPS
apt install -y ufw
ufw default deny incoming
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw enable
Μετά από αυτό, στη δοκιμή μας οι θύρες 3101 και 3102 ήταν απρόσιτες από έξω, ενώ οι 22 και 443 απαντούσαν. Η θύρα 80 μένει ανοιχτή μόνο για να παίρνει και να ανανεώνει το Caddy πιστοποιητικά και να ανακατευθύνει σε HTTPS.
4. Ελέγξτε το
TOKEN=$(cut -d= -f2 /etc/caddy/gateway.env)
INIT='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"check","version":"1"}}}'
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://mcp.example.com/everything/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d "$INIT"
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://mcp.example.com/everything/mcp \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d "$INIT"
Το πρώτο αίτημα πρέπει να τυπώσει 401 και το δεύτερο 200. Στη δοκιμή μας, ένα λάθος και ένα κομμένο token πήραν και τα δύο 401, και μια άγνωστη διαδρομή πήρε 404 ακόμη και με το σωστό token.
Μετά από έναν client, για παράδειγμα το Claude Code:
claude mcp add --transport http everything https://mcp.example.com/everything/mcp \
--header "Authorization: Bearer $TOKEN"
claude mcp list
Και οι δύο servers έδειξαν ✔ Connected. Ο ίδιος client με λάθος token έδειξε ✘ Failed to connect. Περισσότερα για τη ρύθμιση clients στο Σύνδεση του EQVPS MCP με Claude Code και Codex.
Προσθήκη του επόμενου server
Ξεκινήστε τον σε μια νέα θύρα localhost, προσθέστε ένα μπλοκ handle_path και φορτώστε ξανά το Caddy. Η ρύθμιση κανενός δεν αλλάζει, εκτός από ένα νέο URL κάτω από τον ίδιο host και με το ίδιο token.
Όρια που αξίζει να ξέρετε
- Ένα token για όλους είναι απλό και η αλλαγή του είναι ένα αρχείο, αλλά δεν μπορείτε να αφαιρέσετε την πρόσβαση ενός ατόμου χωρίς να το αλλάξετε για όλους. Για πρόσβαση ανά χρήστη, βάλτε μπροστά ένα proxy πιστοποίησης ή δώστε σε καθέναν δική του διαδρομή και token.
- Το gateway δεν κάνει έναν server ασφαλή. Ένας MCP server που εκτελεί εντολές shell παραμένει shell για όποιον έχει το token. Κρατήστε τα tokens έξω από κοινόχρηστες ρυθμίσεις και από το git.
- Διαλέξτε μέγεθος για τους servers, όχι για το gateway. Το ίδιο το Caddy χρησιμοποιεί λίγες δεκάδες megabytes. Αν κάποιος server τρέχει τοπικό μοντέλο ή ευρετηριάζει μεγάλο αποθετήριο, αυτός καθορίζει το πακέτο, όχι το proxy.
Έχετε μόνο έναν MCP server; Το VPS για MCP servers καλύπτει αυτή την απλούστερη περίπτωση. Θέλετε οι πράκτορές σας να διαχειρίζονται και τον server όπου ζουν; Αυτό κάνει ο MCP server της EQVPS (ή το REST API, αν προτιμάτε scripts), και τα πακέτα με δική τους IPv4 ξεκινούν από $8 τον μήνα.
Σχόλια
Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.