Skip to main content
Glama
DreamShaded

MCP App Proxyfier

by DreamShaded

MCP App Proxyfier

MCP-сервер, который отдаёт в чат с моделью интерактивные MCP Apps (официальное UI-расширение MCP, рендерится в песочнице-iframe хоста). Вместо текстовой обёртки над запросами зритель получает нативный UI прямо в диалоге.

Реализован один вылизанный флоу на настоящих данных: Megamarket — поиск товаров → грид → детальная страница → корзина → оформление.

Данные статические: каталог собран из сохранённых снапшотов реальных страниц megamarket.ru (pages/) скриптом pnpm update:data. Сеть и браузер на демо не нужны — сервер стартует мгновенно и отвечает одинаково при любом Wi-Fi в зале.

Сценарий живого демо (без MCP → MCP без UI → MCP с UI → MCP с UI и скиллом) — в DEMO.md.

Структура

packages/
  ui/      React + Vite; собирается в самодостаточные HTML (по одному на приложение)
  server/  MCP-сервер, отдаёт UI как ui:// ресурсы + инструменты
pages/     HAR/HTML-снапшоты megamarket.ru — сырьё для pnpm update:data

UI собирается в два самодостаточных HTML-бандла — index (каркасный ping) и megamarket; все JS/CSS встроены, внешних ссылок нет (требование песочницы-iframe). Сервер на старте читает эти HTML и регистрирует как ui:// ресурсы.

Related MCP server: FakeStore MCP

Инструменты

Инструмент

Вход

UI

Назначение

ping

echo?

ping.html

Каркасная проверка рендера iframe

search_products

query, filters?

Поиск товаров, результат только текстом (список позиций)

search_products_widget

query, filters?

megamarket.html

Тот же поиск + грид карточек виджетом

search_products_advised

query, filters?

megamarket.html

Тот же поиск + виджет; описание обязывает прочитать skill://shopping-advisor

get_product

id

megamarket.html

Карточка товара: галерея, таблица «О товаре», описание

get_delivery_calendar

Сегодня/завтра + ближайшие 7 дней с днями недели

add_to_cart

id

megamarket.html

Добавляет товар в корзину

view_cart

megamarket.html

Текущее состояние корзины

checkout

megamarket.html

Оформляет заказ по корзине, возвращает подтверждение и очищает её

filters — ценовой коридор priceMin / priceMax и срок доставки deliveryBy (YYYY-MM-DD; оставляет только то, что приедет не позже).

get_delivery_calendar существует потому, что у модели нет часов: «до пятницы» она сама в число не превратит — либо выдумает, либо отсчитает от даты обучения. Скилл обязывает вызвать календарь до поиска, отсюда и порядок вызовов в демо.

Три варианта поиска — это ступени живого демо (без UI → с UI → с UI и методичкой). Они существуют одновременно на одном подключении, переключение идёт формулировкой запроса, без перезапуска сервера. Почему их три, а не один с параметром: привязка UI живёт в _meta.ui.resourceUri на регистрации инструмента и уезжает клиенту в tools/list — результат вызова её изменить не может.

Корзина — in-memory, одна на процесс сервера: перезапуск её обнуляет.

Ресурсы ui://

MCP Apps: самодостаточный HTML, который хост рендерит в песочнице-iframe и кормит structuredContent результата инструмента через мост. MIME — text/html;profile=mcp-app.

URI

Собирается из

Кто рендерит

ui://mcp-app-proxyfier/ping.html

packages/ui/index.htmldist/index.html

ping

ui://mcp-app-proxyfier/megamarket.html

packages/ui/megamarket.htmldist/megamarket.html

все инструменты Megamarket

Приложение Megamarket — мини-SPA: выдача → деталка → корзина → подтверждение. Какой вид показать, оно решает по форме пришедшего structuredContent: products — выдача, product — деталка, cart — корзина.

