بناء أول خادم MCP باستخدام TypeScript: الأدوات والموارد والقوالب

فريق نقطةAI Bot
بواسطة فريق نقطة & AI Bot ·

جاري تحميل مشغل تحويل النص إلى كلام الصوتي...

البروتوكول الذي يربط الذكاء الاصطناعي بكل شيء. MCP (بروتوكول سياق النموذج) هو المعيار المفتوح الذي يتيح لوكلاء الذكاء الاصطناعي مثل Claude و Cursor اكتشاف أدواتك واستخدامها. في هذا الدرس، ستبني واحداً من الصفر.

ما ستتعلمه

بنهاية هذا الدرس، ستكون قادراً على:

  • فهم بنية MCP: الخوادم والعملاء والمضيفون وطبقات النقل
  • إعداد مشروع خادم MCP بلغة TypeScript من الصفر
  • تسجيل أدوات يمكن لوكلاء الذكاء الاصطناعي استدعاؤها
  • كشف موارد توفر سياقاً لنماذج اللغة الكبيرة
  • تعريف قوالب كنماذج قابلة لإعادة الاستخدام للمهام الشائعة
  • ربط خادمك بـ Claude Desktop و Cursor
  • اختبار خادمك وتصحيح أخطائه باستخدام MCP Inspector

المتطلبات الأساسية

قبل البدء، تأكد من توفر:

  • Node.js 20+ مثبت (node --version)
  • معرفة بـ TypeScript (الأنواع، async/await، الوحدات)
  • محرر كود — VS Code أو Cursor موصى به
  • Claude Desktop أو Cursor مثبت (للاختبار)
  • فهم أساسي لـ JSON-RPC و APIs

ما هو MCP؟

بروتوكول سياق النموذج هو معيار مفتوح أنشأته Anthropic يحدد كيف تتواصل تطبيقات الذكاء الاصطناعي مع مصادر البيانات والأدوات الخارجية. فكر فيه كـ USB-C للذكاء الاصطناعي — موصل واحد وعالمي يحل محل فوضى التكاملات المخصصة.

نظرة عامة على البنية

┌─────────────────────────────────────────────┐
│  MCP Host (Claude Desktop, Cursor, etc.)    │
│                                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐    │
│  │ Client 1│  │ Client 2│  │ Client 3│    │
│  └────┬────┘  └────┬────┘  └────┬────┘    │
└───────┼────────────┼────────────┼──────────┘
        │            │            │
   ┌────▼────┐  ┌────▼────┐  ┌───▼─────┐
   │ Server A│  │ Server B│  │ Server C│
   │ (Files) │  │ (DB)    │  │ (APIs)  │
   └─────────┘  └─────────┘  └─────────┘
المكوّنالدور
المضيف (Host)تطبيق الذكاء الاصطناعي (Claude Desktop، Cursor)
العميل (Client)يحافظ على اتصال 1:1 مع خادم
الخادم (Server)يكشف الأدوات والموارد والقوالب
النقل (Transport)قناة الاتصال (stdio، HTTP)

ما يمكن للخوادم كشفه

توفر خوادم MCP ثلاثة عناصر أساسية:

  1. الأدوات (Tools) — وظائف يمكن للذكاء الاصطناعي استدعاؤها (مثل نقاط نهاية API)
  2. الموارد (Resources) — بيانات للقراءة فقط يمكن للذكاء الاصطناعي الوصول إليها (مثل الملفات)
  3. القوالب (Prompts) — نماذج قابلة لإعادة الاستخدام لسير العمل الشائع

الخطوة 1: إعداد المشروع

أنشئ مجلداً جديداً وابدأ المشروع.

mkdir my-mcp-server && cd my-mcp-server
npm init -y

ثبّت MCP SDK والاعتماديات.

npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node

ملاحظة حول إصدار SDK: يستخدم هذا الدرس MCP TypeScript SDK v1.x الذي يستخدم @modelcontextprotocol/sdk. الإصدار v2 (المتوقع في الربع الثاني من 2026) يعيد تنظيم الاستيرادات إلى @modelcontextprotocol/server و @modelcontextprotocol/node. المفاهيم تبقى متطابقة — فقط مسارات الاستيراد تتغير.

هيّئ TypeScript.

npx tsc --init

حدّث ملف tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "Node16",
    "moduleResolution": "Node16",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"]
}

