−25%

Windows کی سالانہ ادائیگی پر، 31 اکتوبر تک۔ پلانز دیکھیں

EQVPS
شروع کریں

MCP گیٹ وے کے لیے VPS: ایک پتے اور ایک ٹوکن کے پیچھے کئی MCP سرور

آپ کی ٹیم تین خود میزبانی والے MCP سرور استعمال کرتی ہے اور ہر شخص کے پاس تین URL اور تین راز ہیں۔ انہیں ایک چھوٹے VPS پر ایک HTTPS پتے کے پیچھے رکھیں: Caddy bearer ٹوکن جانچتا ہے، پاتھ کے مطابق روٹ کرتا ہے اور سرورز کو انٹرنیٹ سے دور رکھتا ہے۔ ایک آزمودہ کنفیگریشن۔

خود میزبانی والے MCP سرور بڑھتے جاتے ہیں۔ پہلے اندرونی دستاویزات کے لیے ایک ہوتا ہے، پھر ڈیٹا بیس کے لیے ایک، پھر کوئی ڈیپلائے پائپ لائن کے لیے چھوٹا سا لکھ دیتا ہے۔ ہر ایک کا اپنا پورٹ، اپنا URL اور اپنا راز ہوتا ہے، اور ٹیم کا ہر فرد تینوں کو اپنی کلائنٹ کنفیگ میں چسپاں کرتا ہے۔ ٹوکن بدلنے کا مطلب ہے سب کو پیغام بھیجنا۔

گیٹ وے اسے ایک پتے اور ایک ٹوکن میں بدل دیتا ہے۔ کلائنٹس https://mcp.example.com/docs/mcp، .../db/mcp وغیرہ سے جڑتے ہیں۔ گیٹ وے ٹوکن جانچتا ہے، ہر پاتھ کو localhost پر درست سرور تک بھیجتا ہے، اور سرور خود کبھی باہر نہیں کھلتے۔ اس کے لیے بہت کم چاہیے: اپنے IPv4 والا ایک چھوٹا VPS اور Caddy۔

نیچے کا سیٹ اپ ہم نے ایک ٹیسٹ سرور پر بنایا اور لکھنے سے پہلے اصلی کلائنٹس سے جانچا۔

کیا چاہیے

  • عوامی IPv4 والا VPS، تاکہ کلائنٹس 443 تک پہنچ سکیں۔ اگر آپ کے MCP سرور خود بھاری کام نہیں کرتے تو Nano-IP کافی ہے۔
  • سرور کی طرف اشارہ کرتے A ریکارڈ والا ڈومین، یہاں mcp.example.com۔
  • Ubuntu 24.04 یا Debian 12/13۔ Caddy دونوں کی معیاری ریپوزیٹریز میں ہے۔

1. MCP سرورز کو localhost پر چلائیں

ہر سرور ایک systemd سروس کے طور پر چلتا ہے۔ مثال مکمل رہے، اس لیے یہاں ریفرنس سرور 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

ٹیسٹ کے دوران ہم نے دیکھا: یہ سرور صرف 127.0.0.1 پر نہیں بلکہ تمام انٹرفیسز پر سنتا ہے، اور بہت سے دوسرے بھی ایسا ہی کرتے ہیں۔ تیسرا قدم اسے سنبھالتا ہے۔

2. Caddy: پہلے ٹوکن جانچیں، پھر پاتھ سے روٹ کریں

ایک ٹوکن بنائیں اور ماحول کی فائل سے 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

mcp.example.com کا سرٹیفکیٹ Caddy خود حاصل کر لیتا ہے۔

route بلاک سجاوٹ نہیں ہے۔ ہمارے پہلے ورژن میں ٹوکن جانچ اور handle_path بلاکس سب سے اوپری سطح پر ساتھ ساتھ تھے، اور بغیر ٹوکن والی درخواستیں 200 کے ساتھ سیدھی گزر جاتی تھیں۔ Caddy ہدایات کو اپنی ترتیب میں لگاتا ہے، اور handle_path، respond سے پہلے چلتا ہے۔ route کے اندر وہ لکھی گئی ترتیب میں چلتے ہیں۔ اگر آپ یہ کنفیگ بدلیں تو سب سے پہلے "بغیر ٹوکن" والا معاملہ ٹیسٹ کریں۔

handle_path سابقہ ہٹا دیتا ہے، اس لیے /everything/mcp سرور تک /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 دکھانا چاہیے۔ ہمارے ٹیسٹ میں غلط ٹوکن اور کٹے ہوئے ٹوکن دونوں کو 401 ملا، اور نامعلوم پاتھ کو درست ٹوکن کے ساتھ بھی 404 ملا۔

پھر کسی کلائنٹ سے، مثلاً Claude Code:

