SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-27

VPS-এ AI coding agent-এর জন্য MCP server চালান

নিজের VPS-এ MCP server চালিয়ে AI agent-কে বাস্তব tool দিন। stdio ও remote HTTP, systemd, TLS, auth এবং ভুল configuration-এর নির্দিষ্ট সমাধানসহ সম্পূর্ণ guide।

আপনি যা তৈরি করছেন

একটি VPS-এ দুটি কার্যকর MCP setup। প্রথমটি একটি stdio server—এটি একটি filesystem বা database tool, যেটি Claude Code child process হিসেবে চালু করে এবং pipe-এর মাধ্যমে এর সঙ্গে যোগাযোগ করে। এরপর একটি remote HTTP server থাকবে, যা systemd এবং TLS-সহ nginx reverse proxy-এর পেছনে দীর্ঘমেয়াদি network service হিসেবে চলবে। আপনি যে কোনো MCP client-কে নির্দেশ করলে সেটি এই server-এ পৌঁছাতে পারবে। যেকোনো একটি setup-এর install প্রক্রিয়া ছোট। এই guide-এর মূল বিষয় দুটি: JSON-RPC stream পরিষ্কার রাখা এবং authentication ছাড়া কোনো tool endpoint কখনো public Internet-এ না রাখা।

MCP আসলে কী

Model Context Protocol হলো এমন একটি standard পদ্ধতি, যার মাধ্যমে কোনো AI client, যেমন Claude Code, Claude Desktop, একটি VPS-এ চলা Gemini CLI, অথবা আপনার নিজস্ব script, external tool কল করতে এবং external resource পড়তে পারে। Model নিজে কোনো কিছু চালায় না। এটি client-কে অনুরোধ করে, client JSON-RPC 2.0 ব্যবহার করে একটি MCP server-এর সঙ্গে যোগাযোগ করে, server tool চালায় এবং ফলাফল client-কে ফেরত দেয়। মানুষ যখন agent harness বলে, তখন সাধারণত এই client-কেই বোঝায়: এটি model-এর চারপাশের সেই loop, যা tool list, permission check এবং session state নিয়ন্ত্রণ করে। MCP কেবল এই loop-এর tool অংশ বাড়ানোর পদ্ধতি। একটি protocol ব্যবহার করার ফলে আপনি একবার যে server লিখবেন, MCP সমর্থনকারী প্রতিটি client-এর সঙ্গেই তা কাজ করবে। এই বিভাজনটি আপনার কাছে নতুন হলে, বিশেষ করে model কীভাবে কোনো tool ব্যবহারের সিদ্ধান্ত নেয়—এই প্রশ্নটি থাকলে, কোনো server-কে বাস্তব credential দেওয়ার আগে agent fundamentals বোঝার ধাপে ধাপে পথটি পড়তে এক ঘণ্টা ব্যয় করা উপকারী।

এখানে দুটি transport আছে, এবং এই guide-এর বাকি অংশও এই দুটির ভিত্তিতে বিভক্ত:

  • stdio। Client server-কে child process হিসেবে চালু করে এবং server-এর standard input ও standard output-এর মাধ্যমে newline-delimited JSON-RPC message আদান-প্রদান করে। কোনো network নেই, কোনো port নেই, কোনো auth নেই; trust boundary হলো process নিজেই। প্রায় সব local tool এই পদ্ধতিতে সরবরাহ করা হয়।
  • Streamable HTTP (এবং এর পুরোনো সংস্করণ HTTP+SSE)। Server একটি দীর্ঘসময় চলমান web service। Client HTTP-এর মাধ্যমে সংযোগ করে, এবং server Server-Sent Events হিসেবে response stream করতে পারে। একই server অনেক client-এর সঙ্গে ভাগ করে নেওয়ার জন্য, অথবা এমন কোনো tool চালানোর জন্য এই পদ্ধতি ব্যবহার করা হয়, যেটিকে সার্ভারে স্থায়ীভাবে চলতে হয়।

Tool যদি একটি machine এবং একজন user-এর জন্য নির্দিষ্ট হয়, তাহলে stdio বেছে নিন। এটি shared service হলে HTTP বেছে নিন।

