إنتقل إلى المحتوى الرئيسي

مصادقة وأمان خوادم MCP في Cursor

مصادقة MCP

تقوم خوادم Model Context Protocol (MCP) بتوسيع Cursor بقدرات خارجية قوية، بدءًا من الاستعلام عن منصات الإعلانات إلى إدارة تدفقات الدفع. ومع ذلك، فإن كل اتصال خارجي يطرح اعتبارات تتعلق بالمصادقة والأمان. يأخذك هذا الدليل عبر الطيف الكامل لمصادقة خوادم MCP في Cursor، التي تغطي تدفقات OAuth، وإدارة مفاتيح API، وطبقات الموافقة البشرية للمدفوعات التي يقودها الذكاء الاصطناعي، والتحديات المحددة التي يواجهها المستخدمون مع خدمات مثل Live Meta Ads MCP.

لماذا تعتبر مصادقة MCP مهمة​

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

نموذج الأمان لمحة سريعة​

الطبقةالمسؤوليةمثال
Cursorيستضيف عميل MCP، يدير الاتصالاتيقرأ mcp.json، يشغل عمليات الخادم
خادم MCPيتعامل مع استدعاءات API الخارجيةيستدعي Meta Graph API، Stripe API
مزود المصادقةيتحقق من الهويةرمز OAuth من Meta، مفتاح API من المزود
الموافقة البشريةيتحكم في الإجراءات الحساسةالموافقة قبل إرسال الدفع
warning

لا تقم أبداً بتخزين مفاتيح API للإنتاج أو رموز OAuth كنص عادي داخل مستودعك. استخدم دائماً متغيرات البيئة أو مدير الأسرار. إرسال بيانات الاعتماد إلى git هو أحد أكثر حوادث الأمان شيوعاً التي يواجهها المطورون.

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

قبل تكوين مصادقة MCP في Cursor، تأكد من أن لديك:

  1. Cursor مثبت ومحدث إلى أحدث إصدار
  2. Node.js 18+ لتشغيل خوادم MCP المستندة إلى npx
  3. حساب لدى الخدمة الخارجية التي تريد الاتصال بها (مثل Meta for Developers، Stripe)
  4. بيانات اعتماد التطبيق من المزود (معرف العميل، سر العميل، أو مفتاح API)

فهم طرق مصادقة MCP​

يدعم Cursor نموذجين رئيسيين للمصادقة لخوادم MCP، ويعتمد الاختيار بالكامل على ما يدعمه الخادم الذي تتصل به.

الطريقة الأولى: مصادقة مفتاح API​

النمط الأبسط. يتوقع خادم MCP مفتاح API ثابت يتم تمريره عبر متغير بيئة أو رأس.

{
"mcpServers": {
"my-api-server": {
"command": "npx",
"args": ["-y", "@my-org/api-mcp-server"],
"env": {
"API_KEY": "${MY_API_KEY}"
}
}
}
}

بناء الجملة ${MY_API_KEY} تخبر Cursor بقراءة القيمة من بيئتك. اضبطها في ملف تعريف shell:

# ~/.zshrc أو ~/.bashrc
export MY_API_KEY="sk-your-actual-key-here"
تلميح

على Windows، اضبط متغيرات البيئة عبر PowerShell أو خصائص النظام. في PowerShell:

[System.Environment]::SetEnvironmentVariable("MY_API_KEY", "sk-your-key", "User")

ثم أعد تشغيل Cursor ليتمكن من التقاط المتغير الجديد.

الطريقة الثانية: مصادقة OAuth 2.0​

يكون OAuth أكثر أماناً لأنه يتجنب المفاتيح الثابتة ويدعم وصولاً محدد النطاق وقابلاً للإلغاء. ومع ذلك، يكون إعداده أكثر تعقيداً. يبدأ خادم MCP تدفق OAuth يفتح متصفحاً، ويطلب منك تسجيل الدخول إلى المزود، ويعيد رمزاً إلى Cursor.

{
"mcpServers": {
"oauth-server": {
"command": "npx",
"args": ["-y", "@my-org/oauth-mcp-server"],
"env": {
"OAUTH_CLIENT_ID": "${CLIENT_ID}",
"OAUTH_CLIENT_SECRET": "${CLIENT_SECRET}",
"OAUTH_REDIRECT_URI": "http://localhost:3000/callback"
}
}
}
}

يتابع تدفق OAuth على النحو التالي:

  1. يبدأ Cursor عملية خادم MCP
  2. يكتشف الخادم عدم وجود رمز صالح ويبدأ OAuth
  3. يفتح متصفحك صفحة تسجيل الدخول الخاصة بالمزود
  4. تقوم بتفويض التطبيق
  5. يعيد المزود التوجيه إلى localhost:3000/callback مع رمز تفويض
  6. يقوم الخادم باستبدال الرمز برموز الوصول والتحديث
  7. يتم تخزين الرموز محلياً للاستخدام المستقبلي

إعداد Live Meta Ads MCP​

يُعد Live Meta Ads MCP أحد تكاملات MCP الأكثر طلباً لـ Cursor. يتصل بـ Meta Graph API لتمكين وكيلك من الاستعلام عن أداء الإعلانات وبيانات الحملة ورؤى الجمهور. يبلغ مستخدمو المنتدى بشكل متكرر أن MCP هذا يفشل في المصادقة. إليك كيفية إعداده بشكل صحيح.

الخطوة 1: إنشاء تطبيق Meta​

  1. انتقل إلى بوابة Meta for Developers
  2. انقر على إنشاء تطبيق
  3. حدد أعمال كنوع للتطبيق
  4. أضف منتج Marketing API
  5. دوّن App ID و App Secret الخاصين بك

الخطوة 2: إنشاء رمز وصول طويل الأمد​

تنتهي صلاحية رموز الوصول الافتراضية من Meta بسرعة. للاستخدام مع MCP، تحتاج إلى رمز طويل الأمد:

# استبدل الرمز قصير الأمد برمز طويل الأمد
curl -X GET "https://graph.facebook.com/v19.0/oauth/access_token" \
-d "grant_type=fb_exchange_token" \
-d "client_id=$META_APP_ID" \
-d "client_secret=$META_APP_SECRET" \
-d "fb_exchange_token=$SHORT_LIVED_TOKEN"

تتضمن الاستجابة رمزاً صالحاً لمدة 60 يوماً تقريباً.

الخطوة 3: تكوين خادم MCP في Cursor​

{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@mcp/meta-ads-server"],
"env": {
"META_ACCESS_TOKEN": "${META_ACCESS_TOKEN}",
"META_APP_ID": "${META_APP_ID}",
"META_APP_SECRET": "${META_APP_SECRET}",
"META_API_VERSION": "v19.0"
}
}
}
}

الخطوة 4: التحقق من الاتصال​

أعد تشغيل Cursor، ثم افتح إعدادات Cursor وانتقل إلى قسم MCP. يجب أن ترى meta-ads مدرجاً مع مؤشر حالة أخضر. إذا أظهر خطأ، راجع قسم استكشاف الأخطاء وإصلاحها أدناه.

warning

تنتهي صلاحية رموز Meta طويلة الأمد بعد 60 يوماً. اضبط تذكير تقويم لتحديث الرمز قبل انتهاء صلاحيته. إذا انتهت صلاحية الرمز، سيفشل وكيلك بصمت في جلب بيانات الإعلانات، وقد يكون العرَض الوحيد هو نتائج فارغة أو أخطاء مصادقة مخفية في سجلات MCP.

أعطال مصادقة MCP الشائعة​

يبلغ مستخدمو المنتدى عن عدة مشكلات متكررة مع مصادقة MCP في Cursor. إليك الأعطال الأكثر شيوعاً وحلولها.

العطل 1: الرمز غير موجود في البيئة​

العرَض: يبدأ خادم MCP ولكنه يعيد 401 Unauthorized في كل طلب.

السبب: لم يلتقط Cursor متغير البيئة. يحدث هذا غالباً عندما يتم تعيين المتغير في ملف تعريف shell مختلف أو بعد أن كان Cursor قيد التشغيل بالفعل.

الحل:

# تحقق من وجود المتغير
echo $META_ACCESS_TOKEN

# إذا كان فارغاً، أضفه إلى ملف تعريف shell وأعد تشغيل Cursor
echo 'export META_ACCESS_TOKEN="your-token"' >> ~/.zshrc
source ~/.zshrc

ثم أغلق Cursor بالكامل وأعد فتحه.

العطل 2: عدم تطابق URI لإعادة توجيه OAuth​

العرَض: يفتح تدفق OAuth المتصفح، ولكن بعد التفويض، ترى صفحة خطأ.

السبب: لا يتطابق URI لإعادة التوجيه في تكوين تطبيق Meta الخاص بك مع الذي يستخدمه خادم MCP.

