# Провенанс-вет внешних инструментов C1 marketing-tooling (IS9) **Дата:** 2026-05-22 **Вет-код:** IS9 (согласно ADR-003 + spec §8) **Инструменты:** marketingskills (вендоринг), Yandex Metrika MCP (выбор из 3 кандидатов), yandex-mcp (Direct+Metrika+Wordstat), telegram-mcp, postiz-app / postiz-mcp **Статус:** ЗАВЕРШЁН --- ## Назначение документа Перед добавлением инструментов в раздел C1 «Маркетинг» карты выполнен обязательный провенанс-вет (IS9). Основание: ~13 % security-скилов из маркетплейсов несут критичные дефекты, часть пытается красть учётные данные (исследование ToxicSkills, Snyk + SentinelOne 2025). ADR-003 закрепляет принцип: community-инструменты с непроверенным происхождением — defer. --- ## Сводная таблица вердиктов | # | Инструмент | Источник | Лицензия | Вердикт | Обоснование (одна строка) | |---|---|---|---|---|---| | C1-1 | `marketingskills` (вендоринг скилов) | `coreyhaines31/marketingskills` | **MIT** | **PASS-with-conditions** | Markdown-only скилы + 2 bash-скрипта только локальной валидации; MIT разрешает вендоринг; условие — вендорить только `skills/`, validate-scripts не включать | | C1-2 | Yandex Metrika MCP | `atomkraft/yandex-metrika-mcp` (**выбран**) | **MIT** | **PASS** | Токен передаётся только на `api-metrika.yandex.net`; нет опасных паттернов; MIT; риск single-author задокументирован | | C1-3 | `yandex-mcp` (Direct+Metrika+Wordstat) | `SvechaPVL/yandex-mcp` | **MIT** | **PASS-with-conditions** | Wordstat-модуль изолирован (5 read-only tools); Direct (80 mutation-tools) не активировать; все URL — официальные Yandex | | C1-4 | `telegram-mcp` (MTProto user-account) | `chigwell/telegram-mcp` | **Apache-2.0** | **PASS-with-conditions** | Токен передаётся только Telegram/Telethon; нет опасных паттернов; условие — SESSION_STRING только в `.env`, выделенный аккаунт | | C1-5 | `postiz-app` (self-host) + `postiz-mcp` | `gitroomhq/postiz-app` / `antoniolg/postiz-mcp` | **AGPL-3.0** | **PASS-with-conditions** | AGPL допустима для внутреннего self-host без дистрибуции; лицензия postiz-mcp не проверена в рамках бюджета — см. Open notes | --- ## Детальный анализ ### C1-1 — `coreyhaines31/marketingskills` **Репозиторий:** https://github.com/coreyhaines31/marketingskills **Лицензия:** MIT (Copyright 2025, Corey Haines) — подтверждено прямым чтением `LICENSE`. **Состав репозитория (проверено):** - `skills/` — чистый markdown; нет исполняемых скриптов внутри `skills/`. - `.claude-plugin/` — JSON/YAML конфигурация плагина; не исполняемый код. - `validate-skills.sh` + `validate-skills-official.sh` — bash-скрипты только для локальной валидации (grep/awk/sed по `skills/`; сетевых вызовов нет; внешний URL упоминается только в комментарии — fetch не выполняется). - `AGENTS.md`, `CLAUDE.md` — инструкции для AI-агентов. **Автор и активность:** Corey Haines (coreyhaines31), 279 коммитов, последний 2026-05-21 (v2.1.0). Один основной автор; 30 000+ звёзд, 4 900+ форков — высокий community-уровень. **Провенанс-вывод:** MIT разрешает вендоринг без ограничений (требуется только сохранить copyright notice). Исполняемого кода в `skills/` нет — только markdown. **Условие вендоринга:** копировать только `skills/` + `LICENSE`; validate-скрипты в проект Лидерры не включать; добавить `ATTRIBUTION.md` с указанием copyright Corey Haines. --- ### C1-2 — Yandex Metrika MCP (выбор из 3 кандидатов) #### Сравнение кандидатов | Параметр | `atomkraft/yandex-metrika-mcp` | `theYahia/yandex-metrika-mcp` | `Vadosdavos/yandex-metrika-mcp` | |---|---|---|---| | Лицензия | MIT ✅ | MIT ✅ | Не указана ❌ | | Коммиты | 7 | 8 | 1 (abandoned?) | | Код верифицирован | Да (index.ts + client.ts) | Нет | Нет | | Внешние URL | только `api-metrika.yandex.net` ✅ | не верифицировано | не верифицировано | | Опасные паттерны | Нет ✅ | не верифицировано | не верифицировано | **Выбран: `atomkraft/yandex-metrika-mcp`** `Vadosdavos` — 1 коммит, нет лицензии → отклонён. `theYahia` — лицензия OK, но код не верифицирован в рамках бюджета. `atomkraft` верифицирован полностью. **Верифицированный код (`src/index.ts` + `src/client.ts`):** - Единственный внешний хост: `https://api-metrika.yandex.net` (официальный Яндекс API). - OAuth-токен передаётся только в Authorization-заголовке запросов к этому хосту. - Нет динамического исполнения кода (eval, Function-constructor, и т.п.). - Нет shell-вызовов или spawn. - Валидация входных данных через Zod; regex-проверка формата дат. **Риск:** Одиночный автор, 7 коммитов — maintenance risk. Пинить SHA в `.mcp.json`; пересматривать upstream ежеквартально. --- ### C1-3 — `SvechaPVL/yandex-mcp` (Direct + Metrika + Wordstat) **Репозиторий:** https://github.com/SvechaPVL/yandex-mcp **Лицензия:** MIT — подтверждено прямым чтением `LICENSE`. **Архитектура модулей (верифицировано: README + client.py + config.py):** | Модуль | Файлы | Инструментов | Тип операций | |---|---|---|---| | Direct | `tools/direct/` | 80 | Mutations — НЕ активировать ⚠️ | | Metrika | `tools/metrika/` | 43 | Read-only analytics | | Wordstat | `tools/wordstat.py` | 5 | Read-only keyword research ✅ | **Внешние URL (`config.py`, все официальные домены Yandex):** - `https://api.direct.yandex.com/json/v5` - `https://api-metrika.yandex.net` - `https://api.wordstat.yandex.net` Токены отправляются только на эти хосты. HTTP-библиотека — `httpx.AsyncClient` (безопасная). Нет динамического исполнения кода в `client.py`. **Риск:** SvechaPVL — одиночный автор, 8 коммитов, 16 звёзд. Direct-модуль несёт mutation-риск (создание/редактирование рекламных кампаний в Яндекс.Директ). **Условие:** Активировать ТОЛЬКО Wordstat-инструменты (`tools/wordstat.py`, 5 tools). Direct-модуль не подключать. В конфигурации MCP передавать OAuth-токен с минимальным scope (Wordstat only). --- ### C1-4 — `chigwell/telegram-mcp` **Репозиторий:** https://github.com/chigwell/telegram-mcp **Лицензия:** Apache-2.0 — подтверждено прямым чтением `LICENSE`. **Верифицированный код (`main.py` + `telegram_mcp/runtime.py`):** - Единственный внешний хост: Telegram servers через Telethon (`TelegramClient`). - `TELEGRAM_SESSION_STRING` и API credentials передаются только в `TelegramClient` / `StringSession` — сторонних хостов нет. - Нет динамического исполнения кода. - Нет shell-команд через стандартные системные вызовы. - Защита от path-traversal: проверка `".." in Path.parts`. - Санитизация пользовательского контента (`sanitize_user_content()`). - Поддержка прокси (SOCKS4/5, HTTP, MTProxy) — остаётся в протоколе Telegram. **Автор:** chigwell (primary) + l1v0n1 (contributor), 259 коммитов, ~1 100 звёзд — активный зрелый проект. **Операционный риск:** MTProto user-account — это сессия реального пользователя, не bot-токен. Компрометация SESSION_STRING = полный доступ к аккаунту. Это не проблема кода (код чистый), а операционный риск конфигурации. **Условия:** 1. `TELEGRAM_SESSION_STRING` хранить ТОЛЬКО в `.env` на сервере; не в git, не в логах. 2. Использовать выделенный Telegram-аккаунт (не основной бизнес-аккаунт). 3. Режим — READ-тяжёлый (получение сообщений/каналов); отправка сообщений — только через явное действие оператора. 4. Ротация SESSION_STRING при любом подозрении на компрометацию. --- ### C1-5 — `gitroomhq/postiz-app` + `antoniolg/postiz-mcp` **Репозиторий:** https://github.com/gitroomhq/postiz-app **Лицензия:** AGPL-3.0 — подтверждено прямым чтением `LICENSE` (GNU Affero GPL Version 3, Copyright Nevo David 2025). **Анализ AGPL-3.0 для паттерна «внутренний self-host»:** | AGPL-обязательство | Применяется? | Комментарий | |---|---|---| | Публиковать исходники при **распространении** (§4) | Нет | Мы не распространяем — запускаем на своём сервере | | Публиковать исходники при **сетевом взаимодействии** (§13 — AGPL-специфика) | Ограниченно | Применимо при доступе сотрудников через сеть; FSF-трактовка: private/internal use не триггерит §13 | | Сохранять copyright notice | Да | Обязательно | | Распространять под той же лицензией | Нет | Не распространяем | | Совместимость с проприетарным кодом | Не применимо | Postiz — изолированный self-hosted сервис; код Лидерры с ним не линкуется | **Практический вывод:** Для паттерна «внутренний self-host без дистрибуции» AGPL-3.0 **приемлема**. **Условия:** 1. Использовать Postiz as-is без модификаций кода. 2. Сохранить AGPL copyright notice на сервере. 3. Не распространять сборки третьим лицам. 4. Проверить лицензию `antoniolg/postiz-mcp` отдельно перед активацией (не верифицировано — см. Open notes). --- ## Итоговые решения ### Выбранный репозиторий Yandex Metrika MCP **`atomkraft/yandex-metrika-mcp`** — единственный полностью верифицированный кандидат. `Vadosdavos` отклонён (1 коммит, нет лицензии). `theYahia` приемлем по лицензии, но код не верифицирован в рамках бюджета. Пин версии: зафиксировать SHA в `.mcp.json` после установки; пересматривать upstream ежеквартально. ### Сводка условий для PASS-with-conditions | Инструмент | Обязательные условия | |---|---| | `marketingskills` | Вендорить только `skills/` + `LICENSE`; добавить `ATTRIBUTION.md`; validate-scripts не включать | | `atomkraft/yandex-metrika-mcp` | Пинить SHA; READ-ONLY; пересмотр upstream ежеквартально | | `SvechaPVL/yandex-mcp` | Только Wordstat-модуль (5 tools); Direct-tools не активировать; OAuth-токен с минимальным scope | | `chigwell/telegram-mcp` | SESSION_STRING только в `.env`; выделенный аккаунт; READ-тяжёлый режим; ротация при компрометации | | `postiz-app` (AGPL) | Self-host as-is, без модификаций; сохранить copyright; не распространять; проверить лицензию `antoniolg/postiz-mcp` | ### Нет FAIL Ни один из 5 кандидатов не отклонён. Все прошли вет с условиями или без. --- ## Open notes (не верифицировано в рамках бюджета) 1. **`antoniolg/postiz-mcp` лицензия** — не проверена. Необходимо прочитать `LICENSE` в репозитории перед активацией MCP-клиента. Вероятно MIT (типично для MCP-клиентов), но не подтверждено. 2. **`atomkraft/yandex-metrika-mcp` точная дата последнего коммита** — GitHub вернул ошибку при загрузке contributor-stats. Определено: 7 коммитов, MIT, код чистый. Точную дату проверить через `git log` после клонирования. 3. **`chigwell/telegram-mcp` точная дата последнего коммита** — 259 коммитов, Apache-2.0, код чистый. Точная дата не верифицирована через WebFetch; проверить после клонирования. 4. **`SvechaPVL/yandex-mcp` OAuth scope** — проверить, возможно ли выдать токен только с Wordstat-правами в Яндекс OAuth, чтобы Direct-инструменты были физически неактивны даже при случайной активации модуля. --- ## Методология вета Для каждого кандидата: 1. Прочитана лицензия через `raw.githubusercontent.com` (прямой fetch, не память). 2. Прочитаны 1-2 ключевых исходника (index/client/runtime) через WebFetch. 3. Оценено: внешние хосты, обработка токенов, наличие запрещённых паттернов. 4. Для Metrika-кандидатов — сравнительная таблица по 4 параметрам. Все данные получены через WebFetch на дату 2026-05-22. Израсходовано инструментов: 18/20.