ما هو MCP فعلاً
Model Context Protocol هو المعيار المفتوح من Anthropic لمنح مساعدي الذكاء الاصطناعي وصولاً منظّماً إلى الأدوات والبيانات الخارجية. فكّر فيه كعقد API محدّد الأنواع بين مضيف نموذجك (Claude Code أو Cursor أو غيرهما) وأي قدرة تريد كشفها: قاعدة بيانات، أداة تقشير ويب، مراقب ملفات، بوت Slack، أو مشغّل CI.
حين تبني خادم MCP، فأنت تبني جسراً. النموذج يستدعي أدواتك بالاسم مع وسائط منظّمة؛ خادمك ينفّذ ويعيد نتائج منظّمة. لا مزيد من "اذهب إلى هذا الرابط وأخبرني بما تراه" — فقط استدعاءات دوال محدّدة الأنواع.
المتطلبات المسبقة
- Node.js 22+
- إعداد Claude Code أو Cursor يدعم MCP
- 20 دقيقة
الخطوة 1: إعداد هيكل الخادم
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
أنشئ tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"strict": true
}
}
الخطوة 2: اكتب أداتك الأولى
أنشئ src/index.ts:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "my-first-mcp",
version: "0.1.0",
});
// Tool: fetch and summarize a URL's title
server.tool(
"get_page_title",
"Fetches the <title> tag from a given URL",
{ url: z.string().url().describe("The URL to fetch") },
async ({ url }) => {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
const html = await res.text();
const match = html.match(/<title[^>]*>(.*?)<\/title>/is);
const title = match?.[1]?.trim() ?? "No title found";
return { content: [{ type: "text", text: title }] };
} catch (err) {
return {
content: [{ type: "text", text: `Error: ${String(err)}` }],
isError: true,
};
}
}
);
// Tool: simple math evaluator
server.tool(
"calculate",
"Evaluates a safe arithmetic expression",
{ expression: z.string().describe("e.g. '2 + 2 * 10'") },
async ({ expression }) => {
// Only allow digits, operators, spaces, parens
if (!/^[0-9+\-*/.() ]+$/.test(expression)) {
return {
content: [{ type: "text", text: "Invalid expression" }],
isError: true,
};
}
const result = Function(`"use strict"; return (${expression})`)();
return { content: [{ type: "text", text: String(result) }] };
}
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
الخطوة 3: ربطه بـ Claude Code
أضف إلى إعدادات MCP الخاصة بـ Claude Code (عادةً ~/.claude/mcp.json أو .mcp.json في مساحة العمل):
{
"mcpServers": {
"my-first-mcp": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/my-mcp-server/src/index.ts"]
}
}
}
أعد تشغيل Claude Code. افتح لوحة الأدوات — يجب أن تظهر أداتاك.
الخطوة 4: اختبره بدون مضيف
استخدم مفتّش MCP:
npx @modelcontextprotocol/inspector tsx src/index.ts
يفتح هذا واجهة محلية يمكنك من خلالها استدعاء أدواتك، وفحص المخططات، ومشاهدة رسائل JSON-RPC الخام. ضروري للتصحيح قبل الربط بمضيف حقيقي.
ماذا تبني بعد ذلك
بمجرد إتقان النمط، تتألق خوادم MCP في:
- الذاكرة الدائمة — قراءة/كتابة مخزن JSON محلي حتى يتذكر وكيلك السياق بين الجلسات
- البحث الواعي بالمشروع — كشف بحث دلالي عن قاعدة شيفرتك عبر embeddings
- APIs الداخلية — تغليف أي API لشركتك خلف واجهة نظيفة محدّدة الأنواع يستطيع النموذج استدعاؤها
- التحكم في المتصفح — تغليف Playwright للتفاعل المنظّم مع الويب
- CI hooks — تشغيل البناء، وقراءة نتائج الاختبارات، وفتح PRs من داخل حلقة وكيلك
الفكرة الجوهرية
يحوّل MCP وكيلك من واجهة دردشة إلى بيئة تشغيل قابلة للبرمجة. يتوقف النموذج عن وصف ما سيفعله ويبدأ في فعله فعلاً — عبر استدعاءات دوالك المحدّدة الأنواع والقابلة للتدقيق والمسجّلة. هذه هي القفزة من vibecoding إلى بناء أنظمة agentic حقيقية.
20 دقيقة لأداتك الأولى. الباقي مجرد نطاق.