الحل: في لوحة تحكم Meta for Developers، انتقل إلى إعدادات التطبيق > متقدم > إعدادات OAuth وأضف http://localhost:3000/callback (أو أي URI يستخدمه خادم MCP) إلى عناوين URI المعاد توجيهها المسموح بها.

العطل 3: رمز منتهي الصلاحية أو غير صالح​

العرَض: كان خادم MCP يعمل سابقاً ولكنه يعيد فجأة أخطاء مصادقة.

السبب: انتهت صلاحية رمز Meta طويل الأمد (حد 60 يوماً) أو تم إبطاله.

الحل: أعد تشغيل تدفق استبدال الرمز وقم بتحديث متغير البيئة.

العطل 4: نقص نطاقات الأذونات​

العرَض: تنجح المصادقة، ولكن لا يمكن للوكيل الوصول إلى بيانات معينة (مثلاً: يمكنه قراءة الحملات ولكن ليس بيانات الجمهور).

السبب: يفتقر تطبيق Meta إلى أذونات API المطلوبة.

الحل: في لوحة تحكم تطبيق Meta، انتقل إلى الأدوار > مراجعة التطبيق > الأذونات والميزات واطلب النطاقات الإضافية:

النطاقما يفعله
ads_readقراءة بيانات أداء الحملة
ads_managementإنشاء وإدارة الحملات
read_insightsالوصول إلى التحليلات التفصيلية
business_managementإدارة إعدادات الأعمال

بناء طبقات موافقة بشرية لمدفوعات وكيل الذكاء الاصطناعي​

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

لماذا تعتبر طبقات الموافقة ضرورية​

بدون طبقة موافقة، يمكن لوكيل ذكاء اصطناعي لديه حق الوصول إلى MCP للدفع أن:

  • يفرض رسوماً غير متوقعة على بطاقتك
  • يرسل مدفوعات إلى مستلمين خاطئين
  • يشغل معاملات مالية لا رجعة فيها
  • يراكم التكاليف من خلال المعاملات الصغيرة المتكررة

بنية طبقة الموافقة على الدفع​

يُدخل النمط الموصى به بوابة موافقة بين Cursor وخادم MCP للدفع:

Cursor Agent --> Approval Gateway --> Payment MCP Server --> Stripe/PayPal API
^
|
Human Review

تنفيذ بوابة الموافقة​

أنشئ خادم MCP خفيف الوزن يلف خادم الدفع الفعلي ويتطلب الموافقة:

// approval-gateway.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server({
name: "payment-approval-gateway",
version: "1.0.0",
}, {
capabilities: { tools: {} },
});

// Pending approvals stored in memory (use a database for production)
const pendingApprovals = new Map();

server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "request_payment",
description: "Request a payment. Requires human approval before execution.",
inputSchema: {
type: "object",
properties: {
amount: { type: "number", description: "Amount in cents" },
currency: { type: "string", description: "ISO currency code" },
recipient: { type: "string", description: "Recipient identifier" },
reason: { type: "string", description: "Why this payment is needed" },
},
required: ["amount", "currency", "recipient", "reason"],
},
},
{
name: "approve_payment",
description: "Approve a pending payment by ID",
inputSchema: {
type: "object",
properties: {
approval_id: { type: "string" },
},
required: ["approval_id"],
},
},
],
}));

server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "request_payment") {
const { amount, currency, recipient, reason } = request.params.arguments;
const approvalId = `appr_${Date.now()}`;

pendingApprovals.set(approvalId, {
amount,
currency,
recipient,
reason,
status: "pending",
createdAt: new Date(),
});

return {
content: [{
type: "text",
text: `Payment request created. Approval ID: ${approvalId}\n\n` +
`Amount: ${amount/100} ${currency.toUpperCase()}\n` +
`Recipient: ${recipient}\n` +
`Reason: ${reason}\n\n` +
`To execute this payment, a human must approve it using the approve_payment tool with approval_id: ${approvalId}`,
}],
};
}

if (request.params.name === "approve_payment") {
const { approval_id } = request.params.arguments;
const approval = pendingApprovals.get(approval_id);

if (!approval) {
return { content: [{ type: "text", text: "Error: Approval ID not found." }] };
}

// Forward to actual payment server here
approval.status = "approved";
return {
content: [{
type: "text",
text: `Payment approved and forwarded to payment processor.\nAmount: ${approval.amount/100} ${approval.currency.toUpperCase()}`,
}],
};
}
});

