رفتن به محتوای صفحه
BLOG

ساخت MCP شخصی برای مدیریت چند سایت وردپرسی با ChatGPT؛ تجربه واقعی از صفر تا Gateway

مستند واقعی طراحی و ساخت یک MCP شخصی برای مدیریت چند سایت WordPress از داخل ChatGPT؛ از Local MCP و MCP Inspector تا OAuth، WAF، Cloudflare Worker، D1 و Gateway مرکزی.

معماری اتصال سایت‌های وردپرسی به Ali MCP Gateway و ChatGPT

نوع محتوا: Case Study / Build Log — مستند واقعی ساخت یک زیرساخت شخصی MCP برای مدیریت چند سایت WordPress از داخل ChatGPT.

خلاصه پروژه

هدف ما ساخت یک اتصال ساده و قابل‌اعتماد بین ChatGPT و چند سایت WordPress بود؛ اتصالی که فقط «خواندن» نباشد، بلکه در صورت اجازه بتواند محتوا را بسازد یا ویرایش کند، Bricks را بخواند و patch کند، فایل‌های قالب را با Backup و Hash Verification تغییر دهد و در عین حال عملیات خطرناک را جداگانه کنترل کند.

این کار در یک مرحله انجام نشد. ابتدا یک مسیر محلی با WP MCP AI Client و یک MCP Server روی ویندوز ساختیم. بعد برای عیب‌یابی پروتکل، MCP Inspector را وارد کار کردیم. سپس Ali WordPress Connector را توسعه دادیم تا WordPress خودش REST/OpenAPI/MCP و OAuth 2.1 ارائه کند. در اتصال مستقیم ChatGPT با خطاهای OAuth discovery، مسیرهای .well-known و WAF هاست روبه‌رو شدیم. در نهایت برای اینکه هر سایت جداگانه مجبور به درگیر شدن با OAuth و تنظیمات هاست نباشد، یک Gateway مرکزی روی Cloudflare Worker + D1 ساختیم.

نتیجه نهایی
در معماری نهایی، ChatGPT فقط به یک MCP مرکزی یعنی Ali MCP
Gateway وصل است. هر سایت WordPress فقط افزونه Ali WordPress Connector و
یک API Key دارد. اضافه کردن سایت جدید به‌جای ساخت یک MCP جدید در ChatGPT،
تبدیل شد به «نصب افزونه → ساخت کلید → Add site در Gateway → Test».
دیاگرام معماری چند سایت وردپرس، Ali MCP Gateway و ChatGPT
معماری نهایی استک شخصی WordPress MCP

فهرست مطالب

۱) چرا اصلاً MCP شخصی ساختیم؟

شروع پروژه از یک نیاز عملی بود: مدیریت سایت‌های WordPress از داخل ChatGPT، بدون اینکه برای هر تغییر کوچک مجبور باشیم بین پنل WordPress، ابزارهای جداگانه، کلاینت‌های واسط و چند محیط مختلف جابه‌جا شویم.

در ابتدا ابزارهای دیگری هم برای کنترل WordPress داشتیم، اما محدودیت تعداد فراخوانی، وابستگی به سرویس واسط و نیاز به کنترل دقیق‌تر روی عملیات باعث شد به یک اتصال شخصی فکر کنیم. یکی از اسکرین‌شات‌های واقعی پروژه، مصرف بالای allowance یک ابزار واسط را نشان می‌دهد؛ همین مسئله یکی از انگیزه‌های جدی برای ساخت مسیر مستقل بود.

نمای مصرف سهمیه ابزار واسط WordPress و انگیزه ساخت MCP شخصی
نمونه محدودیت و مصرف سهمیه در ابزار واسط؛ یکی از انگیزه‌های ساخت مسیر مستقل

چیزی که از اتصال شخصی می‌خواستیم

  • خواندن وضعیت WordPress، PHP، قالب فعال و قابلیت‌های Connector.
  • لیست، جستجو، خواندن، ساخت و ویرایش Post/Page/CPT.
  • Exact Patch به‌جای ارسال مجدد کل محتوا.
  • خواندن Bricks element data و patch کردن امن با element ID و hash.
  • خواندن و patch کردن فایل‌های child theme با Backup خودکار.
  • تفکیک عملیات عادی از عملیات Destructive.
  • قابلیت مدیریت چند سایت از یک نقطه مرکزی.
  • عدم نیاز به روشن ماندن PowerShell یا کامپیوتر شخصی در استفاده روزمره.

۲) معماری‌هایی که در مسیر امتحان کردیم

نسخه A — Local Client

در اولین معماری، ChatGPT Plus/Pro از طریق Sign in with ChatGPT داخل یک کلاینت محلی استفاده می‌شد. کلاینت محلی با MCP Server روی 127.0.0.1 ارتباط داشت و MCP Server درخواست‌ها را به WordPress Bridge می‌فرستاد.

