Завдання
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+ ми не бачили, тож поведінка «два речення голосом, деталі на екрані» це наше припущення, записане в навичку.
Чого ми поки не знаємо: підсумки брифу. Демо тримаємо живим до оголошення, щоденна перевірка пише, що все на місці.
Помилки і що винесли