حدّث package.json لتعيين المشروع كـ ESM وإضافة سكربتات البناء:

{
  "name": "my-mcp-server",
  "version": "1.0.0",
  "type": "module",
  "bin": {
    "my-mcp-server": "./build/index.js"
  },
  "scripts": {
    "build": "tsc",
    "start": "node build/index.js",
    "dev": "tsc --watch"
  }
}

أنشئ مجلد المصدر:

mkdir src

الخطوة 2: إنشاء هيكل الخادم

أنشئ src/index.ts — نقطة الدخول لخادم MCP الخاص بك.

#!/usr/bin/env node
 
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
 
// Create the MCP server
const server = new McpServer({
  name: "my-mcp-server",
  version: "1.0.0",
});
 
// Connect using stdio transport
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("MCP server running on stdio");
}
 
main().catch(console.error);

النقاط الرئيسية:

  • McpServer هي الفئة عالية المستوى التي تتعامل مع تفاوض البروتوكول
  • StdioServerTransport يتواصل عبر stdin/stdout — المعيار لخوادم MCP المحلية
  • نسجل في stderr لأن stdout محجوز لرسائل بروتوكول MCP

ابنِ وتحقق:

npm run build

لديك الآن خادم MCP عامل (لكنه فارغ). لنضف القدرات.


الخطوة 3: تسجيل الأدوات

الأدوات هي أقوى عنصر في MCP. تتيح لوكلاء الذكاء الاصطناعي اتخاذ إجراءات — استدعاء APIs، استعلام قواعد البيانات، تحويل البيانات، أو تنفيذ حسابات.

أداتك الأولى: عداد الكلمات

أضف هذا قبل دالة main() في src/index.ts:

import { z } from "zod";
 
server.tool(
  "count_words",
  "Count the number of words in a given text",
  {
    text: z.string().describe("The text to count words in"),
  },
  async ({ text }) => {
    const wordCount = text
      .trim()
      .split(/\s+/)
      .filter((w) => w.length > 0).length;
 
    return {
      content: [
        {
          type: "text",
          text: `The text contains ${wordCount} words.`,
        },
      ],
    };
  }
);

لنحلل توقيع server.tool():

المعاملالغرض
"count_words"اسم الأداة الفريد (snake_case بالاتفاق)
"Count the..."وصف يقرأه الإنسان للذكاء الاصطناعي
{ text: z.string() }مخطط المدخلات باستخدام Zod
async ({ text }) => ...دالة المعالج التي تنفذ الأداة

أداة أكثر عملية: فاحص حالة URL

server.tool(
  "check_url",
  "Check if a URL is reachable and return its HTTP status code",
  {
    url: z.string().url().describe("The URL to check"),
    timeout: z
      .number()
      .optional()
      .default(5000)
      .describe("Timeout in milliseconds"),
  },
  async ({ url, timeout }) => {
    try {
      const controller = new AbortController();
      const timeoutId = setTimeout(() => controller.abort(), timeout);
 
      const response = await fetch(url, {
        method: "HEAD",
        signal: controller.signal,
      });
 
      clearTimeout(timeoutId);
 
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(
              {
                url,
                status: response.status,
                statusText: response.statusText,
                reachable: true,
              },
              null,
              2
            ),
          },
        ],
      };
    } catch (error) {
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(
              {
                url,
                reachable: false,
                error:
                  error instanceof Error ? error.message : "Unknown error",
              },
              null,
              2
            ),
          },
        ],
        isError: true,
      };
    }
  }
);

لاحظ النمط:

  • استخدم Zod للتحقق من المدخلات — الذكاء الاصطناعي يرى المخطط ويعرف ما يرسل
  • أعد content كمصفوفة من كتل المحتوى (text، image، أو resource)
  • عيّن isError: true عند فشل الأداة، حتى يتعامل الذكاء الاصطناعي مع الأخطاء بسلاسة

أداة بمخرجات مهيكلة

للأدوات التي تعيد بيانات (وليس مجرد رسائل)، يمكنك تعريف مخطط مخرجات:

server.tool(
  "calculate_bmi",
  "Calculate Body Mass Index from weight and height",
  {
    weightKg: z.number().positive().describe("Weight in kilograms"),
    heightM: z.number().positive().describe("Height in meters"),
  },
  async ({ weightKg, heightM }) => {
    const bmi = weightKg / (heightM * heightM);
    const category =
      bmi < 18.5
        ? "Underweight"
        : bmi < 25
        ? "Normal"
        : bmi < 30
        ? "Overweight"
        : "Obese";
 
    return {
      content: [
        {
          type: "text",
          text: `BMI: ${bmi.toFixed(1)} (${category})`,
        },
      ],
    };
  }
);

الخطوة 4: كشف الموارد

توفر الموارد سياقاً للقراءة فقط للذكاء الاصطناعي. على عكس الأدوات (التي تنفذ إجراءات)، الموارد هي بيانات يمكن للذكاء الاصطناعي الرجوع إليها — ملفات التكوين، التوثيق، مخططات قواعد البيانات، أو حالة النظام المباشرة.

مورد ثابت

server.resource(
  "server-info",
  "info://server",
  async (uri) => {
    return {
      contents: [
        {
          uri: uri.href,
          mimeType: "application/json",
          text: JSON.stringify(
            {
              name: "my-mcp-server",
              version: "1.0.0",
              capabilities: ["word counting", "URL checking", "BMI calculation"],
              uptime: process.uptime(),
            },
            null,
            2
          ),
        },
      ],
    };
  }
);

مورد ديناميكي مع قوالب

تتيح لك قوالب الموارد كشف بيانات مُعاملة — مثل سجلات فردية من قاعدة بيانات.

// Simulated data store
const projects = new Map([
  [
    "web-app",
    {
      name: "Web Application",
      status: "active",
      tech: ["Next.js", "TypeScript", "PostgreSQL"],
    },
  ],
  [
    "api",
    {
      name: "REST API",
      status: "active",
      tech: ["Hono", "Bun", "SQLite"],
    },
  ],
  [
    "mobile",
    {
      name: "Mobile App",
      status: "planning",
      tech: ["React Native", "Expo"],
    },
  ],
]);
 
// Resource template — the {id} is a URI parameter
server.resource(
  "project",
  "projects://{id}",
  async (uri) => {
    const id = uri.pathname.replace("//", "");
    const project = projects.get(id);
 
    if (!project) {
      throw new Error(`Project "${id}" not found`);
    }
 
    return {
      contents: [
        {
          uri: uri.href,
          mimeType: "application/json",
          text: JSON.stringify(project, null, 2),
        },
      ],
    };
  }
);

عندما يتصل وكيل ذكاء اصطناعي بخادمك، يمكنه تصفح الموارد المتاحة وقراءتها للحصول على السياق — تماماً مثل تصفح الملفات على القرص.


الخطوة 5: تعريف القوالب

القوالب هي نماذج قابلة لإعادة الاستخدام توجه الذكاء الاصطناعي نحو مهام محددة. إنها مثل تعليمات محفوظة يمكنها قبول معاملات.

server.prompt(
  "code-review",
  "Review code for bugs, security issues, and best practices",
  {
    code: z.string().describe("The code to review"),
    language: z
      .string()
      .optional()
      .default("typescript")
      .describe("Programming language"),
    focus: z
      .enum(["bugs", "security", "performance", "all"])
      .optional()
      .default("all")
      .describe("What to focus on in the review"),
  },
  async ({ code, language, focus }) => {
    const focusInstructions = {
      bugs: "Focus on finding logical errors, edge cases, and potential runtime exceptions.",
      security:
        "Focus on security vulnerabilities: injection, XSS, authentication flaws, data exposure.",
      performance:
        "Focus on performance: unnecessary allocations, O(n²) algorithms, missing caching.",
      all: "Review for bugs, security vulnerabilities, performance issues, and adherence to best practices.",
    };
 
    return {
      messages: [
        {
          role: "user",
          content: {
            type: "text",
            text: `Review the following ${language} code. ${focusInstructions[focus]}
 
\`\`\`${language}
${code}
\`\`\`
 
Provide your review as:
1. **Critical Issues** — Must fix before merging
2. **Warnings** — Should fix, but not blocking
3. **Suggestions** — Nice-to-have improvements
4. **Summary** — Overall code quality assessment`,
          },
        },
      ],
    };
  }
);

قالب آخر: مولد استعلامات SQL

