mcpField
Q
Quran Reels MCP

Quran Reels MCP

远程服务
quran-reels-tau.vercel.app其他11 天前更新

关于 Quran Reels MCP

Quran Reels 是在浏览器中制作《古兰经》竖屏视频的工具,面向制作经文短视频的用户。它支持实时预览、多种诵读者和翻译,并可在本地导出视频。

主要功能

  1. 01浏览 114 个章节并选择经文
  2. 0247 位诵读者和 8 种翻译语言
  3. 03设计时实时预览
  4. 04自定义背景、卡片样式和字幕
  5. 05导出 MP4 或 WebM 视频

适用场景

  1. 01制作带诵读音频的经文短视频
  2. 02为经文添加翻译和自定义视觉样式
  3. 03预览并导出竖屏经文视频

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://quran-reels-tau.vercel.app/api/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

قرآن ريلز — Quran Reels ⭐

قرآن ريلز — الواجهة الرئيسية

المستودع: https://github.com/Ansygroup/quran-reels (عام · main) · النشر: Vercel · الدفع المستقبلي: scripts/gh_push.sh

صانع فيديو قرآن مجاني وفوري — نسخة مطوّرة بالكامل من quranreels.tech تعمل داخل المتصفح بدون خوادم معالجة وبدون قوائم انتظار وبدون حدود يومية.

🔗 الفكرة في سطر واحد: اختر الآيات ← شاهد المعاينة الحية ← اضغط «إنشاء» ← حمّل ملف MP4 عمودي 1080×1920 خلال ثوانٍ.

🌐 منشور الآن: https://quran-reels-tau.vercel.app


✨ المزايا (مقارنة بالأصل)

الأصلهذه النسخة
الإنشاءطابور خادم 1–3 دقائق + 10 فيديوهات/يوم + 30 ثانية تبريدفوري داخل المتصفح بلا حدود وبدون تسجيل
المعاينةغير متوفرةمعاينة حية أثناء التصميم (تشغيل/تقديم/تنقل بين الآيات)
الخصوصيةرفع للخادمالصوت والصور لا تغادر جهازك (رفع خلفية محلي)
الأدوات24 أداة32 أداة تعمل دون إنترنت حيث أمكن
التصديرMP4 من الخادمMediaRecorder داخل المتصفح: MP4/WebM حسب دعم المتصفح، مع تقدير الأبعاد 9:16 / 1:1 / 16:9

🎬 الصانع

  • 47 قارئًا (كل ayah mp3 من everyayah عبر /proxy موحّد المصدر — مطلوب لالتقاط الصوت في التصدير)
  • 114 سورة + نطاق آيات يدوي أو «رسائل سريعة» (الصبر، السكينة، الرزق، التوبة… 324 مرجعًا متحققًا)
  • ترجمة داخل الفيديو بـ8 لغات (إنجليزية، فرنسية، تركية، إندونيسية، أردية، إسبانية، إيطالية) + عربي مبسّط
  • 14 خلفية (10 صور مولّدة + 4 تدرّجات) + رفع صورة من جهازك (محلي فقط)
  • أنماط بطاقة (card/glow/banner) × 4 ألوان ذهبي/زمردي/فضي/وردي، عدّ حجم الخط، علامة مائية، إهداء «صدقة جارية» بثلاثة أنماط، إيقاف الحركة، شارة عنوان السورة، شريط تقدّم، ترجمة قابلة للإخفاء
  • معاينة حقيقية: صوت كل آية + رسم Canvas بنفس كود التصدير (لا مفاجآت)
  • تصدير لحظي: canvas.captureStream + MediaRecorder مع شريط تقدّم وإمكانية الإلغاء، ثم تحميل/مشاركة/فيديو فوري

🧰 الأدوات الـ32

مواقيت الصلاة (12 طريقة + تحديد موقع دقيق بتوقيت المنطقة) · القبلة (بوصلة + SVG + خريطة) · التاريخ الهجري/الميلادي · أذكار الصباح والمساء (حصن المسلم كامل — 132 فئة) · المسبحة · أسماء الله الحسنى · آية اليوم · آيات بالموضوع · حلقة التلاوة · خطة الختمة · الختمة الجماعية برابط قابل للمشاركة · مخارج الحروف · إذاعة القرآن (بث مباشر) · الأحاديث (النووية/القدسية مضمّنة + البخاري ومسلم وأبو داود والترمذي والنسائي وابن ماجه والموطأ بتحميل كسول) · تخريج الحديث · مصمّم البطاقات PNG · حاسبة الزكاة · المواريث (شاملة فرع واردث ووصية ووصية مطلقة) · أسماء المولودين (1017 اسمًا) · ألوان E · التقويم الإسلامي · عدّاد المناسبات · عدّاد الإفطار · تنبيهات الأذان (إشعارات + جرس) · أعمال اليوم · متتبع الصيام · قضاء الصلاة · حاسبة الكفارة · تعلم الصلاة · المساجد القريبة (OpenStreetMap) · الدعاء المختار

🏗️ البنية

quran-reels/
├── server.py              # خادم محلي: ثابت + /proxy (قائمة بيضاء) + /api/ip + /api/app-config
├── vercel.json            # إعدادات Vercel: outputDirectory=public + إعادة توجيه /proxy → /api/proxy + كاش
├── .vercelignore          # ما لا يُرفع عند النشر
├── api/                   # دوال Serverless (Node) — مرآة كاملة لـ server.py
│   ├── proxy.js           # نفس عقد /proxy: 400/403/502 + كاش 6 ساعات + ACAO *
│   ├── ip.js              # نفس عقد /api/ip مع نفس البديل الافتراضي (القاهرة)
│   └── app-config.js      # إعدادات عامة (Supabase URL + المفتاح العام) من متغيرات البيئة
└── public/
    ├── index.html         # الصفحة الكاملة (SEO + JSON-LD + FAQ)
    ├── css/style.css      # نظام تصميم RTL (تاجوال/أميري/أميري قرآن)
    ├── js/
    │   ├── data.js        # القراء، الترجمات، الخلفيات، FAMOUS، الأدوات…
    │   ├── core.js        # أدوات + حساب المواقيت (PrayTimes) + القبلة + الهجري + الراوتر
    │   ├── quran.js       # تحميل المصحف + الاختيارات + فهرس البحث
    │   ├── reel.js        # رسم الفيديو (Canvas) + AyahPlayer + ReelRecorder
    │   ├── creator.js     # واجهة الصانع وتدفق التصدير
    │   ├── tools.js       # إطار الأدوات المساعدة
    │   ├── tools-a/b/c.js # الأدوات الـ32
    │   └── app.js         # الإقلاع والصفحة الرئيسية
    ├── data/              # المصحف (2.1MB) + 7 ترجمات + أذكار + أسماء + أحاديث
    ├── fonts/             # Amiri / AmiriQuran / Scheherazade / Tajawal
    └── img/backgrounds/   # 10 خلفيات مولّدة (بلا نصوص)

🚀 التشغيل

cd quran-reels
PORT=8787 python3 server.py
# ثم افتح http://localhost:8787
  • لا توجد تبعيات (Python 3 مكتبة فقط + Node للفحص الاختياري).
  • /proxy?u= يقبل فقط: everyayah.com, api.alquran.cloud, cdn.jsdelivr.net, raw.githubusercontent.com, qurango.net, overpass-api.de, overpass.osm.ch, api.aladhan.com, nominatim.openstreetmap.org.
  • PORT اختياري (افتراضي 8787) ويجب أن يُشغَّل على 0.0.0.0 ليعمل خلف وكيل المعاينة.

🌐 النشر على Vercel + Supabase

Vercel (الحساب متصل — المصادقة محفوظة داخل المشروع في .vcfg ولا تحتاج موافقة جديدة):

# مرة واحدة لكل بيئة عمل جديدة (إن لزم): npm i -g vercel  أو استخدم npx
npx vercel -Q "$PWD/.vcfg" deploy --prod --yes --scope ansygroups-projects
  • الإعدادات في vercel.json: مجلد الخرج = public، و/proxy يُعاد توجيهه إلى api/proxy، وصفحات بدون امتداد تفتح التطبيق، وكاش CDN يوم للملفات الثابتة و6 ساعات للـproxy، ورؤوس nosniff/Referrer-Policy.
  • متغيرات البيئة في المشروع (production + preview):
    • SUPABASE_URL · SUPABASE_ANON_KEY — تقرأها api/app-config.js ويستهلكها المتصفح.
  • نطاق مخصص لاحقًا: أضِفه من لوحة Vercel ثم حدّث وسوم SEO إليه.

تحصينات مطبَّقة (2026-10-27):

  • api/proxy.js + مرآته server.py: سقف حجم25MB · حدّ120 طلب/دقيقة/IP · دعم Range (تنقّل الصوت بـ206) · إعادة فحص مضيفي كل تحويل (حتى3) · كاش6س + كاش دافئ من الذاكرة.
  • /api/ip: يقرأ رؤوس x-vercel-ip-* من حافة Vercel أولًا (بلا اعتماد خارجي وبلا rate-limit) ثم ipapi.co ثم بديل القاهرة.
  • Supabase: صلاحيات أعمدة محدودة (UPDATE على done/plan فقط) + قيود (طول الاسم≤24، done≤365، تنسيق معرّف) + العميل يكتب عبر PATCH ثم INSERT (لا upsert). البقيّة المقصودة: المفتاح العام يسمح بقراءة لوحة الختمة كاملة (بيانات تقدّم منخفضة الحساسية) — الحل الجذري عند الحاجة: Supabase Auth.
  • معرّفات خطط أقوى (16 محرفًا عشوائيًا عبر crypto).

PWA / وضع دون إنترنت:

  • public/sw.js + manifest.json + img/icon.svg: يُخزّن الهيكل والبيانات الأساسية عند أول زيارة؛ التنقّل والأدوات تعمل دون إنترنت، و/proxy+/api شبكة دائمًا (لا يُخزَّن صوت). الإصدار الحالي qr-v1 — عند تغيير ملفات الهيكل ارفع الرقم في sw.js لتجديد الكاش.

Supabase — الختمة الجماعية المشتركة (متزامنة بين الأجهزة):

  • مشروع quran-reels بجدولتي khatma_plans وkhatma_progress مع RLS (تقدّم كل فرد في صف مستقل).
  • أداة «ختمة جماعية» تقرأ /api/app-config؛ عند غيابها تعمل بدون سحابة بهدوء (تراجع صامت).
  • رابط المشاركة يحمل الخطة؛ التقدّم يُدفع عند «أنهيت اليوم» ويُسحب عند فتح الرابط على أي جهاز.

👤 账户 + 自动发布(自动化)——新功能

用户体验(开箱即用):点击「🔑 登录」→ 邮箱魔法链接或「使用 Google 继续」→ 进入 #/account 页面,可一键通过 OAuth 关联平台、查看发布日程表、使用帖子生成器,以及设置每日「自动化」。导出结果中的「🤖 安排发布」按钮会将视频上传到你的账户,并打开排期窗口。访客仍可自由使用——所有功能(创作和工具)无需注册即可使用。

如何启用实际发布(开发者设置——每个平台只需设置一次):