Виджет интерактивный, а не картинка:

  • чипы фильтров над гридом (бренд, шумоподавление) — фильтруют внутри iframe, без вызова инструмента и без нового пузыря в чате;

  • клик по карточке открывает деталку (get_product через мост), «Назад» возвращает в тот же отфильтрованный список — состояние фильтров переживает переход;

  • деталка открывается и голосом («покажи подробнее вот эти») — вид тот же самый;

  • «В корзину» на карточке и на деталке — app-initiated add_to_cart(id); ответ несёт актуальную корзину, поэтому бейдж обновляется без отдельного view_cart.

Фильтры виджета сознательно не трогают доставку: срок задаёт агент через filters.deliveryBy на сервере. Иначе виджет молча показывал бы то, что агент уже отсёк.

Ресурсы skill://

Методички для агента. В отличие от ui:// это не MCP Apps — рендерить нечего, это обычный текст, который агент читает перед вызовом инструмента.

URI

MIME

Назначение

skill://index.json

application/json

Индекс скиллов — точка входа, по которой агент находит остальные

skill://shopping-advisor/SKILL.md

text/markdown

Подбор товара: уточнить бюджет и сценарий, перевести бюджет в filters, сравнивать по цене и объёму отзывов, не вестись на витринную скидку

Индекс и сами методички собираются из одного SkillDefinition (packages/server/src/skills/skill-registry.ts), поэтому имя и описание в индексе не могут разъехаться с ресурсом.

Данные

Каталог — packages/server/data/market.json (70 товаров, у всех есть детальная карточка). Пересобирается из снапшотов:

pnpm update:data              # разбирает pages/ → packages/server/data/market.json
pnpm update:data -- --dry-run # только показать, что распарсилось, ничего не писать

Скрипт идемпотентен: повторный прогон просто перезаписывает файл. Сеть не трогает.

Выдача поиска ограничена девятью позициями (SEARCH_RESULT_LIMIT) — грид 3×3 в узком чат-iframe.

Сроки доставки — синтетические

packages/server/data/delivery.json не собирается из снапшотов: настоящий срок (calculatedDeliveryDate в SSR-стейте страниц) есть ровно у одного товара каталога из 70, а на выдаче Мегамаркет его не отдаёт вовсе. Формат подписей при этом взят у сайта: он пишет только «Сегодня», «Завтра» и дату вида «15 июля» — «Послезавтра» у него нет.

В файле лежат дни, а не даты: дата считается в рантайме от сегодня, поэтому «Завтра» остаётся завтрашним и через месяц. Товары, которых в файле нет, получают детерминированный срок по хешу id — одинаковый между запусками, чтобы выдача не «дышала».

Флаг anc (активное шумоподавление) поднимается в «плоский» DTO из характеристик, чтобы виджет фильтровал грид без запроса деталки на каждый товар. null означает «характеристики нет в снапшоте», а не «шумоподавления нет».

Требования

  • Node.js 22+ (рекомендуется 24)

  • pnpm 11+

Сборка

pnpm install
pnpm build          # сначала собирает HTML-бандлы UI, затем сервер

pnpm build сначала собирает UI (самодостаточные HTML со встроенными JS/CSS — без внешних источников, как требует песочница-iframe), затем компилирует сервер, который на старте читает эти HTML и регистрирует как ui:// ресурсы.

Превью виджета в браузере

Посмотреть виджет без Claude Desktop:

pnpm --filter @mcp-app-proxyfier/ui exec vite
# → http://localhost:5173/preview.html

Рендерит те же компоненты вью, что и боевое приложение, на настоящем ответе сервера. Работают чипы фильтров, заход в карточку и возврат в отфильтрованный список. Кейс открывается ссылкой: ?case=friday, ?case=detail, ?case=cart.

Фикстуры пересобираются с живого сервера, руками их править не надо:

pnpm build            # превью читает ответы собранного сервера
pnpm update:fixtures  # → packages/ui/src/preview/fixtures.json

