نفق ChatGPT MCP: ربط خادم MCP محلي مع ChatGPT

لا يستطيع ChatGPT الوصول إلى localhost، لذلك يحتاج خادم MCP المحلي إلى نفق. تعرّف على أوامر ngrok وCloudflare الدقيقة، ونموذج الموصل في وضع المطوّر، والأخطاء التي تعيق أول استدعاء لأداة، والعادات التي تُبقي العنوان العام آمنًا، ومتى يتفوّق خادم مستضاف على النفق.

نفق ChatGPT MCP: ربط خادم MCP محلي مع ChatGPT
Cristian Da Conceicao
مؤسس Picasso IA

يعمل خادم MCP الخاص بك بشكل مثالي على localhost:3000. ثم تلصق ذلك العنوان في ChatGPT فتظهر رسالة خطأ. لا خلل في الشيفرة. يعمل ChatGPT داخل السحابة التابعة لشركة OpenAI، بينما يقع حاسوبك المحمول خلف جهاز توجيه لم يدعُه إلى الداخل قط. يسدّ نفق ChatGPT MCP هذه الفجوة: برنامج صغير على جهازك يفتح اتصالًا صادرًا إلى وسيط، ويمنحك الوسيط عنوان HTTPS عامًا، وكل طلب يرسله ChatGPT إلى هذا العنوان ينتقل عبر الاتصال المفتوح إلى خادمك المحلي.

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

💡 الخلاصة السريعة: قدّم نقطة نهاية MCP عبر Streamable HTTP، ووجّه النفق إلى ذلك المنفذ، والصق https://<your-tunnel-host>/mcp في نموذج الاتصال في وضع المطوّر داخل ChatGPT، وأبقِ العمليتين تعملان أثناء المحادثة.

لماذا لا يستطيع ChatGPT الوصول إلى localhost

الخوادم البعيدة فقط

تُبنى موصلات ChatGPT للخوادم التي تعمل على الإنترنت العام. لا يمكن لخادم يعمل عبر stdio، وهو النقل الذي يشغّل فيه العميل المكتبي برنامجك كعملية فرعية، أن يعمل هنا، لأن ChatGPT لا يملك طريقة لتشغيل أي عملية على حاسوبك. ما يستطيعه هو استدعاء نقطة نهاية HTTPS، وتسرد وثائق OpenAI بروتوكولين مدعومين: الأول Server-Sent Events والثاني Streamable HTTP. اختر Streamable HTTP ما لم يكن لديك سبب يمنعك، فهو حلّ محل نقل HTTP مع SSE القديم في مواصفة Model Context Protocol، وهو ما توصي به حزم SDK الحالية.

هناك سبب ثانٍ أبسط لفشل localhost. تعني الكلمة «هذا الجهاز» بالنسبة لمن يقرؤها. وعندما يحاول ChatGPT الوصول إلى http://localhost:3000، فإنه ينظر إلى خوادمه هو، ولا يجد شيئًا على المنفذ 3000، فيستسلم.

نفق سكة حديد من الطوب تمتد عبره القضبان نحو دائرة صغيرة من ضوء النهار

ما الذي يفعله النفق فعلًا

يقلب النفق اتجاه الاتصال. يتصل جهازك بمزوّد النفق صادرًا منه، وهو اتصال تسمح به كل أجهزة التوجيه المنزلية ومعظم جدران الحماية في المكاتب، ويُبقي هذا الاتصال مفتوحًا. يملك المزوّد اسم مضيف عامًا بشهادة TLS صالحة، ويدفع الطلبات الواردة عبر الاتصال المفتوح. عمليًا يمر الطلب الواحد بخمس خطوات:

  1. يرسل ChatGPT طلبًا إلى https://abc123.ngrok-free.app/mcp.
  2. تستقبل حافة المزوّد الطلب وتجد جلستك المفتوحة.
  3. ينتقل الطلب عبر الاتصال إلى عميل النفق على حاسوبك المحمول.
  4. يعيد العميل توجيه الطلب إلى http://localhost:3000/mcp.
  5. يعود ردّ خادمك على المسار نفسه.

مقارنةً بتوجيه المنافذ الكلاسيكي، تتخطى إعدادات جهاز التوجيه وخدمة DNS الديناميكي وتجديد الشهادات. كما تحصل على زر إيقاف: أغلق النفق فيتوقف العنوان العام عن العمل فورًا.

ما الذي يجب تجهيزه أولًا

الخطة ووضع المطوّر