claude mcp add --transport http everything https://mcp.example.com/everything/mcp \
  --header "Authorization: Bearer $TOKEN"
claude mcp list

دونوں سرورز نے ✔ Connected دکھایا۔ اسی کلائنٹ نے غلط ٹوکن کے ساتھ ✘ Failed to connect دکھایا۔ کلائنٹ سیٹ اپ کے بارے میں مزید EQVPS MCP کو Claude Code اور Codex سے جوڑیں میں ہے۔

اگلا سرور جوڑنا

اسے نئے localhost پورٹ پر شروع کریں، ایک handle_path بلاک جوڑیں، Caddy ری لوڈ کریں۔ کسی کی کنفیگ نہیں بدلتی، بس اسی ہوسٹ اور اسی ٹوکن کے تحت ایک نیا URL آ جاتا ہے۔

جاننے کے قابل حدود

  • سب کے لیے ایک ٹوکن آسان ہے اور اسے بدلنا ایک فائل ہے، لیکن سب کے لیے بدلے بغیر کسی ایک شخص کی رسائی نہیں ہٹا سکتے۔ ہر صارف کے لیے الگ رسائی چاہیے تو آگے تصدیقی پراکسی لگائیں یا ہر شخص کو اپنا روٹ اور ٹوکن دیں۔
  • گیٹ وے سرور کو محفوظ نہیں بناتا۔ shell کمانڈز چلانے والا MCP سرور ٹوکن رکھنے والے ہر شخص کے لیے shell ہی رہتا ہے۔ ٹوکن مشترکہ کنفیگز اور git سے دور رکھیں۔
  • سائز سرورز کے مطابق چنیں، گیٹ وے کے مطابق نہیں۔ Caddy خود چند درجن MB لیتا ہے۔ اگر کوئی سرور لوکل ماڈل چلاتا ہے یا بڑی ریپوزیٹری انڈیکس کرتا ہے تو پلان وہی طے کرتا ہے، پراکسی نہیں۔

صرف ایک MCP سرور ہے؟ وہ آسان معاملہ MCP سرورز کے لیے VPS میں ہے۔ چاہتے ہیں کہ ایجنٹ اس سرور کو بھی سنبھالیں جس پر وہ رہتے ہیں؟ یہ EQVPS MCP سرور کرتا ہے (یا اسکرپٹ پسند ہوں تو REST API)، اور اپنے IPv4 والے پلانز $8 ماہانہ سے شروع ہوتے ہیں۔

عمومی سوالات

MCP سرورز کو گیٹ وے کے پیچھے کیوں رکھیں؟

ہر سرور کے لیے الگ نہیں بلکہ پوری ٹیم کے لیے ایک پتا اور ایک ٹوکن، TLS ایک جگہ، اور سرور خود صرف localhost پر سنتے ہیں۔ چوتھا سرور جوڑنا گیٹ وے میں تین سطروں کی تبدیلی بن جاتا ہے، سب کے لیے نیا راز نہیں۔

کون سا پلان چاہیے؟

اپنے IPv4 والا پلان، کیونکہ کلائنٹس کو پورٹ 80 اور 443 تک پہنچنا ہے۔ Nano-IP ($8/ماہ، 2 vCPU، 1 GB) ایک گیٹ وے اور چند ہلکے MCP سرورز کے لیے کافی ہے۔ اگر کوئی سرور خود بھاری کام کرتا ہے تو اسی کے مطابق پلان چنیں۔

کیا Caddy سے اسٹریمنگ چلتی ہے؟

ہاں۔ Streamable HTTP عام POST درخواستیں اور server-sent events استعمال کرتا ہے۔ ریورس پراکسی پر flush_interval -1 لگائیں تاکہ ایونٹس بفر میں رکنے کے بجائے فوراً آگے جائیں۔

کیا ایک مشترکہ ٹوکن کافی محفوظ ہے؟

چھوٹی ٹیم کے لیے یہ معقول آغاز ہے: ٹوکن کبھی HTTPS سے باہر نہیں جاتا اور ایک فائل بدل کر اسے تبدیل کیا جا سکتا ہے۔ جب ہر شخص کے لیے الگ رسائی یا واپسی چاہیے ہو تو آگے حقیقی تصدیقی پرت لگائیں۔ مشترکہ ٹوکن کم از کم حد ہے، زیادہ سے زیادہ نہیں۔

کیا یہ NAT پلان پر چل سکتا ہے؟

عوامی گیٹ وے کے طور پر نہیں۔ NAT پلان میں SSH کے لیے ایک فارورڈ پورٹ ہے اور کوئی اور اِن باؤنڈ نہیں، اس لیے کلائنٹس 443 تک نہیں پہنچتے۔ یہ صرف تب چلتا ہے جب تمام کلائنٹس اسی سرور پر ہوں۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