ChatGPT Plus/Pro
↓
WP MCP AI Client (Local)
↓
http://127.0.0.1:8787/mcp
↓
WP MCP Manager / Bridge
↓
WordPress

معماری اولیه محلی

نسخه B — اتصال مستقیم هر سایت به ChatGPT

بعد از اینکه Connector شخصی ساخته شد، تلاش کردیم هر سایت WordPress مستقیم به‌عنوان یک Custom MCP Server در ChatGPT ثبت شود. از نظر معماری ساده بود، اما در عمل هر سایت به OAuth discovery، مسیرهای .well-known و سازگاری WAF هاست وابسته می‌شد.

ChatGPT Custom MCP
↓ OAuth
https://site.com/wp-json/ali-bridge/v1/mcp
↓
Ali WordPress Connector
↓
WordPress

نسخه C — Gateway مرکزی (معماری نهایی)

برای حل مشکل تکرار OAuth و تنظیمات هاست در هر سایت، یک Gateway مرکزی ساختیم. حالا ChatGPT فقط یک MCP می‌شناسد و Gateway به کمک API Key رمزنگاری‌شده، به هر سایت وصل می‌شود.

ChatGPT
↓ OAuth
Ali MCP Gateway (Cloudflare Worker)
↓ X-Ali-Bridge-Key
Ali WordPress Connector on each site
↓
WordPress / Bricks / Theme Files
چرا این معماری بهتر بود؟
OAuth و .well-known فقط برای Gateway مرکزی مدیریت می‌شود؛ هر
سایت جدید فقط Connector + API Key نیاز دارد. در عین حال REST route سایت
باید از شبکه Cloudflare قابل دسترس باشد.

۳) فاز اول: ساخت Local MCP روی ویندوز

این فاز برای اثبات امکان‌پذیری پروژه بسیار مهم بود. قبل از اینکه وارد OAuth و Cloudflare شویم، باید مطمئن می‌شدیم اصلاً می‌توانیم از طریق MCP به WordPress دستور بدهیم و ابزارهای واقعی بسازیم.

۳.۱ اجرای Setup

پکیج Local روی ویندوز شامل فایل‌های setup و mcp-server بود. هنگام اجرای فایل batch، ویندوز هشدار ناشناس بودن Publisher را نمایش داد. چون فایل متعلق به پکیج خودمان بود، Run را انتخاب کردیم.

هشدار امنیتی ویندوز هنگام اجرای فایل setup برای WP MCP AI Client
هشدار Windows هنگام اجرای setup.bat

Setup وابستگی‌های Node را نصب می‌کرد و سپس URL سرور MCP محلی را می‌پرسید. URL پیش‌فرض ما 127.0.0.1:8787/mcp بود.

ترمینال راه‌اندازی WP MCP AI Client و وارد کردن آدرس MCP محلی
نصب dependencyها و درخواست MCP URL در WP MCP AI Client Setup

۳.۲ خطای ساختار پوشه

در یکی از نسخه‌ها، setup.bat فایل configure-windows.ps1 را در مسیر مورد انتظار پیدا نکرد. این خطا ساده بود ولی یک نکته مهم داشت: فایل setup و اسکریپت PowerShell باید نسبت به پوشه mcp-server در همان ساختاری قرار بگیرند که پکیج انتظار دارد.

خطای پیدا نشدن configure-windows.ps1 در Setup اتصال MCP
خطای configure-windows.ps1 was not found
راه‌حل
پوشه را دوباره با ساختار صحیح Extract کردیم و مطمئن شدیم
setup.bat در مسیر درست نسبت به mcp-server قرار دارد.

۳.۳ تست Bridge و پایان Setup

بعد از اصلاح ساختار، Setup توانست اتصال WordPress Bridge را تست کند و پیام WordPress bridge connection succeeded را برگرداند. همین پیام ثابت کرد که لایه WordPress قابل دسترس است و مشکل از خود Bridge نیست.

ترمینال با پیام موفقیت اتصال WordPress Bridge و MCP Server محلی
موفق شدن تست WordPress Bridge و اعلام MCP URL محلی

۳.۴ انتخاب Permission Mode

در Local Client سه الگوی دسترسی داشتیم. برای کار روزمره، حالت «اجرای خودکار عملیات عادی و گرفتن تأیید برای destructive» منطقی‌ترین انتخاب بود؛ چون سرعت را بالا می‌برد ولی حذف یا Restore را خودکار نمی‌کرد.

انتخاب سطح دسترسی Read Write و Destructive در WP MCP AI Client
انتخاب Permission Mode در WP MCP AI Client
قاعده‌ای که از همان ابتدا حفظ کردیم
Destructive باید مستقل از Write باشد. امکان ویرایش محتوا نباید
به‌طور ضمنی اجازه حذف، Restore یا عملیات پرریسک بدهد.

۴) عیب‌یابی MCP با MCP Inspector

وقتی یک MCP به ChatGPT وصل نمی‌شود، بهترین کار این نیست که مستقیم سراغ OAuth برویم. اول باید خود پروتکل را خارج از ChatGPT تست کنیم. برای همین از MCP Inspector استفاده کردیم.

۴.۱ اضافه کردن Server در Inspector

منوی Add Servers برای اضافه کردن MCP Server در MCP Inspector
منوی Add Servers در MCP Inspector

برای یک HTTP MCP، مسیر Add manually را انتخاب می‌کنیم. Inspector برای STDIO و HTTP تنظیمات جدا دارد.

فرم تنظیم MCP Server نوع HTTP در MCP Inspector
فرم Add server در Inspector و تفاوت STDIO با HTTP

۴.۲ خطای Failed و بررسی Network

در اولین تست HTTP، wp-mcp-manager به حالت Failed رفت. بخش Network در سمت راست Inspector دقیقاً نشان می‌داد درخواست به 127.0.0.1:8787/mcp ارسال شده ولی handshake کامل نشده است.

خطای اتصال MCP Inspector و وضعیت Failed برای سرور MCP
MCP Inspector در وضعیت Failed

۴.۳ خطای text/event-stream

باز کردن مستقیم URL MCP در مرورگر هم یک خطای آموزنده داد: Client must accept text/event-stream. این خطا در واقع به ما گفت endpoint زنده است، اما مرورگر عادی هدر Accept مناسب MCP/SSE را نمی‌فرستد. بنابراین مشاهده این پیام به‌معنی خراب بودن MCP نبود.

پیام Client must accept text event stream هنگام باز کردن MCP URL
خطای Not Acceptable هنگام باز کردن MCP URL در مرورگر
نکته مهم
MCP HTTP را با مرورگر عادی قضاوت نکنید. Inspector یا یک Client
واقعی باید هدرهای پروتکل را ارسال کند.

۴.۴ اتصال موفق و Tools/List

بعد از اصلاح transport و پاسخ‌دهی، Inspector وضعیت Connected را نشان داد و پیام‌های initialize، notifications/initialized و tools/list با موفقیت عبور کردند.

MCP Inspector در حالت Connected و دریافت لیست ابزارها
اتصال موفق wp-mcp-manager در Inspector و دریافت Tools/List

در تب Tools ابزارهای واقعی WordPress مثل List WordPress sites، Get site info، Search content، Get content و Update content ظاهر شدند.

لیست ابزارهای WordPress در MCP Inspector
نمایش ابزارهای WordPress در MCP Inspector

۴.۵ اولین Tool Call واقعی

یکی از تست‌های مهم، ساخت یک صفحه آزمایشی با POST به wp/v2/pages بود. ورودی JSON داخل Inspector نشان می‌داد ابزار واقعاً می‌تواند request ساختاریافته بگیرد و به WordPress بفرستد.

اجرای درخواست ساخت صفحه WordPress از MCP Inspector
Tool Call واقعی برای ساخت صفحه آزمایشی MCP Sandbox

۴.۶ خطای sites.json

در نسخه محلی Manager، sites.json هم یک نقطه خطا بود. وقتی JSON با کاراکتر یا ساختار نامعتبر ذخیره شد، Tool Error با پیام Unexpected token گرفتیم. این مسئله نشان داد فایل config باید با JSON معتبر و بدون wrapper اضافه ذخیره شود.

خطای JSON parsing در فایل sites.json برای WordPress MCP Manager
خطای parsing فایل sites.json

۵) ساخت Ali WordPress Connector

بعد از اثبات MCP، قدم بعدی حذف وابستگی به Bridgeهای پراکنده و ساخت یک Connector اختصاصی برای WordPress بود. نتیجه، افزونه Ali WordPress Connector شد که در نسخه 0.6.0 به سطحی رسید که می‌توانست هم REST، هم OpenAPI، هم MCP و هم OAuth 2.1 را ارائه کند.

قابلیت‌هایی که در Connector پیاده شد

  • REST base: /wp-json/ali-bridge/v1
  • MCP endpoint: /wp-json/ali-bridge/v1/mcp
  • OpenAPI endpoint برای مشاهده قرارداد ابزارها
  • OAuth 2.1 با PKCE S256 و Dynamic Client Registration
  • Legacy API Key برای اتصال Gateway
  • Content list/get/create/update/search/exact_patch
  • Post meta get/exact_patch
  • Media list
  • Theme file read/exact_patch با Backup
  • Bricks read و batch patch با hash verification
  • Rate limit و Audit Log اختیاری

در صفحه تنظیمات افزونه می‌توانستیم endpointها و Access Modeها را ببینیم. در اسکرین‌شات واقعی زیر، وضعیت OAuth به Ready (PKCE S256 + DCR) رسیده بود.

تنظیمات REST MCP OpenAPI OAuth و Access Mode در Ali WordPress Connector
Endpointها و Access Modeهای Ali WordPress Connector

API Key و نقش آن در Gateway

Connector یک API Key با prefix مشخص تولید می‌کند. این کلید برای اتصال Gateway به سایت استفاده می‌شود و باید مثل رمز عبور نگهداری شود. اگر کلید لو رفت، از Rotate API key استفاده می‌کنیم.

مدیریت و چرخش API Key در Ali WordPress Connector
دکمه‌های Revoke و Rotate API Key در Connector
امنیت
API Key را داخل مقاله، اسکرین‌شات عمومی، Git یا فایل اشتراکی
قرار ندهید. در این مستند هم مقدار واقعی کلیدها بازنشر نشده است.

۶) تلاش برای اتصال مستقیم Connector به ChatGPT

بعد از آماده شدن Connector، هدف جذاب‌تر این بود که مستقیم از داخل ChatGPT یک Custom MCP Server بسازیم. از منوی Add، گزینه Create custom MCP server را باز کردیم.

منوی ChatGPT برای ساخت Custom MCP Server
مسیر Create custom MCP server در ChatGPT
فرم Create custom MCP server در ChatGPT
فرم اولیه ساخت MCP سفارشی

۶.۱ خطای OAuth discovery

Server URL روی endpoint افزونه قرار گرفت و Authentication روی OAuth بود. اما ChatGPT نتوانست تنظیمات OAuth را کشف کند و پیام Couldn’t discover OAuth settings نشان داد.

خطای Could not discover OAuth settings هنگام اتصال MCP به ChatGPT
خطای OAuth discovery در ChatGPT

در تلاش بعدی، حتی وقتی بخش Advanced OAuth settings را باز کردیم، بعضی تنظیمات رد شدند و پیام Some app settings were rejected ظاهر شد.

پیام Some app settings were rejected در تنظیمات OAuth ChatGPT
رد شدن بعضی تنظیمات OAuth در فرم Custom MCP

۶.۲ User-Defined OAuth Client

برای تشخیص دقیق‌تر مشکل، حالت User-Defined OAuth Client را هم تست کردیم و Callback URL، Client ID و token endpoint auth method را تنظیم کردیم.

تنظیم Callback URL و Client ID برای OAuth Client در ChatGPT
تنظیم User-Defined OAuth Client در ChatGPT

۶.۳ ورود دستی Endpointها و Scopeها

در Advanced settings مقادیر Auth URL، Token URL، Registration URL، Resource و Scopeها را دستی وارد کردیم. این مرحله برای عیب‌یابی مفید بود، چون مشخص کرد Connector قرارداد لازم را دارد ولی discovery در مسیر شبکه متوقف می‌شود.

تنظیم دستی Auth URL Token URL Registration URL و Resource در ChatGPT
ورود دستی Endpointهای OAuth
تنظیم Scopeهای OAuth برای WordPress MCP در ChatGPT
نمونه تنظیم Scopeهای OAuth

۶.۴ OIDC لازم نبود

در یک مقطع OIDC را هم بررسی کردیم، ولی برای نیاز ما ضروری نبود. OAuth 2.1 با PKCE و DCR کافی بود؛ OIDC بیشتر برای دریافت هویت کاربر و UserInfo کاربرد دارد.

تنظیمات OIDC در Custom MCP Server ChatGPT
بخش OIDC در تنظیمات پیشرفته؛ در معماری نهایی خاموش ماند

۷) گلوگاه واقعی: .well-known و WAF هاست

تا اینجا Connector از نظر کد آماده بود، اما discovery هنوز شکست می‌خورد. بررسی دقیق‌تر نشان داد درخواست‌های ChatGPT قبل از رسیدن به WordPress در لایه هاست متوقف می‌شوند.

۷.۱ مشکل .well-known

OAuth discovery به مسیرهایی مثل /.well-known/oauth-protected-resource و /.well-known/oauth-authorization-server وابسته است. روی هاست، این مسیرها قبل از WordPress با 404 پاسخ داده می‌شدند. پشتیبانی هاست دسترسی .well-known را برای دامنه فعال کرد.

۷.۲ مشکل ModSecurity / User-Agent

بعد از حل 404، لاگ WAF نشان داد درخواست‌هایی با User-Agent حاوی python توسط Rule ID 210832 در فایل 04_agents.conf با 403 مسدود می‌شوند. برای دامنه alifatemii.ir آن Rule غیرفعال شد و discovery مستقیم بالاخره کار کرد.

درس معماری
اگر هر سایت مستقیم MCP Server نهایی باشد، این دردسر ممکن است
برای هر هاست تکرار شود. همین تجربه دلیل اصلی رفتن به سمت Gateway مرکزی
بود.

۸) تصمیم معماری: یک Gateway مرکزی برای همه سایت‌ها

در این نقطه سؤال اصلی این بود: آیا برای هر سایت جدید دوباره باید .well-known، WAF، OAuth و Custom MCP جدا بسازیم؟ پاسخ فنی این بود که می‌توانیم، اما برای مدیریت چند سایت طراحی خوبی نیست.