const transport = new StdioServerTransport();
await server.connect(transport);

تكوين بوابة الموافقة في Cursor​

{
"mcpServers": {
"payments": {
"command": "npx",
"args": ["tsx", "./mcp-servers/approval-gateway.ts"],
"env": {
"STRIPE_SECRET_KEY": "${STRIPE_SECRET_KEY}",
"APPROVAL_TIMEOUT_MS": "300000"
}
}
}
}
تلميح

اضبط مهلة موافقة بحيث إذا لم يوافق بشري خلال إطار زمني معقول، تنتهي صلاحية الطلب تلقائياً. خمس دقائق هي قيمة افتراضية جيدة. هذا يمنع طلبات الدفع القديمة من التراكم والموافقة عليها خارج السياق.

warning

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

تكوين خادم MCP الآمن​

إلى جانب المصادقة، فإن طريقة تكوين خوادم MCP في Cursor لها آثار أمنية. اتبع هذه الممارسات الفضلى.

استخدام التكوين على مستوى المشروع مقابل العام​

يدعم Cursor كلاً من التكوينات العامة (~/.cursor/mcp.json) وعلى مستوى المشروع (.cursor/mcp.json).

النطاقالملفحالة الاستخدام
عام~/.cursor/mcp.jsonخوادم شخصية مستخدمة عبر جميع المشاريع
المشروع.cursor/mcp.jsonخوادم مخصصة لمشروع واحد
تلميح

استخدم التكوين على مستوى المشروع للخوادم الحساسة. هذا يبقي بيانات الاعتماد خارج تكوينك العام ويسهل تدقيق المشاريع التي لها حق الوصول إلى أي خدمات. أضف .cursor/mcp.json إلى .gitignore إذا كان يحتوي على أسرار، أو استخدم مراجع متغيرات البيئة فقط.

تقييد الوصول إلى أدوات MCP​

يمكنك تحديد الأدوات التي يكشف عنها خادم MCP لـ Cursor باستخدام حقل disabledTools:

{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@mcp/meta-ads-server"],
"env": {
"META_ACCESS_TOKEN": "${META_ACCESS_TOKEN}"
},
"disabledTools": ["delete_campaign", "pause_all_campaigns"]
}
}
}

هذا يمنع الوكيل من استخدام أدوات تدميرية حتى لو كشف عنها خادم MCP.

أمان النقل​

لخوادم MCP البعيدة (المستندة إلى SSE)، استخدم دائماً HTTPS:

{
"mcpServers": {
"remote-server": {
"url": "https://mcp.example.com/sse",
"headers": {
"Authorization": "Bearer ${REMOTE_MCP_TOKEN}"
}
}
}
}
warning

لا تستخدم أبداً HTTP (غير مشفر) لخوادم MCP البعيدة. يحمل الاتصال رموز المصادقة الخاصة بك، ويمكن لمهاجم على الشبكة اعتراضها. استخدم دائماً HTTPS وتحقق من شهادة TLS للخادم.

أنماط تحديث الرموز​

يصدر العديد من مزودي OAuth رموز وصول قصيرة الأمد (ساعة واحدة) إلى جانب رموز تحديث طويلة الأمد. يجب أن يتعامل خادم MCP مع التحديث تلقائياً لتجنب الانقطاعات.

النمط 1: التحديث من جانب الخادم (موصى به)​

يتعامل خادم MCP مع تحديث الرمز داخلياً. عندما تنتهي صلاحية رمز الوصول، يستخدم الخادم رمز التحديث للحصول على رمز جديد دون تدخل المستخدم.

// Inside your MCP server
let accessToken = await loadToken();
let tokenExpiry = Date.now() + 3600 * 1000; // 1 hour

async function ensureValidToken() {
if (Date.now() >= tokenExpiry - 60000) { // refresh 1 min before expiry
const response = await fetch("https://oauth.provider.com/token", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
grant_type: "refresh_token",
refresh_token: process.env.REFRESH_TOKEN,
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
}),
});
const data = await response.json();
accessToken = data.access_token;
tokenExpiry = Date.now() + data.expires_in * 1000;
await saveToken(accessToken, tokenExpiry);
}
return accessToken;
}

النمط 2: إعادة تحميل البيئة من جانب Cursor​

