Snowflake Cortex Agents MCP: как загрузить жалобы из соцсетей рядом с данными о возвратах
Коннекторы MCP в Snowflake принимают только OAuth. Примеры конфигурации внешнего доступа и оценка месячных расходов по итогам 12 вызовов API (отзывы Amazon получить не удалось).

Возвраты входят в число крупнейших скрытых расходов в потребительской рознице. По оценке Национальной федерации розничной торговли США (NRF), в 2025 году американские покупатели должны были вернуть товары примерно на $849,9 млрд. Это 15,8% объёма продаж, а для онлайн-покупок доля возвратов составляет 19,3% (пресс-релиз NRF). Большинство брендов уже загружают данные о продажах и возвратах в хранилище данных. Гораздо меньше брендов загружают то, что покупатели публично пишут о товаре. В этой статье мы связываем эти данные внутри Snowflake.
Поводом стала конференция Snowflake Expedition 2026. 3 ноября 2026 года Snowflake представила CoWork (новое название Snowflake Intelligence) и новые возможности Cortex Agents (пресс-релиз). Наше внимание привлекли MCP-коннекторы. С ними агент может вызывать инструменты на внешнем MCP-сервере (документация по MCP-коннекторам). Команда бренда сразу увидит, как это использовать: поместить отзывы Amazon, публикации Reddit и комментарии TikTok рядом с таблицами продаж и возвратов. Затем можно спросить агента, жалобы какого типа учащаются одновременно с ростом доли возвратов.
Работу с данными мы проверили на практике. 2026-11-06 с 00:16 до 00:36 по сингапурскому времени (SGT) мы сделали 12 вызовов API EveryInfra. Все запросы и ответы мы сохранили. Часть статьи про Snowflake состоит только из примеров конфигурации. На этом компьютере нет аккаунта Snowflake, поэтому SQL, процедуры и агента мы не запускали. Все факты о Snowflake взяты с snowflake.com или docs.snowflake.com, даты обращения указаны в разделе «Источники».
Коротко: подключить MCP-сервер EveryInfra как коннектор MCP в Snowflake сейчас нельзя.
Snowflake поддерживает только OAuth и требует определённого способа регистрации клиента, которого наш сервер пока не предлагает. Но даже с OAuth коннектор не решил бы эту задачу, потому что результаты коннектора остаются внутри одного чата и не попадают в таблицу. Рабочий вариант — интеграция внешнего доступа (external access integration) в Snowflake. Хранимая процедура на Python по расписанию вызывает API и записывает отзывы в таблицы. Затем Cortex Agent объединяет эти таблицы с данными о продажах и возвратах. Учтите, чего в этой статье нет. В ту ночь вызовы API для получения отзывов Amazon не вернули данных, а данных о возвратах у нас нет. Поэтому вы получите план реализации и оценку расходов, а не вывод о том, какая жалоба приводит к возвратам. У EveryInfra нет партнёрства со Snowflake. Все факты о Snowflake здесь взяты из публичной документации и пресс-релизов компании.

Что Snowflake представила на Expedition 2026: Snowflake CoWork и Cortex Agents
Главным продуктом мероприятия стал Snowflake CoWork. В пресс-релизе он описан как рабочее пространство с агентами для бизнес-пользователей на ai.snowflake.com. Cortex Code, или CoCo, дополняет его как инструмент для разработчиков и дата-инженеров (пресс-релиз Expedition 2026, страница продукта CoWork).
Во втором пресс-релизе в тот же день анонсировали Business Ontology и Cortex AI Gateway. Business Ontology хранит утверждённые значения бизнес-терминов и передаёт эти определения агентам. Cortex AI Gateway управляет тем, как агенты обращаются к моделям, вызывают инструменты и выполняют действия в корпоративных системах (пресс-релиз о Business Ontology и AI Gateway). Оба продукта важны для вопроса, который мы рассмотрим ниже. У термина вроде «доля возвратов» должна быть одна согласованная формула, иначе два агента дадут два разных ответа.
В этой статье люди задают вопросы в CoWork, а работу выполняют Cortex Agents.
Каждый ассистент CoWork представляет собой объект Cortex Agent. В спецификации агента указаны его модель, инструкции и инструменты. Среди инструментов есть Cortex Analyst для SQL-запросов к семантическим представлениям и Cortex Search для поиска по тексту. Также доступны выполнение кода, пользовательские инструменты, MCP-коннекторы и веб-поиск («Cortex Agents overview», «Create and manage agents»). Поэтому качество ответа зависит в основном от таблиц и семантического представления. Агент превращает вопрос в SQL и объясняет результат.
В таблице ниже показан статус двух функций, важных для этой задачи, по состоянию на 2026-11-06. «Не указан» означает, что ни в документации, ни в пресс-релизе статус не назван.
| Функция | Статус на 2026-11-06 | Источник |
|---|---|---|
| CoWork Automations | Не указано | Документация по Automations |
| MCP-коннекторы Cortex Agents | В документации статус не указан, только OAuth | Документация по коннекторам |
В посте о CoWork также упоминается аналитический поиск, который пока находится на этапе предварительного доступа (preview). Его пример близок к нашему: какие проблемы клиентов чаще всего возникали в прошлом месяце (блог CoWork). Ограничения и правила доступа Automations описаны ниже, в разделе о еженедельной рассылке.
Аналитический поиск работает с документами, которые уже хранятся в Snowflake. Он сужает выборку с помощью Cortex Search, а затем считает и сравнивает с помощью AI-функций и SQL. В нашей задаче есть ещё один шаг. Мнения клиентов находятся на Amazon, Reddit и TikTok, за пределами хранилища. Поэтому сначала их нужно по расписанию загружать в Snowflake в формате, позволяющем объединить их с данными о продажах и возвратах товаров.
Можно ли подключить Snowflake Cortex Agents к EveryInfra напрямую через MCP?
Это первое, что приходит в голову. У EveryInfra уже есть удалённый MCP-сервер (MCP-сервер EveryInfra). Cortex Agents теперь умеют вызывать внешние MCP-серверы. Почему бы просто не вставить адрес сервера в Snowflake? Мы пункт за пунктом сравнили требования Snowflake с возможностями нашего сервера. Ответ — нет: препятствием оказался способ регистрации OAuth-клиента.
Документация Snowflake говорит об этом прямо: для подключения к MCP-серверам Snowflake поддерживает только OAuth. Администратор создаёт объект API integration с API_PROVIDER = external_mcp, в котором хранятся настройки OAuth. Затем администратор создаёт объект external MCP server, который ссылается на эту интеграцию (документация по MCP-коннекторам). Заполнить настройки OAuth можно двумя способами.
Первый способ — стандартный OAuth. Вы регистрируете приложение на удалённом сервере авторизации и получаете идентификатор клиента (client ID). У клиента может быть секрет; также это может быть публичный клиент без секрета.
Для этого приложения также нужно зарегистрировать URL обратного вызова https://identity.snowflake.com/oauth2/callback. Второй способ — динамическая регистрация клиента, при которой Snowflake самостоятельно запрашивает у удалённого сервера идентификатор клиента. Для этого удалённый сервер должен реализовывать RFC 7591 (RFC 7591). Готовые коннекторы есть для Atlassian, GitHub, Glean, Linear и Salesforce, причём в примере с Atlassian используется динамическая регистрация.