平台Vercel 环境变量(Secrets)应用创建位置注册重定向网址
YouTube(之后也会启用 Google 登录)GOOGLE_CLIENT_ID · GOOGLE_CLIENT_SECRETGoogle Cloud Console → OAuth consent → Credentialshttps://quran-reels-tau.vercel.app/api/oauth/callback
Facebook + InstagramMETA_APP_ID · META_APP_SECRETdevelopers.facebook.com → My Apps同上
TikTokTIKTOK_CLIENT_KEY · TIKTOK_CLIENT_SECRETdevelopers.tiktok.com同上
XX_CLIENT_ID · X_CLIENT_SECRETdeveloper.x.com同上
  • 所有平台共用一个重定向网址:/api/oauth/callback(平台信息编码在 state 中)。
  • Google 登录:在 Supabase Dashboard → Authentication → Providers → Google 中设置(使用同一个 Google 客户端即可;注册重定向网址:https://<ref>.supabase.co/auth/v1/callback)——魔法邮件无需任何设置即可使用(内置 SMTP;默认上限为每个时间窗口 2 封邮件——可在控制面板中提高,或按需使用自定义 SMTP)。
  • 自动化:Vercel Cron 每天按 15 4 * * * UTC 运行(≈ 开罗时间 06:15),通过 CRON_SECRET 发布到期任务——Vercel 免费计划足够使用(每天自动发布 1 个视频)。始终可以点击「立即发布」按钮即时发布。
  • 存储:排期视频会上传到 Supabase Storage bucket reels(公开——平台需要获取链接),每个文件上限为 50MB;免费的 1GB 存储空间足够存放数百个 Reels。
  • 安全性:令牌使用密钥 TOKEN_ENC_KEY 通过 AES-256-GCM 加密(仅限服务端),JWT 使用 JWKS 通过 ES256 验证,数据表通过 RLS 按用户所有权进行保护,响应中不会显示任何令牌。
  • 项目根目录中的 .env.secrets(已排除在提交之外)保存 TOKEN_ENC_KEY 和 CRON_SECRET 的本地副本——丢失后只需重新关联平台(无其他影响)。
  • Vercel 限制:Hobby 计划每次部署最多允许 12 个函数——当前总数为 11。添加函数时,请合并路由(采用此处的 api/x.js + ?op= 查询参数模式)。
  • 平台实际情况(如实说明):YouTube 可直接上传(默认配额约为每天 6 个视频,可申请提高)· Instagram 要求使用 Business 账户并通过 Meta 应用审核 · TikTok 需要应用审核(测试模式仅向创作者发布)· X 可能需要付费 API 计划才能上传视频。以上均取决于第三方平台——代码已准备就绪,获得授权后即可运行。
  • 套餐(免费版/专业版/终身版)目前仅作为界面展示——电子支付是后续步骤,可按需添加。

✅ 测试

  • 项目内置的持久化测试套件:tests/run.js(Playwright)——可针对生产环境或本地服务器运行:
cd tests
npm i playwright && npx playwright install chromium-headless-shell
npx playwright install-deps chromium-headless-shell   # مكتبات النظام (مرة واحدة)
node run.js                                              # محلي: 127.0.0.1:8787
BASE=https://quran-reels-tau.vercel.app node run.js      # الإنتاج
SKIP_EXPORT=1 node run.js                                # بلا قسم التصدير (~أسرع)
node tools_smoke.js                                      # دخان فتح الـ32 أداة (~5 ث)
node tools_interact.js                                   # تفاعل فعلي لكل أداة (نقر·select·input·checkbox)
node correctness_test.js                                 # صحة الحسابات مقابل Aladhan (30 فحصًا)
# الثلاثة الأخيرة تقبل BASE=… للإنتاج أيضًا
  • 覆盖范围:启动 + SEO 标签和 JSON-LD、robots/sitemap + 预览和实际 MP4 导出 + 32 个工具均可无错误打开 + 深度交互(念珠/天课/个人诵读进度/带云端状态的集体诵读进度/礼拜时间/朝向/祈祷词/圣训/电台/发音部位测试)+ 移动端菜单。

  • Lighthouse(模拟移动设备):性能 91 · 无障碍 100 · 最佳实践 100 · SEO 100(FCP ‏1.0s · LCP ‏1.5s · CLS ‏0.07 · 零失败)

  • W3C 验证器(validator.nu):0 错误 · 0 警告 — 语义化标题层级完整(包括工具区块的 sr-only 标题和今日经文的 v-tag 标题)——4 个新页面 /ar/* 也各自都是 0/0。

  • 索引层(Kamal #8):此前应用的所有 #/… 链接都无法被索引,sitemap 也只有 1 个链接,因此构建了无脚本、内容丰富并带有 JSON-LD 和内部 FAQ 链接的静态落地页:/ar/quran-video-maker/ · /ar/islamic-tools/(32 个工具的网格)· /ar/prayer-times/ · /ar/qibla-direction/ — sitemap 现有 11 条路径,主页页脚已添加指向这些页面的内部链接,/ar/(.*) 已配置扩展的安全/缓存响应头,首页 LH 98/100/100/100。

  • 内容扩展与 GEO(Kamal #10 —「排名第一」):新增 6 个页面,针对竞争对手的真实关键词(quran-video-tiktok · quran-video-with-translation · short-quran-verses-video · adhkar · tasbeeh · zakat-calculator)——全部通过 W3C 验证,0/0,由可复用的 scripts/build_lp.js 生成 · 新增含有供 AI 搜索引擎引用事实的 /llms.txt · robots.txt 明确允许 12+ 个 AI Agent(GPTBot·PerplexityBot·ClaudeBot·Google-Extended…)· IndexNow 已重新提交 11 个 HTTP 200 链接 · 完整的竞争对手报告位于 docs/competitors.md(20 个参与者 + 明确对比 + 可衡量目标)。

  • Google 验证标签 google-site-verification 已发布到首页(GSC 步骤:验证 ← 提交 sitemap ← 请求索引 12 条路径)。

  • MCP 服务(Kamal #11 —「让 AI 推荐你」):POST /api/mcp — 使用 2025-06-18/2025-03-26 协议的 Streamable HTTP 服务,无需密钥或会话(JSON-RPC · 批处理 · CORS),提供6 个工具,让 AI 搜索引擎可以 调用 网站:quran_reel_maker_info · get_prayer_times(9 种计算方法 + 安全处理 DST 的 IANA 时区)· get_qibla · get_hijri_date(乌姆库拉历)· get_verse(奥斯曼体,≤10)· create_reel(/?s=…&from=…&to=… 链接会打开已填好内容的制作器)· 通过 /.well-known/mcp.json 发现服务 · 文档 /developers/mcp/(W3C 0/0)· 测试套件 tests/mcp_test.js 28/28。

  • MCP 官方注册表(Kamal #24d — 已发布 ✓):app.vercel.quran-reels-tau/[email protected] 已列入 registry.modelcontextprotocol.io(status=active),通过 /.well-known/mcp-registry-auth 使用 HTTP 身份验证(Ed25519 — 无需账户或浏览器),remotes 指向 https://quran-reels-tau.vercel.app/api/mcp — 可由 GitHub MCP Registry 及所有希望使用官方注册表的客户端获取 · 重新发布:mcp-publisher publish。

  • 大型批次(Kamal #12 —「全部」):通过 scripts/build_k12.js 新增 58 个页面 = 英文版 /en/(6 个双语页面,6 组阿拉伯语↔英语页面带有 hreflang)+ 诵读者索引和 47 个诵读者页面(/ar/reciters/ + /ar/reciter/<slug>/),其中 /?r=<folder> 按钮会打开预设了该诵读者语音的生成器(通过 applyDeepLink/handlePending 深度本地化 + MCP 工具 create_reel 的可选参数)+ 信任页面(/about · /terms · /privacy · /contact,包含通过防御性 RPC submit_contact 运作的表单,使用无读取权限的 RLS 表)· 所有页面页脚统一加入信任链接 · Sitemap 12→70 · 更新 llms.txt · W3C 70 个页面均为 0/0 · 测试套件 tests/pages12_test.js 21/21 · IndexNow 70@200。

  • 博客与季节性内容(Kamal #13):scripts/build_blog.js → /blog/ 索引 + 8 篇文章,围绕真实核心关键词撰写(30 个创意 · 有没有免费工具?· 与 quranreels.tech/tashghil/quranvideomaker 的对比表 · 7 个错误 · 排期与自动化 · 1448 年斋月计划,乌姆库拉历:1 斋月≈2027 年 2 月 8 日 · 主麻日内容 · 5 分钟制作第一个视频)— 每篇文章均包含 Article+BreadcrumbList+FAQPage JSON-LD、<time> 和明确标注的阅读时长 · 全站页脚增加「文章」链接(3 个模板 + 根页面 + 静态页面)· Sitemap 70→79 · llms.txt 增加博客章节 · W3C 79×0/0 · 测试套件 tests/blog_test.js 12/12(包括 CJK 检查、有效内部链接和精确 sitemap 路径)· IndexNow 79@200。

  • 监控 + 逐词显示 + 资源包 + 延后事项(Kamal #14 —「全部」):卷轴制作器新增第 4 种**「逐词」样式(reel.js _drawWords:按照真实诵读时长,依据字母数量加权,用金色圆盘突出当前词语——音频拆分或估算均可,并与 _fitAyah 行逐字匹配;run.js 中的 S3 测试)· 每周监控:npm run monitor(scripts/monitor_site.js + lib/monitor.js — 检查 sitemap 中的所有页面是否返回 200、robots/llms/GSC 标记/博客页脚 + 竞争对手差异,列出新增/删除内容 + 查询 Bing RSS 检查索引,并在 docs/monitor/ 生成每日 Markdown 报告)+ Vercel Cron**,每周一 06:30 UTC(/api/cron/monitor)· 联系确认邮件:api/contact.js 先调用 RPC,再通过 lib/mailer.js(Resend,无密钥时 no-op)向来信者发送确认并抄送管理员;表单提供直接备用路径 · 修复 OAuth 缺陷:4 个平台的 redirect_uri 都指向不存在的路径 → 统一改为 /api/oauth/callback · 外部引流资源包 docs/backlinks.md(事实说明 + 8 个带链接的目标网站 + 3 个邮件模板 + 每周计划)· 配置记录:docs/{github,domain,oauth,payments,smtp}-setup.md + 草稿 sql/credits-draft.sql(未应用)+ scripts/rebase_url.js,DNS 配置完成后可用一条命令切换域名 · pages12 测试 21→24。

  • GSC 验证标签(Kamal #15):验证码 IHmoe5QFrC77PbZdh2O0MeZFLIKwg-saA50td32AcQo 现已固定在 79/79 个页面中——在缺少的 4 个页面中补齐(ar/quran-video-maker · ar/islamic-tools · ar/prayer-times · ar/qibla-direction),位置与模板一致 · 监控现在会检查值是否完全匹配,而不只是检查是否存在(lib/monitor EXPECTED_VERIF)· pages12 中新增永久测试(GSC token exact on home)· 下一步:GSC → Verify → 记录 Sitemap(79)→ 请求索引 · 验证文件 googleb789508316de731f.html(文件上传方式——根目录中共 53 字节)并在 pages12 中加入校验(24→25)。

  • 平台页面(Kamal #17):quran-video-instagram · quran-video-whatsapp — 使用原文案(标题和描述取自 quranreels.tech 上发布的对应页面)+ quran-video-facebook 使用我们自己的文案(原站没有 Facebook 页面——已核查其 90 个链接的站点地图)— 每个页面都包含 WebPage+FAQPage JSON-LD 和交叉链接(TikTok ↔ 各平台)· 修复失效链接:翻译页面中存在 /ar/quran-reels-for-dawah/ 链接,但对应页面不存在 ← 已替换为 WhatsApp 状态 · Sitemap 79→82 · llms.txt +3 · W3C 5 个已修改页面均为 0/0 · pages12 25→27(包括对 82 个链接的 self-canonical 检查)· IndexNow 200×3 · monitor 82/82。

  • 季节与类别页面(Kamal #18):新增 21 个页面 — 「还剩几天」系列(中心页 + 2027 斋月/开斋节/宰牲节/阿拉法特日/赖哲卜月/舍尔邦月/主麻日:乌姆库拉历日期沿用原文,并注明「可能因观月相差一天」+ 每个页面均有实时 id="kbc" 倒计时,主麻日会在浏览器中按周计算)+ 按姓名定制祝贺(中心页 + 两个开斋节 + 主麻日 + 斋月——沿用原文标题,调整描述,说明可在视频下方添加祝福语,而不是我们没有的「片头贺卡」)+ 7 个工具类别(islamic-tools/{prayer-and-place,quran-discovery,quran-learning,dhikr,hadith-and-learning,calculators-and-tracking,family-and-life},沿用原文标题和描述,并分配我们的工具)+ /ar/quran-word-highlight/ 使用我们自己的文案(原站 slug 已失效并返回 404,因此由我们认领)· 功能提示:data.js 中根目录的 FAQ 问题数增至 16(重新构建 run.js)+ 博客对比表新增一行(明确说明竞争对手也提供「逐词」功能)+ llms · build_lp 9→30 · Sitemap 82→103 · pages12 27→29(关键词检查 + 倒计时检查)· run.js 87/0 · blog 12/12 · correctness30 · smoke32 · mcp28 · interact32 · W3C 23×0/0(validator.nu)· Lighthouse 91/98(首页/制作器——未低于基线,自然波动范围为 79–95,并为 style.css 添加 preload 以减少阻塞渲染)· IndexNow 21@200/202 · monitor 103/103。

  • 补齐原站点地图 + 全面更新设计(Kamal #19「全部」):新增 51 个页面,补齐原站点地图(90 个链接)中所有剩余空缺(只剩下由其他路径覆盖的内容):24 个单独工具页面,使用原站文案(qibla · hijri-date · islamic-calendar · ayat-bil-mawdoo · daily-ayah · quran-radio · quran-looper · quran-khatma · group-khatma(修复 Kamal #18 中存在的失效链接)· hisn-almuslim · asma-allah-husna · hadith · hadith-checker · how-to-pray · mawarith · kaffara · qada · sawm · baby-names · nearby-mosques · minshawi-rare · makharij · tahfeez · quran-quiz 页面内含 8 道真实题目的测验 · crypto-zakat 手动计算器 + 科学提示 · halal-product-checker — 使用我们自己的文案,因为我们不支持「条形码和图片」)+ 13 个专门的制作器页面(no-watermark · no-music · free-maker · quran-video-ramadan · quran-reels-ai · quran-translation-video · quran-tafsir-video(明确说明功能限制的页面)· khushoo · sadaqa-jariya · quran-word-highlight-video + yasser-dossary/mishary-rashid(=alafasy)/best-quran-reciters,均使用真实的 47 个诵读者页面)+ adhkar/{sabah,masaa,nawm} + guides/quran-reels-guide-2026 + compare/quran-video-makers(不声称有「7 个」——只提供经核实的对比表)+ ur/ 和 id/ 两个版本(lang/dir 正确)+ 根目录页面:/faq/ 和 /content-sources/(来源透明度)以及 /developers/ + docs/en + integrations/n8n(真实 MCP/JSON-RPC,无需密钥),并添加 redirect /privacy-policy → /privacy(308) · 如实修改缺失功能的描述(罗盘没有绿色光效 · 不支持「步行」· 没有回历年龄 · 没有圣训图片 · 没有 3D 模型……)· 模板构建:base/lang/dir 可选参数(30→81 个生成页面)· Sitemap 103→154 · pages12 29→30(+ur/id lang+GSC 检查)· 通过 style.css + lp/blog 两个模板全面更新设计(带金色渐变的 hero · hover/边框 · focus-visible · 选中文字样式 · reduced-motion),并修复 text-wrap:balance 导致的 CLS(移除后 LH:制作器 89→97)· W3C 90×0/0 · run 87/0 · blog12 · correctness30 · smoke32 · mcp28 · interact32 · LH 首页 88–91(基线 91) · IndexNow 51@200×3 · monitor 154/154。

  • 文章引擎 + 100 篇文章 + AI 图片 + 深入完善后端(Kamal #20「engine100 · ai · deepen」):新增文章引擎 scripts/build_posts.js,读取 posts/library{,_b}.js(8 个内容主题库:video13 · reciters12 · prayer13 · hifz13 · azkar13 · seasons12 · family12 · publishing12)+ posts/index{,_b}.js(100 篇不同文章的规格:slug/标题(带有后缀「| Quran Reels」)/描述/关键词/引言/3 个要点/应用/FAQ×2-3/至少 2 个内部链接)→ 在 /articles/<slug>/ 发布 100 篇文章 + 中心页 /articles/:Article+BreadcrumbList+FAQPage JSON-LD · 面包屑「首页 ← 文章库」· 阿拉伯语 <time> · 阅读分钟数(字数/180)· 复合关联(2 个来自主题库的链接 +「相关阅读」+3 张相关推荐卡片 + 主题工具 + cluster links)· 在 public/img/articles/<slug>.jpg 中为主题制作 8 张 AI 图片(自动用于 hero+og,其余用作 og-cover)· 所有页脚均新增「文章库」(lp 模板 + blog 模板 +64 个静态页面 + 文章引擎自身)· Sitemap 154→255 · llms.txt 新增「文章库」章节 · pages12 测试 154→255 · 本地全套测试均通过:run 87/0 · blog 12/12 · correctness 30 · smoke 32 · interact 32 · api 0 · mcp 28 · 文章规模经过审慎控制:「一百万篇文章」在物理上不可能,还会让网站面临 scaled-content-abuse 风险(ask_user: engine100)——此引擎已准备好使用相同的主题库扩展后续数百篇文章。

  • GitHub(Kamal #16):公共仓库 https://github.com/Ansygroup/quran-reels 已上传 18 个提交,并验证提交状态一致(本地 sha = 远程)· 分支 master 已重命名为 main · 令牌存放在 .vcfg/gh_token 中(权限 600,已加入 git 忽略列表,绝不输出)+ .vcfg/gh_repo · scripts/gh_push.sh 可重新添加 origin 并用一条命令推送(能够应对 .git/config 被清除)· 状态记录见 docs/github-setup.md。

  • 工具路径上的 Lighthouse:#/tools ‏= 95/100/100/100 · #/tool/prayer ‏= 94/100/100/100 — 所有路径均零失败。

  • 永久 REST E2E 测试套件 tests/e2e_rest.py:最终构建中 13/13 通过(授权·JWKS·OAuth 401/302·上传存储+公开访问·集体诵读进度 RLS·排期·未绑定时发布返回 502·自动化·绑定列表)。

  • 32 个工具的冒烟测试 tests/tools_smoke.js:打开每个工具并检查渲染结果 + 没有页面错误 + 没有水平溢出 — 本地和生产环境均 32/32,约 5 秒完成。

  • 修复冻结故障(由冒烟测试发现):hijriParts 此前每次调用都会创建 Intl.DateTimeFormat,导致 hijriToGreg 循环(历法工具中调用 900 次)冻结主线程数十秒(calendar 工具卡住)——现在 core.js 中只创建并缓存一个格式化器。

  • 健康检查 tests/correctness_test.js — 本地和生产环境均为 30/30:通过 Aladhan 直接获取外部参照来检查当天计算:回历 ↔ gToH + 往返转换 · 开罗/伦敦/雅加达/纽约的朝向 ±1° · 乌姆库拉历(开罗)礼拜时间 ↔ method=4,误差 0–2 分钟 · 通过 DOM 检查天课(2.5% + 85g 起征额 + 两种判断结果)· 文本工具(toAr·fmtTime·normAr)。

  • 修复静默回历故障(由健康检查发现):Kamal #6 一轮重命名后遗留了 raw: fmt.format(date) — ReferenceError 被 catch 吞掉,因此所有回历日期都默认显示为「1448 年穆哈兰月 1 日」,而测试只检查渲染结果,所以仍然通过 — 现在 _HIJRI_FMT 已在正确路径上。

  • 修复 DST 故障:城市表中的固定 tz 在夏令时期间会整整相差 1 小时(开罗 tz:2,而 Africa/Cairo 今天为 +3)— 现在每个城市都有 IANA 区域(z),每次读取时都会通过 tzFromName 推算当天的时差(适用于:已保存位置/设备/IP/选择城市)。

  • 工具交互测试 tests/tools_interact.js — 本地和生产环境均为 32/32:每个工具最多执行 4 次实际操作(点击按钮/链接 · 更改 select · 安全输入 · 切换 checkbox),并设有冻结保护和状态清理机制(Escape/hash/声音)— 纯展示工具(iftar/calendar/countdown)已在代码中标记为纯展示工具。

  • 范围说明:项目配置中包含别名 quran-reels.ansygroup.com(会显示在部署命令中),但 DNS 尚未解析 — 主域 quran-reels-tau.vercel.app 正常。

  • 启动性能:为 12 个脚本添加 defer,3 个工具实现文件会在首次打开工具时才加载(已纳入 SHELL,供离线使用),首页背景采用 webp,字体/背景/JS/CSS 设置一年缓存,版本参数为 ?v=3。

  • 最新结果(Kamal #7 构建):chromium PROD 86/0 · LOCAL 81/0 · api 15/15 · 健康检查 30/30 · 交互测试 32/32 · 冒烟测试 32/32 · LH 91/100/100/100(Firefox/WebKit:在 0d21c5c 构建中使用 SKIP_EXPORT=1 时分别为 85/80 和 85/80:headless 环境中 MediaRecorder 缺失/不可用——此环境限制已记录)· api_test 包含:通过 Service Worker 检查离线运行、生产环境云端行记录、S9 账单/自动化/API 契约部分——拒绝访客 401、Google 按钮保护:提供方未启用时显示提示,而不是错误页面、菜单中的「自动发布」链接,以及 FAQ 与 JSON-LD 一致(15 项)。

  • 完整 PWA,可安装:图标 icon-192.png/icon-512.png(+maskable),并添加 ?v=2 以更新 CDN 缓存,SW 版本 = qr-v3。

  • 所有 /api/* 的安全响应头:nosniff + Referrer-Policy + Permissions-Policy(geo/self — 禁止摄像头/麦克风)。

  • 会话令牌解析器 QRAuth.parseAuthHash:兼容 #access_token=、#/…#access_token= 双重格式和 ?access_token=(已测试 3 种格式)。

  • 魔法链接流程:真实域名可接受发送请求(接受后使用 429 进行测试);验证页面的 token_hash 确实要求来自邮件的令牌(已使用数据库权限测试,按预期返回 otp_expired)— site_url 现已指向生产环境。

  • 本地 git 仓库(80 个文件,.gitignore 保护 .env*/.vcfg/.vercel)— 首次提交包含所有内容。

  • 社交网络预览性能:og-cover 图片已重新压缩,从 2167KB 降至 95KB(1200×630 JPEG),并更新 og/twitter + JSON-LD,使用 ?v=2 — 已验证所有 SW 路径(21 条)均返回 200,生产日志无错误。

  • PWA 应用安装按钮:触发 beforeinstallprompt 时显示,触发 appinstalled 时隐藏(S9 新增两项检查)。

  • HTML 上的严格 CSP:script-src 'self'(禁止内联脚本/onclick 处理器——创建按钮已改为由 JS 控制),connect/media 仅允许真实来源(Supabase/everyayah/overpass/jsdelivr/qurango),frame-ancestors 'none' + X-Frame-Options: DENY + Referrer-Policy — 82 项检查全部通过,未发生任何违规。

  • iOS 集成:apple-touch-icon 使用 PNG-192,且已设置 theme-color。

  • sql/schema.sql:完整的数据库结构快照(5 张表 + RLS + 14 条策略 + 6 个索引,来自线上目录),可用于恢复 — 不包含任何密钥。

  • 兼容性保护:MediaRecorder 缺失时显示清楚的阿拉伯语提示,而不是技术错误。

  • 性能审计:SHELL 仅 2.8MB(12MB 的翻译文件按需加载),已启用 brotli,21 条 SW 路径全部返回 200。

  • 双浏览器测试:PW_BROWSER=firefox node run.js(默认 chromium)— 使用 SKIP_EXPORT=1 时 Firefox 测试通过,85/80,因为 Firefox headless 中的 MediaRecorder 会卡住(已在 run.js 中完整记录为环境限制;MP4 导出已在 chromium 中测试)。 لربطه بـGitHub لاحقًا (بمُشتركك أنت — لا تُلصق التوكن هنا أبدًا):

    gh auth login            # أو استخدم PAT عبر GH_TOKEN
    gh repo create quran-reels --private --source=. --push
    # أو يدويًا:
    # git remote add origin https://github.com/<user>/quran-reels.git
    # git push -u origin main
    
  • فحص عقود الوحدات api_test.js: 15/15 (ACAO · كاش · Range206 · 405 · rate-limit429 · X-Cache HIT · ip · app-config).

  • جدولة Vercel مؤكَّدة: vercel crons ls → /api/cron/publish · 15 4 * * * (يوميًا).

  • E2E كامل بحساب حقيقي (يدوي، خارج المجموعة): منح جلسة → رفع فيزيو للتخزين (200 + رابط عام) → إدراج مهمة بـRLS → جدولة عبر API → نشر بلا ربط ⇒ failed برسالة عربية مُدارة → أتمتة upsert → واجهة بحساب مسجّل 8/8 (بطاقة المستخدم، قوائم، نافذة الجدولة، توليد البوست، خروج ينظّف الجلسة) — وكل البيانات نُظّفت بعدها (0 صف).

  • ملاحظة بيئة العمل: كل رد من المستخدم ينظّف node_modules وذاكرة المتصفح — أعد npm i playwright && npx playwright install chromium-headless-shell (+ install-deps إن لزم) قبل أي تشغيل جديد.

  • التحقق من بيانات الملفات: فحص مطابقة الـ44 ملفًا بين النشرة المحلية والإنتاج (HEAD 200 للكل)، وعقد دوال Vercel بـ13 فحص (api_test.js سابقًا)، وإثبات مزامنة السحابة بجهازين على الإنتاج.

