VPS-এ MCP server চালানোর নিয়ম
আপনার VPS-এ stdio এবং remote HTTP transport ব্যবহার করে MCP server সেটআপ করুন। systemd, TLS এবং auth কনফিগার করার সঠিক পদ্ধতি এখানে জানুন।
আপনি যা তৈরি করছেন
একটি VPS-এ দুটি কার্যকর MCP সেটআপ। প্রথমটি হলো একটি stdio server — এটি একটি filesystem বা database tool যা Claude Code একটি child process হিসেবে চালু করে এবং একটি pipe-এর মাধ্যমে এর সাথে যোগাযোগ করে। দ্বিতীয়টি হলো একটি remote HTTP server যা systemd এবং একটি nginx reverse proxy (TLS সহ) এর মাধ্যমে একটি long-lived network service হিসেবে চলে; এটি যেকোনো MCP client দ্বারা অ্যাক্সেস করা সম্ভব। এই দুটির ইন্সটলেশন প্রক্রিয়া খুবই ছোট। এই গাইডের বেশিরভাগ অংশ মূলত দুটি গুরুত্বপূর্ণ বিষয় নিয়ে: JSON-RPC stream পরিষ্কার রাখা এবং কোনো unauthenticated tool endpoint সরাসরি পাবলিক ইন্টারনেটে না রাখা।
MCP আসলে কী
Model Context Protocol হলো একটি স্ট্যান্ডার্ড পদ্ধতি যার মাধ্যমে একটি AI client — যেমন Claude Code, Claude Desktop, Gemini CLI on a VPS, অথবা আপনার নিজস্ব script — এক্সটারনাল tools কল করতে পারে এবং এক্সটারনাল resources পড়তে পারে। মডেলটি নিজে কোনো কিছু রান করে না। এটি client-কে অনুরোধ পাঠায়, client তখন MCP server-এর সাথে JSON-RPC 2.0 প্রোটোকল ব্যবহার করে যোগাযোগ করে, এবং serverটি tool-টি রান করে ফলাফলটি ফেরত পাঠায়। একটি মাত্র প্রোটোকল হওয়ার কারণে, আপনি একবার একটি server লিখলে সেটি MCP সাপোর্ট করে এমন প্রতিটি client-এর সাথে কাজ করবে।
এখানে দুটি transport রয়েছে, এবং এই গাইডের পরবর্তী অংশ এই দুইটির ভিত্তিতে বিভক্ত:
- stdio. Clientটি server-টিকে একটি child process হিসেবে চালু করে এবং এর standard input ও standard output-এর মাধ্যমে newline-delimited JSON-RPC মেসেজ আদান-প্রদান করে। এখানে কোনো network, port বা auth প্রয়োজন হয় না — প্রসেসটি নিজেই trust boundary হিসেবে কাজ করে। প্রায় সব লোকাল tool এই পদ্ধতিতে কাজ করে।
- Streamable HTTP (এবং এর পুরনো সংস্করণ, HTTP+SSE)। Serverটি একটি long-running web service হিসেবে কাজ করে। Clientটি HTTP-এর মাধ্যমে কানেক্ট করে এবং serverটি Server-Sent Events হিসেবে রেসপন্স স্ট্রিম করতে পারে। অনেকগুলো client-এর সাথে একটি server শেয়ার করার জন্য অথবা কোনো স্থায়ী tool চালানোর জন্য এই পদ্ধতি ব্যবহার করা হয়।
যদি tool-টি কেবল একটি machine এবং একজন user-এর জন্য হয়, তবে stdio বেছে নিন। যদি এটি একটি shared service হয়, তবে HTTP বেছে নিন।
Prerequisites এবং সম্ভাব্য জটিলতা
ধরে নিন আপনার কাছে root বা sudo অ্যাক্সেসসহ একটি নতুন Ubuntu 24.04 KVM VPS আছে। এছাড়া নিচের বিষয়গুলো প্রয়োজন:
- সার্ভারটি যে runtime-এ লেখা হয়েছে তা থাকা প্রয়োজন। বেশিরভাগ রেফারেন্স সার্ভার Node বা Python দিয়ে তৈরি। Ubuntu 24.04-এ Node 18 থাকে, কিন্তু অনেক বর্তমান MCP প্যাকেজের জন্য Node 20 বা তার পরের ভার্সন প্রয়োজন। তাই
apt-এর ওপর নির্ভর না করে NodeSource বা nvm থেকে একটি বর্তমান LTS ইনস্টল করুন। Python 3.12 আগে থেকেই উপস্থিত আছে। - একটি domain এবং DNS A record, তবে এটি শুধুমাত্র রিমোট HTTP সার্ভারের জন্য প্রযোজ্য — TLS-এর জন্য এমন একটি নাম প্রয়োজন যা এই VPS-কে resolve করে। stdio উদাহরণের জন্য কোনো DNS-এর প্রয়োজন নেই।
- 512 MB RAM যথেষ্ট। MCP সার্ভারগুলো খুব হালকা JSON-RPC প্রসেস; মেমরি খরচ মূলত আপনার ব্যবহৃত টুলের (যেমন: database driver, file cache) ওপর নির্ভর করে, প্রোটোকলের ওপর নয়।
- Spec বা নিয়মাবলি এখনও পরিবর্তনশীল। 2025-03-26 রিভিশনে HTTP+SSE-এর পরিবর্তে Streamable HTTP আনা হয়েছে এবং SSE-কে deprecated হিসেবে চিহ্নিত করা হয়েছে। SSE এখনও কাজ করে এবং অনেক সার্ভার এটি ব্যবহার করে, তাই যেকোনো transport পদ্ধতিকে চূড়ান্ত না মেনে সার্ভারের release notes দেখে যাচাই করে নিন।
Step 1: Claude Code-এ একটি stdio server যুক্ত করুন
filesystem server দিয়ে শুরু করুন — এটি অফিসিয়াল, নিয়মিত আপডেট করা হয় এবং এর জন্য Node ছাড়া আর কিছুর প্রয়োজন নেই। নিচের কমান্ডটি এটি Claude Code-এর সাথে রেজিস্টার করবে এবং বর্তমান প্রজেক্টের জন্য সীমাবদ্ধ (scope) করবে, যাতে এটি একটি committable ফাইলে জমা হয়:
cd /home/matt/projects/api
claude mcp add --scope project --transport stdio filesystem \
-- npx -y @modelcontextprotocol/server-filesystem /home/matt/projects/api-- separator-টি গুরুত্বপূর্ণ: এর পরের অংশটি 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 ...-কে একটি child process হিসেবে চালু করবে এবং সেই process-এর stdin/stdout-এর মাধ্যমে MCP handshake সম্পন্ন করবে। এটি সফল হয়েছে কিনা তা নিশ্চিত করুন:
claude mcp listএকটি সঠিক server তার command এবং একটি সবুজ টিক — filesystem: npx -y @modelcontextprotocol/server-filesystem ... - ✓ Connected প্রিন্ট করবে। সেশনের ভেতরে, /mcp slash command সার্ভার দ্বারা প্রদান করা টুলগুলোর তালিকা দেখাবে (read_file, write_file, list_directory), এবং এজেন্ট এখন আপনার অনুমতিপ্রাপ্ত path-এ সেগুলো কল করতে পারবে। একটি database tool-এর গঠনও একই — প্যাকেজটি পরিবর্তন করুন এবং এর শেষ argument হিসেবে একটি connection string প্রদান করুন — তবে সার্ভারের নিজস্ব repository থেকে বর্তমান প্যাকেজের নাম যাচাই করে নিন, কারণ রেফারেন্স Postgres server-এর মালিকানা একাধিকবার পরিবর্তিত হয়েছে।
মেশিনে এজেন্ট চালানোর মূল উদ্দেশ্য এটাই: Claude Code sessionটি tmux-এর ভেতরে VPS-এ চলে, এবং এর stdio servers গুলো সরাসরি প্রজেক্ট ফাইল এবং লোকাল সার্ভিস ব্যবহারের সুবিধা নিয়ে এর পাশেই চলে, কোনো network round-trip ছাড়াই।
ধাপ 2: একটি রিমোট HTTP সার্ভার তৈরি করুন
একটি stdio সার্ভার তার parent প্রসেসের সাথে বন্ধ হয়ে যায়। যখন আপনার এমন একটি টুলের প্রয়োজন হয় যা প্রতিটি ক্লায়েন্টের জন্য সচল থাকবে — যেমন কোনো shared ops tool, একটি database gateway, অথবা এমন কিছু যা আপনার laptop এবং CI উভয়ই কল করে — তখন আপনার HTTP transport এবং একটি প্রকৃত service প্রয়োজন। নিচে অফিসিয়াল SDK ব্যবহার করে একটি মিনিমাল Python সার্ভার দেওয়া হলো, যা একটি টুল এক্সপোজ করে:
# /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-এ bind হয় — বক্সের বাইরের কোনো কিছু সরাসরি এটিকে অ্যাক্সেস করতে পারবে না, যা authentication থাকার আগে আপনার জন্য প্রয়োজন। এটি একটি নিজস্ব virtualenv-এ ইনস্টল করুন যাতে systemd একটি stable interpreter path পায়:
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]"Step 3: systemd দিয়ে এটি সচল রাখুন
Agent যখন কোনো টুলের কাছে পৌঁছায় এবং সেটি বন্ধ থাকে, তখন সেই টুলটি না থাকার চেয়েও বেশি ক্ষতিকর। /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-এর absolute path দেওয়া বাধ্যতামূলক — এটিকে /usr/bin/python3-এর দিকে নির্দেশ করুন এবং ModuleNotFoundError: No module named 'mcp' দিয়ে প্রসেসটি শুরু করুন, কারণ system interpreter আপনার pip install দেখতে পায় না। Enable এবং check করুন:
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 রিটার্ন করবে এবং এর body-তে একটি JSON-RPC error থাকবে — এর মানে হলো রিকোয়েস্টটিতে কোনো session এবং কোনো বৈধ JSON payload ছিল না — এবং এটিই আপনি চান: এটি প্রমাণ করে যে port রেসপন্স করছে এবং protocol বুঝতে পারছে। Connection refused বা একটি empty reply মানে হলো প্রসেসটি আপনার ভাবা জায়গায় bound নেই; journalctl -u mcp-ops -n 50 পড়ুন।
Step 4: TLS এবং একটি reverse proxy ব্যবহার করুন
সার্ভারটি localhost-এ listen করে। যেকোনো জায়গা থেকে এটি অ্যাক্সেস করতে হলে, আপনাকে nginx-এ TLS terminate করতে হবে এবং এরপর inward proxy করতে হবে। nginx ইনস্টল করুন, Certbot and Let's Encrypt on nginx ব্যবহার করে একটি certificate সংগ্রহ করুন, এবং তারপর location block লিখুন। সবচেয়ে গুরুত্বপূর্ণ কাজ হলো buffering বন্ধ করা; কারণ nginx-এর ডিফল্ট আচরণে রেসপন্স সম্পূর্ণ না হওয়া পর্যন্ত সেটি আটকে থাকে, যা একটি 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 করুন। আপনি যদি ইতিমধ্যে অনেকগুলো container চালান, তবে Traefik reverse proxy with automatic TLS ব্যবহার করে একই কাজ সহজে করা সম্ভব — এটি নিজে থেকেই certificate ইস্যু করে এবং hostname অনুযায়ী route করে, আপনাকে শুধু MCP container-এ labels যোগ করতে হবে। যে পদ্ধতিই ব্যবহার করুন না কেন, এখন reverse proxy ছাড়া পাবলিক পোর্টে আর কিছু নেই, এবং এটি এমন একটি service-কে নির্দেশ করছে যা আপনি এখনও secure করেননি। URLটি কোথাও রেজিস্টার করার আগে সেটি ঠিক করে নিন।
Step 5: এই বিষয়ের সবচেয়ে গুরুত্বপূর্ণ নিরাপত্তা নিয়ম
কখনো কোনো unauthenticated MCP endpoint প্রকাশ করবেন না। একটি MCP server শুধুমাত্র read-only API নয়। এটি tool access প্রদান করে — আপনার files, database, এমনকি কখনও কখনও shell-এর অ্যাক্সেস দেয়। পাবলিক ইন্টারনেটে একটি খোলা /mcp আপনার AI agent-এর মতোই ক্ষমতা সম্পন্ন একজন অপরিচিত ব্যক্তির মতো: তারা আপনার tools গুলো তালিকাভুক্ত করবে এবং তারপর সেগুলো কল করবে। এটিকে একটি unauthenticated 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-এর দিকে পয়েন্ট করুন। এতে কোনো কিছুই প্রকাশ পায় না। - এটি একটি private network-এ রাখুন। একটি self-hosted WireGuard VPN-এর tunnel address bind করুন এবং শুধুমাত্র VPN peers-কে এটি অ্যাক্সেস করতে দিন। পাবলিক ইন্টারনেট একটি closed port দেখতে পাবে।
- যদি এটি পাবলিক হতে হয়, তবে একটি token প্রয়োজন করুন। সঠিক সমাধান হলো MCP OAuth flow যা HTTP transport natively সাপোর্ট করে। ব্যবহারিক ক্ষেত্রে সর্বনিম্ন সমাধান হলো proxy-তে একটি shared bearer token যাচাই করা — এটি সহজ এবং এটি 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...
}openssl rand -hex 32 দিয়ে token তৈরি করুন, এবং server-এর সামনে এই ধরনের কোনো সুরক্ষা না থাকলে কখনোই এটিকে 0.0.0.0-এ bind করবেন না। এরপর client একটি header হিসেবে token পাঠাবে। 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-এ plaintext হিসেবে না থাকে — Claude Code read time-এ environment থেকে ${MCP_TOKEN} expand করে।
Step 6: MCP Inspector দিয়ে debug করা
সার্ভার সঠিকভাবে কাজ না করলে, এজেন্ট থেকে অনুমান করার চেষ্টা করবেন না — সরাসরি অফিসিয়াল ওয়েব-ভিত্তিক টেস্ট ক্লায়েন্ট, Inspector ব্যবহার করে পরীক্ষা করুন। একটি stdio সার্ভারের ক্ষেত্রে, এজেন্ট যে কমান্ডটি ব্যবহার করে সেটিই এখানে দিন:
npx @modelcontextprotocol/inspector \
npx -y @modelcontextprotocol/server-filesystem /tmpএটি http://localhost:6274-এ একটি UI চালু করবে (সাম্প্রতিক ভার্সনগুলোতে MCP_PROXY_AUTH_TOKEN query string সহ একটি URL দেখাবে — সেই লিঙ্কটিই ব্যবহার করুন, অন্যথায় UI রিজেক্ট করবে) এবং 6277 পোর্টে একটি proxy চালু করবে। Connect ক্লিক করুন, তারপর List Tools এবং সবশেষে সঠিক arguments সহ Call Tool নির্বাচন করুন। যদি Inspector-এ এটি কাজ করে কিন্তু এজেন্টে ব্যর্থ হয়, তবে সমস্যাটি আপনার client config-এ, সার্ভারে নয়। রিমোট HTTP সার্ভারের জন্য, Streamable HTTP transport বেছে নিন, https://mcp.example.com/mcp লিখুন, Authorization header যোগ করুন এবং connect করুন — এজেন্ট ব্যবহারের আগেই authentication এবং proxy সঠিক আছে কিনা তা যাচাই করার এটি দ্রুততম উপায়।
সার্ভার আপডেট রাখা
MCP দ্রুত পরিবর্তিত হয়, তাই একটি নির্দিষ্ট সময়সূচী অনুযায়ী প্যাচ (patch) করুন। npx -y দিয়ে লঞ্চ করা Node সার্ভারগুলো প্রতিটি spawn-এর সময় সর্বশেষ ভার্সনটি নিয়ে নেয়; এটি সুবিধাজনক হলেও এটি non-reproducible; আপনি যে ভার্সনটি টেস্ট করেছেন সেটি নির্দিষ্ট করে দিন — 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 revision টার্গেট করে তা খেয়াল রাখুন — SSE থেকে Streamable-HTTP সীমানায় পরিবর্তন হলে ক্লায়েন্টদের অনুরোধ করতে হবে এমন transport পরিবর্তিত হয়ে যেতে পারে।
Failure modes, with the strings you will see
The agent shows the server failed. claude mcp list prints ✗ Failed to connect, এবং TUI MCP server 'filesystem' failed to start রিপোর্ট করে। claude --debug চালান এবং আপনি সাধারণত Error: spawn npx ENOENT দেখতে পাবেন — কমান্ডটি agent-এর PATH-এ নেই। runtime অনুপস্থিত অথবা agent যে স্থানে খোঁজে সেখানে নেই: Node ইনস্টল করা নেই, npx অনুপস্থিত, অথবা bare name দিয়ে একটি virtualenv Python রেফারেন্স করা হয়েছে। কমান্ডটি একটি absolute path হিসেবে ঠিক করুন অথবা runtime ইনস্টল করুন, তারপর পুনরায় কানেক্ট করুন।
A stdio server connects, then instantly drops. ক্লায়েন্ট একটি JSON parse error লগ করে — যেমন Unexpected token 'S', "Server sta"... is not valid JSON বা Failed to parse message। এর কারণ সবসময় একই: সার্ভার stdout-এ একটি log line লিখেছে। stdio-তে, stdout হলো JSON-RPC চ্যানেল, তাই যেকোনো অতিরিক্ত টেক্সট stream নষ্ট করে দেয় এবং handshake বন্ধ হয়ে যায়। Node-এর ক্ষেত্রে, console.log stdout-এ যায় — console.error ব্যবহার করুন। Python-এর ক্ষেত্রে, একটি bare print() stdout-এ যায় — লগ লেখার জন্য logging ব্যবহার করুন যা sys.stderr-এ কনফিগার করা থাকবে, অথবা file=sys.stderr পাস করুন। নিয়মটি সুনির্দিষ্ট: stdio-তে, stdout-এ শুধুমাত্র JSON-RPC থাকবে, এবং মানুষের পড়ার উপযোগী সব তথ্য stderr-এ থাকবে।
A remote server times out or closes mid-handshake. ক্লায়েন্ট MCP error -32000: Connection closed এর মাধ্যমে ব্যর্থ হয়, অথবা Inspector Connect অবস্থায় আটকে থাকে এবং কোনো tools লিস্ট করে না। nginx-এর পেছনে এটি buffering-এর কারণে ঘটে: প্রক্সি SSE stream-টি flush করার পরিবর্তে আটকে রাখে, ফলে ক্লায়েন্ট এমন একটি রেসপন্সের জন্য অপেক্ষা করে যা কখনোই আসে না। location-এ proxy_buffering off; (এবং Step 4-এর বাকি অংশটুকু) যোগ করুন। পাবলিক URL-এর বিপরীতে curl -N দিয়ে নিশ্চিত করুন — আপনি ইভেন্ট ডেটা ধাপে ধাপে আসতে দেখবেন, সবশেষে একসাথে নয়।
Auth is rejected. ক্লায়েন্ট Error POSTing to endpoint (HTTP 401) অথবা সরাসরি 401 Unauthorized রিপোর্ট করে। হয় header অনুপস্থিত, অথবা token ভুল, অথবা ক্লায়েন্ট যখন config পড়ে তখন shell variable-টি খালি ছিল — এটি একটি সাধারণ সমস্যা, কারণ variable সেট করা না থাকলে ${MCP_TOKEN} খালি হয়ে যায় এবং nginx তখন কোনো ভ্যালু ছাড়া Bearer দেখতে পায়। variable-টি echo করে দেখুন, পুনরায় header যোগ করুন, এবং নিশ্চিত করুন যে nginx if-এ থাকা token-এর সাথে বাইটগুলো হুবহু মিলে যাচ্ছে।
The service will not start under systemd. journalctl -u mcp-ops ModuleNotFoundError: No module named 'mcp' দেখায় — ExecStart venv interpreter-এর পরিবর্তে system Python নির্দেশ করছে। অথবা Address already in use — অন্য একটি process 8000 পোর্টটি দখল করে আছে; এটি sudo ss -ltnp | grep 8000 দিয়ে খুঁজে বের করুন।
FAQ
MCP server আসলে কী?
এটি একটি প্রোগ্রাম যা Model Context Protocol ব্যবহার করে JSON-RPC 2.0 এর মাধ্যমে একটি AI client-কে tools এবং resources প্রদান করে। AI model নিজে কখনো tool চালাতে পারে না — এটি তার client-কে অনুরোধ করে, client তখন MCP server-কে কল করে, এবং server সেটি execute করে ফলাফল প্রদান করে। যেহেতু এই protocol একটি standard, তাই একটি server যেকোনো compliant client-এর সাথে কাজ করতে পারে, তা Claude Code, Claude Desktop বা Gemini CLI যাই হোক না কেন।
stdio এবং HTTP transport-এর মধ্যে পার্থক্য কী?
একটি stdio server client দ্বারা একটি child process হিসেবে চালু করা হয় এবং stdin/stdout এর মাধ্যমে যোগাযোগ করে; তাই এটি একটি মেশিনে একটি মাত্র client-এর সাথে কাজ করে এবং এর জন্য কোনো network বা auth প্রয়োজন হয় না। একটি HTTP server হলো একটি long-running network service যা অনেকগুলো client একসাথে ব্যবহার করতে পারে, তাই এর জন্য TLS এবং authentication প্রয়োজন। স্থানীয় বা single-user tool-এর জন্য stdio ব্যবহার করুন; শেয়ার করা বা persistent কোনো কিছুর জন্য HTTP (বর্তমান server-গুলোতে Streamable HTTP) ব্যবহার করুন।
আমি কীভাবে একটি remote MCP server সুরক্ষিত করব?
মনে রাখবেন যে এটি আপনার files, database, বা shell-এর tool access প্রদান করতে পারে, তাই কখনো এটি unauthenticated অবস্থায় প্রকাশ করবেন না। সবচেয়ে ভালো পদ্ধতি হলো এটিকে localhost-এর সাথে bind করে রাখা এবং SSH tunnel বা একটি private VPN-এর মাধ্যমে এটি ব্যবহার করা; যদি এটি public হতে হয়, তবে একটি reverse proxy-এর পেছনে রাখুন যা bearer token অথবা MCP OAuth flow প্রয়োগ করে। openssl rand -hex 32 দিয়ে token তৈরি করুন এবং এই পদ্ধতিগুলোর কোনোটি ছাড়া server-টিকে কখনো 0.0.0.0-এ bind করবেন না।
সার্ভার চালু না হলে আমি কীভাবে debug করব?
প্রথমে claude mcp list পরীক্ষা করুন — ✗ Failed to connect এর সাথে spawn ... ENOENT মানে হলো command বা runtime অনুপস্থিত, তাই path ঠিক করুন অথবা এটি install করুন। যদি connection হওয়ার পর JSON parse error দেখায়, তবে বুঝতে হবে server stdout-এ log করছে যা JSON-RPC stream নষ্ট করছে; সব logging stderr-এ সরিয়ে নিন। অন্য যেকোনো সমস্যার জন্য, হুবহু command-টি MCP Inspector-এর অধীনে চালান; এটি server-টিকে isolation-এ চালায় যাতে আপনি server bug এবং client-config bug-এর মধ্যে পার্থক্য করতে পারেন।