পূর্বশর্ত এবং বাস্তব সীমাবদ্ধতা

ধরা হচ্ছে, root অথবা sudo সুবিধাসহ একটি নতুন Ubuntu 24.04 KVM VPS আছে। এর বাইরে আপনার যা লাগবে:

  • সার্ভারটি যে runtime-এ লেখা। অধিকাংশ reference server Node অথবা Python-এ লেখা। Ubuntu 24.04-এ Node 18 থাকে, কিন্তু বর্তমান বেশ কিছু MCP package-এর জন্য Node 20 বা তার পরের সংস্করণ প্রয়োজন। তাই apt-এর ওপর নির্ভর না করে NodeSource অথবা nvm থেকে একটি current LTS সংস্করণ ইনস্টল করুন। Python 3.12 আগে থেকেই উপস্থিত।
  • একটি domain এবং DNS A record, তবে এটি শুধু remote HTTP server-এর জন্য প্রয়োজন। TLS-এর জন্য এমন একটি name দরকার, যা এই VPS-এর দিকে resolve হয়। stdio উদাহরণের জন্য কোনো DNS দরকার নেই।
  • 512 MB RAM যথেষ্ট। MCP server-গুলো ছোট JSON-RPC process। Memory খরচ protocol-এর জন্য নয়; আপনার tool যা ব্যবহার করে, যেমন database driver বা file cache, তার ওপর নির্ভর করে।
  • Spec-টি নতুন এবং পরিবর্তনশীল। 2025-03-26 revision HTTP+SSE-এর পরিবর্তে Streamable HTTP চালু করেছে এবং SSE-কে deprecated হিসেবে চিহ্নিত করেছে। SSE এখনও কাজ করে এবং অনেক server এখনও এটি ব্যবহার করে। তাই কোনো transport নির্দিষ্ট করার আগে server-এর release notes দেখে তা আবার যাচাই করুন; এটিকে অমোঘ নিয়ম ধরে নেবেন না।

ধাপ 1: একটি stdio server Claude Code-এ সংযুক্ত করুন

filesystem server দিয়ে শুরু করুন। এটি official, সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়, এবং Node ছাড়া আর কিছু প্রয়োজন হয় না। নিচের একটি command এটিকে Claude Code-এর সঙ্গে register করে এবং বর্তমান project-এ সীমাবদ্ধ রাখে, যাতে সেটি commit করা যায় এমন একটি file-এ সংরক্ষিত হয়:

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 যে command চালাবে; এটি Claude Code-এর কোনো flag নয়। এতে project root-এ একটি .mcp.json লেখা হয়:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/home/matt/projects/api"
      ]
    }
  }
}

এখনও কিছু চলছে না। পরের বার এই directory-তে Claude Code শুরু করলে agent .mcp.json পড়ে, npx -y @modelcontextprotocol/server-filesystem ...-কে child process হিসেবে চালু করে, এবং সেই process-এর stdin/stdout-এর মাধ্যমে MCP handshake সম্পন্ন করে। এটি কাজ করেছে কি না যাচাই করুন:

claude mcp list

সুস্থ server তার command এবং একটি green tick, filesystem: npx -y @modelcontextprotocol/server-filesystem ... - ✓ Connected, দেখায়। Session-এর ভিতরে /mcp slash command server যে tools প্রকাশ করে তার তালিকা দেখায় (read_file, write_file, list_directory)। এরপর agent আপনার অনুমোদিত path-গুলোতে সেগুলো call করতে পারে। Database tool-এর কাঠামোও একই। Package পরিবর্তন করে শেষ argument হিসেবে একটি connection string দিন। তবে server-এর নিজস্ব repository-তে বর্তমান package name পরীক্ষা করুন, কারণ reference Postgres server-এর মালিকানা একাধিকবার পরিবর্তিত হয়েছে।