تقع الموصلات المخصصة لخوادم MCP البعيدة خلف وضع المطوّر. تدرجه وثائق OpenAI ضمن الحسابات التالية على الويب: Plus، Pro، Business، Enterprise، Education. في خطط مساحات العمل قد يحتاج مسؤول النظام إلى السماح به أولًا، فتحقّق من ذلك قبل أن تلوم خادمك.

تتغير أسماء القوائم بين الإصدارات. الآن يوجد المفتاح في الإعدادات، ضمن قسم التطبيقات، كمفتاح بعنوان وضع المطوّر قرب الأسفل. وضعته الإصدارات الأقدم تحت الموصلات. إذا لم تجده فابحث في لوحة الإعدادات عن الكلمة "developer".

المتطلبماذا يعني عمليًا
خطة ChatGPTPlus، Pro، Business، Enterprise أو Education، مستخدمة على الويب
النقلStreamable HTTP (يعمل Server-Sent Events أيضًا)
العنوانعنوان HTTPS عام ينتهي بمسار MCP، وغالبًا /mcp
المصادقةOAuth، أو بلا مصادقة لاختبار مؤقت
النفقngrok أو Cloudflare Tunnel أو Tailscale Funnel
العمليات قيد التشغيلخادمك والنفق، ويبقيان نشطين أثناء المحادثة

خادم Streamable HTTP بسيط

تحتاج إلى شيء صغير تختبر به النفق. يعرض خادم TypeScript هذا أداة واحدة، في الوضع عديم الحالة، فلا توجد جلسات تضيع عند إعادة التشغيل. ثبّت الاعتماديات أولًا:

npm install @modelcontextprotocol/sdk express zod
npm install -D tsx typescript @types/express

ثم احفظ الملف باسم server.ts:

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

const app = express();
app.use(express.json());

function buildServer() {
  const server = new McpServer({ name: "local-notes", version: "1.0.0" });
  server.tool(
    "add_numbers",
    "Use this when the user asks to add two numbers together.",
    { a: z.number(), b: z.number() },
    async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] })
  );
  return server;
}

app.post("/mcp", async (req, res) => {
  const server = buildServer();
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
  res.on("close", () => {
    transport.close();
    server.close();
  });
  await server.connect(transport);
  await transport.handleRequest(req, res, req.body);
});

app.listen(3000, "127.0.0.1", () => console.log("MCP on http://127.0.0.1:3000/mcp"));

شغّله بالأمر npx tsx server.ts. ثلاثة تفاصيل مهمة. أولًا، المسار هو /mcp، وهذا المسار بالضبط هو ما ينتهي في نموذج ChatGPT. ثانيًا، يجعل sessionIdGenerator: undefined كل طلب مستقلًا، وهذا مناسب لنفق قد يُعاد تشغيله. ثالثًا، يبدأ وصف الأداة بعبارة "Use this when"، وهي عادة تساعد ChatGPT على اختيار الأداة الصحيحة، لأنه يختار الأدوات بقراءة هذه الجمل.

قبل أن يوجد أي نفق، تحقق من أن الخادم يرد على المصافحة:

curl -i http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

يجب أن ترى استجابة HTTP 200 وردًّا يذكر local-notes. إذا فشل هذا محليًا فلن يصلحه أي نفق.

دفتر مفتوح عليه رسم بالقلم الرصاص لمربعين متصلين بخط، بجانب حاسوب محمول مغلق

افتح النفق

ngrok في أمرين

ثبّت ngrok بالأمر brew install ngrok على macOS، أو استخدم المثبّت من موقع ngrok على Windows أو Linux. ثم أضف الرمز من لوحة التحكم وشغّل النفق:

ngrok config add-authtoken YOUR_TOKEN
ngrok http 3000

تطبع الطرفية سطر إعادة توجيه مثل https://abc123.ngrok-free.app -> http://localhost:3000. أضف /mcp فيكون لديك عنوان الموصل. يوفّر ngrok أيضًا مفتشًا محليًا على http://127.0.0.1:4040 يسرد كل طلب واستجابة، وهو أسرع طريقة لترى ما أرسله ChatGPT فعلًا.

افتراضيًا يتغير العنوان كلما أُعيد تشغيل النفق. احجز نطاقًا ثابتًا مجانيًا من لوحة ngrok، ثم شغّل ngrok http --url=your-name.ngrok-free.app 3000 (الإصدارات الأقدم من العميل تستخدم --domain)، فيبقى عنوان الموصل ثابتًا بعد إعادة التشغيل ولا تعود إلى تعديله كل صباح.

