استدعِ أدوات MyTools مباشرة عبر WebMCP

WebMCP معيار وِب ناشئ يتيح للصفحة أن تسلّم الوكيل الذكي قائمة دوال قابلة للاستدعاء بدل شاشة عليه أن يفسّرها. تسجّل الصفحة أدواتها على document.modelContext — لكل أداة اسم ووصف ومخطط JSON — فيستطيع الوكيل العامل داخل ذلك المتصفح أن يسردها ويستدعيها.

يسجّل MyTools ثلاث أدوات على مستوى الموقع في كل صفحة، وثلاثًا أخرى في كل صفحة من صفحات أدواته الـ55: اقرأ الحالة، ونفّذ العملية، واحفظ النتيجة. ويبقى العمل جاريًا داخل المتصفح على جهاز المستخدم نفسه. فـWebMCP يغيّر مَن يضغط الزر، لا وجهة الملف.

أين يعمل هذا، وإلى أي حدٍّ استقرّ

متصفح ChatGPT يستدعي هذه الأدوات اليوم. أضافت OpenAI دعم WebMCP إلى المتصفح المدمج في تطبيق ChatGPT لسطح المكتب، فصارت الأدوات أدناه قابلة للاستدعاء فيه بلا راية ولا رمز تجربة ولا أي إعداد من جهتك. وقد قاد وكلاء حقيقيون MyTools بهذه الطريقة خارج بيئة الاختبار: فقد أبلغ أحدهم، وكان وكيله يستعمل هذه الأدوات فعلاً، عن عُطل خاص بذلك المتصفح، وأُصلح في أغسطس 2026.

أما في Chrome فهي تجربة أصل. تمتدّ التجربة من Chrome 149 إلى Chrome 156، أي إلى نهاية 2026 تقريبًا. ويحمل MyTools رمزًا لأصله الإنتاجي، فتكون الأدوات حاضرة في أي Chrome يدعمها دون الحاجة إلى تفعيل أي راية. وإن انتهت التجربة دون أن تُعتمد الواجهة نهائيًا، اختفى document.modelContext من Chrome وذهبت هذه الأدوات معه — ولهذا تبقى نقطة الدخول بالرابط أدناه قائمة على كل حال.

المواصفة مسوّدةٌ لا معيارٌ معتمد. WebMCP تقرير مجموعة مجتمع بصيغة مسوّدة صادر عن W3C Web Machine Learning Community Group، يحرّره مهندسون من Google وMicrosoft، وهو صراحةً خارج مسار المعايير في W3C. وقد تغيّر شكل الواجهة مرة من قبل: إذ كانت الأدوات تُسجَّل على navigator.modelContext قبل أن تنتقل الواجهة إلى document.modelContext. فإن كنت تعتمد على مراجع أقدم، فتحقّق من هذا أولاً.

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

وهناك بديل يعمل في كل مكان. حيث لا يتوفر WebMCP، قُد الموقع عبر نقطة الدخول بالرابط بدلاً منه: تُفتح 50 أداة من أصل 55 والملف محمَّل مسبقًا من رابط تبنيه بنفسك. تغطي الآليتان العمليات نفسها؛ والفرق في سهولة الاستعمال وحدها.

عند الاختبار محليًا في Chrome بلا رمز التجربة، فعّل ‎chrome://flags/#enable-webmcp-testing‎.

قراءات إضافية مسوّدة المواصفة · توثيق WebMCP في Chrome

ثلاث أدوات في كل صفحة

هذه مسجَّلة على مستوى الموقع كله، حتى في الصفحات التي ليست أدوات أصلاً — الصفحة الرئيسية، أو مقال، أو هذه الصفحة. وبها يهتدي الوكيل إلى الأداة المناسبة.

find_mytools_tools ابحث في الفهرس. تقبل query وcategory وinputType وlimit، وكلها اختيارية، وتعيد الأدوات المطابقة مع slug كل أداة ومسار صفحتها وما إذا كانت تقبل رابط ملف. للقراءة فقط. والمخرجات محدودة الحجم، لذا ضيّق البحث بدل طلب كل شيء.

open_mytools_tool انتقل إلى أداة جاهزة للاستعمال. تتطلب slug كما يعيده find_mytools_tools، وتقبل اختياريًا urls لتحميل ملفات بعيدة مباشرة، وcarryResult الذي يمرّر الملفات التي أنتجتها الأداة الحالية للتوّ إلى الأداة التي تُفتح، فلا تصل إلى شاشة رفع فارغة.