У EveryInfra два MCP-адреса. Основной, https://api.everyinfra.com/mcp, использует API-ключ в заголовке Bearer. В 00:43 SGT 2026-11-06 мы запросили у него метаданные защищённого ресурса и метаданные сервера авторизации. Оба запроса вернули 404, значит, этот адрес не поддерживает OAuth discovery. Полный адрес, https://api.everyinfra.com/mcp/all, ведёт себя иначе. В ту же минуту запрос к нему без учётных данных вернул 401 с заголовком WWW-Authenticate.
Этот заголовок указывает на метаданные ресурса в формате RFC 9728, а в метаданных сервером авторизации указан auth.everyinfra.com/oidc (RFC 9728). Затем мы прочитали метаданные сервера авторизации, которые соответствуют RFC 8414 (RFC 8414). Сервер поддерживает PKCE с S256 и публичные клиенты без секрета. Но значение registration_endpoint пустое, то есть динамической регистрации нет. В нашей публичной документации также нет страницы, где пользователь мог бы самостоятельно зарегистрировать OAuth-клиент.
| Что требуется Snowflake | EveryInfra `/mcp` (API-ключ) | EveryInfra `/mcp/all` (проверено в 00:43 SGT, 2026-11-06) |
|---|---|---|
| Только OAuth | Нет, используется API-ключ в заголовке Bearer | Да, 401 с метаданными RFC 9728 |
| Динамическая регистрация клиента (RFC 7591) | Неприменимо | Нет, в метаданных нет эндпоинта регистрации |
| Стандартный OAuth с зарегистрированным клиентом и URL обратного вызова | Неприменимо | В публичной документации нет возможности самостоятельной регистрации |
| Поддерживаются только инструменты (tools) | Да, все возможности реализованы как MCP-инструменты | Да |
| Имя хоста без символов подчёркивания | Да | Да |
Сама спецификация MCP не требует OAuth. В версии 2025-06-18 сказано, что авторизация необязательна. Если сервер её поддерживает, он обязан публиковать метаданные RFC 9728 и RFC 8414, а динамическая регистрация отнесена к уровню «should», не «must» («MCP authorization, 2025-06-18»). Значит, сервер с API-ключом соответствует спецификации, и клиент, который работает только с OAuth, тоже ей соответствует. Просто они несовместимы друг с другом.
Для внешних MCP-серверов в Snowflake есть ещё один вариант. Cortex AI Gateway позволяет администратору добавить пользовательский MCP-сервер. Его документация тоже требует OAuth, URL, оканчивающийся на /mcp, и роль ACCOUNTADMIN (AI Gateway custom apps). Наш OAuth-адрес оканчивается на /mcp/all, а адрес, оканчивающийся на /mcp, принимает только ключ. Ни один из адресов не соответствует обоим условиям.
Допустим, проблема с регистрацией исчезнет. Коннектор всё равно не подошёл бы для этой задачи. Каждый пользователь нажимает кнопку «Connect» в CoWork, входит в систему на странице удалённого сервиса и подтверждает доступ. После этого агент вызывает удалённые инструменты во время чата, и результаты остаются в этом чате (Use MCP connectors in Snowflake CoWork). Каждому, кто задаёт вопросы, нужен собственный аккаунт EveryInfra. Важнее другое: ни один отзыв не попадает в таблицу, поэтому агент не может объединить отзывы за три месяца с возвратами за те же три месяца.
Для вопроса о трендах нужна история, а история хранится в таблицах. Коннекторы подходят для вопросов другого типа, например «о чём люди спорят под этим видео прямо сейчас». Такой вопрос разовый и не требует хранения данных.
Мы нашли четыре способа связать Snowflake с внешним API данных. В таблице они сравниваются по двум критериям: попадают ли данные в таблицу и требует ли способ OAuth.
| Способ | Данные попадают в таблицу | Нужен OAuth | Для чего подходит | Источник |
|---|---|---|---|---|
| MCP-коннектор (объект external MCP server) | Нет, только в чате | Да | Разовые вопросы | Документация по коннекторам |
| Интеграция внешнего доступа, хранимая процедура и задача | Да | Нет, ключ хранится в секрете | Ежедневные загрузки, наш выбор | Внешний сетевой доступ |
| Сборщик вне Snowflake, затем Snowpipe | Да | Нет | Команды, которые уже используют сборщики данных | Snowpipe |
| Внешний MCP-сервер в Cortex Code Agent SDK | Нет, если только ваш код не записывает данные обратно | Нет, заголовки разрешены | Разработчики, которые тестируют в коде | Пользовательские инструменты Agent SDK |
В четвёртом способе инструмент разработчика Snowflake позволяет передать API-ключ в заголовке запроса (документация Agent SDK). Этот способ работает в коде разработчика, а не в бизнес-интерфейсе CoWork. Дальше в статье разбирается второй способ: он по расписанию записывает данные в таблицы при стандартном контроле доступа Snowflake.
Рабочий способ: внешний доступ и хранимая процедура (пример конфигурации)
Весь процесс умещается на одной схеме. API EveryInfra собирает публичные отзывы и комментарии с Amazon, Reddit и TikTok. Внутри Snowflake задача по расписанию раз в день вызывает хранимую процедуру. Процедура обращается к API через интеграцию внешнего доступа, сохраняет каждый сырой ответ, а затем разворачивает его в таблицы отзывов. Ваши собственные данные о продажах и отчёт о возвратах Amazon FBA загружаются ещё в две таблицы, как и сейчас. Поверх них работают семантическое представление и Cortex Agent, а бизнес-пользователи задают вопросы в CoWork.
Интеграция внешнего доступа — стандартный механизм Snowflake, который позволяет процедурам и функциям обращаться к интернету. Для этого нужны три объекта. Сетевое правило перечисляет хосты и порты, к которым может обращаться код. Секрет хранит учётные данные. Интеграция связывает правило и секрет. Доступ к интеграции предоставляют определённым ролям (обзор внешнего сетевого доступа, создание и использование интеграции внешнего доступа).
Наше правило разрешает только api.everyinfra.com. Даже если кто-то изменит код процедуры, она не сможет обратиться к другому хосту. Ключ хранится в объекте секрета, поэтому в коде его никогда нет в открытом виде. Роль, которая запускает процедуру, тоже не может его прочитать. В примере ниже voc — имя базы данных. Оно расшифровывается как «voice of the customer» («голос клиента»).
-- 1. Allow outbound traffic to one host only
CREATE OR REPLACE NETWORK RULE voc.raw.everyinfra_egress
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = ('api.everyinfra.com');
-- 2. Store the API key. Create a separate key in the EveryInfra console
-- and give it its own per-minute call limit.
CREATE OR REPLACE SECRET voc.raw.everyinfra_key
TYPE = GENERIC_STRING
SECRET_STRING = '<EveryInfra API key>';
-- 3. Tie the rule and the secret together
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION everyinfra_access
ALLOWED_NETWORK_RULES = (voc.raw.everyinfra_egress)
ALLOWED_AUTHENTICATION_SECRETS = (voc.raw.everyinfra_key)
ENABLED = TRUE;
-- 4. Grant it only to the loading role
GRANT USAGE ON INTEGRATION everyinfra_access TO ROLE voc_loader;
GRANT READ ON SECRET voc.raw.everyinfra_key TO ROLE voc_loader;Синтаксис соответствует справочнику Snowflake SQL (CREATE NETWORK RULE, CREATE SECRET, CREATE EXTERNAL ACCESS INTEGRATION). Для создания интеграции требуется привилегия уровня учётной записи, поэтому обычно администратор создаёт её один раз. После этого роли, которая загружает данные, нужны только право на использование интеграции и право на чтение секрета. На странице примеров Snowflake приведены полные примеры процедур, которые обращаются к внешним API с использованием секрета (примеры внешнего сетевого доступа).
При проектировании процедуры нужно принять одно решение, от которого зависят расходы: дожидаться каждого результата или отправлять запросы и забирать результаты позже. API EveryInfra поддерживает оба режима.
Синхронный вызов оставляет соединение открытым, пока не придут данные. В нашем тесте при самом медленном вызове API для отзывов Amazon соединение оставалось открытым 67 секунд. При асинхронном вызове в тело запроса добавляется "mode": "async". API примерно через две секунды возвращает HTTP-статус 202 и ID задания. Позже результат можно получить запросом GET /api/v1/jobs/{job_id} (документация).
В Snowflake эта разница превращается в деньги. Процедура выполняется на виртуальном складе, который тарифицируется за каждую секунду работы. Каждая секунда ожидания оплачивается. Поэтому мы разделили загрузку на две процедуры и две задачи. Одна процедура только отправляет асинхронные запросы и завершается за несколько секунд. Другая собирает результаты завершённых заданий.
В таблице перечислены все объекты Snowflake в этой настройке, их назначение и то, кто обычно их создаёт.
| Объект | Назначение | Кто обычно создаёт |
|---|---|---|
Сетевое правило everyinfra_egress | Разрешает исходящий трафик к одному хосту | Администратор аккаунта |
Секрет everyinfra_key | Хранит API-ключ EveryInfra | Администратор аккаунта |
Интеграция внешнего доступа everyinfra_access | Связывает правило и секрет | Администратор аккаунта |
Процедура submit_pulls | Отправляет асинхронные задания для каждой записи в списке отслеживания | Дата-инженер |
Процедура collect_results | Собирает завершённые задания в таблицы сырых данных | Дата-инженер |
Задачи t_submit и t_collect | Запускают обе процедуры по расписанию | Дата-инженер |
Семантическое представление voc_returns | Определяет темы, недели и метрики возвратов | Инженер-аналитик |
Агент с VocAnalyst | Отвечает на вопросы в CoWork | Инженер-аналитик |
CREATE OR REPLACE PROCEDURE voc.raw.submit_pulls()
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python', 'requests')
HANDLER = 'run'
EXTERNAL_ACCESS_INTEGRATIONS = (everyinfra_access)
SECRETS = ('ei' = voc.raw.everyinfra_key)
AS
$$
import json, requests, _snowflake
API = "https://api.everyinfra.com/api/v1/social"
def run(session):
key = _snowflake.get_generic_secret_string("ei")
headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
# watchlist: one row per product URL, video URL or search keyword
rows = session.sql(
"SELECT watch_id, platform, action, params FROM voc.raw.watchlist WHERE active"
).collect()
submitted = 0
for r in rows:
body = {"platform": r["PLATFORM"], "action": r["ACTION"],
"params": json.loads(r["PARAMS"]), "mode": "async"}
resp = requests.post(API, headers=headers, json=body, timeout=30)
payload = resp.json()
session.sql(
"""INSERT INTO voc.raw.jobs
(watch_id, job_id, http_status, charged_usd, first_payload, submitted_at)
SELECT ?, ?, ?, ?, PARSE_JSON(?), CURRENT_TIMESTAMP()""",
params=[r["WATCH_ID"], payload.get("job_id"), resp.status_code,
(payload.get("billing") or {}).get("charged_usd"), json.dumps(payload)],
).collect()
submitted += 1
return {"submitted": submitted}
$$;Процедура написана по руководству Snowflake для процедур на Python. Блок SECRETS связывает объект секрета с именем, а код читает его через _snowflake.get_generic_secret_string. В блоке PACKAGES перечислены внешние пакеты (обзор хранимых процедур на Python). Стоит учесть две детали. Во-первых, сохраняйте первый ответ целиком. В нём указана точная сумма списания в долларах, поэтому каждый месяц можно сверяться со страницей биллинга EveryInfra.
Во-вторых, не повторяйте запрос к той же цели внутри процедуры. API не списывает средства за неверные параметры, временно недоступные цели и пустые результаты, а в ответе указывает причину. Пусть повторную попытку сделает завтрашний запуск. В наших ответах 503 от Amazon даже прямо говорилось, что немедленная повторная попытка для того же товара вряд ли поможет.
Сборщик работает аналогично. Он читает ID ещё не закрытых заданий из voc.raw.jobs и запрашивает статус каждого. Задания в состоянии running или finalizing он пропускает. Результаты завершённых заданий он записывает в voc.raw.api_responses и помечает как собранные. В нашем тесте мы сначала считали незавершёнными только задания в состоянии running. В результате мы попытались забрать результат одного задания слишком рано, пока оно ещё находилось в состоянии finalizing. Учитывайте при проверке оба состояния.
Запланируйте задачу отправки ежедневно на 02:00 по сингапурскому времени. Сборщик запланируйте на 02:20 и 03:20, чтобы второй запуск подхватил всё, что пропустил первый. Не запускайте сборщик каждые несколько минут. При каждом возобновлении работы виртуального склада оплачивается не менее 60 секунд, поэтому при частых запусках вы в основном платите за простой. Мы также советуем настроить автоматическую приостановку через 60 секунд вместо стандартных 10 минут.
CREATE OR REPLACE TASK voc.raw.t_submit
WAREHOUSE = voc_xs_wh
SCHEDULE = 'USING CRON 0 2 * * * Asia/Singapore'
AS
CALL voc.raw.submit_pulls();
CREATE OR REPLACE TASK voc.raw.t_collect
WAREHOUSE = voc_xs_wh
SCHEDULE = 'USING CRON 20 2,3 * * * Asia/Singapore'
AS
CALL voc.raw.collect_results();
ALTER TASK voc.raw.t_collect RESUME;
ALTER TASK voc.raw.t_submit RESUME;Синтаксис задач описан в разделах CREATE TASK и «Введение в задачи». Можно также убрать WAREHOUSE и использовать бессерверную задачу, работу которой Snowflake тарифицирует по фактическому объёму вычислений. В таблице Service Consumption Table для бессерверных задач указан коэффициент 0,9.
Четыре таблицы: отзывы, упоминания в соцсетях, продажи и возвраты
Структуру таблиц определяют три правила. Храните каждый сырой ответ в том виде, в каком он пришёл. В развёрнутых таблицах оставляйте только поля, нужные для анализа. По возможности удаляйте персональные данные. API возвращает имена и аватары авторов отзывов, а в анализе доли возвратов они не используются. Отказ от их хранения экономит место и снимает вопрос конфиденциальности. Ниже приведены четыре основные таблицы и одна таблица сопоставления. Продажи и возвраты берутся из ваших собственных систем, поэтому для них показана только структура.
-- Raw responses: one row per API response, stored as VARIANT
CREATE TABLE IF NOT EXISTS voc.raw.api_responses (
job_id STRING,
platform STRING,
action STRING,
fetched_at TIMESTAMP_TZ,
payload VARIANT
);
-- Amazon reviews (expanded from amazon/reviews)
CREATE TABLE IF NOT EXISTS voc.core.reviews (
review_id STRING PRIMARY KEY,
asin STRING,
country STRING,
rating NUMBER(3,1),
title STRING,
body STRING,
posted_at TIMESTAMP_TZ,
is_verified_purchase BOOLEAN,
helpful_count NUMBER,
variant STRING,
fetched_at TIMESTAMP_TZ
);
-- Social mentions: TikTok comments and Reddit posts in one table
CREATE TABLE IF NOT EXISTS voc.core.social_mentions (
platform STRING, -- tiktok or reddit
source_id STRING, -- comment or post ID
source_url STRING, -- video URL or post URL
community STRING, -- Reddit community, empty for TikTok
product_key STRING, -- key from product_map
body STRING,
like_count NUMBER,
reply_count NUMBER,
is_reply BOOLEAN,
posted_at TIMESTAMP_TZ,
fetched_at TIMESTAMP_TZ,
themes ARRAY, -- labels from AI_CLASSIFY
PRIMARY KEY (platform, source_id)
);
-- Daily sales from your order system
CREATE TABLE IF NOT EXISTS voc.core.sales_daily (
sale_date DATE,
sku STRING,
asin STRING,
units_ordered NUMBER,
PRIMARY KEY (sale_date, sku)
);
-- FBA customer returns report (GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA)
CREATE TABLE IF NOT EXISTS voc.core.fba_returns (
return_date TIMESTAMP_TZ,
order_id STRING,
sku STRING,
asin STRING,
fnsku STRING,
quantity NUMBER,
fulfillment_center_id STRING,
detailed_disposition STRING,
reason STRING,
status STRING,
customer_comments STRING,
return_themes ARRAY
);
-- Product map: which ASINs, SKUs, videos and keywords belong to one product
CREATE TABLE IF NOT EXISTS voc.core.product_map (
product_key STRING,
asin STRING,
sku STRING,
tiktok_urls ARRAY,
reddit_terms ARRAY
);Таблица возвратов воспроизводит структуру отчёта Amazon SP-API о возвратах покупателей FBA. Тип отчёта: GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA. Среди его полей: дата возврата, ID заказа, SKU, ASIN, FNSKU, название товара, количество, фулфилмент-центр, подробное состояние товара, причина, статус, номер LPN и комментарии покупателя. Согласно документации, Amazon обновляет отчёт ежедневно (типы отчётов SP-API для FBA).
Здесь важнее всего столбец комментариев покупателя. Это свободный текст, как комментарий в TikTok. Если классифицировать оба источника по одному списку тем, они сопоставятся по темам. В столбце причины используются фиксированные коды Amazon, которые гораздо грубее темы вроде «протекает крышка». По одним только кодам причин нельзя понять, какая тема приводит к возвратам.
В следующей таблице поля API сопоставлены со столбцами таблиц. Названия полей взяты из каталога EveryInfra по адресу GET /api/v1/social/catalog, прочитанного 2026-11-06 (каталог).
| Возможность | Поля API | Столбец таблицы | Примечание |
|---|---|---|---|
amazon/reviews | review_id, product_asin, country | reviews.review_id, asin, country | Дедупликация по ID отзыва |
amazon/reviews | rating, title, text, posted_at | rating, title, body, posted_at | Оценка от 1 до 5 |
amazon/reviews | is_verified_purchase, helpful_count, variant | Те же названия | Цвет и размер хранятся в variant |
amazon/reviews | author_name, author_id, author_avatar_url | Не сохраняются | Персональные данные, не нужные для анализа |
tiktok/comments | id, text, like_count, reply_count, is_reply, posted_at | Соответствующие столбцы social_mentions | Каждый комментарий верхнего уровня содержит до 2 ответов |
tiktok/comments | author_username, author_id | Не сохраняются | По той же причине |
reddit/search | id, url, title и text, community, like_count, comment_count | source_id, source_url, body, community, like_count, reply_count | Заголовок и основной текст объединены в один текст |
reddit/search | author_username | Не сохраняются | По той же причине |
Для шага развёртывания достаточно SQL. Выберите записи по платформе из api_responses, примените LATERAL FLATTEN к payload:results и выполните MERGE в целевую таблицу по ID. При повторном сборе данных с того же видео у старых комментариев обновляется число лайков, а новые комментарии добавляются. Дальше в статье вы увидите, что повторный сбор данных с того же видео через несколько месяцев оказывается самым полезным шагом в этой схеме.
Один реальный прогон: REST, асинхронный режим и MCP
Запустить часть на стороне Snowflake мы не смогли. Но процедура отправляет те же запросы к тому же API, которым мы пользовались на своей машине, и получает ответы в том же формате. 2026-11-06 с 00:16 до 00:36 SGT мы сделали 12 вызовов с тестовым ключом. Они охватывают три возможности из этой статьи и ещё два поиска, которые помогли нам выбрать цели. Для каждого вызова мы сохранили запрос, время начала и окончания, HTTP-статус, длительность и сумму списания.
| # | SGT | Возможность | Режим | Результат | Длительность | Списание |
|---|---|---|---|---|---|---|
| 1 | 00:16:52 | amazon/search, ключевое слово «portable blender» | Синхронно | 10 товаров, 9 из них — Ninja | 42.14 s | $0.002236 |
| 2 | 00:17:41 | amazon/reviews, товар B0C2FF4JD1 | Синхронно | 503, временно недоступно (без списания) | 60.12 s | $0 |
| 3 | 00:18:41 | amazon/reviews, товар B0CN3S2SW2 | Синхронно | 503 | 58.57 s | $0 |
| 4 | 00:19:47 | amazon/reviews, товар B09B8V1LZ3 | Синхронно | 0 записей, средства за пустой результат возвращены | 67.25 s | $0 |
| 5 | 00:20:55 | reddit/search, portable blender, сначала новые | Синхронно | 14 постов | 6.56 s | $0.000556 |
| 6 | 00:21:13 | tiktok/search, ninja blast portable blender review | Синхронно | 10 видео | 3.78 s | $0.000556 |
| 7 | 00:21:21 | tiktok/comments, видео со сравнением дешёвого и дорогого блендеров | Синхронно | 200 комментариев | 52.30 s | $0.000556 |
| 8 | 00:22:13 | walmart/reviews, страница товара | Синхронно | 0 записей, средства за пустой результат возвращены | 54.34 s | $0 |
| 9 | 00:24:22 | amazon/reviews, товар B0D2YYHN1B | Синхронно | 503 | 19.48 s | $0 |
| 10 | 00:25:26 | reddit/search, ninja blast | MCP | 7 постов | 7.62 s | $0.000556 |
| 11 | 00:27:36 | tiktok/comments, видео с тестом одного товара | Асинхронно | 202, готово примерно через 100 с, 73 комментария | Отправка 1,95 с | $0.000556 |
| 12 | 00:36:23 | amazon/reviews, товар B0C2FF4JD1 повторно | Синхронно | 503 | 38.42 s | $0 |
Из 12 вызовов оплачены шесть, всего на $0,005016. Остальные шесть вернули 503 или пустой результат, и за них ничего не списано. URL товара Walmart в вызове 8 мы угадали по названию товара, так что пустой результат вызван нашей ошибкой. Тем не менее он подтверждает, что возврат средств за пустой результат действует и для отзывов Walmart.