يدا مطوّر تكتبان على حاسوب محمول في مكتب منزلي خافت الإضاءة، ونافذة الطرفية خارج التركيز

نفق Cloudflare السريع

إذا كنت تفضّل Cloudflare، فثبّت cloudflared وشغّل أمرًا واحدًا:

cloudflared tunnel --url http://localhost:3000

يطبع عنوانًا مثل https://random-words.trycloudflare.com. لا تحتاج الأنفاق السريعة إلى حساب، وهذه ما يجعلها جذابة وما يحدّ منها في الوقت نفسه: يكون اسم المضيف جديدًا في كل تشغيل، فتعيد لصقه في ChatGPT كل مرة. ويفيد المطوّرون أيضًا بأن الأنفاق السريعة قد تواجه صعوبة مع Server-Sent Events، ما يجعل Streamable HTTP الاقتران الأكثر أمانًا. للحصول على عنوان دائم، أنشئ نفقًا مسمّى مرتبطًا بنطاق تملكه.

اختيار النفق المناسب

الخيارجهد الإعدادثبات العنوانالأنسب في
حساب ngrok المجانيحساب ورمزعشوائي ما لم تحجز نطاقًا ثابتًااختبار أول سريع
نفق Cloudflare السريعأمر واحد، دون تسجيل دخولجديد في كل تشغيلعروض مؤقتة
نفق Cloudflare المسمّىنطاق وتسجيل دخولثابتالعمل اليومي
Tailscale Funnelتثبيت Tailscaleاسم مضيف ثابت ضمن tailnet الخاص بكالإعدادات المستخدمة أصلًا مع Tailscale

للاختبار الأول، استخدم ngrok أو نفقًا سريعًا. للاستخدام اليومي، يهم ثبات العنوان أكثر من أي ميزة في ذلك الجدول.

كابلات إيثرنت زرقاء موصولة بلوحة توصيل سوداء داخل خزانة صغيرة

أضف الموصل في ChatGPT

فعّل وضع المطوّر

  1. افتح ChatGPT في المتصفح وانتقل إلى الإعدادات.
  2. اعثر على مفتاح وضع المطوّر وفعّله.
  3. اقرأ التحذير. يستطيع الموصل قراءة بياناتك، وإن سمحت بذلك فيمكنه تغيير أشياء، لذا اتصل فقط بالخوادم التي تثق بها.

أنشئ التطبيق

  1. بجوار المفتاح، انقر إنشاء تطبيق. تحمل الإصدارات الأقدم هذا الزر تسمية إنشاء ضمن الموصلات.
  2. أدخل اسمًا مثل "Local Notes".
  3. اكتب وصفًا قصيرًا يوضّح متى ينبغي للنموذج أن يستخدمه.
  4. الصق عنوانك العام في حقل عنوان خادم MCP، مع المسار: https://abc123.ngrok-free.app/mcp. الخطأ الأكثر شيوعًا هو إدخال اسم المضيف وحده دون /mcp.
  5. اضبط المصادقة على بلا مصادقة لاختبار مؤقت، أو على OAuth إذا كان خادمك يطبّقها.
  6. ضع علامة في المربع الذي يؤكد ثقتك بالتطبيق، ثم انقر إنشاء.

يتصل ChatGPT الآن بعنوانك، ويُجري مصافحة MCP، ويسرد الأدوات التي يجدها. رؤية add_numbers على تلك الشاشة تعني أن السلسلة كاملة تعمل: ChatGPT والنفق وخادمك.

شخص يعمل على حاسوب محمول على طاولة قرب نافذة مقهى، بجانبه قهوة فلات وايت وكرواسون

شغّل أول استدعاء لأداة

ابدأ محادثة جديدة، وافتح قائمة +، واختر المزيد، ثم اختر وضع المطوّر، وفعّل تطبيقك. بعد ذلك اطلب شيئًا يحتاجه: "استخدم Local Notes لإضافة 19 و 23."

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

  • المحادثة: الإجابة 42، مع استدعاء الأداة القابل للتوسيع فوقها.
  • طرفية خادمك: الطلب الوارد.
  • مفتش ngrok: JSON الخام الذي أرسله ChatGPT وأعاده خادمك.

حين تتطابق الأماكن الثلاثة، يكون لديك نفق ChatGPT MCP يعمل، وقالب لكل أداة تضيفها لاحقًا.

زميلان يبتسمان أمام حاسوب محمول في مكتب علوي بتصميم مفتوح