VPS-এ agent চালানোর মূল সুবিধা এটাই: Claude Code session VPS-এর ভিতরে tmux-এ চলে, এবং এর stdio server-গুলো সরাসরি তার পাশেই চলে। ফলে project file ও local service-এ সরাসরি access পাওয়া যায় এবং network round-trip প্রয়োজন হয় না। Agent-এর কাছে write_file এবং read_file দুটিই থাকলে, সেই access-এর সঙ্গে কাজ করে এমন সবচেয়ে ছোট পরিবর্তনের দিকে agent-কে পরিচালিত করে এমন একটি skill যুক্ত করা উপযোগী। কারণ filesystem tool থাকলে বড় rewrite এবং দুই লাইনের fix—দুটিই সমান সহজ হয়ে যায়। এই সংযোগ local file-এর বাইরেও ব্যবহার করা যায়। VPS-এ যদি আগে থেকেই একটি search engine চালান, তাহলে নিজের SearXNG instance-কে search tool হিসেবে agent-এর হাতে দিতে পারেন। এতে query আপনার box-এই থাকে, কিন্তু অবিশ্বস্ত page text সরাসরি agent-এর context-এ চলে আসে, যার ভিত্তিতে agent পরে কাজ করে।

ধাপ 2: একটি remote HTTP server তৈরি করুন

একটি stdio server তার parent process-এর সঙ্গে বন্ধ হয়ে যায় এবং প্রতি client-এর জন্য একবার করে চালু হয়। তাই একই machine-এ একে অপরের কাছে কাজ পাঠানো দুটি Claude Code session চালালে, প্রতিটি session tool-টির নিজস্ব private copy পায়। প্রতিটি client-এর জন্য চালু থাকা একটি tool, shared ops tool, database gateway, অথবা আপনার laptop ও CI উভয় থেকে ব্যবহারযোগ্য কোনো service প্রয়োজন হলে HTTP transport এবং একটি বাস্তব service ব্যবহার করতে হবে। এখানে official SDK ব্যবহার করে তৈরি একটি ন্যূনতম Python server দেখানো হয়েছে, যা একটি tool প্রকাশ করে:

# /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" লক্ষ্য করুন। server-টি শুধু localhost-এ bind করে। machine-এর বাইরের কোনো কিছু সরাসরি এতে পৌঁছাতে পারে না। auth না থাকা অবস্থায় এটিই প্রত্যাশিত আচরণ। এটি নিজের virtualenv-এ install করুন, যাতে systemd একটি স্থিতিশীল 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]"

ধাপ 3: systemd ব্যবহার করে service চালু রাখুন

Agent কোনো tool ব্যবহার করতে যাওয়ার সময় সেটি বন্ধ থাকলে, tool না থাকার চেয়েও পরিস্থিতি খারাপ হয়। Client নিজেই দীর্ঘসময় চলমান process হলে বিষয়টি আরও গুরুত্বপূর্ণ। reboot-এর পরেও memory ও schedule ধরে রাখা always-on agent কোনো তদারকি ছাড়াই নির্ধারিত সময়ে এই tool-গুলো কল করবে। তাই server-কেও নিজে থেকে আবার চালু হতে হবে। /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.target

ExecStart-এ venv Python-এর absolute path আবশ্যক। এতে /usr/bin/python3 নির্ধারণ করুন। Process ModuleNotFoundError: No module named 'mcp' দিয়ে শুরু হবে, কারণ system interpreter আপনার pip install দেখেনি। Enable করে পরীক্ষা করুন:

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/mcp

status-এর মান active (running) হওয়া উচিত। curl body-তে JSON-RPC error সহ HTTP/1.1 400 Bad Request ফিরে আসবে। Request-এ কোনো session বা বৈধ JSON payload ছিল না। আপনি ঠিক এটাই চান। এর মাধ্যমে প্রমাণ হয় যে port উত্তর দিচ্ছে এবং protocol অনুযায়ী কাজ করছে। Connection refused বা খালি reply-এর অর্থ process-টি আপনার ধারণার interface-এ bind করা নেই। journalctl -u mcp-ops -n 50 পড়ুন।

ধাপ 4: সামনে TLS এবং একটি reverse proxy বসান

