Model Context Protocol (MCP)

راهنمای جامع ساخت سرورهای قدرتمند MCP برای یکپارچه‌سازی با هوش مصنوعی

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

درک معماری سرور

قبل از نوشتن حتی یک خط کد، درک نقش سرور MCP حیاتی است. برخلاف APIهای سنتی REST یا GraphQL، یک سرور MCP فقط داده ارائه نمی‌دهد؛ بلکه قابلیت‌ها را ارائه می‌دهد. این سرور دو اصل اولیه را به کلاینت نمایش می‌دهد: ابزارها و منابع.

ابزارها توابعی هستند که LLM می‌تواند آن‌ها را اجرا کند، مانند اجرای یک کوئری پایگاه داده یا ارسال یک ایمیل. منابع منابع داده ایستا یا پویا هستند، مانند خواندن یک فایل پیکربندی یا دریافت قیمت زنده سهام. یک سرور MCP با معماری خوب، این نگرانی‌ها را به شدت جدا نگه می‌دارد در حالی که یک لایه انتقال یکپارچه را حفظ می‌کند که معمولاً JSON-RPC از طریق stdio یا HTTP است.

تعریف دقیق ابزارها

دقت استفاده LLM از ابزارها به شدت به نحوه تعریف طرح‌های داده‌ای شما بستگی دارد. در TypeScript، با استفاده از @modelcontextprotocol/sdk رسمی، شما ابزارها را با استفاده از اعتبارسنج طرح Zod برای اطمینان از ایمنی نوع و توضیحات واضح تعریف می‌کنید.

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

const server = new McpServer({
  name: "my-awesome-server",
  version: "1.0.0"
});

// Define a tool to search a documentation index
server.tool(
  "search_docs",
  "Search the internal documentation for technical queries",
  {
    query: z.string().describe("The search query string"),
    limit: z.number().default(5).describe("Max results to return")
  },
  async ({ query, limit }) => {
    // Implementation logic here
    const results = await myDocSearchEngine.search(query, limit);
    return {
      content: results.map(r => ({
        type: "text",
        text: JSON.stringify(r)
      }))
    };
  }
);

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

مدیریت منابع و دستورات

فراتر از ابزارها، سرورهای MCP می‌توانند منابع را از طریق URIها نمایش دهند. این به کلاینت‌ها اجازه می‌دهد داده‌ها را به صورت پویا درخواست کنند. برای مثال، ممکن است یک منبع در docs://config/latest نمایش دهید که پیکربندی فعلی برنامه را برمی‌گرداند.

علاوه بر این، MCP از دستورات (Prompts) پشتیبانی می‌کند که دنباله‌های از پیش تعریف شده‌ای از دستورالعمل‌ها یا قالب‌هایی هستند که کاربران می‌توانند آن‌ها را فراخوانی کنند. این از ابزارها متمایز است زیرا دستورات متن را برای خواندن توسط کاربر یا LLM تولید می‌کنند، نه اجرای کد. پیاده‌سازی دستورات نیاز به ثبت یک دستگیره (handler) دستور دارد که یک لیست پیام ساختاریافته را برمی‌گرداند.

server.prompt(
  "summarize_code",
  "Generate a concise summary of the provided code snippet",
  { filePath: z.string() },
  async ({ filePath }) => {
    const content = await fs.readFile(filePath, 'utf-8');
    return {
      messages: [
        {
          role: "user",
          content: {
            type: "text",
            text: `Please summarize this code:\n\n${content}`
          }
        }
      ]
    };
  }
);

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

  1. مدیریت خطا: همیشه منطق ابزار خود را در بلوک‌های try-catch قرار دهید. پیام‌های خطای ساختاریافته‌ای را برگردانید که LLM بتواند آن‌ها را درک کند، نه ردیابی‌های پشته خام.
  2. پخش زنده (Streaming): برای عملیات‌های طولانی‌مدت، پاسخ‌های پخش زنده را پیاده‌سازی کنید. این با ارائه بازخورد بلادرنگ، تجربه کاربری را بهبود می‌بخشد.
  3. امنیت: هرگز آدرس‌های شبکه داخلی یا اعتبارنامه‌های حساس را به عنوان منابع نمایش ندهید. تمام ورودی‌ها را با دقت با استفاده از Zod اعتبارسنجی کنید تا از حملات تزریق جلوگیری شود.

نتیجه‌گیری

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

Share: