خادم MCP للتعرّف على جوازات السفر لوكلاء الذكاء الاصطناعي

امنح مساعدًا القدرة على قراءة جواز سفر أو بطاقة هوية أو وثيقة سفر – والحصول على حقول منظّمة، لا كتلة نص. يتحدث الخادم Model Context Protocol بطريقتين: عبر stdio، مثبّتًا من npm ويشغّله عميلك بوصفه أمرًا، أو عبر Streamable HTTP، مستضافًا على mcp.doc.cheap. وفي الحالتين هو عميل خفيف لواجهة HTTP API العامة: لا يحتفظ بأي بيانات خاصة به.

npx -y @doc-cheap/mcp

منشور باسم @doc-cheap/mcp على npm وباسم cheap.doc/mcp في سجل MCP الرسمي؛ والشيفرة المصدرية في المرآة العامة على GitLab.

مُدرَج في سجل MCP الرسمي، Smithery، cursor.directory، npm.

ما الذي يحصل عليه وكيلك

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

  • حامل المستند – الأسماء الأولى، واسم العائلة، وتاريخ الميلاد، والجنس، والجنسية.
  • المستند – النوع، والبلد، والدولة المُصدِرة، والرقم، والسلسلة، وتاريخ الإصدار، وتاريخ انتهاء الصلاحية، وهل انتهت صلاحيته، وعدد الأيام المتبقية.
  • كل حقل عُثر عليه، ولكلٍّ درجة ثقته، مقروءًا من منطقة القراءة الآلية (MRZ) ومن المنطقة المرئية المطبوعة كلٌّ على حدة – ليرى النموذج أن القراءتين متطابقتان بدلًا من افتراض ذلك.
  • منطقة القراءة الآلية مع حكم: ناجحة، أو فاشلة، أو غائبة، مع السبب، والأسطر نفسها.
  • ملخص من سطر واحد يستطيع المساعد أن يعرضه عليك أثناء عمله.

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

ثبّته في عميلك

Claude Desktop

claude_desktop_config.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Claude Code

أمر واحد، من دليل المشروع

claude mcp add-json doc-cheap '{"command":"npx","args":["-y","@doc-cheap/mcp"],"env":{"DOC_CHEAP_API_KEY":"sk_live_your_key"}}'

Cursor

~/.cursor/mcp.json، أو .cursor/mcp.json داخل مشروع

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

VS Code

.vscode/mcp.json – لاحظ أن الكتلة تُدرج تحت servers لا تحت mcpServers

{
  "servers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "type": "stdio",
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Gemini CLI

~/.gemini/settings.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Kiro

.kiro/settings/mcp.json في مساحة العمل، أو ~/.kiro/settings/mcp.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "disabled": false,
      "autoApprove": [
        "check_balance",
        "search_docs"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Kiro، بنقرة واحدة

رابط التثبيت الخاص بالعميل نفسه. يطلب التأكيد ويعرض الأمر وقائمة الوسائط قبل أن يكتب أي شيء.

أضِف إلى Kiro

  • أعد تشغيل العميل بعد إضافة الكتلة. العميل هو من يشغّل الخادم، لذا لا يلتقط الإعدادات أو البيئة بعد تغييرها إلا عند بدء تشغيل جديد.
  • دون DOC_CHEAP_API_KEY يعود الخادم إلى مفتاح sandbox العام: تُنفَّذ عمليات المسح حينها ضمن حصته المجانية ولا يوجد رصيد يُبلَّغ عنه. هذه أسرع طريقة لرؤيته يعمل.
  • إعدادات اختيارية: DOC_CHEAP_DOCS_BASE (الوجهة التي تشير إليها روابط نتائج البحث)، و DOC_CHEAP_DOCS_DIR (أي نسخة من التوثيق يُبحث فيها)، و DOC_CHEAP_IMAGE_ROOT (انظر الحمايات أدناه).

أو اتصل بالخادم المستضاف

الأدوات الثلاث نفسها مستضافة على https://mcp.doc.cheap/mcp عبر Streamable HTTP، فلا يحتاج العميل الذي يتصل بعنوان URL إلى تثبيت أي شيء. لا تسجيل دخول: أرسل مفتاحك في X-Doc-Cheap-Api-Key أو في Authorization: Bearer – وتكون الأولوية للترويسة المسمّاة إذا أُرسلت الاثنتان – أو لا ترسل شيئًا فيُستخدم مفتاح sandbox العام. لا يستطيع الخادم المستضاف قراءة الملفات على جهازك، لذا يستقبل الصورة بترميز base64 أو كعنوان URL من نوع https.

https://mcp.doc.cheap/mcp

Claude Code

أمر واحد

claude mcp add --transport http doc-cheap https://mcp.doc.cheap/mcp --header "Authorization: Bearer sk_live_your_key"

Cursor

~/.cursor/mcp.json

{
  "mcpServers": {
    "doc-cheap": {
      "url": "https://mcp.doc.cheap/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_your_key"
      }
    }
  }
}

VS Code

.vscode/mcp.json

{
  "servers": {
    "doc-cheap": {
      "type": "http",
      "url": "https://mcp.doc.cheap/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_your_key"
      }
    }
  }
}

في Claude Desktop و claude.ai، أضِفه من Settings ثم Connectors بوصفه موصّلًا مخصصًا بعنوان URL https://mcp.doc.cheap/mcp؛ ومن دون مفتاح يعمل بمفتاح sandbox.

الأدوات الثلاث

الأدوات الثلاث التي ينشرها خادم MCP
الأداةما تفعلهما تعيدهالسلوك الذي تعلنه
scan_document Recognise a passport or ID documentتتعرّف على صورة مستندالنتيجة المنظّمة كاملة، إضافةً إلى الملخص المكوّن من سطر واحدليست للقراءة فقط – قد تستهلك وحدة رصيد. ليست مدمِّرة. متساوية القوى (idempotent) عندما ترسل مفتاح idempotency، وعندها فقط. عالم مفتوح (open-world): الإجابة تأتي من خدمة بعيدة.
check_balance Check remaining creditsتقرأ استخدام الحسابالرصيد وعدّادات الفترة الحاليةللقراءة فقط، وعالم مفتوح: الأرقام هي وضع الحساب الحي.
search_docs Search the doc.cheap API documentationتبحث في التوثيقالأقسام المطابقة مع العناوين والروابط والمقتطفات – دون اتصالللقراءة فقط، وعالم مغلق (closed-world): مصدر البحث هو نسخة التوثيق المرفقة مع الخادم، لذا يعطي الاستعلام نفسه الإجابة نفسها دون أي شبكة.
  • تستقبل scan_document الصورة بوصفها image_base64 أو image_path أو image_url، والخيارات نفسها التي يستقبلها الاستدعاء المباشر، ومنها expect_country و return_portrait و reference و idempotency_key.
  • تقرأ search_docs نسخة من التوثيق مرفقة مع الخادم، فتجيب دون أي شبكة – ما يعني أن الوكيل يستطيع البحث عن مفردات الحقول أو عن رمز خطأ دون أن يستهلك استدعاءً.
  • تحتاج check_balance إلى مفتاح وراءه حساب. ومع مفتاح sandbox العام تقول بوضوح إنه لا يوجد رصيد، بدلًا من الإجابة بأصفار تبدو كأنها قراءة فعلية.
  • كل أداة تعلن مخطط مُخرجات وتعيد محتوى منظّمًا يطابقه، فيستطيع الوكيل استخدام الحقول دون تحليل النص.
  • كل صفحة من التوثيق هي أيضًا مورد يستطيع الوكيل قراءته، وأربعة قوالب أوامر (prompts) – قراءة مستند إلى JSON، والتحقق من تاريخ انتهاء الصلاحية، ومسح دفعة، وشرح رمز خطأ – تبدأ المهام الشائعة بخطوة واحدة.

التكلفة

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

قبل أن يكون لديك حساب: يُجري مفتاح sandbox العام التعرّف مجانًا على 10 مستندات لكل عنوان IP إجمالًا، بحد أقصى 10 طلبات في الساعة أيًّا كانت إجابتها، ويضيف التسجيل 20 وحدة رصيد. وحدة الرصيد الواحدة تساوي سنتًا واحدًا، والسنت الواحد يساوي مستندًا واحدًا.

يبلغ الوسيط لزمن التعرّف نحو 275 ms في بيئة الإنتاج، وكل نتيجة تحمل توقيتاتها الخاصة، لذا تستطيع حلقة الوكيل أن تبني ميزانيتها على رقم حقيقي.

ما الذي يُبلغ عنه الخادم

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

حمايتان يجدر بك معرفتهما

يعمل الخادم على جهازك بصلاحياتك، ويختار وسائطَه نموذجٌ. لذلك وُضعت حدود على اثنين منها:

الملفات المحلية معطّلة حتى تفتح دليلًا واحدًا

ترفض image_path فعل أي شيء حتى يحدد DOC_CHEAP_IMAGE_ROOT دليلًا، وتطلب من المساعد إرسال image_base64 بدلًا منها. ومع ضبط المتغير، يُحَلّ كلٌّ من الدليل والملف المطلوب عبر الروابط الرمزية قبل فحص الاحتواء؛ ويُرفض كلٌّ من المقطع .. والرابط الذي يشير إلى الخارج، ويُؤخذ المسار النسبي من ذلك الدليل لا من أي مكان صادف أن بدأ منه العميل العملية. والمسار الواقع خارج الجذر والمسار غير الموجود يعطيان الرسالة نفسها – فرسالة مختلفة لكلٍّ منهما ستجيب عن سؤال «هل هذا الملف موجود؟» لأي مسار على جهازك.

يجب أن تكون الصور البعيدة عبر https وعلى عناوين عامة

يجلب الخادمُ image_url، لذا يجب أن يكون المخطط https: وأن يُحَلّ المضيف إلى عناوين إنترنت عامة فقط: تُرفض نطاقات loopback، والخاصة، و link-local، و NAT على مستوى المشغّل (CGNAT)، والبث المتعدد، والمحجوزة، بما في ذلك صيغها المعيّنة في IPv6. إجابة واحدة غير عامة ترفض عنوان URL بالكامل. تُتبَع عمليات إعادة التوجيه يدويًا، بثلاث قفزات كحد أقصى، ويُعاد فحص كل قفزة. ويُحدّ جسم الاستجابة بـ 25 MB، يُحسب أثناء وصوله لا اعتمادًا على ترويسة.

لا تخضع image_base64 لأيٍّ من هذه القيود، لأن المستدعي يملك البايتات أصلًا – ولهذا يشير كل رفض أعلاه إليها.

اقرأ الدليل