suggest_mytools_pipeline أعطِها slug أداة وأسماء الملفات التي أنتجتها، فتسرد لك الأدوات التي يمكن أن تنتقل إليها تلك الملفات بعد ذلك. ولا تعود إلا الوجهات المتوافقة: فلا تُعرض دفعة ملفات على أداة تقبل ملفًا واحدًا، ولا تُعرض على أداة صيغة لا تستطيع فتحها.

وثلاث أخرى في كل صفحة أداة

تحمل الأدوات الـ55 كلها الثلاثيّ نفسه، وتُشتق أسماؤها من slug الأداة بتحويل الشرطات إلى شرطات سفلية. ففي ‎/pdf/rotate-pdf‎ تكون get_rotate_pdf_state وrun_rotate_pdf وdownload_rotate_pdf.

get_<tool>_state ما المحمَّل حاليًا، وإلامَ ضُبطت الإعدادات، وتلميح يسمّي الاستدعاء التالي الذي ينبغي إجراؤه. اقرأها قبل تنفيذ أي شيء: فمنها تأتي أعداد الصفحات والمدد وأبعاد البكسل، وهي ما يجعل للمعاملات معنى.

run_<tool> نفّذ العمل. تختلف المعاملات من أداة إلى أخرى ويصفها مخطط كل أداة؛ وأي معامل تتركه يبقى على ما هو مضبوط في الشاشة. ولا يعود الاستدعاء قبل انتهاء العملية، فلا شيء تستطلعه دوريًا — وفي ترميز فيديو طويل يستغرق ببساطة ما يستغرقه الترميز.

download_<tool> احفظ النتيجة على جهاز المستخدم. لا تُسجَّل هذه الأداة إلا بعد وجود نتيجة، فظهورها في قائمة الأدوات هو إشارة اكتمال العمل. أما الأدوات التي تنتج عدة ملفات فتقبل index لحفظ ملف بعينه، أو zip لحفظها كلها في أرشيف واحد.

ثلاث أدوات تنتهي إلى رابط منشور لا إلى ملف — أداتا النشر على Facebook وأداة الرفع إلى YouTube — فلا تسجّل أي أداة download. كما أنها ترفض العمل ما لم يكن هناك مستخدم مسجَّل الدخول: إذ يفتح تسجيل الدخول نافذة منبثقة لا يفتحها إلا نقر حقيقي.

مثال كامل خطوة بخطوة

تدوير ملف PDF موجود على رابط، من أوله إلى آخره. وكل استجابة أدناه هي المخرجات الحقيقية لهذه الأدوات، لا محاكاة لها.

1. ابحث عن الأداة.

find_mytools_tools({ query: "rotate pdf", inputType: "application/pdf", limit: 3 })

→ { "total": 55, "matched": 1, "tools": [
      { "slug": "rotate-pdf", "title": "Rotate PDF",
        "description": "Rotate PDF pages in one click",
        "multiple": true, "byUrl": true } ] }

2. افتحها والملف محمَّل مسبقًا. تتغيّر أدوات الصفحة بتغيّر الصفحة، فأعد قراءة قائمة الأدوات بعدها.

open_mytools_tool({ slug: "rotate-pdf",
                    urls: ["https://example.com/rental-application.pdf"] })

→ "Opened Rotate PDF with 1 file(s) loading from URL. Everything is processed
   locally in the browser. The page-specific tools available to you have changed."

3. اقرأ الحالة. يأتي عدد الصفحات من ملف الـ PDF نفسه، وهذا ما يجعل لإرسال نطاق صفحات معنى.

get_rotate_pdf_state({})