সার্ভারটি localhost-এ listening করে। যেকোনো স্থান থেকে এতে পৌঁছাতে nginx-এ TLS termination করুন এবং অনুরোধ ভেতরের দিকে proxy করুন। nginx install করুন, nginx-এ Certbot এবং Let's Encrypt ব্যবহার করে একটি certificate সংগ্রহ করুন, তারপর location block লিখুন। buffering বন্ধ করা সবচেয়ে গুরুত্বপূর্ণ। কারণ 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 করুন। আপনি যদি ইতিমধ্যে অনেকগুলো container চালান, তাহলে automatic TLS-সহ Traefik reverse proxy একই কাজ করে দেবে। এটি certificate issue করে এবং hostname অনুযায়ী route করে। আপনাকে শুধু MCP container-এ label যোগ করতে হবে। যেকোনো ক্ষেত্রেই এখন public port-এ একমাত্র reverse proxy-ই listening করছে। এটি এমন একটি service-এর দিকে নির্দেশ করছে, যেটি আপনি এখনও secure করেননি। কোথাও URL register করার আগে এটি ঠিক করুন।

ধাপ 5: এই বিষয়ে প্রাধান্য পাওয়া নিরাপত্তা নিয়ম

কখনো authentication ছাড়া কোনো MCP endpoint প্রকাশ করবেন না। MCP server শুধু read-only API নয়। এটি আপনার file, database এবং কখনো shell-এ tool access দেয়। Public Internet-এ খোলা /mcp আপনার AI agent-এর সমপর্যায়ের access-সহ একজন অপরিচিত ব্যক্তিকে সুযোগ দেয়: সে আপনার tool-গুলোর তালিকা দেখবে, তারপর সেগুলো call করবে। এটিকে authentication-বিহীন admin socket-এর মতোই বিবেচনা করুন, কারণ প্রকৃতপক্ষে এটি সেটিই। চুরি হওয়া token দিয়ে কতটা access পাওয়া যাবে, তা এর পেছনের server-এর ওপরও নির্ভর করে: openGym workout tracker-এর সঙ্গে থাকা read-only MCP server কেবল training data ফেরত দিতে পারে, কিন্তু filesystem বা shell tool পুরো box-এর access দিয়ে দেয়।

পছন্দের ক্রমে তিনটি প্রতিরক্ষা:

  1. এটি publish করবেন না। Server-টিকে 127.0.0.1-এ রাখুন এবং SSH tunnel দিয়ে আপনার laptop থেকে access করুন: ssh -L 8000:127.0.0.1:8000 matt@vps, তারপর client-কে http://127.0.0.1:8000/mcp-এর দিকে নির্দেশ করুন। কোনো কিছুই public Internet-এ প্রকাশিত হবে না।
  2. এটিকে private network-এ রাখুন। self-hosted WireGuard VPN-এর tunnel address-এ bind করুন এবং শুধু VPN peer-গুলোকে সেখানে access করতে দিন। Public Internet একটি বন্ধ port দেখতে পাবে।
  3. Public করতেই হলে token বাধ্যতামূলক করুন। উপযুক্ত সমাধান হলো MCP OAuth flow, যা HTTP transport স্বাভাবিকভাবেই সমর্থন করে। বাস্তবসম্মত ন্যূনতম ব্যবস্থা হলো proxy-তে যাচাই করা একটি shared bearer token। এটি সাশ্রয়ী এবং drive-by access পুরোপুরি বন্ধ করে:
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 কখনো plaintext হিসেবে .mcp.json-এ না থাকে। Claude Code read time-এ environment থেকে ${MCP_TOKEN} expand করবে।

উপরের প্রতিটি প্রতিরক্ষা endpoint-কে সুরক্ষিত রাখে, কিন্তু ইতিমধ্যে token থাকা agent-কে নয়। এটিই সমস্যার অন্য দিক: আপনার client যদি DeepSeek Harness হয়, তাহলে agent কোন tool call করতে পারবে তা নিয়ন্ত্রণ করে এবং tool output-এ injected instruction শনাক্ত করে এমন plugin সেই দিকটি সামলায়।

ধাপ 6: MCP Inspector দিয়ে ডিবাগ করুন

কোনো server অস্বাভাবিক আচরণ করলে agent-এর ভেতর থেকে অনুমান করবেন না। অফিসিয়াল web-based test client Inspector ব্যবহার করে server-টিকে সরাসরি চালান। stdio server-এর ক্ষেত্রে agent যে একই command চালায়, সেটিই দিন:

npx @modelcontextprotocol/inspector \
  npx -y @modelcontextprotocol/server-filesystem /tmp

