Model Context Protocol (MCP)

تسلط بر سرورهای MCP: اتصال مدل‌های زبانی بزرگ به دنیای واقعی

در چشم‌انداز در حال تحول سریع هوش مصنوعی، مدل‌های زبانی بزرگ (LLMs) قدرتمند اما اغلب ایزوله هستند. آن‌ها به دانش از پیش آموزش‌دیده یا بافت‌هایی که از طریق پرامپت‌ها تزریق می‌شوند، متکی هستند که می‌تواند محدود، ایستا یا پرهزینه از نظر توکن باشد. پروتکل بافت مدل (MCP) به عنوان استاندارد برای حل این مشکل ظهور کرده است. MCP که توسط Anthropic توسعه یافته، یک استاندارد باز است که به برنامه‌های LLM اجازه می‌دهد به صورت امن به منابع داده، ابزارها و محیط‌های خارجی متصل شوند.

MCP را به عنوان "USB-C برای هوش مصنوعی" در نظر بگیرید. همان‌طور که USB-C یک رابط جهانی برای شارژ و انتقال داده بین دستگاه‌های مختلف فراهم می‌کند، MCP یک رابط جهانی برای تعامل LLMها با دنیای دیجیتال فراهم می‌کند. در این راهنما، ما معماری MCP را بررسی خواهیم کرد و نشان خواهیم داد که چگونه یک سرور MCP مستحکم را از صفر بسازیم.

درک معماری MCP

MCP بر اساس معماری کلاینت-سرور عمل می‌کند. میزبان MCP (مانند Claude Desktop یا یک برنامه سفارشی) اتصال را آغاز می‌کند. این میزبان یک کلاینت MCP را در خود دارد که با یک یا چند سرور MCP ارتباط برقرار می‌کند. این سرورها به عنوان پل‌ها عمل می‌کنند و قابلیت‌های خاص (ابزارها) یا داده‌ها (منابع) را به LLM در یک ساختارمند و سازگار با JSON-RPC آشکار می‌کنند.

مزیت کلیدی این جداسازی، امنیت و ماژولار بودن است. خود LLM کد دلخواه را اجرا نمی‌کند یا فراخوانی مستقیم API به خدمات شخص ثالث انجام نمی‌دهد. به جای آن، آن از سرور MCP اقدامات خاصی را درخواست می‌کند که توسط سرور MCP تعریف شده‌اند، و سپس سرور اقدام را در یک محیط ساندباکس اجرا کرده و نتیجه را برمی‌گرداند.

تعریف قابلیت‌ها: ابزارها در مقابل منابع

هنگام ساخت یک سرور MCP، باید تصمیم بگیرید که چه چیزی را آشکار می‌کنید. به طور کلی، این موارد در دو دسته قرار می‌گیرند:

  • ابزارها: توابعی که LLM می‌تواند آن‌ها را اجرا کند. برای مثال، "get_current_weather" یا "create_github_issue". این‌ها اقدامات دارای حالت هستند که دنیای واقعی را تغییر می‌دهند یا داده‌های تازه را بازیابی می‌کنند.
  • منابع: ساختارهای داده‌ای فقط خواندنی که LLM می‌تواند آن‌ها را بازیابی کند. برای مثال، یک مسیر سیستم فایل یا یک اسکیمای جدول پایگاه داده خاص. این‌ها معمولاً برای ارائه بافت بدون نیاز به فراخوانی تابع استفاده می‌شوند.

ساخت یک سرور MCP ساده در TypeScript

برای این مثال، ما از SDK رسمی TypeScript MCP استفاده خواهیم کرد تا سروری را بسازیم که یک ابزار ساده "ماشین‌حساب" را آشکار می‌کند. این سرور به LLM اجازه می‌دهد عملیات حسابی پایه را انجام دهد.

اول، وابستگی‌های لازم را نصب کنید:


npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript ts-node

اکنون، بیایید فایل سرور خود را، server.ts، ایجاد کنیم. ما ابزار را با استفاده از zod برای اعتبارسنجی اسکیمای تعریف خواهیم کرد، اطمینان حاصل می‌کنیم که پارامترهای ورودی به طور سختگیرانه تایپ شده باشند.


import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// Initialize the MCP Server
const server = new McpServer({
  name: "calculator-server",
  version: "1.0.0",
});

// Define a Tool: Calculate
server.tool(
  "calculate",
  {
    expression: z
      .string()
      .describe("A mathematical expression to evaluate, e.g., '2 + 2'"),
  },
  async ({ expression }) => {
    try {
      // Simple safety check: Only allow basic operators
      if (!/^[\d+\-*/(). ]+$/.test(expression)) {
        return {
          content: [{ type: "text", text: "Invalid characters in expression." }],
        };
      }

      // Note: In a production environment, use a safe math parser library.
      // Do NOT use eval() directly on user input.
      const result = new Function(`return ${expression}`)();
      
      return {
        content: [{ type: "text", text: `Result: ${result}` }],
      };
    } catch (error) {
      return {
        content: [{ type: "text", text: `Error: ${error.message}` }],
        isError: true,
      };
    }
  }
);

// Define a Resource: Current Timestamp
server.resource(
  "current-time",
  "time://now",
  { title: "Current Server Time" },
  async (uri) => {
    return {
      contents: [
        {
          uri: uri.toString(),
          text: new Date().toISOString(),
        },
      ],
    };
  }
);

