سرور MCP پرامپت‌کت یک سرور واقعی است که می‌توانید همین حالا به کلاینت خود وصل کنید: روی درگاه راه‌دور ۱۰ ابزار می‌دهد و پاسخ هر جست‌وجو زیر ۲۵۰ میلی‌ثانیه برمی‌گردد. اما بسته‌ی محلی با همان نام فقط ۲ ابزار دارد، چون یک پروکسی نازک است که خودش هیچ پایگاه داده‌ای ندارد. در این پست هر دو مسیر را اجرا می‌کنیم، ابزارهایی را که فقط از راه دور در دسترس‌اند جدا می‌کنیم، و اندازه می‌گیریم هر فراخوانی چقدر از پنجره‌ی زمینه‌ی شما را می‌خورد.

اولین فراخوانی واقعی روی درگاه راه‌دور

سرور MCP پرامپت‌کت روی یک نشانی عمومی پاسخ می‌دهد و برای خواندن هیچ کلیدی نمی‌خواهد. لحظه‌ی خواندن: ۷ اکتبر ۲۰۲۶. اولین کاری که هر کلاینت MCP می‌کند یک دست‌دادن است و بعد فهرست ابزارها را می‌گیرد.

# هدر Accept باید هر دو نوع پاسخ را بپذیرد
curl -s -X POST https://prompts.chat/api/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"hoosh","version":"0.1"}}}'

پاسخ در ۰٫۰۷۴ ثانیه آمد و نسخه‌ی پروتکل را ۲۰۲۵-۰۶-۱۸ اعلام کرد. سرور خودش را prompts-chat با نسخه‌ی ۱٫۰٫۰ معرفی می‌کند و دو قابلیت اعلام می‌کند: prompts و tools.

{"result":{"protocolVersion":"2025-06-18","capabilities":{"prompts":{"listChanged":false},"tools":{"listChanged":true}},"serverInfo":{"name":"prompts-chat","version":"1.0.0"}},"jsonrpc":"2.0","id":1}

نکته‌ی عملی این است که همان یک نشانی هم برای کلاینت MCP و هم برای درخواست معمولی HTTP کار می‌کند. یعنی اگر کلاینت شما MCP نیست، باز هم می‌توانید با همان curl پرامپت بگیرید و لازم نیست کتابخانه‌ای نصب کنید. همین نشانی در پست پیشین درباره‌ی تشخیص نسل پروتکل هم محور آزمون بود.

ده ابزار، و هشت‌تایشان فقط روی درگاه راه‌دور است

پس از دست‌دادن، فراخوانی tools/list فهرست کامل ابزارها را برمی‌گرداند. پاسخ ۸۳۳۰ بایت بود و ۱۰ ابزار در آن فهرست شد.

ابزارکارش چیستکلید می‌خواهد
search_promptsجست‌وجوی پرامپت با کلیدواژهنه
get_promptگرفتن متن کامل یک پرامپت با شناسهنه
search_skillsجست‌وجو در اسکیل‌های چندفایلینه
get_skillگرفتن یک اسکیل با همه‌ی فایل‌هایشنه
improve_promptبازنویسی پرامپت با کمک مدلبله
save_promptذخیره‌ی پرامپت در حساببله
save_skillذخیره‌ی اسکیل چندفایلیبله
add_file_to_skillافزودن یک فایل به اسکیل موجودبله
update_skill_fileویرایش یک فایل از اسکیلبله
remove_file_from_skillحذف یک فایل از اسکیلبله

حالا بخش مهم. اگر به‌جای درگاه راه‌دور، بسته‌ی محلی را نصب کنید، فقط دو ابزار اول را می‌بینید. این را پنج بار با پنج دست‌دادن مستقل اندازه گرفتم و در هر پنج بار نتیجه یکسان بود.

$ python3 compare_endpoints.py
=== remote ===
https://prompts.chat/api/mcp               serverInfo=1.0.0   tools=10  (prompts-chat)

=== the two local entry points ===
prompts.chat mcp  (README)                 serverInfo=1.0.9   tools= 2
prompts-chat-mcp    (API docs)             serverInfo=1.0.9   tools= 2

=== verdict ===
same server version   : True (1.0.9 vs 1.0.9)
same tool set locally : True
local tools == remote : False
missing locally       : ['add_file_to_skill', 'get_skill', 'improve_prompt',
                         'remove_file_from_skill', 'save_prompt', 'save_skill',
                         'search_skills', 'update_skill_file']

به این نکته دقت کنید که نسخه‌ی سرور محلی ۱٫۰٫۹ است و از نسخه‌ی راه دور ۱٫۰٫۰ بالاتر قرار دارد. پس این عقب‌گرد کهنه‌شدن نیست؛ نسخه‌ی بالاتر ابزارهای کمتری معرفی می‌کند. هر دو بسته، یعنی prompts.chat و بسته‌ای که مستندات API نام برده، دقیقا یک مجموعه ابزار می‌دهند.

ریشه‌ی اختلاف در کد است، نه در نسخه

بسته‌ی محلی یک فایل اجرایی ۵۷۹۶ بایتی دارد. در آن، آدرس بالادستی ثابت نوشته شده و فقط دو فراخوانی ثبت ابزار وجود دارد.

const PROMPTS_CHAT_API_BASE = "https://prompts.chat/api/mcp";
const USER_AGENT = "prompts-chat-mcp/1.0.9";
const PROMPTS_API_KEY = process.env.PROMPTS_API_KEY;