بنابراین Ali MCP Gateway طراحی شد. Gateway سه وظیفه اصلی دارد: ۱) احراز هویت ChatGPT در یک نقطه؛ ۲) نگهداری اطلاعات سایت‌ها و کلیدهای رمزنگاری‌شده؛ ۳) Route کردن Tool Callها به سایت درست.

مقدار / توضیح بخش
یک Custom MCP Server / Plugin واحد لایه ChatGPT
Cloudflare Worker Gateway Runtime
Cloudflare D1 دیتابیس
OAuth روی Gateway احراز هویت ChatGPT
X-Ali-Bridge-Key احراز هویت Gateway→WordPress
Read / Write / Files / Destructive به‌صورت مستقل سطح دسترسی
نکته مهم
Gateway نیاز به PowerShell روشن ندارد. PowerShell فقط برای
deploy، تغییر secret، D1 یا debug با wrangler tail لازم است.

۹) استقرار Ali MCP Gateway روی Cloudflare

Gateway در پکیج ali-mcp-gateway-v1.0.0 روی ویندوز آماده شد. مسیر کاری ما روی Windows داخل Downloads بود. مراحل زیر بازسازی دقیق همان Deploy است، با این تفاوت که مقادیر secret و شناسه‌های حساس با placeholder نوشته شده‌اند.

۹.۱ ورود به پوشه و نصب dependencyها

cd
C:\Users\User\Downloads\ali-mcp-gateway-v1.0.0\ali-mcp-gateway-v1.0.0
npm install

۹.۲ ساخت D1 Database

npx wrangler d1 create ali-mcp-gateway

Wrangler یک database_id برمی‌گرداند. همان ID باید در wrangler.toml و binding مربوط به DB قرار گیرد. شناسه واقعی پروژه را در نسخه عمومی مقاله بازنشر نمی‌کنیم.

۹.۳ اجرای schema.sql

npx wrangler d1 execute ali-mcp-gateway –remote
–file=.\schema.sql

اجرای موفق Schema جداول موردنیاز برای سایت‌ها، OAuth و تنظیمات را در D1 ایجاد می‌کند.

۹.۴ تعریف Secretها

npx wrangler secret put ADMIN_PASSWORD
npx wrangler secret put SESSION_SECRET
npx wrangler secret put MASTER_KEY

ADMIN_PASSWORD برای ورود به پنل مدیریت Gateway است. SESSION_SECRET برای session و MASTER_KEY برای رمزگذاری secretهای ذخیره‌شده استفاده می‌شود. این مقادیر نباید داخل wrangler.toml یا Git قرار بگیرند.

۹.۵ Deploy

npx wrangler deploy

بعد از Deploy، Worker یک آدرس workers.dev می‌دهد. در پروژه ما health endpoint را با curl.exe تست کردیم. در PowerShell بهتر است curl.exe را صریح بنویسید تا alias داخلی PowerShell مزاحم نشود.

curl.exe -i “https://YOUR-WORKER.workers.dev/health”
پاسخ مورد انتظار
HTTP 200 و JSON شبیه {“ok”:true,”service”:”Ali MCP
Gateway”,”version”:”1.0.0″,…}

۱۰) اتصال اولین سایت WordPress به Gateway

بعد از بالا آمدن Worker، وارد پنل Ali MCP Gateway شدیم. در شروع هیچ سایتی ثبت نشده بود. فرم Add site سه داده اصلی می‌خواهد: Name، Site URL و Ali Connector API key. در کنار آن سه Permission Ceiling برای Write، Theme Files و Destructive وجود دارد.

داشبورد Ali MCP Gateway و فرم Add Site پیش از اتصال سایت
پنل Ali MCP Gateway قبل از اضافه شدن اولین سایت

۱۰.۱ تست status endpoint قبل از Add

اگر Add and verify خطا می‌دهد، بهترین تست این است که دقیقاً همان Endpoint و Headerهای Gateway را از PowerShell بفرستید.

$KEY = Read-Host “Paste Ali Connector API key”

curl.exe -i “https://alifatemii.ir/wp-json/ali-bridge/v1/status” ` -H “Accept: application/json” ` -H “User-Agent: Ali-MCP-Gateway/1.0” ` -H “X-Ali-Bridge-Key: $KEY”

Remove-Variable KEY

در پروژه ما این تست HTTP 200 گرفت و WordPress 7.1.2، PHP 8.1.34 و قالب Planner Studio — Bricks Child را برگرداند. بنابراین خود Connector و API Key سالم بودند.

۱۰.۲ خطای 522

در یکی از تست‌های اولیه، Add and verify از Gateway خطای 522 گرفت. نکته مهم این بود که همین endpoint از اینترنت عادی 200 می‌داد؛ بنابراین مسیر Worker→Origin باید جدا بررسی می‌شد.