أصلح الأخطاء التي ستواجهها

أخطاء الاتصال ومسار /mcp

عندما يرفض ChatGPT حفظ التطبيق أو يبلغ بأنه تعذّر الوصول إلى الخادم، راجع هذه القائمة قبل تغيير أي شيء في الشيفرة:

  • هل الخادم يعمل؟ افتح الطرفية التي بدأ فيها وتأكد أنه ما زال حيًا.
  • هل يشير النفق إلى المنفذ نفسه؟ ngrok http 3000 لا يعمل إلا إذا كان خادمك يستمع على المنفذ 3000.
  • هل المسار مطابق؟ يجب أن ينتهي العنوان في ChatGPT بالمسار نفسه الذي يسجّله كودك.
  • هل أُعيد تشغيل النفق؟ اسم مضيف عشوائي جديد يعني أن عنوان الموصل القديم لم يعد يعمل.
  • هل العنوان HTTPS؟ لن يقبل ChatGPT عنوان HTTP العادي.

ثم كرّر اختبار المصافحة المحلي على العنوان العام. إذا فشل هناك لكنه نجح على localhost، فالعطل يقع بين النفق وخادمك، وليس داخل ChatGPT أبدًا:

curl -i https://abc123.ngrok-free.app/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

مطوّر متعب يفرك جسر أنفه على مكتب تضيئه مصباح واحد ليلًا

الأدوات القديمة وترويسات Host

هناك مشكلتان تبدوان كأخطاء برمجية وليستا كذلك.

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

فحوص ترويسة Host. تتحقق بعض الأطر، وبعض مساعدات SDK لبروتوكول MCP، من ترويسة Host لصد هجمات DNS rebinding. يصل الطلب عبر النفق ويحمل اسم مضيف النفق بدلًا من localhost، لذا قد يرد خادمك بالرمز 403 أو 421. أضف اسم مضيف النفق إلى المضيفين المسموح بهم. تتغير أسماء مضيفي الأنفاق السريعة مع كل تشغيل، لذا اسمح بلاحقة مثل .trycloudflare.com بدلًا من تعطيل الفحص.

الأعراضالسبب المرجّحالحل
خطأ أثناء حفظ التطبيقمسار خاطئ أو الخادم متوقفشغّل فحص curl للمصافحة على العنوان العام
كان يعمل أمس وتوقف اليومتغيّر اسم مضيف النفقحدّث الموصل أو احجز نطاقًا ثابتًا
403 أو 421 من خادمكالتحقق من ترويسة Hostاسمح باسم مضيف النفق
أداة جديدة غير ظاهرة في المحادثةقائمة أدوات مخزّنة مؤقتًاحدّث الموصل أو أعد إنشاءه
انتهت مهلة استدعاء الأداةأداة بطيئة خلف النفقأعد الرد مبكرًا وأبقِ الاستدعاءات بضع ثوانٍ

أحكم القفل

عامل العنوان كأنه عام

أي شخص يحصل على عنوان نفقك يستطيع استدعاء خادمك ما لم يوقفه شيء ما. الاسم المضيف العشوائي مجرّد غموض لا حماية، وهو يظهر في السجلات ولقطات الشاشة وسجل المتصفح. استخدم OAuth على الخادم، أو ضع طبقة وصول أمام النفق: كل من Cloudflare Access وسياسات حركة ngrok موجودة لهذا الغرض تحديدًا. اربط خادمك بالعنوان 127.0.0.1 كما يفعل الكود النموذجي، بحيث يستطيع عميل النفق على جهازك وحده الوصول إليه مباشرة.

قفل نحاسي ثقيل على مزلاج بوابة خشبية متآكلة

قيّد ما تستطيع الأدوات كتابته

الأداة وعد بما يجوز للنموذج أن يفعله على جهازك. اجعلها صغيرة:

  • ابدأ بأدوات للقراءة فقط، وأضف أدوات الكتابة واحدة تلو الأخرى.
  • لا تكشف أبدًا أمر shell عامًا، ولا حذف ملفات غير مقيّد.
  • قيّد أدوات الملفات بمجلد مشروع واحد.
  • سجّل كل استدعاء مع معاملاته، حتى تستطيع معرفة ما حدث لاحقًا.
  • عامل مخرجات الأداة كنص غير موثوق. قد تحتوي صفحة ويب أو مستند تعيده أداتك على تعليمات موجهة إلى النموذج، وهو خطر معروف باسم حقن الأمر النصي (prompt injection).
  • أوقف النفق بالأمر Ctrl+C حين تنتهي. العنوان العام الخامل ليس فيه إلا الضرر.