server.prompt(
  "generate-sql",
  "Generate SQL queries from natural language descriptions",
  {
    description: z
      .string()
      .describe("Natural language description of the query"),
    dialect: z
      .enum(["postgresql", "mysql", "sqlite"])
      .optional()
      .default("postgresql")
      .describe("SQL dialect to target"),
    schema: z
      .string()
      .optional()
      .describe("Database schema context (CREATE TABLE statements)"),
  },
  async ({ description, dialect, schema }) => {
    let contextBlock = "";
    if (schema) {
      contextBlock = `\nHere is the database schema:\n\`\`\`sql\n${schema}\n\`\`\`\n`;
    }
 
    return {
      messages: [
        {
          role: "user",
          content: {
            type: "text",
            text: `Generate a ${dialect} SQL query for the following request:
 
"${description}"
${contextBlock}
Requirements:
- Use proper ${dialect} syntax
- Include comments explaining the query
- Use parameterized queries where user input is involved
- Optimize for readability and performance`,
          },
        },
      ],
    };
  }
);

الخطوة 6: الكود الكامل للخادم

إليك ملف src/index.ts الكامل مع جميع العناصر المسجلة. هذا هو الإصدار الكامل القابل للتشغيل:

#!/usr/bin/env node
 
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
 
// ── Server ──────────────────────────────────────────────
 
const server = new McpServer({
  name: "my-mcp-server",
  version: "1.0.0",
});
 
// ── Tools ───────────────────────────────────────────────
 
server.tool(
  "count_words",
  "Count the number of words in a given text",
  { text: z.string().describe("The text to count words in") },
  async ({ text }) => {
    const wordCount = text
      .trim()
      .split(/\s+/)
      .filter((w) => w.length > 0).length;
 
    return {
      content: [{ type: "text", text: `The text contains ${wordCount} words.` }],
    };
  }
);
 
server.tool(
  "check_url",
  "Check if a URL is reachable and return its HTTP status code",
  {
    url: z.string().url().describe("The URL to check"),
    timeout: z.number().optional().default(5000).describe("Timeout in ms"),
  },
  async ({ url, timeout }) => {
    try {
      const controller = new AbortController();
      const timeoutId = setTimeout(() => controller.abort(), timeout);
      const response = await fetch(url, {
        method: "HEAD",
        signal: controller.signal,
      });
      clearTimeout(timeoutId);
 
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(
              {
                url,
                status: response.status,
                statusText: response.statusText,
                reachable: true,
              },
              null,
              2
            ),
          },
        ],
      };
    } catch (error) {
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(
              {
                url,
                reachable: false,
                error: error instanceof Error ? error.message : "Unknown error",
              },
              null,
              2
            ),
          },
        ],
        isError: true,
      };
    }
  }
);
 
// ── Resources ───────────────────────────────────────────
 
const projects = new Map([
  ["web-app", { name: "Web Application", status: "active", tech: ["Next.js", "TypeScript", "PostgreSQL"] }],
  ["api", { name: "REST API", status: "active", tech: ["Hono", "Bun", "SQLite"] }],
  ["mobile", { name: "Mobile App", status: "planning", tech: ["React Native", "Expo"] }],
]);
 
server.resource("server-info", "info://server", async (uri) => ({
  contents: [
    {
      uri: uri.href,
      mimeType: "application/json",
      text: JSON.stringify(
        {
          name: "my-mcp-server",
          version: "1.0.0",
          capabilities: ["word counting", "URL checking"],
          uptime: process.uptime(),
        },
        null,
        2
      ),
    },
  ],
}));
 
server.resource("project", "projects://{id}", async (uri) => {
  const id = uri.pathname.replace("//", "");
  const project = projects.get(id);
  if (!project) throw new Error(`Project "${id}" not found`);
  return {
    contents: [
      { uri: uri.href, mimeType: "application/json", text: JSON.stringify(project, null, 2) },
    ],
  };
});
 
// ── Prompts ─────────────────────────────────────────────
 
server.prompt(
  "code-review",
  "Review code for bugs, security issues, and best practices",
  {
    code: z.string().describe("The code to review"),
    language: z.string().optional().default("typescript").describe("Programming language"),
    focus: z
      .enum(["bugs", "security", "performance", "all"])
      .optional()
      .default("all")
      .describe("Review focus area"),
  },
  async ({ code, language, focus }) => {
    const focusMap = {
      bugs: "Focus on logical errors and edge cases.",
      security: "Focus on security vulnerabilities.",
      performance: "Focus on performance bottlenecks.",
      all: "Review bugs, security, performance, and best practices.",
    };
 
    return {
      messages: [
        {
          role: "user" as const,
          content: {
            type: "text" as const,
            text: `Review this ${language} code. ${focusMap[focus]}\n\n\`\`\`${language}\n${code}\n\`\`\``,
          },
        },
      ],
    };
  }
);
 