خطای HTTP 522 هنگام تست اتصال Ali MCP Gateway به WordPress
Connection test failed با HTTP 522
اگر 522 برگشت
بررسی کنید سایت پشت Cloudflare است یا نه، A/AAAA چه هستند، WAF
یا Anti-DDoS ورودی شبکه Cloudflare را محدود نکرده باشد و endpoint
/wp-json/ali-bridge/v1/status از بیرون قابل دسترس باشد.

۱۰.۳ ثبت موفق سایت

بعد از رفع مسیر اتصال، alifatemii با موفقیت در Gateway ثبت شد. همان پنل حالا سایت و permissionهای آن را نشان می‌داد.

داشبورد Ali MCP Gateway پس از اتصال موفق سایت alifatemii
نمای Gateway بعد از ثبت alifatemii

۱۱) اتصال Gateway به ChatGPT

از اینجا به بعد دیگر لازم نبود هر سایت WordPress را جدا به ChatGPT معرفی کنیم. فقط Gateway را یک‌بار به‌عنوان Custom MCP Server/Plugin ساختیم.

مقدار / توضیح بخش
Ali WordPress Manager Name
https://YOUR-WORKER.workers.dev/mcp Server URL
OAuth Authentication
Dynamic Client Registration (DCR) Registration
Off OIDC
wp:read Default scope پیشنهادی

بعد از OAuth approval، اولین تست فقط Read بود: «سایت‌های WordPress متصل به Gateway را لیست کن. هیچ تغییری ایجاد نکن.» سپس وضعیت alifatemii خوانده شد و نسخه WordPress، PHP و قالب فعال دقیقاً برگشت.

قاعده تست
همیشه اتصال جدید را با Read-only شروع کنید. بعد از موفق شدن،
Write را فعال کنید. Theme Files و Destructive را آخر از همه بالا
ببرید.

۱۲) تست واقعی قابلیت‌ها بعد از اتصال

۱۲.۱ Read

site_status روی alifatemii با موفقیت WordPress 7.1.2، PHP 8.1.34 و Planner Studio — Bricks Child را برگرداند. این یعنی مسیر ChatGPT → Gateway → Connector → WordPress از ابتدا تا انتها سالم بود.

۱۲.۲ Write

برای تست Write یک Draft با عنوان Gateway Write Test ساخته شد و سپس همان Draft دوباره خوانده شد. وضعیت draft باقی ماند و هیچ چیزی publish نشد. این تست ثابت کرد عملیات Create و Read-after-write کار می‌کند.

۱۲.۳ Bricks Read

برای صفحه اصلی alifatemii با ID 1525، ابزار Bricks توانست 389 element را بخواند و یک verification hash برگرداند. دریافت hash مهم است چون patch بعدی می‌تواند قبل از Commit بررسی کند داده از زمان Read تغییر نکرده باشد.

۱۲.۴ Theme Files Read

فایل style.css قالب child با موفقیت خوانده شد؛ اندازه 32694 بایت و hash فایل برگشت. همین تست نشان داد Gateway permission فایل و Connector file mode هر دو درست تنظیم شده‌اند.

۱۲.۵ Theme File Patch با Dry Run

برای اطمینان از امنیت patch، یک exact-match patch با dry_run=true اجرا شد. سیستم match_count=1 و before_hash/after_hash فرضی را برگرداند، اما بعد از dry run فایل دوباره خوانده شد و hash واقعی تغییر نکرد. این تست یکی از مهم‌ترین تست‌ها بود چون نشان داد می‌توان تغییر را پیش‌نمایش کرد بدون اینکه فایل واقعی دست بخورد.

الگوی امن ویرایش فایل
Read → ذخیره Hash → Dry Run → بررسی match_count و after_hash →
Commit واقعی → Read مجدد → در صورت نیاز Restore از Backup.

۱۳) تبدیل شدن سیستم به مدیریت چندسایتی

بعد از موفق شدن alifatemii، اضافه کردن سایت‌های بعدی بسیار سریع شد. دیگر هیچ Custom MCP جدیدی داخل ChatGPT نساختیم؛ فقط همان فایل Ali WordPress Connector 0.6.0 روی سایت جدید نصب شد، API Key تولید شد و رکورد سایت در Gateway ساخته شد.

مقدار / توضیح بخش
متصل؛ Read/Write/Bricks/Theme Files تست شد alifatemii
متصل؛ WordPress 7.1.2، PHP 8.1.34، Woodmart Child digikhab
متصل؛ WordPress 7.1.2، PHP 8.1.34، Woodmart apadanasivand
متصل؛ WordPress 7.1.2، PHP 8.1.34، Woodmart exir

در این مرحله مهم‌ترین نتیجه معماری مشخص شد: برای کار روزمره PowerShell دیگر لازم نیست باز باشد. Worker ابری مستقل از سیستم شخصی اجرا می‌شود.

روش استاندارد اضافه کردن سایت جدید

1) فایل ali-wordpress-connector-v0.6.0 را در WordPress نصب و Activate کن.

