Роботи / Агенти і ботиробота на відкритий бриф

Shop Counter: Alexa+ пам'ятає твої пристрої і відповідає «підійде?» тільки словами магазину

Що було

Магазини електроніки чекають, що покупець пам'ятає свої пристрої, а сумісність кожен описує по-своєму. Чат-боти відповідають упевнено і без доказів, коробка їде назад. Amazon відкрив бриф на додатки для Alexa+ через MCP, але сам інструментарій Alexa+ учасникам не видали: тестувати не було на чому.

Що зробили

Зробили MCP-сервер з 9 інструментами, що читає публічний каталог Shopify, пам'ятає пристрої покупця в одній шафі для всіх магазинів і каже «підійде» тільки тоді, коли магазин назвав точну модель, з цитатою на екрані. Замість закритої Alexa+ зібрали симулятор Echo Show у браузері, справжній MCP-клієнт. Виклали все на AWS Lambda, додали OAuth 2.1 і 81 запит оцінки чесності.

Що отримав клієнт

Живе демо в браузері без установки, два справжні магазини, відео 2:56 і відкрита бібліотека shelf-to-alexa, що перетворює будь-який каталог Shopify на такий самий сервер. 81 з 81 запит без вигаданих фактів, жива модель 19 з 21 розмови, витрати на модель за всю розробку близько 0,1 $.

ЗамовникAmazon, відкритий бриф на Devpost (трек Alexa+)
Моя рольІдея, MCP-сервер і бібліотека, симулятор Echo Show, оцінка чесності, OAuth, деплой на AWS, відео, тексти подачі
СтатусПодано, підсумки 03.12.2026. Демо на Lambda живе, щоденна перевірка зелена
Результат81 з 81 запитів покупця без жодного вигаданого факту, перевірено проти сирого фіду магазину · Відкрити
Відхилено: магазин ставить тег «iPhone 17», а сервер казав «підтверджено для iPhone 17 Pro». Збіг по серії видавався за сумісність. Реконструкція, не скриншот
Відхилено: магазин ставить тег «iPhone 17», а сервер казав «підтверджено для iPhone 17 Pro». Збіг по серії видавався за сумісність. Реконструкція, не скриншот
Прийнято: магазин не згадує Galaxy S24, тож відповідь «не підтверджено, вгадувати не буду». «Так» існує лише з цитатою на точну модель
Прийнято: магазин не згадує Galaxy S24, тож відповідь «не підтверджено, вгадувати не буду». «Так» існує лише з цитатою на точну модель

Завдання

Amazon відкрив бриф на додатки для Alexa+, які підключаються через MCP: сервер із інструментами, екрани для Echo Show через MCP Apps і навичка, що пояснює моделі, коли який інструмент кликати. Ми обрали питання, яке чуємо щодня в чаті справжнього магазину техніки: «а це підійде до мого?». Зарядки, кабелі, щітки для робота купують до того, що вже є вдома, а бот відповідає впевнено і без доказів.

Головна перешкода з’ясувалась одразу: інструментарій Alexa+, CLI і веб-симулятор учасникам не дають. Ми ніколи не побачили, як справжня Alexa+ скорочує чи показує результат інструмента. Тестувати наскрізь не було на чому.

Навіщо і яка ідея

Ідея в двох правилах. Перше: пристрої належать покупцю, а не магазину. Скажеш «у мене iPhone 15» один раз, і будь-який магазин на цьому сервері це знає, а «підійде до мого телефона?» працює без назви моделі. Друге: «так» існує тільки тоді, коли магазин сам назвав точну модель у тезі чи у фразі «designed for», і цитата показана на екрані. Магазин згадав лише серію, відповідь так і каже: «магазин вказує iPhone 17, не ваш iPhone 17 Pro». Магазин мовчить, відповідь «не підтверджено, вгадувати не буду».

У сервері немає моделі. Сумісність, характеристики і тип товару витягуються правилами з даних магазину, тому ми можемо обіцяти нуль вигаданих фактів і перевіряти це автоматично.

Оскільки Alexa+ закрита, ми зібрали свій Echo Show у браузері: справжній MCP-клієнт по Streamable HTTP, екран MCP App у пісочниці, журнал JSON-RPC і Claude Haiku в ролі Alexa. Усі припущення про поведінку Alexa+ записані в навичку, а не в код.

Хід роботи

Коли Що відбувалося
День 1, ранок Пробний прототип відповів на три питання до продуктового коду: який SDK, сесії чи без стану, як пакувати під Lambda. З’ясувалось, що ext-apps 2.0.3 працює лише з новим розділеним SDK v2
День 1 Бібліотека і сервер: адаптер каталогу Shopify з кешем 6 годин, нормалізація по варіантах, витяг ватів, портів і пристроїв, пошук BM25F, 9 інструментів. Симулятор Echo Show 8 і 15, одна HTML-сторінка на всі екрани
День 1, день Перша оцінка чесності: 17 з 39 запитів як очікувалось, 2 вигадані факти. Після виправлень 51 з 51 і 0 вигадок, відкладений набір 9 з 12
День 1, вечір Перший незалежний огляд: ядро міцне, але шафа пристроїв невидима, нічого не хостилось. Шафа стала спільною для всіх магазинів, підписані сесії, DynamoDB, деплой на Lambda. Оцінка 57 з 57
День 2, ранок Жива модель у ролі Alexa, 18 розмов: інструмент обрала вірно 18 з 18, нічого не вигадала, але довжину репліки тримала у 13 з 18. Довжину обрізаємо кодом. Відео v1 і v2
День 2, день Другий огляд зламав «нуль вигадок» у трьох запитах: iPhone 17 Pro за тегом «iPhone 17», MacBook Pro будь-якого року, «мій телефон» при двох телефонах. Контракт v1.6, 11 нових кейсів, 68 з 68
День 2, вечір Аудит смислу цитат на Roborock: 13 нових кейсів, старий код дав 11 хибних фактів. Після виправлення 81 з 81. OAuth 2.1 з консент-сторінкою, симулятор і модель переїхали на ту саму Lambda, відео v4 і v5. Подано
Через три дні Офлайн-роутер не чув першу фразу з відео. Виправлено, 18 записаних реплік: 16 без змін, 2 виправлені. Далі заморозка коду і щоденна автоматична перевірка живого демо

Чим робили

Сервер на TypeScript і MCP SDK v2, спека 2025-11-25, Streamable HTTP. Без стану: на кожен запит новий McpServer, тому будь-який екземпляр Lambda відповідає на будь-який запит. 9 інструментів, по одному на намір покупця: знайти, порівняти, перевірити сумісність, запам’ятати пристрої, мої пристрої, підготувати і оформити замовлення, статус замовлення, покликати людину. Кожен повертає одне-два речення для голосу і структуру для екрана; 8 з 9 відкривають екран через MCP Apps.

Особа покупця тільки з Authorization: Bearer: підроблений, прострочений чи чужий токен отримує 401. Зв’язування акаунта за MCP Authorization 2025-11-25: метадані ресурсу, PKCE S256, динамічна реєстрація, сторінка «Link Shop Counter to Alexa», токен на годину з прив’язкою до магазину. Шафа і замовлення в DynamoDB, витрати моделі обмежені в коді: 0,50 $ на день і 60 ходів на годину на відвідувача, понад ліміт працює роутер за ключовими словами без моделі.

Оцінка: npm run eval проганяє 81 запит покупця через справжній MCP-клієнт на замороженому знімку каталогу і звіряє кожну ціну, наявність і цитату з сирим фідом. Аудит написаний окремо від коду сервера, щоб не ділити з ним сліпі плями, і спершу має почервоніти на старому коді. Окремо 21 розмова з живою моделлю і 29 перевірок проти справжньої вітрини Satechi.

Бібліотеку винесли в окремий репозиторій shelf-to-alexa під MIT: будь-який каталог Shopify стає таким самим сервером одним записом конфігурації. Roborock підключили саме так.

Результат

Живе демо в браузері без установки і ключів: сторінка, MCP-сервер і модель, що грає Alexa, на одній Lambda. Два справжні магазини з публічних каталогів Shopify: Satechi, 141 товар, і Roborock, 311 товарів. Кожен відвідувач отримує свого приватного покупця на 24 години.

Цифри: 81 з 81 запит без вигаданих фактів, 173 юніт-тести, жива модель 19 з 21 розмови з вірним інструментом у 20 з 21. Витрати на модель за всю розробку і обидві живі оцінки близько 0,1 $. Відео 2:56 записане на опублікованій сторінці, репліки Alexa дослівно з того прогону.

Що з обмежень знаємо чесно: Bedrock на новому акаунті AWS не давав жодної моделі, тому Alexa грає Claude Haiku через API Anthropic, а код Bedrock лежить за прапорцем. Справжню Alexa+ ми не бачили, тож поведінка «два речення голосом, деталі на екрані» це наше припущення, записане в навичку.

Чого ми поки не знаємо: підсумки брифу. Демо тримаємо живим до оголошення, щоденна перевірка пише, що все на місці.

Помилки і що винесли

Дослівний збіг не дорівнює сумісності.«(Not compatible with Saros 10R)» давало «так», а вітринний тег «magsafe charger» на звичайному кабелі робив із нього MagSafe. Заперечення магазину тепер означає «несумісно», тег доводить сумісність лише коли він сам є пристроєм.
Збіг по серії видавався за підтвердження.Шафа з iPhone 17 Pro отримувала «підтверджено» за тегом «iPhone 17», а «MacBook Pro 2017 Intel» обрізався до «MacBook Pro». Доказ тепер лише на точну модель, назву від покупця зберігаємо як є, аудит ганяємо на Pro-моделях.
Аудит чесності перевіряв форму цитати, а не її смисл.На Roborock «for Qrevo Curv» давало «так» для простого Qrevo, і 68 з 68 це пропускали. Тепер аудит читає межі моделі, «only», «upgraded from» і заперечення. Нова перевірка спершу обов'язково має почервоніти на старому коді: 11 хибних фактів у 13 кейсах.
Модель відповідала з назви товару, минаючи інструмент.Побачивши «Not compatible» у заголовку, Haiku відповіла сама. Сценарій тепер перевіряє виклик інструмента, а не лише фразу.
Промпт не тримає довжину репліки.Модель дописувала «Want me to…?» у 7 з 28 ходів. Жорсткі обмеження форми робимо кодом: сервер ріже до двох речень, хост говорить лише їх.
Доступ до хмарної моделі перевіряти одним викликом до коду.Інтеграцію Bedrock написали, а акаунт виявився закритий для всіх моделей. Один ручний виклик у консолі зекономив би години.
Щоденна перевірка сама викликала 429.Скрипт брав сторінки фіду Shopify підряд без пауз і запускався двічі з однієї адреси. Тепер пауза 2 с між запитами, один повтор за Retry-After, і 429 стає попередженням, а не провалом.

Інструменти

TypeScriptMCP SDK v2MCP AppsAWS LambdaDynamoDBOAuth 2.1Claude Haiku 5.5Shopify products.jsonClaude Code