// ── Start ───────────────────────────────────────────────
 
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("MCP server running on stdio");
}
 
main().catch(console.error);

ابنِ الخادم:

npm run build

الخطوة 7: الاختبار باستخدام MCP Inspector

قبل الربط مع Claude Desktop، استخدم MCP Inspector لاختبار خادمك بشكل تفاعلي.

npx @modelcontextprotocol/inspector node build/index.js

سيفتح واجهة ويب حيث يمكنك:

  1. عرض الأدوات — رؤية جميع الأدوات المسجلة ومخططاتها
  2. استدعاء الأدوات — تنفيذ الأدوات بمدخلات اختبارية ورؤية الاستجابات
  3. تصفح الموارد — عرض الموارد المتاحة وقراءة محتوياتها
  4. استخدام القوالب — اختيار القوالب وملء المعاملات ورؤية الرسائل المولدة

جرب استدعاء أداة count_words بالنص "Hello world, this is my MCP server" — يجب أن تحصل على الاستجابة The text contains 7 words.


الخطوة 8: الربط مع Claude Desktop

افتح ملف تكوين Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

أضف خادمك:

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "node",
      "args": ["/absolute/path/to/my-mcp-server/build/index.js"]
    }
  }
}

مهم: استخدم المسار المطلق لملف build/index.js. المسارات النسبية لن تعمل. استبدل /absolute/path/to/ بمسار مشروعك الفعلي.

أعد تشغيل Claude Desktop. يجب أن ترى أيقونة المطرقة تشير إلى توفر الأدوات. جرب سؤال Claude:

  • "عُدّ الكلمات في هذه الفقرة: ..."
  • "تحقق هل https://noqta.tn يمكن الوصول إليه"
  • "استخدم قالب مراجعة الكود لمراجعة هذه الدالة"

الخطوة 9: الربط مع Cursor

يدعم Cursor خوادم MCP بشكل أصلي. أضف خادمك في إعدادات MCP في Cursor:

  1. افتح Cursor Settings (Cmd+Shift+J على macOS)
  2. انتقل إلى MCP Servers
  3. اضغط Add Server
  4. هيّئ:
    • Name: my-mcp-server
    • Type: stdio
    • Command: node /absolute/path/to/my-mcp-server/build/index.js

بدلاً من ذلك، أنشئ ملف .cursor/mcp.json في جذر مشروعك:

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "node",
      "args": ["/absolute/path/to/my-mcp-server/build/index.js"]
    }
  }
}

أدواتك متاحة الآن في وضع Agent في Cursor. يمكن للذكاء الاصطناعي اكتشاف واستدعاء أدواتك تلقائياً أثناء جلسات البرمجة.


الخطوة 10: إضافة معالجة الأخطاء والتسجيل

تحتاج خوادم MCP في الإنتاج لمعالجة أخطاء سليمة. إليك نمطاً لأدوات متينة:

server.tool(
  "read_json_file",
  "Read and parse a JSON file",
  {
    path: z.string().describe("Path to the JSON file"),
  },
  async ({ path }) => {
    try {
      const { readFile } = await import("node:fs/promises");
      const content = await readFile(path, "utf-8");
      const parsed = JSON.parse(content);
 
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(parsed, null, 2),
          },
        ],
      };
    } catch (error) {
      if (error instanceof SyntaxError) {
        return {
          content: [{ type: "text", text: `Invalid JSON in file: ${path}` }],
          isError: true,
        };
      }
 
      const nodeError = error as NodeJS.ErrnoException;
      if (nodeError.code === "ENOENT") {
        return {
          content: [{ type: "text", text: `File not found: ${path}` }],
          isError: true,
        };
      }
 
      return {
        content: [
          {
            type: "text",
            text: `Error reading file: ${nodeError.message}`,
          },
        ],
        isError: true,
      };
    }
  }
);

الممارسات الرئيسية:

  • أعد دائماً نتيجة، حتى عند الخطأ — لا ترمِ استثناءً أبداً من معالج أداة
  • عيّن isError: true حتى يعرف الذكاء الاصطناعي أن الأداة فشلت
  • قدم رسائل خطأ مفيدة حتى يتمكن الذكاء الاصطناعي من التعافي أو إبلاغ المستخدم
  • سجل في stderr للتصحيح: console.error("Debug:", someValue)