إذا كان خادم MCP لا يدعم التحديث التلقائي، يمكنك إعادة تحميل البيئة في Cursor:

  1. حدّث الرمز خارجياً
  2. حدّث متغير البيئة
  3. أعد تشغيل خادم MCP في Cursor عبر الإعدادات

النمط 3: البرنامج النصي المغلف​

أنشئ برنامج نصي مغلف يحدّث الرمز قبل تشغيل خادم MCP:

#!/bin/bash
# refresh-and-start.sh

# Refresh the Meta token
NEW_TOKEN=$(node /path/to/refresh-token.js)
export META_ACCESS_TOKEN=$NEW_TOKEN

# Start the MCP server
exec npx -y @mcp/meta-ads-server

اضبط Cursor لاستخدام البرنامج المغلف:

{
"mcpServers": {
"meta-ads": {
"command": "bash",
"args": ["/path/to/refresh-and-start.sh"]
}
}
}
تلميح

بالنسبة لـ Live Meta Ads MCP تحديداً، فإن انتهاء صلاحية الرمز بعد 60 يوماً هو السبب الأكثر شيوعاً لبلاغات "توقف عن العمل فجأة". أتمت عملية التحديث باستخدام مهمة cron أو مهمة مجدولة. على macOS/Linux، استخدم cron. على Windows، استخدم Task Scheduler.

استكشاف أخطاء مصادقة MCP وإصلاحها​

التحقق من سجلات خادم MCP​

لا يُظهر Cursor دائماً أخطاء خادم MCP في الواجهة. لمعرفة ما يحدث:

  1. افتح لوحة الأوامر (Cmd/Ctrl + Shift + P)
  2. ابحث عن Output: Show Output Channels
  3. حدد MCP من القائمة المنسدلة
  4. راجع السجلات بحثاً عن أخطاء المصادقة

اختبار المصادقة بشكل مستقل​

قبل تصحيح الأخطاء عبر Cursor، اختبر خادم MCP مباشرة:

# Run the server manually
npx -y @mcp/meta-ads-server

# In another terminal, send a test request
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | npx -y @mcp/meta-ads-server

إذا فشل الخادم في المصادقة خارج Cursor، فالمشكلة في بيانات الاعتماد الخاصة بك، وليس في Cursor.

التحقق من تحميل متغيرات البيئة​

# Create a test script
cat > test-env.js << 'EOF'
console.log("META_ACCESS_TOKEN:", process.env.META_ACCESS_TOKEN ? "SET" : "NOT SET");
console.log("META_APP_ID:", process.env.META_APP_ID ? "SET" : "NOT SET");
console.log("META_APP_SECRET:", process.env.META_APP_SECRET ? "SET" : "NOT SET");
EOF

# Run with the MCP server's environment
node test-env.js

إذا ظهرت المتغيرات كـ NOT SET، فالمشكلة في ملف تعريف shell أو في طريقة تحميل Cursor للبيئة.

قائمة فحص الأمان​

قبل نشر خوادم MCP في سياق الإنتاج، راجع هذه القائمة:

  • مفاتيح API مخزنة في متغيرات البيئة، وليس أبداً في ملفات التكوين
  • تمت إضافة .cursor/mcp.json إلى .gitignore إذا كان يحتوي على أسرار
  • تم قفل عناوين URI لإعادة توجيه OAuth على localhost
  • تم تعطيل الأدوات التدميرية عبر disabledTools
  • تم تغليف خوادم MCP للدفع ببوابات موافقة
  • تم أتمتة تحديث الرموز لمنع الأعطال الصامتة
  • تستخدم خوادم MCP البعيدة HTTPS فقط
  • تمت مراقبة سجلات خادم MCP بحثاً عن أعطال مصادقة غير متوقعة
  • تم تحديد نطاق رموز الوصول بأقل الأذونات المطلوبة
  • تمت إزالة خوادم MCP غير المستخدمة من التكوين

الخلاصة​

تغطي مصادقة MCP في Cursor طيفاً يتراوح من متغيرات بيئة بسيطة لمفاتيح API إلى تدفقات OAuth معقدة مع تحديث تلقائي للرموز. يُعد Live Meta Ads MCP نقطة ألم شائعة بسبب انتهاء صلاحية الرمز بعد 60 يوماً ومتطلبات نطاق الأذونات. باتباع الأنماط في هذا الدليل، يمكنك بناء تكاملات MCP آمنة وموثوقة تحمي الإجراءات الحساسة خلف طبقات الموافقة البشرية وتبقي بيانات الاعتماد الخاصة بك آمنة.