2) از Tools → Ali WordPress Connector وارد صفحه تنظیمات شو.

3) Writes و Advanced را بر اساس نیاز روشن کن. Theme Files فقط وقتی واقعاً لازم است.

4) Destructive را پیش‌فرض خاموش نگه دار.

5) API Key بساز یا Rotate کن و فقط همان لحظه کپی کن.

6) در Gateway نام کوتاه و واضح سایت، URL و API Key را وارد کن.

7) Gateway permission ceiling را تنظیم کن.

8) Add and verify site را بزن.

9) از داخل ChatGPT sites_list و site_status را اجرا کن و هیچ تغییری نده.

10) بعد از موفقیت، Write را با ساخت Draft تست کن.

۱۴) مدل امنیت و Permissionها

یکی از مهم‌ترین تصمیم‌های فنی پروژه، دو لایه کردن Permission بود. فقط روشن بودن قابلیت در WordPress کافی نیست؛ Gateway هم باید اجازه همان عملیات را بدهد. این یعنی Gateway یک سقف اضافه روی دسترسی سایت ایجاد می‌کند.

مقدار / توضیح بخش
پایه و کم‌ریسک؛ برای status، content، meta، media و Bricks read Read
ساخت/ویرایش محتوا و patchهای غیر destructive Write
عملیات پیشرفته Connector مانند Bricks و exact patch Advanced
خواندن و patch کردن فایل‌های child theme؛ بهتر است فقط زمان نیاز روشن
باشد
Theme Files
Restore/Delete و عملیات خطرناک؛ پیش‌فرض خاموش Destructive
یک نکته از تست فعلی
در یکی از بررسی‌های Gateway، alifatemii برای مدتی
allow_destructive=true دیده شد. در استفاده واقعی بهتر است این گزینه فقط
هنگام Restore یا عملیات مشخص روشن شود و بعد دوباره خاموش گردد.

۱۵) خطاهای مهمی که واقعاً دیدیم و راه‌حلشان