// Forward prompts/list to upstream
server.server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
    const response = await callPromptsChatMcp("prompts/list", { ... });
    ...
});

// Tool: search_prompts
server.registerTool("search_prompts", { ... }, async ({ query, limit, ... }) => { ... });

// Tool: get_prompt
server.registerTool("get_prompt", { ... }, async ({ id }) => { ... });

پس سرور محلی پایگاه داده‌ی خودش را ندارد و هر فراخوانی را به همان نشانی راه دور می‌فرستد. برای اثبات، سرور محلی را داخل یک فضای نام شبکه‌ی بدون مسیر بیرونی اجرا کردم.

$ unshare -rn bash -c "ip link set lo up; python3 offline_search.py"
initialize answered: True
tools/list answered: 2
search isError: True
search text   : {"error":"fetch failed"}

# همان اسکریپت، با شبکه‌ی سالم
initialize answered: True
tools/list answered: 2
search isError: None
search text   : {"query":"code review","count":3,"prompts":[...]}

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

هزینه‌ی واقعی هر فراخوانی روی پنجره‌ی زمینه

هر چیزی که این سرور به کلاینت برمی‌گرداند وارد پنجره‌ی زمینه می‌شود. اندازه‌ی پاسخ‌ها را برای شش فراخوانی واقعی در همین اجرا اندازه گرفتم.

فراخوانیتعداد نتیجهبایت پاسخزمان
جست‌وجوی پرامپت با limit برابر ۱11280154 ms
جست‌وجوی پرامپت با limit برابر ۱۰107773207 ms
جست‌وجوی پرامپت با limit برابر ۵۰4638229214 ms
گرفتن یک اسکیل با متن کامل2737530527105 ms
جست‌وجوی اسکیل با limit برابر ۵۰2198197 ms
جست‌وجوی بی‌نتیجه0167130 ms

روش تخمین توکن: تقسیم بر ۳٫۵ کاراکتر بر توکن. جمع شش فراخوانی بالا ۷۹۹۵۷ بایت است، یعنی حدود ۲۲۸۴۴ توکن. یعنی یک نشست که چند جست‌وجوی بی‌دلیل انجام دهد، به‌سرعت ده‌ها هزار توکن را فقط صرف خواندن نتیجه‌ها می‌کند.

نکته‌ی اصلی در تفاوت بین limit یک و limit پنجاه است. یک جست‌وجو با limit پنجاه که ۴۶ نتیجه برگرداند، حدود ۳۰ برابر بزرگ‌تر از limit یک است. چون پیش‌نمایش متن هر نتیجه حدود ۳۰۳ کاراکتر است. پس همیشه با limit کوچک شروع کنید و بعد فقط یکی را کامل بخوانید.

مرز احراز هویت را هم آزمودم

شش ابزار از ده ابزار بدون کلید کار نمی‌کنند. این را با یک آزمون منفی ثابت کردم، نه با خواندن مستندات.

$ curl -s -X POST https://prompts.chat/api/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"save_prompt","arguments":{"title":"t","content":"x"}}}'
{"result":{"content":[{"type":"text","text":"{\"error\":\"Authentication required. Please provide an API key.\"}"}],"isError":true},"jsonrpc":"2.0","id":1}

در همین آزمون، شناسه‌ی نامعتبر هم پاسخ درست و کوتاهی گرفت. یعنی خطاها قابل تشخیص‌اند و لازم نیست از نبود پاسخ حدس بزنید.

# با شناسه‌ی نامعتبر
{"error":"Prompt not found"}

# و یک ناهماهنگی دیگر که در همین تست پیدا شد:
# مستندات نام هدر را PROMPTS_API_KEY می‌نویسد،
# ولی کد بسته‌ی محلی PROMPTS-API-KEY را می‌فرستد.
# هر سه نام را با یک کلید نامعتبر آزمودم و هر سه
# پاسخ یکسانی دادند، پس از این آزمون به‌تنهایی
# نمی‌توان گفت سرور کدام را می‌خواند.

جمع‌بندی روشن است: سرور محلی را فقط وقتی انتخاب کنید که می‌خواهید کلاینت یک فرمان نپرسد و هدر را خودش مدیریت کند. وگرنه درگاه راه دور هم همان دو ابزار را با همان کیفیت می‌دهد و هشت ابزار دیگر را هم به شما اضافه می‌کند. برای پیوند دادن یک سرور به کلاینت کدکس، روش تایپ‌دار و کم‌دردسرتر را در پست درباره‌ی کلید مسر در کدکس توضیح داده‌ام.

منابع

  1. ریپوی prompts.chat در گیت‌هاب، پرامپت‌ها و مهارت‌های جامعه
  2. مستندات API و MCP پرامپت‌کت، شامل فهرست ابزارها و نام هدر کلید
  3. فایل خواندنی ریپوی prompts.chat، شامل خط نصب با npx
  4. صفحه‌ی بسته‌ی prompts.chat در npm، نسخه‌ی 0.1.1
  5. مستندات MCP کلاد کد، افزودن سرور به کلاینت
  6. مشخصات چرخه‌ی حیات MCP در نسخه‌ی 2025-06-18
  7. مستندات افزونه‌های کلاد کد
  8. فهرست عمومی پرامپت‌ها در prompts.chat