এটি http://localhost:6274-এ একটি UI চালু করে। সাম্প্রতিক version-গুলো MCP_PROXY_AUTH_TOKEN query string-সহ একটি URL দেখায়। সেই নির্দিষ্ট link ব্যবহার করুন, নইলে UI আপনাকে গ্রহণ করবে না। এটি 6277 port-এ একটি proxy-ও চালু করে। Connect-এ click করুন, তারপর List Tools এবং এরপর বাস্তব argument-সহ Call Tool নির্বাচন করুন। Inspector-এ কাজ করলেও agent-এ ব্যর্থ হলে সমস্যা server-এ নয়, আপনার client config-এ। Remote HTTP server-এর জন্য Streamable HTTP transport নির্বাচন করুন, https://mcp.example.com/mcp লিখুন, Authorization header যোগ করুন এবং connect করুন। কোনো agent যুক্ত করার আগে authentication ও proxy সঠিক কি না যাচাই করার এটি দ্রুততম উপায়।

সার্ভার আপডেট রাখা

MCP দ্রুত পরিবর্তিত হয়, তাই নির্ধারিত সময়সূচি অনুযায়ী patch প্রয়োগ করুন। npx -y দিয়ে চালু করা Node server প্রতিবার নতুন করে শুরু হলে সর্বশেষ version সংগ্রহ করে। এটি সুবিধাজনক হলেও reproducible নয়। আপনি যে নির্দিষ্ট version পরীক্ষা করেছেন, সেটি নির্ধারণ করুন। npm view @modelcontextprotocol/server-filesystem version থেকে version পড়ে .mcp.json-এ package name-এর শেষে তা যোগ করুন (@modelcontextprotocol/server-filesystem@<version>)। কোনো server গুরুত্বপূর্ণ হয়ে উঠলে version পরিবর্তনটি পরিকল্পনা করে করুন। systemd-এর অধীনে চলা Python server আপডেট করতে প্রথমে 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-এর মধ্যবর্তী boundary পার হয়ে version পরিবর্তন করলে client-কে অনুরোধ করার জন্য প্রয়োজনীয় transport বদলে যেতে পারে।

ব্যর্থতার ধরন এবং যে স্ট্রিংগুলো দেখবেন

Agent দেখায় যে সার্ভার ব্যর্থ হয়েছে। claude mcp list, ✗ Failed to connect প্রিন্ট করে এবং TUI, MCP server 'filesystem' failed to start রিপোর্ট করে। claude --debug চালালে সাধারণত Error: spawn npx ENOENT দেখতে পাবেন; commandটি agent-এর PATH-এ নেই। Runtime অনুপস্থিত, অথবা agent যেখানে খোঁজে সেখানে নেই: Node ইনস্টল করা নেই, npx অনুপস্থিত, অথবা bare name দিয়ে virtualenv-এর Python নির্দিষ্ট করা হয়েছে। commandটি একটি absolute path-এ ঠিক করুন অথবা runtime ইনস্টল করুন। এরপর আবার সংযোগ করুন।

একটি stdio server সংযোগের পর সঙ্গে সঙ্গে বিচ্ছিন্ন হয়ে যায়। Client log-এ JSON parse error দেখা যায়, যেমন Unexpected token 'S', "Server sta"... is not valid JSON বা Failed to parse message। কারণ সব সময় একই: server, stdout-এ একটি log line লিখেছে। stdio-তে stdout-ই JSON-RPC channel। তাই অতিরিক্ত যেকোনো text stream নষ্ট করে এবং handshake ব্যর্থ হয়। Node-এ console.log stdout-এ যায়; console.error ব্যবহার করুন। Python-এ bare print() stdout-এ যায়। logging-এর মাধ্যমে log লিখুন এবং সেটি sys.stderr-এ configure করুন, অথবা file=sys.stderr পাস করুন। নিয়মটি কঠোর: stdio-তে stdout-এ শুধু JSON-RPC থাকবে, মানুষের পড়ার জন্য সব output stderr-এ যাবে।