متى يكون الخادم المستضاف هو الأفضل

النفق هو الأداة المناسبة للبناء والتصحيح. أما للاستخدام اليومي، فيزيل الخادم المستضاف فئة كاملة من المشكلات، لأنه يعيش أصلًا على عنوان عام: لا حاسوب محمول يجب إبقاؤه مستيقظًا، ولا اسم مضيف لإعادة لصقه، ولا منفذ يُنسى.

يعمل PicassoIA بهذه الطريقة في جانب API. تعمل واجهة API الخاصة بالمطورين على https://api.picassoia.com/v1 مع نقاط نهاية بأسلوب Replicate: تنشئ تنبؤًا، ثم تستعلم عن حالته، ثم تجلب النتيجة. تُدار اتصالات MCP من حسابك على picassoia.com/en/mcp/accounts بعد تسجيل الدخول، ويمكن للحساب تشغيل ما يصل إلى 5 تنبؤات في الوقت نفسه، مشتركةً بين توكنات واتصالات MCP. راجع صفحة PicassoIA API للاطلاع على قواعد الوصول الحالية قبل أن تبني عليها.

كيف تستخدم GPT 5.4 على PicassoIA

يتطلب تصحيح خادم MCP الكثير من الكتابة: أوصاف الأدوات، ومخططات JSON، وشروح الأخطاء. يُعد GPT 5.4 شريكًا جيدًا لتلك المهمة. إليك سير عمل يناسب هذا المقال:

  1. افتح صفحة نموذج GPT 5.4 على PicassoIA.
  2. الصق اسم أداة واحدة ومخطط إدخالها وهدفًا من سطر واحد. واطلب ثلاثة إصدارات من الوصف تبدأ بعبارة "Use this when".
  3. اطلب من النموذج سرد موقفين ينبغي فيهما ألا يستدعي ChatGPT تلك الأداة، ثم أضف هذين السطرين إلى الوصف.
  4. الصق الخطأ الدقيق من طرفيتك أو من مفتش ngrok، واطلب الأسباب الثلاثة الأرجح مرتبةً.
  5. انسخ أفضل وصف إلى خادمك، وأعد تشغيله، ثم حدّث الموصل في ChatGPT.

نصائح المعاملات: الصق مخططات حقيقية بدلًا من وصفها، وغيّر شيئًا واحدًا في كل أمر، واجعل كل طلب مقتصرًا على أداة واحدة. وللحصول على رأي ثانٍ في الشيفرة المعقدة، شغّل الأمر نفسه عبر Claude Sonnet 5 أو GPT 5.6 Sol وقارن الإجابات.

💡 نصيحة: حين يختلف نموذجان حول سبب فشل طلب ما، صدّق الذي يشير إلى سطر يمكنك التحقق منه في مفتش ngrok.

أنشئ صورك بعد ذلك

بعد أن يعمل خادمك، ستحتاج إلى توثيقه أو عرضه أو وضعه في README، ويحتاج المنشور إلى مرئيات. كل صورة في هذا المقال مولّدة، لم تُلتقط بكاميرا: يسمّي كل أمر نصي موضوعًا وبيئة واتجاه الضوء وعدسة ونوع الفيلم الفوتوغرافي. هذه الوصفة تصلح لأي موضوع تطرحه.

  • سمِّ الضوء: "ضوء شمسي ذهبي منخفض من الجهة اليسرى" أفضل من "إضاءة جميلة".
  • اختر العدسة: "85mm عند f/1.8" يعطي إحساس البورتريه، و"24mm عند f/8" يعطي مشهدًا واسعًا وحادًّا.
  • صف الملمس: الصوف والألومنيوم المصقول والطوب المبلل تجعل الصورة تبدو واقعية.

افتح PicassoIA، واختر نموذج صور، وجرّب أمرًا نصيًا لمشروعك الخاص. إذا لم تكفِ الصورة الثابتة، فيمكن لنموذج تحويل النص إلى فيديو أن يحوّل الفكرة نفسها إلى حركة. ابدأ بمشهد واحد من إعدادك أنت، وانظر إلى مدى اقتراب النتيجة الأولى مما أردت.

مبدع يعمل على مكتب استوديو مشرق، بجانبه صور مطبوعة لمناظر طبيعية وكاميرا

شارك هذا المقال

اختر لغتك

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