VPS پر MCP سرور کیسے چلائیں AI ایجنٹس کے لیے
VPS پر Model Context Protocol سرور چلائیں تاکہ AI ایجنٹس کو حقیقی ٹولز ملیں۔ stdio اور remote HTTP ٹرانسپورٹ، systemd، TLS، auth اور JSON-RPC اسٹریم کی ہر خرابی کی مکمل وضاحت۔
آپ کیا بنا رہے ہیں
ایک VPS پر دو کام کرنے والی MCP ترتیبات۔ پہلے ایک stdio سرور — ایک فائل سسٹم یا ڈیٹا بیس ٹول جسے Claude Code چائلڈ پروسیس کے طور پر لانچ کرتا ہے اور pipe کے ذریعے اس سے بات چیت کرتا ہے۔ پھر ایک remote HTTP سرور جو systemd اور nginx ریورس پراکسی کے پیچھے TLS کے ساتھ ایک طویل عمر والی نیٹ ورک سروس کے طور پر چلتا ہے، جس تک کوئی بھی MCP کلائنٹ جسے آپ اس کی طرف اشارہ کریں پہنچ سکتا ہے۔ ان دونوں میں سے کسی کی انسٹالیشن بھی چھوٹی ہے۔ اس گائیڈ کا بیشتر حصہ ان دو چیزوں کے بارے میں ہے جو دراصل مسئلہ پیدا کرتی ہیں: JSON-RPC اسٹریم کو صاف رکھنا، اور عوامی انٹرنیٹ پر کوئی غیر مستند ٹول اینڈ پوائنٹ کبھی نہ لگانا۔
MCP درحقیقت کیا ہے
Model Context Protocol ایک معیاری طریقہ ہے جس کے ذریعے کوئی AI کلائنٹ — Claude Code, Claude Desktop, VPS پر Gemini CLI، یا آپ کا اپنا اسکرپٹ — بیرونی ٹولز کو کال کرتا ہے اور بیرونی وسائل کو پڑھتا ہے۔ ماڈل خود کچھ نہیں چلاتا۔ یہ کلائنٹ سے درخواست کرتا ہے، کلائنٹ کسی MCP سرور سے JSON-RPC 2.0 میں بات کرتا ہے، سرور ٹول چلاتا ہے اور نتیجہ واپس کرتا ہے۔ یہ ایک ہی پروٹوکول ہے، اس لیے آپ جو سرور ایک بار لکھتے ہیں وہ ہر اس کلائنٹ کے ساتھ کام کرتا ہے جو MCP بولتا ہے۔
دو ٹرانسپورٹ طریقے ہیں، اور اس گائیڈ کا باقی ماندہ حصہ انہی کے مطابق تقسیم ہوتا ہے:
- stdio. کلائنٹ سرور کو چائلڈ پروسیس کے طور پر سپاون کرتا ہے اور اس کے معیاری ان پٹ اور معیاری آؤٹ پٹ پر نیو لائن سے الگ کردہ JSON-RPC پیغامات کا تبادلہ کرتا ہے۔ کوئی نیٹ ورک، کوئی پورٹ، کوئی auth نہیں ہے — اعتماد کی حد پروسیس خود ہے۔ تقریباً ہر لوکل ٹول اسی طرح شپ ہوتا ہے۔
- Streamable HTTP (اور اس کا پرانا کزن، HTTP+SSE)۔ سرور ایک طویل عرصے تک چلنے والا ویب سروس ہوتا ہے۔ کلائنٹ HTTP پر کنیکٹ ہوتا ہے اور سرور Server-Sent Events کے طور پر جوابات واپس بھیج سکتا ہے۔ اسی طرح آپ ایک سرور کو متعدد کلائنٹس کے ساتھ شیئر کرتے ہیں، یا ایسا ٹول چلاتے ہیں جو باکس پر مستقل طور پر موجود رہنا چاہیے۔
جب ٹول ایک مشین اور ایک یوزر سے تعلق رکھتا ہو تو stdio منتخب کریں۔ جب یہ ایک شیئرڈ سروس ہو تو HTTP منتخب کریں۔
ضروریات اور حقیقی مشکلات
فرض کریں ایک نیا Ubuntu 24.04 KVM VPS ہے جس میں root یا sudo دستیاب ہے۔ اس کے علاوہ:
- وہ رن ٹائم جس میں سرور لکھا گیا ہے۔ زیادہ تر حوالہ جاتی سرور Node یا Python پر مبنی ہیں۔ Ubuntu 24.04 میں Node 18 شامل ہے، اور کئی موجودہ MCP پیکیجز کو Node 20 یا اس سے جدید ورژن درکار ہے، اس لیے NodeSource یا nvm سے موجودہ LTS ورژن انسٹال کریں،
aptپر بھروسہ نہ کریں۔ Python 3.12 پہلے سے موجود ہے۔ - ایک ڈومین اور DNS A ریکارڈ، لیکن صرف ریموٹ HTTP سرور کے لیے — TLS کو ایک ایسا نام درکار ہوتا ہے جو اس VPS تک رہنمائی کرے۔ stdio مثال کو DNS کی بالکل ضرورت نہیں۔
- 512 MB RAM کافی ہے۔ MCP سرور ہلکے JSON-RPC عمل ہیں؛ میموری کا خرچ اس بات پر منحصر ہے کہ آپ کا ٹول کیا استعمال کرتا ہے (ڈیٹا بیس ڈرائیور، فائل کیش)، نہ کہ پروٹوکول پر۔
- اسپیک فی الحال نئی اور تبدیل ہو رہی ہے۔ 2025-03-26 ریویژن نے HTTP+SSE کی جگہ Streamable HTTP لے لی ہے اور SSE کو deprecated قرار دیا ہے۔ SSE اب بھی کام کرتا ہے اور کئی سرور اسے استعمال کرتے ہیں، اس لیے کسی بھی ٹرانسپورٹ پن کو حتمی حقیقت نہ سمجھیں، بلکہ اسے سرور کی ریلیز نوٹس کے مقابلے میں دوبارہ چیک کرنا چاہیے۔
مرحلہ 1: Claude Code میں stdio سرور کو منسلک کریں
فائل سسٹم سرور سے آغاز کریں — یہ سرکاری ہے، فعال طور پر برقرار ہے، اور اسے صرف Node کی ضرورت ہے۔ نیچے دیا گیا واحد کمانڈ اسے Claude Code کے ساتھ رجسٹر کرتی ہے اور اسے موجودہ پروجیکٹ تک محدود رکھتی ہے تاکہ یہ ایک قابلِ کمیٹ فائل میں محفوظ ہو:
cd /home/matt/projects/api
claude mcp add --scope project --transport stdio filesystem \
-- npx -y @modelcontextprotocol/server-filesystem /home/matt/projects/api-- علیحدہ کنٹھنک اہم ہے: اس کے بعد کی ہر چیز وہ کمانڈ ہے جو Claude Code چلائے گا، نہ کہ Claude Code کے لیے کوئی flag۔ یہ پروجیکٹ کی جڑ میں .mcp.json لکھتا ہے:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/home/matt/projects/api"
]
}
}
}ابھی تک کچھ نہیں چل رہا۔ جب آپ اگلی بار اس ڈائریکٹری میں Claude Code شروع کریں گے، تو ایجنٹ .mcp.json کو پڑھے گا، npx -y @modelcontextprotocol/server-filesystem ... کو بطور چائلڈ پروسیس بھیجے گا، اور اسی پروسیس کے stdin/stdout پر MCP ہینڈشیک مکمل کرے گا۔ تصدیق کریں کہ یہ کامیاب ہوا:
claude mcp listایک صحت مند سرور اپنی کمانڈ اور ایک سبز ٹِک پرنٹ کرتا ہے — filesystem: npx -y @modelcontextprotocol/server-filesystem ... - ✓ Connected۔ سیشن کے اندر، /mcp سلیش کمانڈ ان آلات کی فہرست دکھاتی ہے جو سرور بہم پہنچاتا ہے (read_file، write_file، list_directory)، اور اب ایجنٹ انہیں آپ کی اجازت شدہ path پر کال کر سکتا ہے۔ ایک ڈیٹا بیس ٹول بھی اسی شکل کا ہوتا ہے — پیکیج تبدیل کریں اور کنکشن سٹرنگ کو بطور آخری دلیل پاس کریں — لیکن موجودہ پیکیج نام کے لیے سرور کے اپنی ریپوزیٹری کی جانچ کریں، کیونکہ ریفرنس Postgres سرور کی ملکیت ایک سے زیادہ بار تبدیل ہو چکی ہے۔
یہی باکس پر ایجنٹ چلانے کا اصل مقصد ہے: Claude Code سیشن VPS پر tmux کے اندر موجود ہے، اور اس کے stdio سرور اسی کے ساتھ چلتے ہیں جنہیں پروجیکٹ فائلز اور مقامی سروسز تک براہ راست رسائی حاصل ہے، بغیر کسی نیٹ ورک راؤنڈ ٹرپ کے۔
مرحلہ 2: ایک ریموٹ HTTP سرور بنائیں
ایک stdio سرور اپنے پیرنٹ کے ساتھ ختم ہو جاتا ہے۔ جب آپ ایسا ٹول چاہتے ہیں جو ہر کلائنٹ کے لیے چلتا رہے — ایک مشترکہ ops ٹول، ایک ڈیٹا بیس گیٹ وے، یا ایسی چیز جسے آپ کی لیپ ٹاپ اور آپ کا CI دونوں کال کریں — تو آپ کو HTTP ٹرانسپورٹ اور ایک حقیقی سروس درکار ہے۔ یہ ایک کم سے کم Python سرور ہے جو سرکاری SDK استعمال کرتا ہے اور ایک ٹول ظاہر کرتا ہے:
# /opt/mcp-ops/server.py
from mcp.server.fastmcp import FastMCP
import subprocess
mcp = FastMCP("ops-tools", host="127.0.0.1", port=8000)
@mcp.tool()
def disk_free() -> str:
"""Return `df -h` for the server."""
out = subprocess.run(["df", "-h"], capture_output=True, text=True)
return out.stdout
if __name__ == "__main__":
# Serves Streamable HTTP at /mcp on 127.0.0.1:8000
mcp.run(transport="streamable-http")host="127.0.0.1" پر غور کریں۔ سرور صرف localhost سے بائنڈ ہوتا ہے — باکس کے باہر سے کوئی بھی اس تک براہ راست نہیں پہنچ سکتا، جو بالکل وہی ہے جو آپ auth موجود ہونے سے پہلے چاہتے ہیں۔ اسے اپنے الگ virtualenv میں انسٹال کریں تاکہ systemd کے پاس ایک مستحکم انٹرپریٹر پاتھ ہو:
sudo useradd --system --home /opt/mcp-ops --shell /usr/sbin/nologin mcp
sudo install -d -o mcp -g mcp /opt/mcp-ops
sudo -H -u mcp python3 -m venv /opt/mcp-ops/.venv
sudo -H -u mcp /opt/mcp-ops/.venv/bin/pip install "mcp[cli]"مرحلہ 3: systemd کے ساتھ اسے زندہ رکھیں
ایک ایسا آلہ جو ایجنٹ کی پہنچ پر بند ہو، اس سے بڑھ کر کوئی آلہ نہ ہونا بہتر ہے۔ /etc/systemd/system/mcp-ops.service لکھیں:
[Unit]
Description=MCP ops-tools server
After=network.target
[Service]
Type=simple
User=mcp
WorkingDirectory=/opt/mcp-ops
ExecStart=/opt/mcp-ops/.venv/bin/python /opt/mcp-ops/server.py
Restart=on-failure
RestartSec=2
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.targetExecStart میں venv Python کا مطلق پاتھ اختیاری نہیں ہے — اسے /usr/bin/python3 کی طرف اشارہ کریں اور عمل ModuleNotFoundError: No module named 'mcp' کے ساتھ شروع ہوتا ہے، کیونکہ سسٹم انٹرپریٹر نے آپ کا pip install کبھی نہیں دیکھا۔ فعال کریں اور چیک کریں:
sudo systemctl daemon-reload
sudo systemctl enable --now mcp-ops
sudo systemctl status mcp-ops
curl -si -H 'Accept: application/json, text/event-stream' \
-H 'Content-Type: application/json' \
-X POST http://127.0.0.1:8000/mcpstatus میں active (running) پڑھنا چاہیے۔ curl HTTP/1.1 400 Bad Request کے ساتھ واپس آتا ہے جس میں باڈی میں JSON-RPC error ہوتا ہے — درخواست میں کوئی session نہیں تھا اور کوئی درست JSON payload نہیں تھی — اور یہی وہ چیز ہے جو آپ چاہتے ہیں: یہ ثابت کرتا ہے کہ پورٹ جواب دیتا ہے اور پروٹوکول بولتا ہے۔ Connection refused یا خالی جواب کا مطلب ہے کہ عمل وہاں باؤنڈ نہیں جہاں آپ سمجھتے ہیں؛ journalctl -u mcp-ops -n 50 پڑھیں۔
مرحلہ 4: TLS اور ریورس پراکسی آگے لگائیں
سرور localhost پر سنتی ہے۔ اسے کہیں سے بھی reachable بنانے کے لیے، آپ TLS کو nginx پر ختم کرتے ہیں اور اندر کی طرف پراکسی کرتے ہیں۔ nginx انسٹال کریں، nginx پر Certbot اور Let's Encrypt کے ساتھ سرٹیفکیٹ حاصل کریں، پھر location بلاک لکھیں۔ اہم حصہ buffering کو disable کرنا ہے، کیونکہ nginx کا default رویہ response کو مکمل ہونے تک روکے رکھتا ہے، جو ایک SSE stream کو ہمیشہ کے لیے معطل کر دیتا ہے:
server {
listen 443 ssl;
server_name mcp.example.com;
# ssl_certificate lines managed by Certbot
location /mcp {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
# The four lines that make SSE work through nginx:
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
chunked_transfer_encoding off;
}
}sudo nginx -t && sudo systemctl reload nginx کے ساتھ reload کریں۔ اگر آپ پہلے ہی containers کا بیڑا چلا رہے ہیں، تو یہی کام آپ کے لیے خودکار TLS کے ساتھ Traefik ریورس پراکسی کر دیتی ہے — یہ سرٹیفکیٹ جاری کرتی ہے اور hostname کے لحاظ سے route کرتی ہے، اور آپ کو بس MCP container میں labels شامل کرنی ہیں۔ دونوں صورتوں میں، ریورس پراکسی اب public port پر واحد چیز ہے، اور یہ ایک ایسی سروس کی طرف اشارہ کر رہی ہے جسے آپ نے ابھی secure نہیں کیا۔ اسے کہیں بھی URL رجسٹر کرنے سے پہلے درست کریں۔
مرحلہ 5: اس موضوع پر حاوی سیکیورٹی اصول
کبھی بھی غیر مصدق شدہ MCP endpoint کو عوامی طور پر دستیاب نہ کریں۔ MCP server صرف read-only API نہیں ہے۔ یہ ٹول تک رسائی دیتا ہے — آپ کی فائلوں، آپ کی database، اور بعض اوقات shell تک۔ عوامی انٹرنیٹ پر ایک کھلا /mcp ایک اجنبی کے برابر ہے جس کی رسائی آپ کے AI agent کے مساوی ہے: وہ آپ کے ٹولز کی فہرست دیکھتا ہے، پھر انہیں کال کرتا ہے۔ اسے بالکل غیر مصدق شدہ admin socket کی طرح سمجھیں، کیونکہ یہ دراصل وہی ہے۔
ترجیح کی ترتیب میں تین دفاعی اقدامات:
- اسے شائع نہ کریں۔ server کو
127.0.0.1پر رکھیں اور اس تک اپنے laptop سے SSH tunnel کے ذریعے پہنچیں:ssh -L 8000:127.0.0.1:8000 matt@vps، پھر client کوhttp://127.0.0.1:8000/mcpپر مبنی کریں۔ کچھ بھی کبھی عوامی نہیں ہوتا۔ - اسے ایک نجی نیٹ ورک پر رکھیں۔ ایک خود میزبانی شدہ WireGuard VPN کے tunnel address کو bind کریں اور صرف VPN peers کو اس تک پہنچنے دیں۔ عوامی انٹرنیٹ کو ایک بند port نظر آتا ہے۔
- اگر اسے عوامی ہونا ضروری ہے، تو token کی ضرورت کریں۔ مناسب جواب MCP OAuth flow ہے جسے HTTP transport خود بخود سپورٹ کرتا ہے۔ عملی طور پر کم سے کم ایک shared bearer token ہے جس کی جانچ proxy پر کی جاتی ہے — سستا، اور یہ drive-by حملے کو مکمل طور پر روک دیتا ہے:
location /mcp {
if ($http_authorization != "Bearer REPLACE_WITH_LONG_RANDOM") {
return 401;
}
proxy_pass http://127.0.0.1:8000;
# ...buffering-off block from above...
}token کو openssl rand -hex 32 کے ساتھ بنائیں، اور ان میں سے کسی کو آگے رکھے بغیر server کو خود 0.0.0.0 پر کبھی bind نہ کریں۔ پھر client token کو header کے طور پر بھیجتا ہے۔ Claude Code میں:
claude mcp add --scope project --transport http ops-tools https://mcp.example.com/mcp \
--header 'Authorization: Bearer ${MCP_TOKEN}'اپنے shell میں MCP_TOKEN سیٹ کریں تاکہ secret کبھی .mcp.json میں plain text کے طور پر محفوظ نہ ہو — Claude Code پڑھنے کے وقت ${MCP_TOKEN} کو ماحول سے حاصل کرتا ہے۔
مرحلہ 6: MCP Inspector کے ساتھ ڈیبگ کریں
جب سرور غلط رویہ دیتا ہے، تو ایجنٹ کے اندر سے اندازہ نہ لگائیں — اسے براہ راست Inspector کے ساتھ چلائیں، جو کہ سرکاری ویب بیسڈ ٹیسٹ کلائنٹ ہے۔ stdio سرور کے لیے، اسے وہی کمانڈ دیں جو ایجنٹ چلاتا ہے:
npx @modelcontextprotocol/inspector \
npx -y @modelcontextprotocol/server-filesystem /tmpیہ http://localhost:6274 پر ایک UI شروع کرتا ہے (حالیہ ورژنز ایک URL پرنٹ کرتے ہیں جس میں MCP_PROXY_AUTH_TOKEN query string ہوتی ہے — اسی مخصوص لنک کا استعمال کریں ورنہ UI آپ کو مسترد کر دے گا) اور 6277 پر ایک پراکسی۔ Connect پر کلک کریں، پھر List Tools پر، پھر حقیقی دلائل کے ساتھ Call Tool پر۔ اگر یہ Inspector میں کام کرتا ہے لیکن ایجنٹ میں ناکام ہوتا ہے، تو خرابی آپ کی کلائنٹ کنفیگ میں ہے، سرور میں نہیں۔ remote HTTP سرور کے لیے، Streamable HTTP ٹرانسپورٹ منتخب کریں، https://mcp.example.com/mcp درج کریں، Authorization ہیڈر شامل کریں، اور کنیکٹ کریں — یہ ثابت کرنے کا تیز ترین طریقہ ہے کہ کسی بھی ایجنٹ کو شامل کیے بغیر auth اور پراکسی درست ہیں۔
سرورز کو اپ ڈیٹ رکھنا
MCP تیزی سے آگے بڑھتا ہے، اس لیے شیڈول پر پیچ لگائیں۔ npx -y سے لانچ کیے گئے Node سرورز ہر اسپاؤن پر تازہ ترین ورژن لاتے ہیں، جو سہولت کے لحاظ سے تو بہتر ہے لیکن دہرایا نہیں جا سکتا۔ جیسے ہی کوئی سرور اہم ہو، اپنے ٹیسٹ کیے گئے عین مطابق ورژن کو پن کریں — اسے npm view @modelcontextprotocol/server-filesystem version سے پڑھیں اور .mcp.json میں پیکیج کے نام کے ساتھ شامل کریں (@modelcontextprotocol/server-filesystem@<version>) — اور اسے باآسانی اپ گریڈ کریں۔ systemd کے تحت چلنے والے Python سرورز sudo -H -u mcp /opt/mcp-ops/.venv/bin/pip install -U "mcp[cli]" کے بعد sudo systemctl restart mcp-ops چلا کر اپ ڈیٹ ہوتے ہیں۔ اپ گریڈ کے وقت اپنے SDK کے ہدف کردہ spec ریویژن کو دیکھیں — SSE-to-Streamable-HTTP کی حد کو پار کرنے والی چھلانگ آپ کے کلائنٹس کی درخواست کردہ ٹرانسپورٹ کو تبدیل کر سکتی ہے۔
ناکامی کے طریقے، جن سٹرنگز کی آپ کو نظر آئے گی
ایجنٹ سرور کی ناکامی ظاہر کرتا ہے۔ claude mcp list پرنٹ کرتا ہے ✗ Failed to connect، اور TUI رپورٹ کرتا ہے MCP server 'filesystem' failed to start۔ claude --debug چلائیں، تو عموماً Error: spawn npx ENOENT نظر آئے گا — کمانڈ ایجنٹ کے PATH پر موجود نہیں ہے۔ رن ٹائم غائب ہے یا ایجنٹ کی تلاش کی جگہ پر نہیں ہے: Node انسٹال نہیں ہے، npx موجود نہیں، یا کوئی virtualenv Python صرف نام سے استعمال ہو رہا ہے۔ کمانڈ کو مطلق پاتھ پر درست کریں یا رن ٹائم انسٹال کریں، پھر دوبارہ کنیکٹ کریں۔
کوئی stdio سرور کنیکٹ ہوتا ہے، پھر فوراً منقطع ہو جاتا ہے۔ کلائنٹ JSON پارس ایرر لاگ کرتا ہے — جیسے Unexpected token 'S', "Server sta"... is not valid JSON یا Failed to parse message۔ وجہ ہمیشہ ایک جیسی ہوتی ہے: سرور نے stdout پر ایک لاگ لائن لکھ دی۔ stdio پر، stdout ہی JSON-RPC چینل ہے، اس لیے کوئی بھی غیر متعلقہ ٹیکسٹ سٹریم کو خراب کرتا ہے اور ہینڈشیک ناکام ہو جاتا ہے۔ Node میں، console.log stdout پر جاتا ہے — console.error استعمال کریں۔ Python میں، ایک سادہ print() stdout پر جاتا ہے — لاگز logging سے لکھیں جسے sys.stderr پر کنفیگر کیا گیا ہو، یا file=sys.stderr پاس کریں۔ اصول مطلق ہے: stdio پر، stdout پر صرف JSON-RPC، باقی سب انسانی پیغامات stderr پر۔
کوئی ریموٹ سرور ٹائم آؤٹ ہو جاتا ہے یا ہینڈشیک کے دوران بند ہو جاتا ہے۔ کلائنٹ MCP error -32000: Connection closed کے ساتھ ناکام ہوتا ہے، یا Inspector Connect پر ہینگ ہو جاتا ہے اور ٹولز کبھی نہیں دکھاتا۔ nginx کے پیچھے یہ بفرنگ ہے: پراکسی SSE سٹریم کو فلش کرنے کے بجائے روکے ہوئے ہے، اس لیے کلائنٹ ایک ایسے جواب کا انتظار کرتا ہے جو کبھی نہیں آتا۔ proxy_buffering off; (اور Step 4 کا باقی بلاک) location میں شامل کریں۔ پبلک URL کے خلاف curl -N سے تصدیق کریں — آپ کو ایونٹ ڈیٹا بتدریج آتا ہوا نظر آنا چاہیے، نہ کہ آخر میں یکبارگی۔
توثیق مسترد ہو جاتی ہے۔ کلائنٹ Error POSTing to endpoint (HTTP 401) رپورٹ کرتا ہے یا باآسانی 401 Unauthorized۔ یا تو ہیڈر غائب ہے، ٹوکن غلط ہے، یا کلائنٹ کے کنفیگ پڑھنے کے وقت شیل ویریبل خالی تھا — یہ ایک عام غلطی ہے، کیونکہ ${MCP_TOKEN} خالی ویریبل کی صورت میں کچھ بھی نہیں بنتا اور nginx کو Bearer بغیر کسی ویلیو کے نظر آتا ہے۔ ویریبل کو echo کریں، ہیڈر دوبارہ شامل کریں، اور تصدیق کریں کہ nginx کے if میں موجود ٹوکن سے بائٹس بالکل میل کھاتے ہیں۔
سروس systemd کے تحت شروع نہیں ہوتی۔ journalctl -u mcp-ops میں ModuleNotFoundError: No module named 'mcp' نظر آتا ہے — ExecStart venv انٹرپریٹر کے بجائے سسٹم Python کی طرف اشارہ کرتا ہے۔ یا Address already in use — کوئی اور پروسیس 8000 پورٹ پر قابض ہے؛ اسے sudo ss -ltnp | grep 8000 سے تلاش کریں۔
FAQ
MCP server بالکل کیا ہے؟
یہ ایک پروگرام ہے جو Model Context Protocol کے ذریعے JSON-RPC 2.0 کا استعمال کرتے ہوئے AI کلائنٹ کو ٹولز اور وسائل فراہم کرتا ہے۔ AI ماڈل خود ٹول نہیں چلاتا — یہ اپنے کلائنٹ سے درخواست کرتا ہے، کلائنٹ MCP server کو کال کرتا ہے، اور server اسے چلا کر نتیجہ واپس کرتا ہے۔ چونکہ پروٹوکول معیاری ہے، اس لیے ایک server کسی بھی مطابقت رکھنے والے کلائنٹ کے ساتھ کام کرتا ہے، خواہ وہ Claude Code ہو، Claude Desktop ہو، یا Gemini CLI۔
stdio اور HTTP transport میں کیا فرق ہے؟
stdio server کو کلائنٹ ایک child process کے طور پر لانچ کرتا ہے اور stdin/stdout پر بات چیت کرتا ہے، اس لیے یہ ایک مشین پر ایک کلائنٹ کے ساتھ شروع ہوتا اور ختم ہوتا ہے، اور اسے network یا auth کی ضرورت نہیں۔ HTTP server ایک طویل چلنے والا network service ہے جس تک ایک ساتھ متعدد کلائنٹس پہنچ سکتے ہیں، اسی لیے اسے TLS اور authentication کی ضرورت ہوتی ہے۔ مقامی، سنگل یوزر ٹولز کے لیے stdio استعمال کریں؛ کسی بھی مشترک یا مستقل چیز کے لیے HTTP (موجودہ servers پر Streamable HTTP) استعمال کریں۔
میں ایک remote MCP server کو کیسے محفوظ کروں؟
فرض کریں کہ یہ آپ کی فائلوں، database، یا shell تک ٹول تک رسائی دیتا ہے، اور اسے کبھی بھی unauthenticated expose نہ کریں۔ بہترین یہ ہے کہ اسے localhost سے باؤنڈ رکھیں اور SSH tunnel یا private VPN کے ذریعے اس تک پہنچیں؛ اگر اسے عوامی ہونا ضروری ہے، تو اسے reverse proxy کے پیچھے رکھیں جو bearer token یا MCP OAuth flow کو نافذ کرے۔ token کو openssl rand -hex 32 سے بنائیں اور server کو کبھی بھی 0.0.0.0 سے باؤنڈ نہ کریں جب تک کہ ان میں سے کوئی ایک آگے نہ ہو۔
میں ایک ایسے server کو کیسے ڈیبگ کروں جو شروع نہیں ہوتا؟
پہلے claude mcp list چیک کریں — spawn ... ENOENT کے ساتھ ✗ Failed to connect کا مطلب ہے کہ command یا runtime غائب ہے، اس لیے path درست کریں یا اسے انسٹال کریں۔ اگر یہ کنیکٹ ہو کر JSON parse error کے ساتھ ڈراپ ہو جائے، تو server stdout پر لاگ لکھ رہا ہے اور JSON-RPC stream کو خراب کر رہا ہے؛ تمام logging کو stderr پر منتقل کریں۔ کسی اور مسئلے کے لیے، MCP Inspector کے تحت exact command چلائیں، جو server کو الگ تھلگ چلاتا ہے تاکہ آپ بتا سکیں کہ یہ server کا bug ہے یا client-config کا bug۔