একটি remote server timeout হয় বা handshake চলাকালীন বন্ধ হয়ে যায়। Client, MCP error -32000: Connection closed দিয়ে ব্যর্থ হয়, অথবা Inspector-এর Connect-এ আটকে থাকে এবং tool-এর তালিকা দেখায় না। nginx-এর পেছনে থাকলে এটি buffering-এর সমস্যা: proxy SSE stream ধরে রাখে এবং flush করে না। ফলে client এমন response-এর জন্য অপেক্ষা করে, যা কখনো আসে না। proxy_buffering off; এবং Step 4-এর block-এর বাকি অংশ location-এ যোগ করুন। Public URL-এর বিরুদ্ধে curl -N চালিয়ে নিশ্চিত করুন। Event data শেষ মুহূর্তে একসঙ্গে না এসে ধাপে ধাপে আসা উচিত।

Auth প্রত্যাখ্যাত হয়। Client, Error POSTing to endpoint (HTTP 401) রিপোর্ট করে, অথবা সরাসরি 401 Unauthorized দেখায়। Header অনুপস্থিত হতে পারে, token ভুল হতে পারে, অথবা client configuration পড়ার সময় shell variable খালি ছিল। এটি একটি সাধারণ সমস্যা, কারণ variable unset থাকলে ${MCP_TOKEN} কোনো value-তে expand হয় না এবং nginx তখন value ছাড়া Bearer পায়। Variable-টি echo করুন, header আবার যোগ করুন, এবং exact bytes nginx-এর if-এ থাকা token-এর সঙ্গে মেলে কি না যাচাই করুন।

systemd-এর অধীনে service start হয় না। 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 বলতে ঠিক কী বোঝায়?

এটি এমন একটি program, যা Model Context Protocol ব্যবহার করে JSON-RPC 2.0-এর মাধ্যমে কোনো AI client-এর কাছে tools ও resources প্রকাশ করে। AI model নিজে কখনো tool চালায় না। এটি তার client-কে অনুরোধ করে, client MCP server-কে কল করে, এবং server tool চালিয়ে ফলাফল ফেরত দেয়। Protocol-টি standard হওয়ায় যেকোনো compliant client-এর সঙ্গে একটি server কাজ করে। সেই client Claude Code, Claude Desktop অথবা Gemini CLI—যেকোনোটি হতে পারে।

stdio এবং HTTP transport-এর মধ্যে পার্থক্য কী?

একটি stdio server client child process হিসেবে চালু করে এবং stdin/stdout-এর মাধ্যমে যোগাযোগ করে। তাই এটি একটি machine-এ একটি client-এর সঙ্গে চালু ও বন্ধ হয় এবং এর জন্য network বা auth প্রয়োজন হয় না। একটি HTTP server দীর্ঘক্ষণ চলমান network service। একসঙ্গে অনেক client এতে সংযোগ করতে পারে। তাই এতে TLS এবং authentication প্রয়োজন হয়। Local, single-user tool-এর জন্য stdio ব্যবহার করুন। Shared বা persistent যেকোনো কিছুর জন্য HTTP ব্যবহার করুন। বর্তমান server-গুলোতে Streamable HTTP ব্যবহার করা হয়।

Remote MCP server কীভাবে নিরাপদ করব?

ধরে নিন, এটি আপনার file, database বা shell-এ tool access দেয়। তাই কখনো এটিকে authentication ছাড়া Internet-এ প্রকাশ করবেন না। সর্বোত্তম পদ্ধতি হলো server-টিকে 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 করবেন না।

কোনো server start না হলে কীভাবে debug করব?

প্রথমে claude mcp list পরীক্ষা করুন। ✗ Failed to connect-এর সঙ্গে spawn ... ENOENT থাকলে command বা runtime অনুপস্থিত। তাই path ঠিক করুন অথবা এটি install করুন। সংযোগ স্থাপনের পর JSON parse error দিয়ে সংযোগ বিচ্ছিন্ন হলে server stdout-এ log লিখছে এবং JSON-RPC stream নষ্ট করছে। সব log stderr-এ পাঠান। অন্য যেকোনো সমস্যার ক্ষেত্রে MCP Inspector-এর অধীনে exact command চালান। এটি server-কে আলাদাভাবে চালায়। ফলে server-এর bug এবং client configuration-এর bug আলাদা করে শনাক্ত করতে পারবেন।