راه‌حل علت خطا
پکیج را با ساختار اصلی Extract کنید و setup را از همان Root اجرا
کنید.
ساختار Extract پکیج غلط بود یا setup.bat کنار مسیر مورد انتظار
نبود.
configure-windows.ps1 was not found
با MCP Inspector یا Client واقعی تست کنید؛ این پیام ثابت می‌کند
endpoint زنده است.
URL MCP را با مرورگر عادی باز کرده بودیم. Client must accept text/event-stream
تب Network و Protocol را بررسی و initialize/tools/list را جدا تست
کنید.
Handshake/transport یا server process کامل نبود. MCP Inspector: Failed
JSON را validate و فایل را UTF-8 با ساختار خالص JSON ذخیره
کنید.
فایل JSON نامعتبر یا با wrapper اضافه ذخیره شده بود. sites.json Unexpected token
protected-resource و authorization-server را مستقیم تست کنید و لاگ
WAF را ببینید.
مسیر .well-known از هاست قابل دسترس نبود یا WAF جلوی درخواست را
می‌گرفت.
Couldn’t discover OAuth settings
Rule مشخص دامنه را در هاست disable/allow کنید؛ از whitelist بی‌قاعده
خودداری کنید.
ModSecurity User-Agent شامل python را بلاک می‌کرد. 403 روی OAuth/MCP
A/AAAA، proxy، Firewall و route /wp-json/ali-bridge/v1/* را بررسی
کنید.
Worker توان اتصال به origin را نداشت یا upstream Cloudflare/Firewall
دخالت داشت.
Connection test failed: HTTP 522
از curl.exe استفاده کنید. curl در PowerShell می‌تواند alias Invoke-WebRequest باشد. PowerShell curl رفتار عجیب

۱۶) نسخه اجرایی: اگر بخواهی امروز از صفر همین سیستم را بسازی

مرحله A — WordPress Connector

1) روی یک سایت آزمایشی WordPress شروع کن، نه سایت تولیدی حساس.

2) Ali WordPress Connector 0.6.0 را نصب و Activate کن.

3) status endpoint را بدون secret تست نکن؛ از API Key و هدر درست استفاده کن.

4) Read را اول تست کن.

5) اگر Bricks یا Theme Files لازم داری، modeهای مربوط را روشن کن.

مرحله B — Gateway

1) Cloudflare account و Wrangler را آماده کن.

2) D1 Database بساز و database_id را در wrangler.toml بگذار.

3) schema.sql را روی Remote D1 اجرا کن.

4) ADMIN_PASSWORD، SESSION_SECRET و MASTER_KEY را به‌صورت secret تنظیم کن.

5) Worker را deploy کن و /health را تست کن.

مرحله C — ثبت سایت

1) API Key Connector را بساز.

2) در Gateway: Name، Site URL و API Key را وارد کن.

3) Write/Files/Destructive را به‌عنوان Gateway ceiling تعیین کن.

4) Add and verify را بزن.

5) اگر خطا بود، ابتدا /status را با همان Headerهای Gateway از PowerShell تست کن.

مرحله D — ChatGPT

1) یک Custom MCP Server برای Gateway بساز.

2) Server URL را روی /mcp خود Worker بگذار.

3) OAuth + DCR را استفاده کن؛ OIDC لازم نیست.

4) اول sites_list و site_status را اجرا کن.

5) بعد یک Draft بساز و دوباره بخوان.

6) بعد Bricks read و Theme File read را تست کن.

7) در نهایت Dry Run patch را اجرا کن.

تست نهایی موفق یعنی چه؟
وقتی بدون PowerShell روشن بتوانی از ChatGPT وضعیت چند سایت را
بخوانی، روی سایت انتخابی Draft بسازی، Bricks و Theme Files را بخوانی و
یک patch dry-run با hash verification بگیری، معماری اصلی کامل است.

۱۷) استفاده و نگهداری روزانه

بعد از Deploy، کار روزانه بسیار ساده‌تر از مرحله ساخت است. PowerShell نباید روشن بماند. فقط در موارد زیر دوباره به Wrangler/PowerShell نیاز دارید:

  • Deploy نسخه جدید Gateway
  • تغییر Secretها
  • مهاجرت یا Query مستقیم D1
  • مشاهده لاگ زنده با wrangler tail
  • عیب‌یابی Worker یا ارتباط Worker→WordPress

روال پیشنهادی برای تغییرات حساس

  • قبل از ویرایش صفحه Bricks، bricks_read و hash را بگیر.
  • برای patch فایل، ابتدا theme_file_read و hash را بگیر.
  • Dry Run را برای patch اجرا کن.
  • پس از Commit، همان منبع را دوباره بخوان و نتیجه را verify کن.
  • Destructive را فقط برای Restore روشن کن و پس از اتمام خاموش کن.

۱۸) جمع‌بندی تجربه

چیزی که این پروژه را جالب کرد فقط «وصل کردن WordPress به ChatGPT» نبود. ارزش اصلی تجربه در این بود که چند لایه متفاوت را کنار هم فهمیدیم: پروتکل MCP، Transportهای HTTP/STDIO، رفتار Inspector، REST WordPress، OAuth 2.1، DCR، PKCE، مسیرهای .well-known، WAF هاست، Cloudflare Worker، D1، مدیریت Secret و در نهایت طراحی Permission.

نسخه اول وابسته به کامپیوتر محلی بود. نسخه دوم از نظر UX بهتر بود ولی برای هر سایت OAuth و هاست را تکرار می‌کرد. نسخه نهایی با Gateway مرکزی این دو مشکل را حل کرد و سیستم را به یک زیرساخت واقعی چندسایتی تبدیل کرد.

الان مسیر نهایی برای اضافه کردن سایت جدید بسیار کوتاه است: Connector را نصب کن، API Key بساز، سایت را در Gateway اضافه و Verify کن. ChatGPT از همان Ali WordPress Manager مرکزی می‌تواند سایت جدید را ببیند. این دقیقاً همان نقطه‌ای است که پروژه از «آزمایش MCP» به «ابزار عملی روزمره» تبدیل شد.

معماری نهایی در یک خط
ChatGPT → Ali MCP Gateway → Ali WordPress Connector →
WordPress

ضمیمه A — Promptهای پیشنهادی برای تست

نمونه Prompt
سایت‌های WordPress متصل به Gateway را لیست کن. هیچ تغییری ایجاد
نکن.
نمونه Prompt
وضعیت سایت alifatemii را بررسی کن و نسخه WordPress، PHP و قالب
فعال را بگو. هیچ تغییری نده.
نمونه Prompt
یک نوشته Draft با عنوان Gateway Write Test بساز، منتشرش نکن،
بعد همان Draft را دوباره بخوان و تأیید کن.
نمونه Prompt
صفحه اصلی را از طریق Bricks فقط Read-only بررسی کن و تعداد
elementها و hash را بگو.
نمونه Prompt
فایل style.css قالب فرزند را فقط بخوان و size و hash را گزارش
کن.
نمونه Prompt
یک Theme File Patch آزمایشی با dry-run انجام بده؛ هیچ تغییری
واقعی اعمال نکن.

ضمیمه B — نکات انتشار عمومی این مقاله

  • API Key، Application Password، ADMIN_PASSWORD، SESSION_SECRET و MASTER_KEY را هرگز منتشر نکن.
  • اگر اسکرین‌شات جدیدی اضافه می‌کنی، قبل از انتشار Tokenها و ایمیل/شناسه‌های حساس را Mask کن.
  • Worker URL به‌خودی‌خود secret نیست، اما در مقاله عمومی بهتر است از YOUR-WORKER به‌عنوان مثال استفاده شود.
  • هر API Key که قبلاً در چت یا اسکرین‌شات عمومی دیده شده بهتر است Rotate شود.