Даты доставки в фикстуре заморожены на момент снятия (превью — про вёрстку, не про календарь). Протухли подписи вроде «Завтра» — просто перезапустите update:fixtures.

Чего в превью нет: postMessage-моста и вызовов инструментов — «Подробнее» берёт деталку из фикстуры, а не дёргает get_product; «В корзину» показывает снимок корзины, а не вызывает add_to_cart. Мост и рендер iframe проверяются только вживую, в Claude Desktop (см. «Ручная проверка рендера» ниже). В продакшен-сборку превью не попадает: pnpm build:ui собирает только index и megamarket.

Тесты

pnpm test           # typecheck (включая тесты) + прогон

Тесты проверяют внешнее поведение через швы: инструменты MCP как чёрные ящики (поднимается настоящий McpServer на in-memory транспорте), загрузку статического каталога (включая деградацию товара без богатой детали), сроки доставки, реестр скиллов и выбор транспорта. Рендер iframe проверяется вручную (см. ниже) — в CI его нет.

Тесты тайпчекаются вместе с кодом: гоняет их tsx, который типы не проверяет, поэтому раньше tsc молча зеленел на тестах, ссылающихся на удалённые модули. Сборка идёт отдельным конфигом (tsconfig.build.json), чтобы тесты не попадали в dist/.

Запуск / регистрация в Claude Desktop

Сервер говорит по MCP через stdio: Claude Desktop запускает его как дочерний процесс. После pnpm build пропишите его в конфиг Claude Desktop.

Расположение файла конфигурации:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Добавьте (замените путь на абсолютный путь к этому репозиторию):

{
  "mcpServers": {
    "mcp-app-proxyfier": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-app-proxyfier/packages/server/dist/index.js"]
    }
  }
}

Затем полностью закройте и заново откройте Claude Desktop.

Ручная проверка рендера (главный риск демо)