📝 ملاحظات

  • التصدير يلتقط الصوت الحي من مشغّل WebAudio (MediaStreamDestination) — يجب مرور الصوت عبر نفس الأصل (/proxy) لتجاوز قيود CORS.

  • الموقع منشور على quran-reels-tau.vercel.app (كل وسوم SEO وrobots/sitemap عليه). عند ربط نطاق مخصّص لاحقًا: بدّل النطاق في index.html (canonical/og/JSON-LD) وrobots.txt/sitemap.xml ثم أعد النشر.

  • الاختبارات: tests/run.js (التشغيلان أعلاه خضراء: PROD 65/0 · LOCAL 64/0) — حزمة دائمة داخل المشروع بدل الملفات المؤقتة السابقة.

  • ملاحظات بيئة العمل: مجلدات التبعيات (node_modules، ذاكرة المتصفح، CLI) تُنظَّف مع كل رسالة — أعد تثبيتها بالأوامر أعلاه عند الحاجة؛ ملفات المشروع والبيانات تبقى كما هي.

  • 200 مقالًا + مكتبة إنجليزية + GEO + فيديوهات حقيقية (كمل#21 «كلهم»): (أ) التوسعة 100→200: posts/library_c.js أضاف 24 قسمًا (بنوك المحتوى6→9 لكل العناقيد الثمانية) · posts/index_c.js + posts/index_d.js = 100 مواصفة جديدة (video · reciters · prayer · hifz · azkar · seasons · family · publishing = 25 لكل عننقود) مع فحص CJK وروابط ميتة أغلق9 عيوب كتابة · (ب) المكتبة الإنجليزية: posts/en.js 15 مقالًا إنجليزيًا أصليًا (مواضيع متصلة بأقراها العربية) + scripts/build_posts_en.js → /en/articles/<slug>/ + hub /en/articles/ (Article+Breadcrumb+FAQ LD · hreflang متقابل ar↔en + x-default · صور hero مشتركة عند توفّرها) · فوترات الصفحات lang=en أُعيدت إلى /en/articles/ · (ج) GEO: Article LD حصل على timeRequired + keywords + isPartOf · الرئيسية +WebSite + Organization LD (4 كتل JSON-LD صالحة) · llms.txt: 200 دليلًا (25×8) + قسم المكتبة الإنجليزية + بند حقائق جديد (خريطة 371) · (د) فيديوهات MP4 حقيقية: scripts/export_videos.js يقود الموقع نفسه عبر Playwright (/?s=&from=&to=&r= → #btnCreate → انتظار #btnDownload → تنزيل) → 8 مقاطع عمودية 1080×1920 بلا علامة مائية (3.6–16.7MB) في deliverables/videos/ + README ببيانات يوتيوب جاهزة (عنوان ووصف ووسوم لكل مقطع · روابط لمقالاته · قواعد الرفع Shorts) · Sitemap 255→371 (+116 بلا تكرار) · pages12 ينتظر 371 · محلي: 371/371 كلها 200 + canonical متطابق · correctness 30 · blog 12 · smoke 32 · interact 32 · api 0 · W3C 372 ملفًا → أخطاء0 (إصلاح تدرّج عناوين /faq/) · خادم8787 أُعيد تشغيله من جذر المستودع (كان يعمل دون مسارات API محليًا).

  • 400 مقالًا + 40 إنجليزيًا + فيديوهات40 + APK (كمل#22 «كلهم» + «APK للجوال»): (أ) المكتبة200→400: posts/library_d.js (+24 بنك محتوى) + posts/index_e/f/g/h.js (52+52+52+44 = 200 مواصفة جديدة) → 8 عناقيد × 50 =400 فريدة، إغلاق29 رابطًا ميتًا عبر خرائط href عالمية (DEAD=0)، build_posts.js → 400 مقالًا + hub، خريطة الموقع 371→571 · (ب) فيديوهات40/40: مكتبة video_recipes_c.js (32 وصفة) + إصلاحات انتظار Playwright (60–150s، صيغة3 معاملات لـ waitForFunction) → 40 ملف MP4 عمودية1080×1920 =494MB + README 40 صفًا ببيانات يوتيوب · (ج) الإنجليزية15→40: posts/en_b.js (+25 دليلًا كاملًا) + معالجة 22 وقوع {t} حرفية في build_posts_en.js (تطبيع قبل العرض HTML+JSON-LD) + hub يعرض400 · 40 زوجًا ar↔en hreflang متبادلًا · صفحة /en/tools/ الجديدة زوجًا لـ/ar/islamic-tools/ (x-default→/) · تذييل k12 EN يوصّل الأدوات · خريطة الموقع 571→597 (+26) · pages12 ينتظر 597 · llms: 400 عربي +40 EN +597 رابطًا · W3C محليًا0 أخطاء على42 ملف EN · (د) backlinks docs/backlinks.md: أقسام §12–15 (حزمة روابط400 · أصول النشر والفيديو · خريطة مجتمعات8 عناقيد · قياس اقتباس GEO وتتبّع) + ورقة الحقائق §0 محدّثة للأرقام الحقيقية · (هـ) APK للجوال: Bubblewrap TWA → deliverables/app/quran-reels.apk (1.07MB) + quran-reels.aab — حزمة app.quranreels.twa · minSdk24 · التسمية «قرآن ريلز — صانع ريلز قرآني» · يفتح الموقع الحيّ · شهادة التوقيع مطابقة للـkeystore المحفوظ في deliverables/app/build/android.keystore (كلمة السر داخل .vcfg/apk_keystore_pw — لا تُشارك) · إعادة البناء: scripts/make_apk.py.

  • 500 مقالًا + 100 إنجليزي + فيديوهات80 + ختمة جماعية مُتحقَّق منها (كمل#23 «كلهم»): (أ) المكتبة400→500: posts/index_i.js (+58) + posts/index_j.js (+42) = 100 مواصفة جديدة (video15 · reciters16 · prayer14 · azkar13 · hifz11 · seasons10 · family10 · publishing11) → 500 فريدة، روابط ميتة0، contract0 · build_posts.js → 500 مقالًا + hub · (ب) الإنجليزية40→100: posts/en_c.js+en_d.js = 60 دليلًا جديدًا (slug==arTwin) → بناء 100 مقال EN + 100 زوج ar↔en hreflang · {t} صفر · (ج) فيديوهات40→80: scripts/video_recipes_d.js (+40 وصفة) + ربط BATCH=d → 80 MP4 (785MB) + README 80 صفًا (تشخيص مسار65:1 الممتد 160ث استُبدل بمطلع التغابن47ث) · (د) المزايا (تحقّق لا بناء): auth Google+magic link موجودان ومربوطان (QRAuth + #/account + login overlay)، الروابط السحرية حيّة إنتاجيًا، ختمة جماعية Supabase تعمل ببيانات حقيقية (khatma_plans/progress + RLS مُختبَرة200)، وGoogle provider بانتظار تفعيلهم في لوحة Supabase (الواجهة تُظهر تنبيهًا صريحًا عند التعطّل) · (هـ) تجهيز النشر: deliverables/youtube/ (upload-pack CSV+JSON لـ80 + CHECKLIST) + deliverables/app/store/ (PLAY-LISTING + 6 لقطات1080×1920) · أرقام: sitemap 597→757 · pages12 757 · llms 500/100/757 · backlinks §0 محدّث · W3C محليًا 0 أخطاء/160 · monitor 757/757 بحالة200 · IndexNow160@200 · محلي: run0/0 · correctness30 · blog12 · smoke32 · interact32 · api0 · إنتاج: run0/0 · pages12 30/30@757 · mcp28 · correctness30 · blog12 · smoke32 · interact32 · api0 · LH 89/98 (a11y94/100 · bp100 · seo100).

  • 10,000 مقال + 136 بوابة + IndexNow9,636 (كمل#24 «التسع آلاف»): (أ) التوليد: ‏8 ملفات posts/gen_data_*.js (video185 · reciters178 · prayer154 · hifz162 · azkar170 · seasons132 · family170 · publishing221 = 1,362 موضوعًا في136 مجموعة) بفحص scripts/scan_content.js v3 (CJK/سيليري/يوناني/لاتيني موسّع + نطاق مكمّل + فحص بعد كل كتابة أغلق عيوب «ƪ/ Frauen/过去» وملتصقات الأرقام20) + scripts/gen_engine.js المحرك المتدرّج: صيغ × مواضيع × صفات مؤهّلة (سياق12×جمهور5 · قائمة سماح خاصة بالنشر) مع بوابات تشابه: تفرّد slugs وعناوين وأوصاف عالميًّا · تنقية فتحات العميقة بتطابق الكلمات · منع صفات غير منطقية → 9,500 مقالة بالضبط (1,000 عميق + 8,500 منهجية) +500 قديمة = 10,000 · (ب) البناء: build_posts.js مُرقّى (تحميل القديم+الجديد · قسم ثالث للعميق · بطاقة SVG مضمّنة بديل الهيرو بلا ملفات إضافية · CSS خارجي خفّض279→200MB · ح1 بلا لاحقة · فترينة المجموعة في breadcrumb+LD+روابط) → 10,000 صفحة + hub رئيسي (8×17 شرائح) +136 بوابة محور · vnu 0 أخطاء على عيّنات الأنواع الستة · (ج) الفهرسة: build_sitemap.js → sitemap 757→10,393 بالضبط (kept257+articles10,000+hubs136 · EN101 محفوظة) · pages12 → سحب10,393 بحوض16 عيّنة + عدّاد10393 · llms.txt محدّث + llms-full.txt جديد (2.39MB · 10,136 بندًا وصفيًّا) · (د) النشر: حدّ CLI (100MB/15k ملف) يمنع الرفع المباشر → استُخدم ربط Git موجود (push → نشر تلقائي) → deploy quran-reels-npyd2cnjk جاهز · IndexNow 9,636 (9,500+136) @200 · (هـ) الصور هجين: SVG مضمّن للجميع + عامل gen_ai_images.js (pollinations · حدّ مجاني صورة/45ث → بوابة47ث · عميق أولًا · 500 مخطط) يعمل في الخلفية ويُعاد البناء بعد اكتماله · (و) روابط: docs/backlinks.md §16–18 (حزمة10k · حملة1,000 عميق بمصفوفة8 عناقيد · قياس وصيانة) + §0 محدّثة (10,000/10,393/136) · (ز) الأرقام: محلي run0/0 · correctness30 · blog12 · smoke32 · interact32 · api0 · إنتاج: run0/0 · pages12 30/30@10,393 · mcp28 · correctness30 · blog12 · smoke32 · interact32 · api0 · sitemap10,393 · pool16 كلها200+canonical.

  • تتمة كمل#24 (2026-10-29 «الحاوية الجديدة + كاشف البطاقات»): (أ) الاستعادة: الحاوية أُعيد تجهيزها (.git → a54a4b9 · ~2,969 مجلد مقالة و-out/*.json ضاعت بحدّ لقطة10,000 ملف) → جلب من GitHub و«reset --hard fc69b086» أعاد 10,137 مجلد + 9 ملفات خرج + 13 صورة سليمة · سجلّ العامل صار في ~/ai_images.log (يدوم عبر الرسائل) · JRE21+vnu.jar نُقلا إلى /home/user/tools/ · chromium deps ثُبّتت (sudo apt) · هوية git أُعيد ضبطها · (ب) كاشف بطاقات pollinations: حدّ «صورة/45ث» يُعيد بطاقة JPEG صفراء («Free limit reached») بحالة 400/402 — رُفضت 13 بطاقة تسلّلت كنجاح (فحص md5 مزدوج + حظر التكرارات + تصاعد نوم46→300ث + قراءة retry-after) · الصور الحقيقية14 (8 قديمة +5 أمس +1 بعدها) والباقي يُستكمل دفعةً عبر الرسائل · (ج) a11y: من90-93 إلى100: تسطير روابط .crumb و.foot-bottom (فحص link-in-text-block) → LH إنتاج: articles100/100/100/100 · عميق100/100/100/100 · بوابة97/100/100/100 · الرئيسية a11y100 (perf72-95 تذبذب قياس — المولّر98 كما كان) · (د) فحوص إضافية: vnu23 عيّنة=0 أخطاء (JRE21 دائم) · pages12 بعد الاستعادة30/30 · مراقبة10,393/10,393 سابقًا · IndexNow9,636@200.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。