→ { "phase": "configure",
    "pdfs": [ { "name": "rental-application.pdf", "pages": 2, "rotations": [0, 0] } ],
    "saving": false, "result": null,
    "hint": "Call run_rotate_pdf with a rotation, optionally narrowed with pages,
             to turn the loaded PDFs." }

4. نفّذها. يعود الاستدعاء عند اكتمال التدوير، وتصبح download_rotate_pdf موجودة.

run_rotate_pdf({ rotation: 90 })

→ "Rotated 1 PDF(s) by 90°. Call download_rotate_pdf to save it."

5. احفظها. يذهب الملف إلى جهاز المستخدم؛ ولا تستلم أنت بياناته أبدًا.

download_rotate_pdf({})

→ "Saving rental-application-rotated.pdf to the user's device."

إعادة القرار إلى المستخدم

ليس كل معامل ينبغي أن تختاره أنت. فأيّ جزء من الصورة يُبقى، وأيّ صفحات المستند الممسوح تهمّ، وكم يكفي أن يعلو الصوت — كل هذا يحتاج إلى عين تنظر إلى الملف. وهذه الواجهة مبنيّة لتتوقّف عندها، فتدع المستخدم يقرّر ثم تكمل. إذ تُبلغك get_<tool>_state بما هو معروض على الشاشة في اللحظة نفسها، بما في ذلك تغييرٌ أجراه المستخدم للتوّ بالفأرة، وكل معامل تتركه من run_<tool> يحتفظ بقيمته المعروضة على الشاشة. واتركها كلها فيجري التنفيذ بما ضبطه المستخدم تمامًا.

أداة قص الصور، وفي منتصف المسار سحبٌ حقيقي بالفأرة:

get_crop_image_state({})

→ … "source": { "width": 6240, "height": 4160 },
    "selection": { "x": 1459, "y": 420, "width": 3330, "height": 3328 }

    ← the user drags the box over what they want to keep

get_crop_image_state({})

→ … "selection": { "x": 2910, "y": 831, "width": 3330, "height": 3329 }

run_crop_image({})

→ "Cropped to 3330×3329 pixels out of 6240×4160 (5507 KB, image/jpeg).
   Call download_crop_image to save it."

قُل ما تحتاجه في الرسالة نفسها التي تفتح فيها الأداة — «اسحب الإطار على الجزء الذي تريد الاحتفاظ به، ثم قل لي هيّا» — ثم أعد قراءة الحالة حين يجيبك. ولا شيء في الصفحة مقفل وأنت تنتظر؛ فالمستخدم يعمل في علامة تبويب متصفح عادية.

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

أربعة أمور تحكم سلوك هذه الأدوات

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

لا تعبر أي بيانات ثنائية هذا الحدّ. لا تستطيع تمرير ملف إلى أداة، ولا تستلم منها ملفًا أبدًا. تدخل الملفات عبر رابط يجلبه المتصفح، وتخرج عبر download_<tool> التي تُطلق تنزيلاً عاديًا في المتصفح إلى جهاز المستخدم. وكل ما تتبادله مع هذه الأدوات نصّ.

يمكن إلغاء الاستدعاءات. يحصل كل تنفيذ على AbortSignal خاص به. وإلغاء التشغيل يوقف العمل فعليًا بدل أن يتركه معلّقًا — فترميز الفيديو يُنهى ولا يُترك يعمل في عامل خلفي — ويعود الاستدعاء بوصفه إلغاءً لا فشلاً.

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

أسئلة تستحق إجابة

أي أدوات MyTools يستطيع الوكيل استدعاءها مباشرة؟

faq.coverage.answer

هل يعمل هذا في Chrome وحده؟

لا. فالمتصفح المدمج في تطبيق ChatGPT لسطح المكتب يدعم WebMCP، ويتيحه Chrome للمشاركين في تجربة الأصل، ومنهم MyTools، حتى الإصدار 156. والمواصفة مسوّدة مجموعة مجتمع في W3C يستطيع أي متصفح ذي قدرات وكيلة أن ينفّذها، فتعامل مع توفّرها على أنه أمر يُختبر وقت التشغيل لا قائمة ثابتة.

هل يلزم مفتاح API أو حساب؟

لا. لا تسجيل ولا دخول ولا مفتاح ولا حصة. وإن كان المتصفح يوفّر WebMCP فالأدوات حاضرة من الزيارة الأولى.

هل يؤدي استدعاء run_<tool> إلى رفع الملف إلى خادم؟

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

ماذا يحدث إذا كان المتصفح لا يدعم WebMCP؟

لا ينكسر شيء. يغيب document.modelContext ببساطة ولا تُسجَّل أي أدوات؛ وتعمل الصفحات كصفحات عادية. عندها ارجع إلى نقطة الدخول بالرابط، فهي لا تحتاج إلى أي دعم من المتصفح.

هل يمكن ربط عدة أدوات في سلسلة بلا تنزيل في المنتصف؟

نعم. استدعِ suggest_mytools_pipeline مع slug الأداة وأسماء الملفات التي أُنتجت للتوّ لترى ما يقبلها، ثم استدعِ open_mytools_tool مع carryResult، فتُفتح الأداة التالية وتلك الملفات محمَّلة فيها.

هل يستطيع الوكيل والمستخدم أن يعملا على الأداة نفسها في الوقت نفسه؟

faq.together.answer

العودة إلى MyTools للوكلاء الأذكياء