Первая часть скриншота показывает то, что получает процедура отправки. Запрос вернул 202 за 1,95 секунды вместе с ID задания, а в ответе указано списание $0,000556 в момент отправки. Вторая часть показывает то, что получает сборщик. Состояние сменилось с running на finalizing, затем на succeeded. Мы опрашивали статус примерно каждые 8 секунд, всего 12 раз, и задание завершилось примерно через 100 секунд после отправки.
Третья часть показывает сбой. Статус 503, причина access_blocked, повторную попытку рекомендуется сделать через 900 секунд, списание равно 0. Процедуре достаточно выбирать ветвь по коду статуса и значениям этих полей.
Вызов 10 сделан для сравнения. Тот же поиск по Reddit через MCP-инструмент everyinfra_call_api за 7,62 секунды вернул 7 постов. Результат инструмента содержал 18 619 символов, а весь ответ занимал 19 490 байт. Если бы такой вызов сделал Cortex Agent через MCP-коннектор, эти 18 619 символов попали бы в контекст модели как входные токены. Если же загрузить те же данные в таблицу, в контекст агента попадут только те несколько записей, которые он прочитает. Поэтому мы предпочитаем подход «сначала загрузить, потом спрашивать», а не «получать данные вживую в каждом чате».
Эта диаграмма задержек определяет модель затрат в Snowflake. Для всех трёх возможностей объём данных невелик. Объём ответа на один вызов комментариев TikTok с 200 комментариями составил 71 228 байт, а на один поиск по Reddit — около 30 000 байт. По времени ожидания синхронный запрос отзывов или комментариев часто занимает от 50 до 70 секунд.
Виртуальный склад тарифицируется посекундно, причём при каждом возобновлении работы действует минимум в 60 секунд («Warehouses overview», «Understanding compute cost»). Во время синхронного вызова виртуальный склад почти всё время ждёт ответа по сети. В разделе о затратах это пересчитано в доллары.
Тест 1: сколько комментариев в TikTok описывают проблему с товаром?
Мы выбрали категорию, знакомую большинству читателей: портативные блендеры. В вызове 1 мы искали через amazon/search по запросу «portable blender». Девять из первых 10 результатов оказались товарами Ninja по цене от $19,95 до $59,99 (API данных Amazon, поиск Amazon). В вызове 6 мы искали через tiktok/search по запросу «ninja blast portable blender review». Из 10 найденных видео мы взяли два с наибольшим числом комментариев и выгрузили их комментарии через tiktok/comments (API данных TikTok, API комментариев TikTok, API поиска TikTok).
Первое видео сравнивает дешёвый и дорогой блендеры и опубликовано 2025-07-27. На момент выгрузки у него было 2 586 703 просмотра и 251 комментарий. Мы получили 200 комментариев: это лимит одного вызова. Второе видео, где тестируют один товар, опубликовано 2026-01-20; у него 208 916 просмотров и 98 комментариев. Мы получили 73 комментария, из них 17 ответов. Авторов обоих видео мы в статье не называем.
| Видео | Опубликован | Версии | Комментариев под видео | Получено комментариев | Ответы | Проблемы с товаром | Доля |
|---|---|---|---|---|---|---|---|
| Сравнение дешёвого и дорогого | 2025-07-27 | 2,586,703 | 251 | 200 | 23 | 4 | 2.0% |
| Тест одного товара | 2026-01-20 | 208,916 | 98 | 73 | 17 | 13 | 17.8% |
Сначала мы попробовали самый распространённый способ упростить задачу: список ключевых слов battery, leak, broke, returned, expensive, too small. Комментарий считался жалобой, если содержал хотя бы одно из этих слов. В первом видео хотя бы одно ключевое слово нашлось в 42 из 200 комментариев. Затем мы вручную прочитали каждый комментарий. Лишь 4 из 42 описывали проблему с блендером, то есть правило ключевых слов давало верный результат в 9,5% случаев.
Причину легко увидеть. В комментариях под видео со сравнением дешёвого и дорогого в основном шутят про сам формат и просят сравнить дешёвые и дорогие версии других вещей. Тридцать комментариев содержали слово «expensive» или другое слово о цене. Лишь в 7 из них говорилось, что блендер не стоит своих денег. В Snowflake метки тем должна присваивать модель, а понятие «проблема с товаром» нужно сначала определить письменно.
В таблице приведена наша ручная разметка 42 комментариев из первого видео, в которых нашлось хотя бы одно слово из списка.
| Ручная метка | Комментарии |
|---|---|
| Не относится к товару (шутки, другие темы) | 29 |
| Только претензия к цене | 7 |
| Проблема с товаром | 4 |
| Неясно | 2 |
| Всего совпадений по ключевым словам | 42 |
Правило ручной разметки было строгим. Комментарий засчитывается, только если в нём сказано, что у этого товара возникла проблема. К таким проблемам относятся неполадки с крышкой или протекание, короткое время работы от батареи, плохая работа со льдом, отсутствие детали, трудности с мытьём и быстрая поломка. Общая жалоба вроде «не стоит того, я его вернул» тоже засчитывается. Жалобы на цену, сравнения брендов, шутки и эмодзи не засчитываются. По этому правилу два видео выглядят совершенно по-разному.
У видео, набравшего в десять раз больше просмотров, лишь 2,0% комментариев описывают проблемы с товаром. У менее популярного видео с тестом одного товара таких комментариев 17,8%. Причина в аудитории. Сравнительное видео привлекает тех, кто смотрит его ради развлечения. Видео с тестом привлекает владельцев товара и тех, кто собирается его купить; именно они пишут: «Мой тоже протекал». Для схемы в Snowflake выбор видео в product_map важнее количества комментариев на видео.
При одинаковой цене $0,000556 за вызов видео с тестом одного товара дало почти в девять раз больше полезных сигналов. Этот выбор тоже можно автоматизировать. Ищите через tiktok/search, а затем оставляйте видео, в подписях к которым есть слова вроде «review», «trying» или «honest» и у которых от десятков до сотен комментариев.
В двух видео вместе 17 из 273 комментариев описывали проблему с товаром. По темам они распределяются так.
| Тема | Комментарии | Пример (исходный текст, автор скрыт) | Лайки |
|---|---|---|---|
| Крышка или протекание | 6 | The way I just gasped when it spilled. Were you supposed to open it from the top instead? | 79 |
| Батарея | 3 | the batteries do not last long enough to make a full smoothie | 9 |
| Общая негативная оценка, товар возвращён | 2 | Not worth it, returned after a week | 0 |
| Плохо справляется со льдом или замороженными фруктами | 2 | It's not. I returned mine. Barely could get through frozen fruit | 97 |
| Отсутствующая деталь | 2 | ours both didn't come with the blade cap | 0 |
| Быстро сломался | 1 | they are shit, lasts 2 spins | 1 |
| Трудно мыть | 1 | Hard to wash | 0 |
Самая большая группа связана с крышкой и протеканием. Самый популярный комментарий в ней, с 79 лайками, спрашивает, не нужно ли было открывать крышку сверху. В другом автор пишет, что в первый раз пролил так же и не догадался воспользоваться колпачком. Комментарий от 2026-01-22 предупреждает не пользоваться кнопкой на крышке, потому что она ломается, а замену не продают.
Такая проблема отличается от жалоб на батарею или мотор. Её часто можно решить более понятной инструкцией, упаковкой или фотографиями товара, и тогда доля возвратов может быстро снизиться. Именно такие случаи и должен находить вопрос «какая тема жалоб растёт вместе с возвратами». Когда тема совпадает со всплеском возвратов, следующий шаг становится конкретным.
Сохраняйте в таблице число лайков. Комментарий «я свой вернул» с 97 лайками и жалоба с 0 лайков отражают мнение разного числа людей. В семантическом представлении задайте две меры: число комментариев и взвешенное по лайкам число комментариев. Попросите агента выводить обе.
В Snowflake разметку может выполнить AI_CLASSIFY. Используйте в качестве категорий семь тем плюс «не проблема с товаром». Настройте вывод нескольких меток. Добавьте описание задачи, которое исключает жалобы на цену и шутки. Документация рекомендует ограничиться примерно 20 категориями и позволяет добавлять примеры (документация AI_CLASSIFY).
В этой документации есть одно важное замечание. Лучшие результаты дают входные данные на английском языке, а на других языках качество может быть ниже. Большинство комментариев в TikTok и на Amazon US написаны по-английски, поэтому для американского бренда это небольшая проблема. Если вы также отслеживаете испаноязычные или другие рынки, сначала проверьте выборку, размеченную вручную. Кроме того, описание задачи и категории тоже учитываются как токены для каждой записи. Поэтому реальное число токенов на запись больше длины комментария.
UPDATE voc.core.social_mentions
SET themes = AI_CLASSIFY(
body,
['lid_or_spill', 'battery', 'weak_on_ice', 'missing_part',
'breaks_quickly', 'hard_to_clean', 'general_negative', 'not_a_product_issue'],
{'output_mode': 'multi',
'task_description': 'Label only comments that report a problem with this blender. Price complaints, jokes and brand comparisons are not_a_product_issue.'}
):labels
WHERE themes IS NULL;Запустите ту же классификацию для столбца customer_comments таблицы возвратов и запишите результат в return_themes. Тогда обе стороны используют одни и те же темы, модель и описание, и сравнение по темам имеет смысл. AI_SENTIMENT также может оценить каждый комментарий по шкале от негативного до позитивного (документация AI_SENTIMENT). Здесь от него меньше пользы, потому что вопрос в том, какая именно проблема, а не в том, насколько покупатель недоволен.
Тест 2: что возвращает поиск по Reddit?
Многие команды считают Reddit местом честных обсуждений между пользователями, поэтому мы проверили, может ли он дополнить TikTok. В вызове 5 мы искали через reddit/search по запросу «portable blender» с сортировкой по новизне и получили 14 постов. В вызове 10 мы искали «ninja blast» через MCP и получили 7 постов (API данных Reddit, API поиска Reddit). Эта возможность всегда выполняет поиск только по данным за последний месяц и возвращает до 25 постов за вызов. Наши 14 постов охватывали лишь период с 2026-10-30 по 2026-11-05 (UTC), а 7 постов — период с 3 по 5 ноября.
Мы прочитали каждый пост. Ни один из 21 поста не обсуждал, хорошо ли работает блендер. Из 14 постов по запросу «portable blender» 10 были постами о скидках. Большинство из них были опубликованы в сообществах скидок, например r/priceglitch, с заголовками вроде «Ninja Blast Max Portable Blender, Twist & Go, 22oz» плюс цвет и цена. Посты о скидках появлялись 2026-10-31, 2026-11-01 и 2026-11-05. Ежедневные подборки скидок Amazon появлялись 2026-11-02 и 2026-11-03.
Остальные 4 поста не имели отношения к блендерам. Один пользователь спрашивал о портативном ThinkPad, а в двух постах в сообществах 3D-программы Blender спрашивали о характеристиках ноутбуков. Из 7 постов по запросу «ninja blast» 4 были о скидках. Остальные 3 попали в результаты из-за случайного совпадения слов запроса: один был о видеоигре, а два были опубликованы в сообществе мультсериала Ninjago.
| Запрос | Посты | Посты о скидках | Не по теме | Обсуждение товара | Период (UTC) |
|---|---|---|---|---|---|
| portable blender (REST) | 14 | 10 | 4 | 0 | с 2026-10-30 по 2026-11-05 |
| ninja blast (MCP) | 7 | 4 | 3 | 0 | с 2026-11-03 по 2026-11-05 |
Это не значит, что Reddit бесполезен. Это значит, что запрос из короткого ключевого слова с сортировкой по новизне сформулирован неправильно. Для загрузки в Snowflake внесите три изменения. Во-первых, оценивайте релевантность только по заголовку и требуйте, чтобы непосредственно перед «blender» стояло portable, personal, smoothie или название бренда. Наше первое правило находило «blender» в тексте постов и засчитывало посты о программах для 3D-моделирования как посты о товаре.
Во-вторых, выделите посты о скидках в отдельную категорию, потому что это полезные данные. Данные о том, сколько раз конкретный блендер упоминается за месяц в сообществах, посвящённых скидкам, и по какой цене его предлагают, можно хранить рядом с таблицей продаж. Тогда можно увидеть, приводит ли неделя скидок к всплеску возвратов. В-третьих, обсуждения самих товаров обычно сосредоточены в нескольких сообществах, например в группах о смузи или спортивном питании. Используйте reddit/comments для подходящих тредов в этих сообществах вместо поиска по всему сайту.
Тест 3: запрос отзывов Amazon вернул статус 503, списаний не было
Больше всего нам были нужны отзывы Amazon. Отзывы и возвраты поступают с одной платформы и от одних и тех же покупателей. Но ни один из пяти вызовов amazon/reviews не вернул отзывов (API отзывов Amazon). В 00:17, 00:18 и 00:24 SGT запросы для трёх разных товаров брендов Ninja и Hamilton Beach завершились со статусом 503 и причиной access_blocked. Это означает, что отзывы о товаре были временно недоступны, списаний не было, а ответ рекомендовал повторить запрос через 900 секунд.
В 00:19 SGT мы попробовали более старый товар. Он вернул 200 с 0 записей, и средства за вызов вернули как за пустой результат. В 00:36 SGT, через 19 минут после первой попытки, мы снова запросили первый товар и снова получили 503. У всех пяти вызовов charged_usd равно 0.
| SGT | Продукт | HTTP-статус | Причина | Длительность | Списание |
|---|---|---|---|---|---|
| 00:17:41 | B0C2FF4JD1 | 503 | access_blocked | 60.12 s | $0 |
| 00:18:41 | B0CN3S2SW2 | 503 | access_blocked | 58.57 s | $0 |
| 00:19:47 | B09B8V1LZ3 | 200 | Пустой результат, средства возвращены | 67.25 s | $0 |
| 00:24:22 | B0D2YYHN1B | 503 | access_blocked | 19.48 s | $0 |
| 00:36:23 | B0C2FF4JD1 | 503 | access_blocked | 38.42 s | $0 |
Мы описываем всё так, как было, потому что ежедневная задача в Snowflake столкнётся с тем же. По правилам EveryInfra для временно недоступных или требующих входа целевых ресурсов возвращается статус 503 с указанием причины и рекомендацией, когда повторить запрос. В таких случаях никогда не возвращается пустой ответ со статусом 200, создающий ложное впечатление, что отзывов нет. Для загрузчика важно различать эти статусы. Статус 503 означает «сегодня данных нет, повторите попытку завтра». Пустой ответ со статусом 200 означает «здесь действительно ничего нет».
Если процедура не различает эти два случая, для некоторых товаров в семантическом представлении появятся ложные дни «без жалоб». Агент сделает на их основе неверные выводы. Сохраняйте HTTP-статус и причину в таблице jobs. Разворачивайте только ответы со статусом 200. Добавьте в семантическое представление меру «дни без данных», чтобы агент мог указать, за какие дни данных не было.
В каталоге также указано, что amazon/reviews возвращает только избранные отзывы, показанные на странице товара. Обычно для одного товара это около десятка отзывов, но не более 100 за вызов. Отзывы можно получать с 11 маркетплейсов Amazon.
Поэтому даже в удачный день вы получаете не все отзывы, а только выбранный Amazon набор. Такого набора достаточно, чтобы ответить на вопрос «о чём говорят самые заметные жалобы», но его недостаточно, чтобы подсчитать все жалобы. Более полную картину дают данные Seller Central и комментарии покупателей из отчёта о возвратах FBA. Данные из этого отчёта загружаются в таблицу fba_returns, описанную выше.
Спросите Cortex Agent: какая тема жалоб растёт вместе с долей возвратов?
Когда таблицы готовы, постройте недельное представление. Каждая запись содержит один товар, одну тему и одну неделю, а также число упоминаний в соцсетях, количество возвращённых единиц и количество проданных единиц. Доля возвратов по теме равна числу единиц, возвращённых по этой теме, делённому на число единиц, проданных за ту же неделю.
CREATE OR REPLACE VIEW voc.core.theme_returns_weekly AS
WITH mentions AS (
SELECT s.product_key,
DATE_TRUNC('week', s.posted_at)::DATE AS week_start,
t.value::STRING AS theme,
COUNT(*) AS mentions,
SUM(1 + COALESCE(s.like_count, 0)) AS weighted_mentions
FROM voc.core.social_mentions s,
LATERAL FLATTEN(input => s.themes) t
WHERE t.value::STRING <> 'not_a_product_issue'
GROUP BY 1, 2, 3
),
returns AS (
SELECT pm.product_key,
DATE_TRUNC('week', f.return_date)::DATE AS week_start,
COALESCE(t.value::STRING, 'unclassified') AS theme,
SUM(f.quantity) AS returned_units
FROM voc.core.fba_returns f
JOIN (SELECT DISTINCT product_key, asin FROM voc.core.product_map) pm
ON pm.asin = f.asin,
LATERAL FLATTEN(input => f.return_themes, OUTER => TRUE) t
GROUP BY 1, 2, 3
),
sales AS (
SELECT pm.product_key,
DATE_TRUNC('week', d.sale_date)::DATE AS week_start,
SUM(d.units_ordered) AS units_sold
FROM voc.core.sales_daily d
JOIN (SELECT DISTINCT product_key, asin FROM voc.core.product_map) pm
ON pm.asin = d.asin
GROUP BY 1, 2
),
theme_weeks AS (
SELECT COALESCE(m.product_key, r.product_key) AS product_key,
COALESCE(m.week_start, r.week_start) AS week_start,
COALESCE(m.theme, r.theme) AS theme,
COALESCE(m.mentions, 0) AS mentions,
COALESCE(m.weighted_mentions, 0) AS weighted_mentions,
COALESCE(r.returned_units, 0) AS returned_units
FROM mentions m
FULL OUTER JOIN returns r
ON r.product_key = m.product_key
AND r.week_start = m.week_start
AND r.theme = m.theme
)
SELECT tw.product_key, tw.week_start, tw.theme,
tw.mentions, tw.weighted_mentions, tw.returned_units,
s.units_sold,
tw.returned_units / NULLIF(s.units_sold, 0) AS theme_return_rate
FROM theme_weeks tw
LEFT JOIN sales s
ON s.product_key = tw.product_key AND s.week_start = tw.week_start;Три решения в этом представлении не позволяют потерять данные о возвратах. Во-первых, упоминания и возвраты объединяются полным внешним соединением (full outer join) по товару, неделе и теме, после чего к ним по товару и неделе присоединяются продажи. Поэтому, если посты в соцсетях за какую-то неделю упоминают только проблемы с крышкой, возвраты из-за проблем с батареей за эту неделю всё равно попадут в отдельную запись. Во-вторых, OUTER => TRUE сохраняет под меткой unclassified возвраты, у которых нет комментария или темы. В-третьих, одному ASIN могут соответствовать несколько SKU в product_map, поэтому представление соединяет таблицы по уникальным парам товара и ASIN. Иначе возвраты и продажи учитывались бы несколько раз. Учтите, что одному комментарию могут соответствовать две темы, поэтому сумма значений в записях по темам может превышать фактическое число возвращённых единиц. Общую долю возвратов рассчитывайте непосредственно по fba_returns, а не суммированием записей по темам.
Затем создайте поверх него семантическое представление. Оно сообщает Cortex Analyst, что означает каждый столбец и какие столбцы являются мерами («Semantic views overview», CREATE SEMANTIC VIEW). Задайте как минимум четыре меры: число упоминаний темы, взвешенное по лайкам число упоминаний, число возвращённых единиц товара по теме и долю возвратов по теме. В качестве измерений используются товар, тема и неделя. Добавьте также синонимы. Сопоставьте «leak», «spill» и «cap» с lid_or_spill, чтобы агент понимал слова, которые на самом деле вводят бизнес-пользователи.
Спецификация агента пишется в YAML. Как минимум нужен один инструмент Cortex Analyst, работающий с этим семантическим представлением. Мы добавляем один пользовательский инструмент, который возвращает комментарии с наибольшим числом лайков для заданных товара и темы. Структура соответствует CREATE AGENT. В документации Cortex Agents сказано, что параметры пользовательских инструментов не могут иметь тип object, поэтому используйте простые параметры («Cortex Agents overview»).
models:
orchestration: claude-sonnet-5-5
orchestration:
budget:
seconds: 120
tokens: 40000
instructions:
orchestration: >
For questions about complaint themes and returns, use VocAnalyst on weekly data.
Compare each theme's mentions with the same week and the next 1 to 4 weeks of
theme_return_rate. Report weeks with missing review data. Never treat a missing
week as zero complaints.
response: >
Give the theme, the weeks, both raw and like-weighted mention counts, and the
return rate change. Quote at most two comments from TopComments, without author names.
sample_questions:
- question: "Which complaint theme rises together with the return rate?"
- question: "Did lid complaints for the Ninja Blast track returns over the last four weeks?"
tools:
- tool_spec:
type: cortex_analyst_text_to_sql
name: VocAnalyst
description: Weekly social complaint themes, returns and sales by product.
- tool_spec:
type: generic
name: TopComments
description: Returns the most liked comments for one product and one theme.
input_schema:
type: object
properties:
product_key: {type: string, description: Product key from product_map}
theme: {type: string, description: One theme label}
required: [product_key, theme]
tool_resources:
VocAnalyst:
semantic_view: voc.core.voc_returns
TopComments:
type: procedure
identifier: voc.core.top_comments
execution_environment:
type: warehouse
warehouse: voc_xs_whФормулировке «растут вместе» нужно дать точное определение. Инструкции велят агенту сравнивать жалобы за определённую неделю с возвратами за ту же неделю и за период от одной до четырёх недель после неё. Наши собственные данные показывают, почему это важно. Жалобы и возвраты возникают не одновременно. На диаграмме ниже показаны 17 комментариев о проблемах с товаром по месяцам.
Сравнительное видео вышло 2025-07-27, и 4 комментария о проблемах под ним появились через 6, 44, 245 и 245 дней. Видео с тестированием товара вышло 2026-01-20. Лишь 2 из 13 комментариев о проблемах появились в первую неделю, а остальные распределились по периоду с марта по сентябрь. Оба комментария, где упоминается возврат, появились в марте 2026 года: один через 245 дней после публикации соответствующего видео, другой через 52 дня.
| Комментарий (автор скрыт) | Тема | Дата комментария | Дней после публикации видео | Лайки |
|---|---|---|---|---|
| Спрашивает, следует ли открывать крышку сверху | Крышка или протекание | 2026-01-20 | 0 | 79 |
| Не пользуйтесь кнопкой на крышке, она ломается | Крышка или протекание | 2026-01-22 | 2 | 5 |
| Пишет, что все называют этот блендер ужасным | Общий негатив | 2026-03-01 | 40 | 23 |
| Товар вернули: плохо справляется с замороженными фруктами | Плохо колет лёд | 2026-03-13 | 52 | 97 |
| Заряда не хватает даже на один смузи | Батарея | 2026-03-14 | 53 | 9 |
| Оба экземпляра пришли без защитного колпачка для ножа | Отсутствующая деталь | 2026-07-31 | 192 | 0 |
| Купил второй экземпляр ради запасной крышки | Крышка или протекание | 2026-09-12 | 235 | 0 |
Эта диаграмма меняет архитектуру в Snowflake по двум направлениям. Во-первых, никогда не собирайте данные по видео только один раз. Если бы мы собрали данные только за первую неделю, то упустили бы 3 комментария о проблемах под первым видео и 11 под вторым. Поэтому watchlist должен собирать данные по одним и тем же видео каждую неделю или каждый месяц, а MERGE — добавлять новые комментарии.
Во-вторых, объединение жалоб и возвратов в пределах одной недели, скорее всего, ничего не покажет. Покупатели какое-то время пользуются товаром, прежде чем пожаловаться и вернуть его. Определяйте величину задержки по данным, а не задавайте её заранее.
Нужно честно сказать и об объёме данных. Два видео дали 17 комментариев о проблемах за 14 месяцев, так что в большинстве недель их число равно нулю. Корреляция на настолько разреженных данных ничего не значит.
Чтобы у агента была надёжная база, отслеживайте по 20–30 роликов с тестированием каждого товара, а также отзывы на Amazon и комментарии о возвратах. Начните с помесячной детализации и переходите на понедельную, когда данных станет достаточно. Это ограничение связано с объёмом данных, а не со Snowflake, и оно возникло бы при использовании любого инструмента. Поэтому в инструкциях агенту и сказано сообщать о неделях без данных. Честное «данных слишком мало» лучше, чем тренд, придуманный по трём комментариям.
Сколько стоит месяц работы: плата за API и расходы на Snowflake
Начните с конкретного плана, а затем рассчитайте его стоимость. Один бренд отслеживает 20 ASIN и 20 видео в TikTok и раз в день собирает отзывы или комментарии к каждому из них. Чтобы находить новые видео, он ежедневно ищет по 5 ключевым словам в Reddit, а раз в неделю — по 5 ключевым словам в TikTok. За 30 дней получается 1 370 вызовов API. Стоимость API рассчитана по ценам из каталога, актуальным на 2026-11-06, так что это реальная цена.
Каждая статья расходов на Snowflake является оценкой, а метод расчёта показан в таблице. Цены взяты из Service Consumption Table, действующей с 2026-11-04, и из цены on-demand для редакции Standard в регионе AWS US East. Кредит платформы стоит $2.00. ИИ-кредит стоит $2.00 по глобальному тарифу (Service Consumption Table, страница с ценами, цены Cortex AI).
| Пункт | Метод | В месяц |
|---|---|---|
| Плата за API EveryInfra | 600 amazon/reviews × $0.001389 + 600 tiktok/comments × $0.000556 + 150 reddit/search × $0.000556 + 20 tiktok/search × $0.000556 | $1.26 |
| Виртуальный склад ждёт ответов (синхронно, последовательно) | Результаты замеров: отзывы Amazon — 67.25 с (самый медленный из 5 наших вызовов, результат пустой; с учётом диапазона 19.48–60.12 с для вызовов, завершившихся ошибкой 503, стоимость по этой строке составит $24.61–38.16), комментарии TikTok — 52.3 с, Reddit — 7.62 с, поиск в TikTok — 3.78 с. Итого: 20.27 часа × 1 кредит в час для размера XS × $2 | $40.54 |
| Виртуальный склад ждёт ответов (синхронно, 10 параллельных вызовов) | То же, разделённое на 10 | $4.05 |
| Виртуальный склад (асинхронная схема, две задачи) | Около 46 отправок заданий в день × 2 с, плюс 2 запуска сборщика с минимальной тарификацией 60 с, плюс 60 с простоя до автоприостановки после каждого из 3 запусков. Около 392 с в день, или 3.3 часа в месяц | Около $6.5 |
Тематические метки AI_CLASSIFY | 10 000 комментариев × около 150 токенов = 1.5 млн токенов × 1.62 ИИ-кредита за миллион × $2 | $4.86 |
| Вопросы к Cortex Agent (Sonnet 5.5) | 50 вопросов × 20 000 входных и 1 500 выходных токенов, по 1.30 ИИ-кредита за миллион входных и 6.50 за миллион выходных токенов | $3.58 |
| Вопросы к Cortex Agent (Haiku 5.5) | То же, по 0.065 за входные и 0.325 за выходные | $0.18 |
| SQL-запросы агента на виртуальном складе | 50 запросов × минимум 60 с × $2 за кредит-час | $1.67 |
| Хранение | 1 ГБ по $23 за ТБ в месяц | Около $0.02 |
Внимание стоит обратить на вторую строку. Сам API обходится в $1.26 в месяц. Но если процедура написана самым простым способом, с синхронными вызовами один за другим, виртуальный склад работает больше 20 часов в месяц. Это около $40.54, то есть в 32 раза больше платы за API. При 10 параллельных вызовах или асинхронной схеме с двумя задачами расходы по этой строке снижаются до $4–7.
По нашей оценке, параллельные вызовы дешевле всего, но потоками и таймаутами в Python придётся управлять самостоятельно. Асинхронная схема дороже на два-три доллара. Зато ни один запрос не обрывается из-за слишком долгого ожидания, а упавшее задание просто запускается снова на следующий день. Мы предпочитаем асинхронную схему.
В сумме последовательная схема обходится примерно в $51.93 в месяц, а параллельная — примерно в $15.44. В регионе Singapore кредит редакции Standard стоит $2.50, поэтому статьи расходов на виртуальный склад нужно умножить на 1.25. В редакции Enterprise цена on-demand в US East составляет $3.00 за кредит; масштабирование выполняется так же.
Второй рычаг экономии связан с выбором модели. Оркестрация Cortex Agent тарифицируется по токенам, а цены моделей в таблице потребления сильно различаются. За те же 50 вопросов Sonnet 5.5 обойдётся примерно в $3.58, а Haiku 5.5 — примерно в $0.18. Opus 5.5 стоит 2.60 за миллион входных токенов и 13.00 за миллион выходных, вдвое дороже Sonnet. В таблице приведены цены, важные для этой статьи, в ИИ-кредитах за миллион токенов. ИИ-функции тарифицируются по общему числу токенов, без разделения на входные и выходные.
| Модель или функция | Входные данные | Вывод | Применение в этой статье |
|---|---|---|---|
| claude-sonnet-5-5 (CoWork, Agents) | 1.30 | 6.50 | Оркестрация агента; используется по умолчанию в таблице расходов |
| claude-haiku-5-5 (CoWork, Agents) | 0.065 | 0.325 | Недорогая оркестрация |
| claude-opus-5-5 (CoWork, Agents) | 2.60 | 13.00 | Для регулярных отчётов не требуется |
| openai-gpt-6.1-sol (CoWork, Agents) | 1.30 | 6.50 | Та же цена, что у Sonnet |
AI_CLASSIFY | 1.62 (суммарно) | Тематические метки для комментариев и примечаний к возвратам | |
AI_SENTIMENT | 1.60 (суммарно) | Необязательная оценка тональности | |
AI_AGG | 1.85 (суммарно) | Необязательная сводка текстов по темам |
Цифра в 20 000 входных токенов на вопрос является нашим допущением. Она учитывает семантическое представление, инструкции и один-два раунда результатов инструментов. Если агент много раз вызывает инструменты в одном чате или загружает в контекст длинные комментарии, реальное число будет выше. После запуска реальные цифры покажет представление CORTEX_AGENT_USAGE_HISTORY. Вопросы из CoWork попадают в SNOWFLAKE_COWORK_USAGE_HISTORY, и ни одно из этих представлений не включает запросы другого (представление использования Cortex Agent, представление использования CoWork).
Каждый исходящий запрос процедуры отображается в представлении EXTERNAL_ACCESS_HISTORY, данные в котором могут запаздывать до 3 часов (история внешнего доступа). Сопоставьте его по времени со значениями charged_usd в voc.raw.jobs, и вы сможете каждый месяц сверять вызовы и расходы с обеих сторон. Snowflake также позволяет задать бюджеты ресурсов для каждого агента и квоты для каждого пользователя (бюджеты ресурсов Cortex Agents). На стороне EveryInfra задайте для этого ключа отдельный лимит вызовов в минуту. С лимитом на каждой стороне задача, работающая со сбоем, не сможет сделать десятки тысяч вызовов за ночь.
Одну строку в таблице потребления легко понять неправильно. «Cortex Tools» списывает 8 ИИ-кредитов за 1000 вызовов инструментов, когда сторонние агенты обращаются к эндпоинтам за пределами Snowflake, а за обращения к эндпоинтам Snowflake ничего не берёт. В нашей архитектуре API EveryInfra вызывает хранимая процедура Snowflake, а не агент. Агент только читает таблицы Snowflake, поэтому эту строку мы не учитывали.
Допустим, вы перейдёте на MCP-коннекторы и разрешите агенту вызывать внешние инструменты во время чатов. В документации не сказано, применяется ли тогда эта строка и как рассчитывается плата. Уточните это до запуска у команды Snowflake, сопровождающей ваш аккаунт. Новый аккаунт может опробовать всю схему в течение бесплатного пробного периода: на странице с ценами указаны 30 дней и пробные кредиты на сумму $400.
Еженедельное письмо через Snowflake CoWork Automations
Когда данные и агент готовы, остаётся вовремя доставить ответ нужным людям. Именно для этого нужны CoWork Automations. Вы задаёте вопрос, который выполняется по расписанию, например каждый понедельник в 09:00. Хороший вопрос: «Какая тема жалоб росла вместе с долей возвратов за последние четыре недели?» Результат приходит по электронной почте (документация по Automations).
Сначала разберитесь с ограничениями, описанными в документации. Автоматизация запускается не чаще раза в час. Результаты отправляются только по электронной почте, и каждый получатель должен предварительно подтвердить адрес электронной почты в Snowflake. История запусков хранится 60 дней. Каждая автоматизация выполняется с правами своего создателя, поэтому в письмо могут попасть данные из любой таблицы, к которой у создателя есть доступ на чтение.
| Ограничение по документации | Значение | Влияние на еженедельный отчёт о жалобах |
|---|---|---|
| Максимальная частота запусков | Раз в час | Не влияет: отчёт еженедельный |
| Способ доставки | Только по электронной почте, на подтверждённые адреса | Получатели должны заранее подтвердить адрес |
| История запусков | 60 дней | Сохраняйте ответы в таблицу, если историю нужно хранить дольше |
| Права | Права создателя | В письмо может попасть любая таблица, которую может читать создатель |
| EXECUTE AGENT TASK | По умолчанию выдана роли PUBLIC | При необходимости отзовите привилегию и предоставьте её отдельным ролям |
Ни одно из этих ограничений не мешает нашему сценарию. Жалобы и возвраты отслеживаются понедельно, так что ежечасных запусков более чем достаточно. Доставка только по электронной почте означает, что напрямую публиковать результаты в Slack нельзя. В пресс-релизе сказано, что Snowflake for Slack сейчас находится в стадии публичной предварительной версии (пресс-релиз Expedition 2026).
Главное здесь — контроль доступа. Привилегия EXECUTE AGENT TASK по умолчанию предоставлена роли PUBLIC, поэтому любой пользователь аккаунта может создать автоматизацию для себя. Автоматизация выполняется с правами создателя. Значит, человек, который может читать все данные о продажах, может отправить их на любой указанный им адрес. Если это недопустимо, администратор должен отозвать привилегию у PUBLIC и предоставить её только нужным ролям.
Ограничения теста
Всё, что относится к Snowflake, является примером конфигурации. У нас нет аккаунта Snowflake, и мы не запускали ни этот SQL, ни эти процедуры, ни эту спецификацию агента. Синтаксис основан на документации docs.snowflake.com по состоянию на 2026-11-06. В этом месяце Snowflake выпустила крупный релиз, так что синтаксис и ограничения ещё могут измениться. Прежде чем полагаться на какой-либо блок, выполните его в своём аккаунте.
В таблице расходов реальной ценой является только плата за API. Все строки Snowflake представляют собой оценки на основе публичных цен и наших допущений. Две главные неизвестные: реальное число токенов на один классифицированный комментарий и на один вопрос к агенту.
Что касается данных, в этот раз ни один из 5 вызовов для отзывов Amazon не вернул отзывов. Поэтому тематический анализ построен только на 273 комментариях из TikTok. Их вручную разметил один автор по правилу выше, и повторно разметку никто не проверял. 17 комментариев о проблемах достаточно, чтобы сказать, что проблемы с крышкой и протечками заслуживают внимания. Но их недостаточно, чтобы оценить реальную долю проблем у этого товара.
В этой статье приведена только структура таблиц продаж и возвратов, без реальных или выдуманных чисел. Ответ на вопрос «какая тема жалоб растёт вместе с возвратами» появится, когда появятся ваши собственные данные.
Одно ограничение касается самой EveryInfra. Наш MCP-сервер сейчас нельзя добавить как коннектор Snowflake по причинам, описанным выше. На маршрут через внешний доступ это не влияет, и именно его мы рекомендуем. Но если вашей команде нужно подключение в один клик внутри CoWork, пока это невозможно. Мы ещё раз проверим статус к моменту публикации статьи.
Чем этот подход отличается от наших предыдущих статей
В наших предыдущих статьях об отзывах данные оставались внутри агента или файла: запланированные задачи Claude Cowork, Claude Managed Agents для ночной проверки отзывов, Qwen Agent MCP на практике и DeepSeek V4 в Claude Code для очистки отзывов. Они отвечают на вопрос «на что люди жалуются в последнее время». Здесь отзывы попадают в корпоративное хранилище данных, под те же правила доступа и бизнес-определения, что и продажи с возвратами, и вопрос превращается в «какая жалоба действительно стоит нам денег». Цена: ещё один счёт за хранилище и набор таблиц, по расчёту выше около пятнадцати долларов в месяц на один бренд. Если ваши продажи и возвраты ещё не в Snowflake, предыдущие подходы проще. Если они уже там, эта схема впервые позволяет сопоставить жалобы с финансовыми показателями.
Последние изменения
2026-11-04 вступила в силу новая Service Consumption Table Snowflake. Все цены моделей, цены AI-функций и строка «Cortex Tools» в этой статье взяты из этой версии (Service Consumption Table).
В тот же день вышло примечание к выпуску: в MCP-сервере под управлением Snowflake появились фоновые запуски. Инструменты CORTEX_AGENT_RUN и CODING_AGENT получили аргумент background, с которым вызов сразу возвращает дескриптор. Серверы с этими инструментами теперь автоматически получают ещё три инструмента: ASYNC_AGENT_RUN_STATUS, ASYNC_AGENT_RUN_CANCEL и AGENT_RUN_RESULT. Новый параметр content_cel_filter позволяет клиенту сначала получить оглавление, а затем прочитать только нужные части (примечание к выпуску от 4 ноября 2026 года).
Частые вопросы о Snowflake Cortex Agents MCP и Snowflake CoWork
MCP-сервер Snowflake Cortex Agents — это то же самое, что MCP-коннектор?
Нет. Они работают в противоположных направлениях. Источник: автодополнение Google по запросу «snowflake cortex agents mcp server». MCP-сервер под управлением Snowflake делает Snowflake сервером. Внешние клиенты через MCP вызывают ваших агентов, Cortex Search, Cortex Analyst и SQL. Типы инструментов этого сервера: CORTEX_AGENT_RUN, CODING_AGENT, CORTEX_SEARCH_SERVICE_QUERY, CORTEX_ANALYST_MESSAGE, SYSTEM_EXECUTE_SQL и GENERIC. Документация рекомендует OAuth вместо токенов, прописанных в коде (Snowflake-managed MCP server, CREATE MCP SERVER).
MCP-коннектор делает Snowflake клиентом: Cortex Agents и CoWork могут вызывать внешний MCP-сервер, причём только через OAuth (документация по коннекторам). В этой статье нужно второе направление, но в итоге мы используем внешний доступ (external access) вместо MCP.
Чем Snowflake CoWork отличается от CoCo (Cortex Code)?
Источник: автодополнение Google по запросу «snowflake cowork vs coco». Согласно пресс-релизу от 2026-11-03, CoWork предназначен для бизнес-пользователей. Они задают вопросы обычным языком на ai.snowflake.com, открывают дашборды и настраивают автоматизации. CoCo предназначен для разработчиков и дата-инженеров: с его помощью они пишут код и создают объекты данных. Аналитики тоже могут описать нужный дашборд в CoCo, и CoCo его построит (пресс-релиз Expedition 2026, документация Cortex Code).
В этой статье дата-инженеры создают таблицы, процедуры и семантическое представление с помощью CoCo или обычного SQL. Бизнес-пользователи задают вопросы и получают еженедельный отчёт в CoWork.
Могут ли Cortex Agents вызывать внешний API по API-ключу вместо OAuth?
Да, но не через MCP-коннектор. Источник: вопрос, который возникает после строки «только OAuth» в документации Snowflake по коннекторам. Сохраните ключ в секрете типа GENERIC_STRING и используйте его через интеграцию внешнего доступа (external access integration). Напишите хранимую процедуру на Python, которая вызывает API, и добавьте её агенту как пользовательский инструмент. Когда агент вызывает этот инструмент, процедура выполняется на виртуальном складе (warehouse), а плата начисляется за время работы склада (внешний сетевой доступ, обзор Cortex Agents). Мы предпочитаем задачу по расписанию, которая загружает данные в таблицы, чтобы при ответе на каждый вопрос не приходилось ждать ответа API.
Работает ли AI_CLASSIFY с комментариями не на английском языке?
Работает, но сначала проверьте результат. Источник: примечания по использованию в документации Snowflake по AI_CLASSIFY. В документации сказано, что лучше всего функция работает с английским текстом, а на других языках качество может быть ниже (документация AI_CLASSIFY). Если вы отслеживаете испаноязычные или другие рынки, вручную разметьте около 100 комментариев и сравните результаты. Там, где категории расходятся, сделайте описание задачи и примеры конкретнее. Можно также поручить оценку каждого комментария более сильной модели в Cortex Agents, но это дороже.
Взимает ли EveryInfra плату за неудачные вызовы или вызовы с пустым результатом?
Нет. Источник: ответы на наши 12 реальных вызовов. За вызовы с неверными параметрами, временно недоступными целями (статус 503) и пустыми результатами плата не взимается, а в каждом ответе со списанием указана точная сумма. Во всех 6 вызовах в этой статье, которые не вернули данных, значение charged_usd равно 0. В асинхронном режиме средства списываются при отправке задания, а если оно позже завершается ошибкой, списанная сумма возвращается.
С чего начать
- Зарегистрируйтесь в EveryInfra и выполните инструкции из раздела «Быстрый старт». Создайте отдельный API-ключ, предназначенный только для Snowflake, и задайте для него собственный лимит запросов в минуту.
- Выполните через
curlпо одному вызову API для каждого URL товара, URL видео и ключевого слова. Проверьте поля и количество записей, прежде чем добавлять цели в таблицуwatchlist. - В Snowflake создайте сетевое правило, секрет и интеграцию внешнего доступа по примерам выше. Затем создайте две процедуры и две задачи.
- Через несколько дней после начала загрузки данных создайте еженедельное представление и семантическое представление. Разметьте комментарии и примечания к возвратам по тем же темам
AI_CLASSIFY. - Создайте Cortex Agent и задайте ему несколько вопросов в CoWork. Когда он начнёт правильно сообщать о пропущенных неделях, настройте еженедельную автоматизацию.
Все возможности сбора данных перечислены в каталоге EveryInfra. Настройка удалённого MCP-сервера описана на странице MCP-сервера, а цены за каждый вызов указаны на странице «Тарифы».
Источники
- Пресс-релиз Snowflake, «Expedition 2026: CoCo and CoWork», дата обращения 2026-11-06: https://www.snowflake.com/en/news/press-releases/expedition-2026-coco-cowork/
- Пресс-релиз Snowflake, «Business Ontology and Cortex AI Gateway», дата обращения 2026-11-06: https://www.snowflake.com/en/news/press-releases/expedition-2026-business-ontology-ai-gateway/
- Блог Snowflake, «AI agents, governed data and business context», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/ai-agents-governed-data-business-context/
- Блог Snowflake, «Snowflake CoWork Adds Profiles, Dashboards and Automations», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/snowflake-cowork-profiles-automations-dashboards
- Блог Snowflake, «Snowflake CoCo cloud agents and automations», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/snowflake-coco-cloud-agents-automations/
- Страница продукта Snowflake CoWork, дата обращения 2026-11-06: https://www.snowflake.com/en/product/snowflake-cowork/
- Snowflake, «Pricing options», дата обращения 2026-11-06: https://www.snowflake.com/en/pricing-options/
- Snowflake, «Service Consumption Table», действует с 2026-11-04, дата обращения 2026-11-06: https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf
- Документация Snowflake, «Cortex Agents MCP connectors», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp-connectors
- Документация Snowflake, «Cortex Agents MCP connectors», раздел «Limitations», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp-connectors#limitations
- Документация Snowflake, «Cortex Agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents
- Документация Snowflake, «Create and manage agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-manage
- Документация Snowflake, «CREATE AGENT», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-agent
- Документация Snowflake, «Cortex Agents Run API», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-run
- Документация Snowflake, «Cortex Agents resource budgets», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-resource-budgets
- Документация Snowflake, «Cortex Agents code execution tool», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-code-execution-tool
- Документация Snowflake, «Snowflake-managed MCP server», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp
- Документация Snowflake, «CREATE MCP SERVER», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-mcp-server
- Примечание к выпуску Snowflake от 4 ноября 2026 года, «Background runs and additional supplementary tools for agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/release-notes/2026/other/2026-11-04-mcp-async-agent-tools
- Документация Snowflake, «Cortex AI Gateway custom apps and MCP servers», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-ai-gateway/tools/admin-custom-apps
- Документация Snowflake, «Cortex Code Agent SDK, MCP and custom tools», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cortex-code-agent-sdk/mcp-custom-tools
- Документация Snowflake, «Cortex Code», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code
- Документация Snowflake, «Snowflake CoWork», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-cowork
- Документация Snowflake, «CoWork Automations», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-cowork/automations
- Документация Snowflake, «Cortex AI pricing», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/pricing
- Документация Snowflake, «Cortex AI Functions», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/aisql
- Документация Snowflake, «AI_CLASSIFY», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/functions/ai_classify
- Документация Snowflake, «AI_SENTIMENT», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/functions/ai_sentiment
- Документация Snowflake, «Semantic views overview», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/views-semantic/overview
- Документация Snowflake, «CREATE SEMANTIC VIEW», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-semantic-view
- Документация Snowflake, «External network access overview», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/external-network-access-overview
- Документация Snowflake, «Creating and using an external access integration», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/creating-using-external-network-access
- Документация Snowflake, «External network access examples», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/external-network-access-examples
- Документация Snowflake, «CREATE NETWORK RULE», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-network-rule
- Документация Snowflake, «CREATE SECRET», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-secret
- Документация Snowflake, «CREATE EXTERNAL ACCESS INTEGRATION», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration
- Документация Snowflake, «Writing stored procedures in Python», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/stored-procedure/python/procedure-python-overview
- Документация Snowflake, «CREATE TASK», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-task
- Документация Snowflake, «Introduction to tasks», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/tasks-intro
- Документация Snowflake, «Snowpipe», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/data-load-snowpipe-intro
- Документация Snowflake, «Overview of warehouses», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/warehouses-overview
- Документация Snowflake, «Understanding compute cost», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cost-understanding-compute
- Документация Snowflake, «CORTEX_AGENT_USAGE_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/cortex_agent_usage_history
- Документация Snowflake, «SNOWFLAKE_COWORK_USAGE_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/snowflake_cowork_usage_history_view
- Документация Snowflake, «EXTERNAL_ACCESS_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/external_access_history
- Спецификация MCP, «Authorization», версия 2025-06-18, дата обращения 2026-11-06: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
- IETF RFC 9728, «OAuth 2.0 Protected Resource Metadata», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc9728
- IETF RFC 8414, «OAuth 2.0 Authorization Server Metadata», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc8414
- IETF RFC 7591, «OAuth 2.0 Dynamic Client Registration Protocol», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc7591
- Документация Amazon SP-API, «FBA report type values», дата обращения 2026-11-06: https://developer-docs.amazon/sp-api/docs/report-type-values-fba
- National Retail Federation, «Consumers expected to return nearly $850 billion in merchandise in 2025», дата обращения 2026-11-06: https://nrf.com/media-center/press-releases/consumers-expected-to-return-nearly-850-billion-in-merchandise-in-2025
- Analytics India Magazine, «Snowflake introduces Business Ontology and Cortex AI Gateway», дата обращения 2026-11-06: https://analyticsindiamag.com/ai-news/snowflake-introduces-business-ontology-cortex-ai-gateway-to-bring-ai-agents-into-enterprise-workflows
- Каталог возможностей EveryInfra, GET /api/v1/social/catalog, дата обращения 2026-11-06: https://api.everyinfra.com/api/v1/social/catalog
- Адрес удалённого MCP-сервера EveryInfra (проверен 2026-11-06): https://api.everyinfra.com/mcp
- Метаданные защищённого ресурса EveryInfra для полного MCP-адреса (проверены 2026-11-06): https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all
Справка BL-97