// Run the Server
const transport = new StdioServerTransport();
server.connect(transport).catch(console.error);

جزئیات کلیدی پیاده‌سازی

به استفاده از zod در تعریف ابزار توجه کنید. MCP به شدت به JSON Schema برای توصیف آنچه یک ابزار انتظار دارد، متکی است. روش describe حیاتی است زیرا متادیتا را به LLM ارائه می‌دهد. اگر توضیحات شما مبهم باشد، LLM ممکن است ورودی‌های نامعتبر را هالوسینه کند یا درک نکند که چه زمانی از ابزار استفاده کند. دقت در نوشتن توضیحات یک مهارت حیاتی برای توسعه‌دهندگان MCP است.

علاوه بر این، مدیریت خطا صریح است. با تنظیم isError: true، شما به کلاینت MCP (و در نتیجه LLM) اطلاع می‌دهید که اجرای ابزار ناموفق بوده است. این به LLM اجازه می‌دهد که در صورت نیاز با آرگومان‌های متفاوت تلاش کند یا شکست را به طور مناسب به کاربر اطلاع دهد.

اتصال به Claude Desktop

برای آزمایش سرور خود، باید میزبان MCP خود را پیکربندی کنید. برای Claude Desktop، شما فایل claude_desktop_config.json را ویرایش می‌کنید (که در macOS در ~/Library/Application Support/Claude/ و در Windows در %APPDATA%\Claude قرار دارد).


{
  "mcpServers": {
    "calculator": {
      "command": "npx",
      "args": ["ts-node", "/path/to/your/server.ts"]
    }
  }
}

Claude Desktop را مجدداً راه‌اندازی کنید. اکنون باید ابزار "ماشین‌حساب" را در منوی توسعه‌دهنده یا قابل استفاده مستقیم در چت ببینید. از Claude بخواهید "15 * 3 را محاسبه کند" و تماشا کنید که چگونه سرور شما را در پس‌زمینه فراخوانی می‌کند.

بهترین روش‌ها و ملاحظات امنیتی

  1. حداقل امتیاز: سرور MCP شما باید فقط حداقل قابلیت‌های لازم را آشکار کند. اگر در حال ساخت یک اتصال‌دهنده پایگاه داده هستید، اگر می‌توانید از آن اجتناب کنید، اجرای SQL خام را آشکار نکنید. توابع خاص و ایمن مانند getUserById را ارائه دهید.
  2. اعتبارسنجی ورودی: همیشه ورودی‌ها را اعتبارسنجی کنید. اگرچه LLM ورودی را تولید می‌کند، اما می‌تواند اشتباه کند. از اعتبارسنجی اسکیمای (مانند Zod) برای رد داده‌های نادرست قبل از رسیدن به منطق بک‌اند خود استفاده کنید.
  3. ایدمپوتنس: در صورت امکان، ابزارها را طوری طراحی کنید که ایدمپوتنت باشند. اگر ابزاری در میانه شکست بخورد، LLM ممکن است دوباره تلاش کند. اطمینان حاصل کنید که تلاش‌های مجدد عوارض جانبی مانند شارژهای تکراری یا خرابی داده ایجاد نمی‌کنند.
  4. لاگ‌نویسی: لاگ‌نویسی جزئی را درون سرور خود پیاده‌سازی کنید. وقتی LLM در استفاده از یک ابزار مشکل دارد، لاگ‌ها بینشی در مورد پارامترهای ارسال شده و دلیل شکست فراخوانی ارائه می‌دهند.

جهت‌های آینده

MCP هنوز یک پروتکل جوان است. با بلوغ آن، انتظار می‌رود موارد زیر را ببینیم:

  • استانداردهای احراز هویت: جریان‌های OAuth2 مستحکم‌تر که مستقیماً در مشخصات پروتکل برای دسترسی امن به APIهای محافظت‌شده یکپارچه شده‌اند.
  • منابع قابل جریان‌سازی: پشتیبانی بهتر برای جریان‌های داده بلادرنگ، که به LLMها اجازه می‌دهد منابع داده زنده مانند تیکرهای سهام یا لاگ‌های سرور را پایش کنند.
  • هماهنگ‌سازی چند سروری: قابلیت‌های بهبود یافته برای میزبان‌ها جهت مدیریت ده‌ها سرور MCP به طور همزمان، با مسیریابی هوشمند برای جلوگیری از تورم پنجره بافت.

نتیجه‌گیری

ساخت سرورهای MCP دیگر فقط یک تمرین نظری نیست؛ بلکه به روش استاندارد برای گسترش قابلیت‌های برنامه‌های هوش مصنوعی تبدیل شده است. با جداسازی منطق از مدل، شما سیستم‌هایی را ایجاد می‌کنید که ایمن‌تر، قابل نگهداری‌تر و چندمنظوره‌تر هستند. چه در حال ساخت یک خواننده فایل ساده باشید یا یک اتصال‌دهنده داده سازمانی پیچیده، MCP بنیادی را که نیاز دارید فراهم می‌کند.

کوچک شروع کنید. یک ابزار واحد بسازید که یک مشکل خاص در جریان کاری شما را حل می‌کند. آن را به طور کامل آزمایش کنید. سپس، گسترش دهید. اکوسیستم به سرعت در حال رشد است و پذیرندگان اولیه از بهبودهای قابل توجهی در توانایی برنامه‌های LLM خود برای استدلال و عمل در محیط‌های خاص خود بهره می‌برند.

Share: