Files
portal/docs/security/marketing-vet.md
T
Дмитрий 26999ca597 chore: working tree cleanup pre-llm-first-router merge
Три группы накопившихся auto-правок (НЕ ручные):

1. markdownlint --fix auto-format (~25 .md в docs/superpowers/, docs/security/marketing-vet.md, docs/adr/015, docs/deploy/lkomega-runbook): MD031/MD032 (blank lines around fence/list) + MD004 (bullet markers `+`→`-`). Содержательных текстовых правок 3: ADR-015 bullet, sprint5d-cleanup bullet, router-discipline trailing space.

2. lefthook 2.1.6 → 2.1.8 (package.json + lock): patch-bump, авто-резолвил npm.

3. Observer runtime (docs/observer/): episodes-2026-05.jsonl +420 строк (текущая активность мозга), STATUS.md regen, .pii-counters / .read-counter тики, +2026-05-24-brain-retro.md note.

Цель — разблокировать merge feat/llm-first-router → main (этап 0 плана постановки в боевой). Содержание ветки не трогает.
2026-05-25 14:23:11 +03:00

205 lines
16 KiB
Markdown

# Провенанс-вет внешних инструментов 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.