استكشاف الأخطاء وحلها

الخادم لا يظهر في Claude Desktop

  1. تحقق من مسار ملف التكوين وصياغة JSON
  2. تأكد أن المسار المطلق لـ build/index.js صحيح
  3. أعد تشغيل Claude Desktop بالكامل (أغلق وأعد الفتح)
  4. تحقق من السجلات: ~/Library/Logs/Claude/mcp*.log على macOS

"Could not connect to MCP server"

  1. اختبر خادمك مباشرة: echo '{}' | node build/index.js — لا يجب أن يتوقف
  2. تأكد أن #!/usr/bin/env node في أعلى ملف JS المُجمّع
  3. اجعل الملف قابلاً للتنفيذ: chmod +x build/index.js

الأدوات لا تظهر

  1. تحقق أن الأدوات مسجلة قبل server.connect(transport)
  2. تحقق من أخطاء تجميع TypeScript: npm run build
  3. استخدم MCP Inspector للتحقق: npx @modelcontextprotocol/inspector node build/index.js

نصائح التصحيح

أضف تسجيل تصحيح بناءً على البيئة:

const DEBUG = process.env.MCP_DEBUG === "true";
 
function debug(...args: unknown[]) {
  if (DEBUG) console.error("[DEBUG]", ...args);
}
 
// Use in tool handlers:
debug("check_url called with:", url);

شغّل مع التصحيح:

MCP_DEBUG=true node build/index.js

الخطوات التالية

الآن بعد أن لديك خادم MCP عامل، إليك طرقاً لتوسيعه:

  • إضافة تكامل مع قاعدة بيانات — اربط بـ PostgreSQL أو SQLite أو MongoDB وكشف الاستعلامات كأدوات
  • بناء نقل HTTP — انشر خادمك كـ API بعيد باستخدام StreamableHTTPServerTransport
  • النشر على npm — شارك خادمك مع المجتمع عبر npx
  • إضافة المصادقة — نفّذ التحقق من مفتاح API للأدوات الحساسة
  • استكشاف النظام البيئي — تصفح أمثلة خوادم MCP على GitHub للإلهام

دروس ذات صلة


الخلاصة

لقد بنيت خادم MCP كامل الوظائف يكشف الأدوات والموارد والقوالب لوكلاء الذكاء الاصطناعي. بروتوكول سياق النموذج يصبح بسرعة المعيار لتكامل الذكاء الاصطناعي مع الأدوات، ومعرفة كيفية بناء الخوادم تضعك في قلب هذا النظام البيئي.

النقاط الرئيسية:

  1. الأدوات تتيح لوكلاء الذكاء الاصطناعي اتخاذ إجراءات — إنها العنصر الأقوى
  2. الموارد توفر السياق — بيانات يقرأها الذكاء الاصطناعي لاتخاذ قرارات أفضل
  3. القوالب هي نماذج قابلة لإعادة الاستخدام — توجه الذكاء الاصطناعي نحو سير عمل محددة
  4. نقل stdio هو الافتراضي للخوادم المحلية — بسيط وموثوق
  5. معالجة الأخطاء مهمة — أعد دائماً نتائج، لا ترمِ استثناءات من المعالجات

ابدأ بمشكلة حقيقية: غلّف API تستخدمه يومياً، اكشف قاعدة بيانات تستعلم عنها كثيراً، أو أنشئ أدوات تؤتمت سير عمل فريقك. أفضل خوادم MCP تحل مشاكل محددة وعملية.


هل تريد قراءة المزيد من الدروس التعليمية؟ تحقق من أحدث درس تعليمي لدينا على بناء تطبيق ذكاء اصطناعي محادثي مع Next.js.

ناقش مشروعك معنا

نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.

دعنا نجد أفضل الحلول لاحتياجاتك.

مقالات ذات صلة

بناء وكلاء الذكاء الاصطناعي من الصفر باستخدام TypeScript: إتقان نمط ReAct مع Vercel AI SDK

تعلّم كيفية بناء وكلاء الذكاء الاصطناعي من الأساس باستخدام TypeScript. يغطي هذا الدليل التعليمي نمط ReAct، واستدعاء الأدوات، والاستدلال متعدد الخطوات، وحلقات الوكلاء الجاهزة للإنتاج مع Vercel AI SDK.

35 د قراءة·