Главный риск — баг рендера iframe на хосте (ext-apps #671): клиент согласует UI-возможность и тянет ресурс, но не рисует iframe. Поэтому его проверяют глазами на боевой сборке.

В чате Claude Desktop попросите модель вызвать инструмент ping (например, «вызови инструмент ping с echo hello»). Убедитесь визуально:

  1. В чате нарисован интерактивный iframe (карточка с заголовком «MCP App Proxyfier»), а не только текстовый результат.

  2. Карточка показывает message: pong, echo: hello и таймстамп — то есть structuredContent инструмента дошёл до UI через мост.

Если виден только текст и iframe не рисуется — баг #671 воспроизведён: зафиксируйте версию Claude Desktop и держите наготове запасной текстовый сценарий для демо.

Абстракция транспорта

Сервер не зависит от транспорта. Инструменты и ресурсы регистрируются на McpServer без знания о канале. Транспорт выбирается за швом ServerTransportProvider (packages/server/src/transport/): stdio (по умолчанию) и http (Streamable HTTP). Оба провайдера регистрируют ровно те же инструменты и ui:// ресурсы — добавление HTTP не потребовало правок кода инструментов или ресурсов.

Транспорт выбирается флагом или переменной окружения (флаг приоритетнее):

Параметр

Флаг

Env

По умолчанию

Транспорт

--transport stdio|http

MCP_TRANSPORT

stdio

Интерфейс прослушивания

--host

MCP_HTTP_HOST

127.0.0.1

Порт

--port

MCP_HTTP_PORT

3000

Путь эндпоинта

--path

MCP_HTTP_PATH

/mcp

Bearer-токен

--token

MCP_HTTP_TOKEN

(выкл.)

Флаги понимают обе формы: --port 3000 и --port=3000.

Удалённый коннектор (Streamable HTTP)

Для демо, где владелец подключает коннектор сам (custom connector в claude.ai), а не Claude Desktop запускает его локально. Это альтернативный канал к тому же серверу — stdio-демо он не блокирует.

  1. Соберите и запустите сервер по HTTP (слушает на 127.0.0.1:3000/mcp). Туннель делает порт публичным, поэтому задайте MCP_HTTP_TOKEN — запросы без Authorization: Bearer <token> отклоняются с 401:

    pnpm build
    MCP_TRANSPORT=http MCP_HTTP_TOKEN="$(openssl rand -hex 16)" pnpm start
    # токен выкл. (только локально, без туннеля): pnpm start -- --transport http
  2. Откройте публичный HTTPS-туннель к этому локальному порту:

    cloudflared tunnel --url http://127.0.0.1:3000
    #   → печатает https://<random>.trycloudflare.com
    # альтернатива ngrok:
    #   ngrok http 3000   → https://<random>.ngrok-free.app

    URL коннектора — это origin туннеля плюс путь эндпоинта, например https://<random>.trycloudflare.com/mcp.

  3. В claude.ai → Settings → Connectors → Add custom connector вставьте этот URL (и Bearer-токен в поле авторизации коннектора, если вы его задали). Claude инициализирует сессию Streamable HTTP и показывает те же инструменты и ui:// приложения, что и stdio.

Ручная проверка (рендер iframe на хосте, ext-apps #671). Как и для stdio, убедитесь визуально, что результат инструмента рисует интерактивный iframe в чате claude.ai, а не только текст. Баг рендера #671 — клиентский и не связан с транспортом, но его нужно перепроверить на claude.ai: сборка хоста отличается от Claude Desktop.

Замечания:

  • Один запущенный процесс держит одну сессию Streamable HTTP — одного докладчика за туннелем.

  • Реконнект = перезапуск. При чистом отключении claude.ai шлёт завершение сессии и повторное подключение работает; после грязного обрыва (туннель умер) проще всего Ctrl-C и заново --transport http, если коннектор потерял сессию.

  • Прослушивание остаётся на localhost намеренно; не слушайте 0.0.0.0 — доступ к серверу только через туннель. Защита от DNS-rebinding выключена намеренно (host туннеля динамический); доступ охраняет Bearer-токен MCP_HTTP_TOKEN.

  • После демо погасите туннель — URL является секретом.

Available Tools

9 tools
add_to_cartДобавить в корзину MegamarketA

Добавляет товар в корзину (по id из выдачи/деталки) и возвращает актуальное состояние корзины.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesИдентификатор товара из выдачи search_products или get_product

Output Schema

ParametersJSON Schema
NameRequiredDescription
cartYes
addedYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It discloses the side effect (add to cart) and the return value (current cart state), but it does not mention authentication requirements, duplicate-item behavior, or error conditions, leaving some behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that starts with the action, specifies the id source in parentheses, and states the return value. Every phrase is meaningful; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema and clear sibling context, the description is sufficiently complete: it states the action, the id source, and the returned cart state. It lacks minor behavioral details like duplicate handling, but the tool's simplicity and existing output schema mitigate the impact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'id' is fully described in the schema as from search_products or get_product, and the tool description mirrors this by saying 'по id из выдачи/деталки'. Since schema coverage is 100%, the description adds no new parameter semantics beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Добавляет' with the resource 'корзину' and specifies that it works by product id from search or detail pages, clearly distinguishing it from sibling tools like view_cart and checkout. The scope is immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use after obtaining an id via search_products/get_product, which gives a clear workflow context. However, it does not explicitly state alternatives or exclusions (e.g., when not to use), so it falls just short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

checkoutОформление MegamarketA

Оформляет заказ по текущей корзине и возвращает подтверждение с её снимком.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cartYes
confirmedAtYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It states that it places an order and returns a confirmation with a snapshot of the cart, which is useful. However, it does not mention that checkout is likely irreversible, may trigger payment, or that the cart will be emptied—important details for a mutating action like this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that clearly states the action and outcome. It contains no filler or redundant information, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a checkout action that has significant side effects (financial transaction, cart clearing), yet the description only mentions placing an order and returning confirmation. It lacks prerequisites like having items in the cart or having payment details configured. An output schema exists for return values, but the behavioral context is still incomplete for such a complex action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The input schema is empty, and no parameter descriptions are needed. The description adds no parameter semantics, but no such semantics are required for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Оформляет заказ' (places/checks out order) with a clear resource 'текущей корзине' (current cart). It distinctly performs a final purchase action, differentiating it from sibling tools like view_cart and add_to_cart which manage the cart rather than complete it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when the user has a current cart ready to check out, and returns a confirmation. However, it does not explicitly state when to use this tool over alternatives, such as mentioning it should be used after adding items to the cart or that it should not be used for merely viewing cart contents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_delivery_calendarКалендарь доставкиA

Возвращает сегодняшнюю и завтрашнюю дату плюс ближайшие 7 дней с днями недели. Вызывай ПЕРЕД поиском всегда, когда пользователь говорит о сроке словами — «завтра», «до пятницы», «к выходным», «на этой неделе». Своих часов у тебя нет: без этого вызова дату подставлять нельзя. Полученную дату передавай в search_products* как filters.deliveryBy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
todayYes
tomorrowYes
upcomingYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full responsibility. It discloses the return format (today, tomorrow, plus 7 days with weekdays) and the critical dependency on this call for any date substitution. It doesn't mention timezone or edge cases, but the output schema covers exact structure, so this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences that each serve a distinct purpose: what it does, when to call, why it's necessary, and how to use the result. The core function is front-loaded and there is no redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with an output schema, the description fully covers the tool's role, usage, and output integration. It leaves no ambiguity about why and how to invoke it, making it complete in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, making schema coverage trivially 100%. Per the baseline for 0 params, a score of 4 is appropriate; no parameter explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns today's and tomorrow's dates plus the next 7 days with weekdays. This specific verb+resource distinctly separates it from sibling search/cart tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to call before searching whenever the user specifies a date verbally, provides concrete examples ('tomorrow', 'by Friday'), and states the tool is mandatory because the agent has no clock. It also directs how to pass the result to search_products*.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_productКарточка товара MegamarketA

Возвращает детальную карточку товара Megamarket (галерея, цена, характеристики, описание) по его id из выдачи.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesИдентификатор товара из выдачи search_products

Output Schema

ParametersJSON Schema
NameRequiredDescription
productYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the burden. It clarifies the return content (gallery, price, characteristics, description) but does not explicitly state that it is a read-only operation or disclose error/rate-limit behavior. The verb 'returns' implies a safe read, but more context would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no wasted words; the core verb, target resource, and key parameter context are all present up front.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter, an existing output schema, and simple read semantics, the description covers the necessary context: what is returned, how to obtain the id, and the scope (Megamarket). No further information is critically needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides a description for the id parameter (identifier from search_products output). The tool description merely repeats this provenance ('по его id из выдачи') without adding new details, so it does not surpass the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the verb 'Возвращает' (returns) and specifies a detailed product card with gallery, price, characteristics, and description, keyed by product id from search results. This clearly distinguishes it from sibling tools like search_products that return lists.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states that the id comes from search_products output, implying this tool is used after a search to fetch details. However, it does not explicitly mention alternative tools or exclusion criteria, only that the id originates from search results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingPingA

Health check that renders the minimal MCP App and echoes an optional message.

ParametersJSON Schema
NameRequiredDescriptionDefault
echoNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
echoYes
messageYes
timestampYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of explaining behavior. It discloses that the tool renders the minimal MCP App and echoes an optional message, covering its primary actions. It does not explicitly state side effects, but the description implies a safe, non-destructive health check, which is sufficient for a ping tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the purpose, behavior, and parameter semantics without any filler. Every word contributes value, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is extremely simple: one optional parameter and an output schema that presumably defines the echo response. The description covers the main behavior and parameter, and since an output schema exists, the description does not need to explain return values. It is complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter 'echo' with no description (0% schema coverage). The description directly explains this parameter by stating it 'echoes an optional message,' fully compensating for the schema gap and clarifying both the parameter's purpose and its optionality.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('echoes') and identifies the resource ('health check') and scope (minimal MCP App). It clearly distinguishes this from sibling tools, which are product/cart operations, making it a health-check utility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly labels this as a health check, implying it is for verifying connectivity/availability. It does not explicitly list alternatives or exclusion criteria, but the sibling tools are all product-related, so the usage context is clear without needing explicit 'use when' statements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_productsПоиск товаров Megamarket (только текст)A

Ищет товары в каталоге Megamarket и возвращает результат ТОЛЬКО ТЕКСТОМ — списком позиций. Интерактивный виджет не рендерится. Использовать по умолчанию, когда пользователь просто просит найти товар и НЕ просил показать виджет, карточки или интерактивную выдачу, и НЕ просил подобрать товар или помочь с выбором.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesПоисковый запрос, например «беспроводные наушники»
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
productsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses a key behavioral trait: the output is text-only and interactive widgets are not rendered. However, it doesn't mention potential rate limits, empty results handling, or side effects, but for a search tool the most critical behavior is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core functionality (text-only search results) and then clear usage guidance. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to explain return values. It adequately covers when to use the tool and the essential text-only behavior. The missing details on filters are a minor gap, but overall it is sufficiently complete for selecting and invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% (query is described, filters object is not). The description does not mention filters at all, leaving the meaning and usage of the filters parameter undocumented. The description adds no value beyond the schema for parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the Megamarket catalog and returns a text-only list of items. It explicitly distinguishes from sibling tools like search_products_widget and search_products_advised by noting that the interactive widget does not render and that it handles simple search requests, not product selection advice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Use by default' and specifies when to avoid it (when user asks for widget, cards, interactive output, or product selection help). This clearly differentiates from alternatives and gives concrete selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_products_advisedПодбор товара Megamarket (виджет + методичка)A

Подбирает товар под задачу пользователя и рендерит интерактивный виджет — грид карточек. ОБЯЗАТЕЛЬНО: перед первым вызовом прочитай ресурс skill://shopping-advisor/SKILL.md и следуй методичке (уточни бюджет и сценарий использования, переведи бюджет в filters, сравнивай по цене и объёму отзывов, предложи 2–3 варианта с разным компромиссом). Использовать, когда пользователь просит ПОДОБРАТЬ товар или ПОМОЧЬ ВЫБРАТЬ, а не просто найти.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesПоисковый запрос, например «беспроводные наушники»
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
productsYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses several behavioral traits: rendering a widget, mandatory prerequisite reading of skill://shopping-advisor/SKILL.md, asking clarifying questions, and comparing by price/review volume. It does not elaborate on side effects or state changes, but the tool is clearly advisory and non-destructive in intent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but dense, using two sentences plus a mandatory instruction. Every clause earns its place, covering purpose, prerequisites, usage context, and methodology. It is front-loaded with the core function, and while packed, it remains clear and not overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is contextually complete for a complex tool with nested parameters and an output schema. It explains what the tool does, when to use it (vs simply searching), mandatory prep (SKILL.md), the step-by-step approach, and the expected deliverable (interactive widget with 2-3 tradeoff options). The output schema covers return-value details, so no further explanation is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema coverage is 50%: only 'query' has a description, while filters properties (priceMax, priceMin, deliveryBy) lack descriptions. The description adds value by instructing to 'translate budget into filters', implying the price parameters, but it does not clarify deliveryBy or any exact parameter formats. This partial compensation justifies a mid score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'selects a product for the user's task and renders an interactive widget', using specific verbs and resources. It also distinguishes itself from siblings by explicitly contrasting with 'just find' (search_products) and referencing the widget and methodology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'when the user asks to SELECT a product or HELP CHOOSE, not just find'. It also mandates reading the SKILL.md resource before first call and outlines the required methodology (clarify budget, translate budget to filters, compare, suggest 2-3 options), providing strong usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_products_widgetПоиск товаров Megamarket (виджет)A

Ищет товары в каталоге Megamarket и рендерит интерактивный виджет — грид карточек (фото, название, цена, рейтинг). Использовать ТОЛЬКО когда пользователь явно попросил показать виджет, карточки, интерактивную выдачу или UI. Методичку skill:// перед вызовом читать не нужно.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesПоисковый запрос, например «беспроводные наушники»
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
productsYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the main behavior (searches and renders a widget), but does not mention side effects, permissions, or rate limits. Since this is a read-only style widget tool, the lack of such details is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and followed by a clear usage condition. Every sentence serves a purpose, and there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return format is already specified. The description provides purpose and usage guidelines, and the 'only when widget requested' clause sufficiently distinguishes it from siblings. Minor omission: no explicit mention of alternative tools, but the guideline implies it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, and the description adds no parameter semantics beyond what the schema provides. The 'query' parameter is described in the schema, but 'filters' and its nested properties are undocumented, and the description doesn't mention them at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches the Megamarket catalog and renders an interactive widget grid with photo, name, price, and rating. The specific verb 'searches and renders' and the underlined 'widget' distinguishes it from sibling search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Использовать ТОЛЬКО когда пользователь явно попросил показать виджет, карточки, интерактивную выдачу или UI', giving a strong condition for when to invoke. This differentiates it from plain search tools and instructs the agent not to read the skill manual.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

view_cartКорзина MegamarketA

Возвращает текущее состояние корзины Megamarket (позиции, количество, сумма).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cartYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It implies a read-only operation via 'returns' but does not disclose potential side effects, authentication needs, or behavior when the cart is empty. For a simple view operation, the basics are adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the purpose and includes parenthetical details. Every word earns its place, with no unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, this description sufficiently conveys what the tool returns (cart state with items, quantity, sum). No additional context is needed for the agent to understand its purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is trivial. The description adds value by explaining what the response contains, but parameter semantics are not a concern. Baseline 4 is appropriate for zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the action ('Возвращает' - returns), the resource ('корзину Megamarket'), and the content (positions, quantity, sum). This clearly differentiates it from sibling tools like search_products, add_to_cart, and checkout.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It only states the tool's function, leaving the usage context to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 9 tool updatesv1.0.0
    • First observedadd_to_cart
    • First observedcheckout
    • First observedget_delivery_calendar
    • First observedget_product
    • First observedping
    • First observedsearch_products
    • First observedsearch_products_advised
    • First observedsearch_products_widget
    • First observedview_cart

TDQS

A4.2/5.0
Disambiguation4/5

The three search tools share a core purpose but have clear differentiators: text output vs. widget rendering vs. advisory mode. The extensive descriptions and usage rules make misselection unlikely, though the overlap still creates some ambiguity.

Naming Consistency5/5

All tools follow a consistent snake_case verb-noun pattern (search_products, get_product, add_to_cart). The search variants use meaningful suffixes (_widget, _advised), and even ping fits as a simple action verb. No mixed conventions or unclear names.

Tool Count5/5

Nine tools is well-scoped for a shopping assistant, covering search, product details, cart management, and checkout without bloat. Each tool serves a distinct purpose and earns its place.

Completeness4/5

The core shopping flow is complete: discovery, details, cart, and checkout. Missing cart mutation tools (remove/update quantity) are minor gaps an agent can work around, but they prevent full lifecycle management.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that connects AI assistants to SearchAgora, enabling users to search for, discover, and purchase products across the web through natural language conversations.
    6
    2
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that enables AI assistants to interact with a complete e-commerce application, providing authentication, product browsing, and shopping cart management through standardized MCP tools.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that connects Carrefour Drive to Claude and other MCP clients, enabling product search with real prices, nutriscore, availability, and natural language cart management.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DreamShaded/MCP-Apps-data-proxyfier'

If you have feedback or need assistance with the MCP directory API, please join our Discord server