{"_id":"@ai-hub-open/yandex-direct-mcp","_rev":"5-8555f74f11ee0a1f1d2b9deb6101e583","name":"@ai-hub-open/yandex-direct-mcp","dist-tags":{"latest":"0.5.0"},"versions":{"0.4.0":{"name":"@ai-hub-open/yandex-direct-mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","yandex-direct","ppc","advertising","click-ru","bun"],"license":"Apache-2.0","_id":"@ai-hub-open/yandex-direct-mcp@0.4.0","maintainers":[{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"}],"homepage":"https://github.com/ai-hub-open/yandex-direct-mcp#readme","bugs":{"url":"https://github.com/ai-hub-open/yandex-direct-mcp/issues"},"bin":{"yandex-direct-mcp":"src/index.ts"},"dist":{"shasum":"9df5ec198a2503b8cecdecbdb29caccb3ee71a31","tarball":"https://registry.npmjs.org/@ai-hub-open/yandex-direct-mcp/-/yandex-direct-mcp-0.4.0.tgz","fileCount":23,"integrity":"sha512-Po4hdtMxuWppjX8XEUsjSIoqdA/xDPh4yRn6hvjmwRuAGwJIGyvOgOPkX6V5j9MQqk8wGNMm8utMjIwjC0WsOg==","signatures":[{"sig":"MEUCIQCwDzWACxyfs+Lp7ua5HdOKLQ2bOjQcqFhXlGQ32QM5rAIgbQfSzk/HQtbFcwk3iBaASyLPCwxRrOPv6rPeRwcsCmo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133706},"main":"src/index.ts","type":"module","engines":{"bun":">=1.1.0"},"gitHead":"6cba0b06ac9fb26556acd35e6da54fa94fa5e6a9","scripts":{"build":"bun build ./src/index.ts --target=bun --outdir=./dist","start":"bun run src/index.ts","typecheck":"tsc --noEmit","prepublishOnly":"tsc --noEmit"},"_npmUser":{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"},"repository":{"url":"git+https://github.com/ai-hub-open/yandex-direct-mcp.git","type":"git"},"_npmVersion":"11.12.0","description":"MCP server for Yandex Direct API (JSON v5) — Bun/TypeScript port","directories":{},"_nodeVersion":"25.8.2","dependencies":{"jimp":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/yandex-direct-mcp_0.4.0_1785133554068_0.36924401013056385","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@ai-hub-open/yandex-direct-mcp","version":"0.4.1","keywords":["mcp","model-context-protocol","yandex-direct","ppc","advertising","click-ru","bun"],"license":"Apache-2.0","_id":"@ai-hub-open/yandex-direct-mcp@0.4.1","maintainers":[{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"}],"homepage":"https://github.com/ai-hub-open/yandex-direct-mcp#readme","bugs":{"url":"https://github.com/ai-hub-open/yandex-direct-mcp/issues"},"bin":{"yandex-direct-mcp":"src/index.ts"},"dist":{"shasum":"e0fa23952a85c37eb1b24eadd72cc395e37fddb9","tarball":"https://registry.npmjs.org/@ai-hub-open/yandex-direct-mcp/-/yandex-direct-mcp-0.4.1.tgz","fileCount":23,"integrity":"sha512-yTAo2TUCjjayI1bydymdsO/JuHL4sg9gfP0oD+bwOFmWRiE9ZogZwW2ey95RekKrTCil8RNIUkZCG3y5v7uQJg==","signatures":[{"sig":"MEUCIB4Y0iFkDzM31zgnckVctcityYHzxXU/FND0IRQ7XazCAiEA4Xt3ZVadQHhY2QCHL4YRB1RGj5wfxVG9IVtJcjEqI1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133936},"main":"src/index.ts","type":"module","engines":{"bun":">=1.1.0"},"gitHead":"95a90dafb01998ecb76a3e639fb1afc0c58840dd","mcpName":"io.github.ai-hub-open/yandex-direct-mcp","scripts":{"build":"bun build ./src/index.ts --target=bun --outdir=./dist","start":"bun run src/index.ts","typecheck":"tsc --noEmit","prepublishOnly":"tsc --noEmit"},"_npmUser":{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"},"repository":{"url":"git+https://github.com/ai-hub-open/yandex-direct-mcp.git","type":"git"},"_npmVersion":"11.12.0","description":"MCP server for Yandex Direct API (JSON v5) — Bun/TypeScript port","directories":{},"_nodeVersion":"25.8.2","dependencies":{"jimp":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/yandex-direct-mcp_0.4.1_1785135437099_0.805212706161933","host":"s3://npm-registry-packages-npm-production"}},"0.4.12":{"name":"@ai-hub-open/yandex-direct-mcp","version":"0.4.12","keywords":["mcp","model-context-protocol","yandex-direct","ppc","advertising","click-ru","bun"],"license":"Apache-2.0","_id":"@ai-hub-open/yandex-direct-mcp@0.4.12","maintainers":[{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"},{"name":"akainq","email":"aka.inq@gmail.com"}],"homepage":"https://github.com/ai-hub-open/yandex-direct-mcp#readme","bugs":{"url":"https://github.com/ai-hub-open/yandex-direct-mcp/issues"},"bin":{"yandex-direct-mcp":"src/index.ts"},"dist":{"shasum":"e0233930baaab3c995e024bb592ccd9b4799a23c","tarball":"https://registry.npmjs.org/@ai-hub-open/yandex-direct-mcp/-/yandex-direct-mcp-0.4.12.tgz","fileCount":30,"integrity":"sha512-mTGfWQkqbUKd8rbvnmrAgOO1Rr9HFt2GFUecAwrxbfixETOYi8oZhquJ9JNqJ+cRvO7RJFTsdeqG4S50/MDgOQ==","signatures":[{"sig":"MEUCIGQemcYFhUs9ZCb3LwqmPxRAP8lcZxialYNE80aDyuWVAiEAtWyrmSPdE8wuzj5J6SrEeDAX5+tDUf+0b4ahZbwaAiM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-hub-open%2fyandex-direct-mcp@0.4.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217639},"main":"src/index.ts","type":"module","engines":{"bun":">=1.1.0"},"gitHead":"dbb05bdaf9bf323b974f9735a6fd5d1603f848fe","mcpName":"io.github.ai-hub-open/yandex-direct-mcp","scripts":{"test":"bun run scripts/mock-tests.ts && bun run scripts/http-tests.ts","build":"bun build ./src/index.ts --target=bun --outdir=./dist","start":"bun run src/index.ts","test:http":"bun run scripts/http-tests.ts","test:mock":"bun run scripts/mock-tests.ts","typecheck":"tsc --noEmit","test:sandbox":"bun run scripts/sandbox-e2e.ts","prepublishOnly":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:337aad37-badf-46fe-871c-e617a87d9543"}},"repository":{"url":"git+https://github.com/ai-hub-open/yandex-direct-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server for Yandex Direct API (JSON v5) — Bun/TypeScript port","directories":{},"_nodeVersion":"22.23.1","dependencies":{"jimp":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/yandex-direct-mcp_0.4.12_1785389363244_0.20551318784256378","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@ai-hub-open/yandex-direct-mcp","version":"0.5.0","description":"MCP server for Yandex Direct API (JSON v5) — Bun/TypeScript port","license":"Apache-2.0","type":"module","main":"src/index.ts","scripts":{"start":"bun run src/index.ts","build":"bun build ./src/index.ts --target=bun --outdir=./dist","typecheck":"tsc --noEmit","test":"bun run scripts/mock-tests.ts && bun run scripts/http-tests.ts","test:mock":"bun run scripts/mock-tests.ts","test:http":"bun run scripts/http-tests.ts","test:sandbox":"bun run scripts/sandbox-e2e.ts","prepublishOnly":"tsc --noEmit"},"dependencies":{"jimp":"^1.6.0"},"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"bin":{"yandex-direct-mcp":"src/index.ts"},"repository":{"type":"git","url":"git+https://github.com/ai-hub-open/yandex-direct-mcp.git"},"homepage":"https://github.com/ai-hub-open/yandex-direct-mcp#readme","bugs":{"url":"https://github.com/ai-hub-open/yandex-direct-mcp/issues"},"keywords":["mcp","model-context-protocol","yandex-direct","ppc","advertising","click-ru","bun"],"engines":{"bun":">=1.1.0"},"publishConfig":{"access":"public"},"mcpName":"io.github.ai-hub-open/yandex-direct-mcp","gitHead":"8dedb472885ac9ecfe4e64a648f8387b885751b4","_id":"@ai-hub-open/yandex-direct-mcp@0.5.0","_nodeVersion":"22.23.1","_npmVersion":"12.0.2","dist":{"integrity":"sha512-EJ2bJWoqVHNs//h5iVgv5HKTZ2hZ1/hdE3Dg57KR1NwYlM5pOHLAIVG5fePvZe/QQvKHXUvjyYWprzlIudH11w==","shasum":"0d3678527a8c79ba61ff712b9c8ebb0ff6b857b6","tarball":"https://registry.npmjs.org/@ai-hub-open/yandex-direct-mcp/-/yandex-direct-mcp-0.5.0.tgz","fileCount":33,"unpackedSize":253751,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-hub-open%2fyandex-direct-mcp@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEzo5LZE3qINBfDFIqcuMyYyBQJJLRl1Ag38CbiC/khnAiEA9GK6a2rlntL2tkZKBSJ0GMdBmfLphCDKlj4GTih/fmI="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:337aad37-badf-46fe-871c-e617a87d9543"}},"directories":{},"maintainers":[{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"},{"name":"akainq","email":"aka.inq@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yandex-direct-mcp_0.5.0_1785396867233_0.49290516107496307"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-27T06:25:53.908Z","modified":"2026-07-30T07:34:27.666Z","0.4.0":"2026-07-27T06:25:54.225Z","0.4.1":"2026-07-27T06:57:17.245Z","0.4.12":"2026-07-30T05:29:23.379Z","0.5.0":"2026-07-30T07:34:27.356Z"},"bugs":{"url":"https://github.com/ai-hub-open/yandex-direct-mcp/issues"},"license":"Apache-2.0","homepage":"https://github.com/ai-hub-open/yandex-direct-mcp#readme","keywords":["mcp","model-context-protocol","yandex-direct","ppc","advertising","click-ru","bun"],"repository":{"type":"git","url":"git+https://github.com/ai-hub-open/yandex-direct-mcp.git"},"description":"MCP server for Yandex Direct API (JSON v5) — Bun/TypeScript port","maintainers":[{"name":"dmitry-zhokhov","email":"ai-hub-open@proton.me"},{"name":"akainq","email":"aka.inq@gmail.com"}],"readme":"# Yandex Direct MCP\n\nMCP-сервер для [Yandex Direct JSON API v5](https://yandex.ru/dev/direct/) на Bun + TypeScript.\n\n50 инструментов: кампании (включая ЕПК, стратегии торгов и цели Метрики), группы объявлений, объявления (текстовые и комбинаторные), расширения (быстрые ссылки, уточнения), изображения, ставки и прогноз цены клика, корректировки ставок, ключевые фразы, отчёты, справочники.\n\n## Требования\n\n- [Bun](https://bun.sh) 1.1+\n\n## Установка\n\n```bash\ngit clone https://github.com/ai-hub-open/yandex-direct-mcp.git\ncd yandex-direct-mcp\nbun install\n```\n\n## Настройка\n\nСкопируйте `.env.example` в `.env` и заполните **один из двух режимов** (переменные окружения имеют приоритет над `.env`):\n\n**A. Прямой режим — свой OAuth-токен Яндекс.Директа:**\n\n```bash\nYANDEX_DIRECT_TOKEN=y0__...\nYANDEX_DIRECT_SANDBOX=false   # true — песочница\n```\n\nПо умолчанию используется версия API **v501** (обязательна для ЕПК); переключить можно через `YANDEX_DIRECT_API_VERSION=v5`.\n\n**B. Через прокси [Click.ru](https://click.ru) — OAuth-токен Яндекса не нужен:**\n\n```bash\nCLICK_RU_PROXY=true\nCLICK_RU_TOKEN=<API-токен из профиля click.ru>\nCLICK_RU_CLIENT_LOGIN=<логин аккаунта Яндекс.Директа>\nCLICK_RU_USER_ID=<ID пользователя click.ru>   # только при работе из мастер-аккаунта\n```\n\nТокен создаётся в профиле `https://click.ru/userinfo.html` → поле «API Token» → «Создать». Аккаунт Яндекс.Директа должен быть подключён в Click.ru. Справка: `https://help.click.ru/81`, `https://api.click.ru/V0/docs/`.\n\n> Прокси Click.ru работает только с продакшн-API Яндекса (песочница недоступна).\n\n## Запуск\n\n```bash\nbun run src/index.ts                                  # stdio — для локальных MCP-клиентов\nMCP_AUTH_TOKEN=<секрет> bun run src/index.ts --http   # HTTP-сервер на :3000\n```\n\nВ HTTP-режиме `MCP_AUTH_TOKEN` обязателен — см. [HTTP-режим](#http-режим).\n\n## Тесты\n\nОбязательный гейт перед изменениями — мок-тесты (тела запросов к API, без сети) и тесты HTTP-транспорта (авторизация, CORS):\n\n```bash\nbun run test\n```\n\nE2E-прогон на песочнице (создаёт и удаляет тестовые кампании; нужны `YANDEX_DIRECT_TOKEN` и `YANDEX_DIRECT_SANDBOX=true`):\n\n```bash\nbun run test:sandbox\n```\n\n**Ограничения песочницы Яндекса** (в проде их нет; часть лечится пересозданием песочницы в кабинете — Инструменты → Настройки API → Песочница). E2E помечает такие шаги как «пропуск», а не как ошибку:\n\n- `adgroups.add` возвращает ID, но группа не появляется в `adgroups.get`, а `ads.add` отвечает «Группа объявлений не найдена» — заливка объявлений в песочнице непроверяема;\n- `bidmodifiers.add` возвращает ID, но `bidmodifiers.get` всегда пуст при любом фильтре;\n- сервис `sitelinks` отвечает «Сервис временно недоступен».\n\n## Подключение к Claude Code\n\n`.mcp.json` в корне вашего проекта (см. также `.mcp.json.example`):\n\n```json\n{\n  \"mcpServers\": {\n    \"yandex-direct\": {\n      \"command\": \"bun\",\n      \"args\": [\"run\", \"/абсолютный/путь/к/yandex-direct-mcp/src/index.ts\"],\n      \"env\": {\n        \"CLICK_RU_PROXY\": \"true\",\n        \"CLICK_RU_TOKEN\": \"<ваш токен>\",\n        \"CLICK_RU_CLIENT_LOGIN\": \"<логин Директа>\"\n      }\n    }\n  }\n}\n```\n\nДля прямого режима в `env` вместо `CLICK_RU_*` укажите `YANDEX_DIRECT_TOKEN`.\n\n**📋 Инструкция для AI-агента** — скопируйте и передайте своему агенту (Claude Code / Codex), подставив ключи:\n\n> Установи и подключи MCP-сервер «Yandex Direct»: склонируй `https://github.com/ai-hub-open/yandex-direct-mcp.git`, проверь Bun (`bun --version`, если нет — установи с https://bun.sh), выполни `bun install` в корне репозитория. Зарегистрируй локальный stdio-MCP: команда `bun`, аргументы `run <абсолютный_путь_к_репо>/src/index.ts`, переменные окружения — мои ключи: `CLICK_RU_PROXY=true`, `CLICK_RU_TOKEN=<...>`, `CLICK_RU_CLIENT_LOGIN=<...>` (или `YANDEX_DIRECT_TOKEN=<...>` для прямого режима). Проверь `tools/list` и сообщи результат.\n\n## HTTP-режим\n\n```bash\nMCP_TRANSPORT=http MCP_PORT=3000 MCP_AUTH_TOKEN=<секрет> bun run src/index.ts\n```\n\n**`MCP_AUTH_TOKEN` обязателен**: без него сервер не стартует, потому что открытый эндпоинт даёт полный доступ к рекламному кабинету. Запросы должны нести `Authorization: Bearer <секрет>`. Если сервер закрыт reverse-proxy или слушает только localhost, запуск без авторизации подтверждается явно: `MCP_ALLOW_ANONYMOUS=true`.\n\nПеременные: `MCP_PORT` (3000), `MCP_HOST` (0.0.0.0), `MCP_AUTH_TOKEN`, `MCP_ALLOW_ANONYMOUS`, `MCP_ALLOWED_ORIGIN`. CORS-заголовки по умолчанию **не выдаются** (MCP-клиенты ходят не из браузера) — разрешите конкретный источник через `MCP_ALLOWED_ORIGIN`, если он действительно нужен.\n\n| Метод + путь | Назначение |\n|---|---|\n| `POST /mcp` | JSON-RPC 2.0 запрос (или батч) |\n| `GET /healthz` | health check |\n| `GET /mcp/tools` | список инструментов (отладка) |\n\n**Multi-tenant:** креды можно передавать заголовками на каждый запрос (перекрывают `.env`) — один инстанс обслуживает несколько клиентов:\n\n```\nX-Yandex-Token: <OAuth>              X-Click-Ru-Token: <токен>\nX-Yandex-Sandbox: true|false         X-Click-Ru-User-Id: <ID>\nX-Yandex-Api-Version: v501|v5        X-Client-Login: <логин Директа>\n                                     X-Click-Ru-Base-Url: <база API Click.ru>\n```\n\nВ режиме Click.ru по HTTP обязательны все три заголовка. Сервер можно запустить без кред в `.env` — тогда каждый запрос обязан нести заголовки.\n\n**⚠️ Безопасность:** при публикации в сеть держите `MCP_AUTH_TOKEN` заданным и закройте порт за reverse-proxy с TLS. Запуск с `MCP_ALLOW_ANONYMOUS=true` на `MCP_HOST=0.0.0.0` открывает кабинет всем, кто дотянется до порта.\n\n## Docker\n\n```bash\ncp .env.example .env   # заполните ключи и MCP_AUTH_TOKEN\ndocker compose up -d --build\ncurl http://localhost:3000/healthz\n```\n\n## Инструменты (50)\n\n- **Campaigns**: get / add / update / delete / suspend / resume — текстовые кампании и ЕПК (единая перформанс-кампания), стратегии торгов с недельным бюджетом, счётчики Метрики и приоритетные цели\n- **AdGroups**: get / add / update / delete — включая группы ЕПК (UnifiedAdGroup)\n- **Ads**: get / add / add_responsive (комбинаторное объявление ЕПК) / update (текстовые и комбинаторные) / delete / suspend / resume / moderate\n- **AdImages**: add (с кропом) / get\n- **Sitelinks**: add / get / delete — наборы быстрых ссылок\n- **AdExtensions**: add / get / delete — уточнения\n- **BidModifiers**: devices / regional / retargeting / demographics / set / delete / get — корректировки ставок на запись и чтение\n- **Keywords**: get / add / update / delete / suspend / resume\n- **KeywordBids**: set / get — ставки по фразам и данные аукциона (объёмы трафика, цены)\n- **Forecast**: forecast_bids — прогноз цены клика и трафика по произвольным фразам **без создания кампании**\n- **Reports**: campaign / ad / search_queries / custom (произвольный тип и набор столбцов)\n- **Dictionaries**: regions / currencies / interests / all\n\n### Предпросмотр записи (dry-run)\n\nЛюбой инструмент, меняющий кабинет, принимает `dry_run: true` — вернёт тело запроса, которое ушло бы в API, и **ничего не изменит**. Валидация параметров при этом выполняется полностью, так что предпросмотр ловит ошибки до записи:\n\n```json\n{ \"name\": \"yandex_direct_campaigns_add\", \"arguments\": { \"name\": \"Тест\", \"start_date\": \"2026-08-01\", \"dry_run\": true } }\n```\n\n### Отказы API\n\nЛюбой отказ Директа возвращается агенту помеченным как ошибка, с причиной и следующим шагом — включая частичные отказы, когда запрос выполнен, но отдельные объекты не приняты. Пример реального ответа:\n\n```\nЗапрос к API Яндекс.Директа отклонён (код 152).\nПричина: Недостаточно баллов\nБаллы API: потрачено 0, осталось 0 из 64000\nЧто делать: Закончились баллы API (units) — это дневной лимит на обращения\nк Директу, а не проблема моста. Баллы начисляются раз в 60 минут...\n```\n\nНиже подсказки всегда идёт полный ответ API — для разбора нестандартных случаев.\n\n### Расход контекста\n\nПолное описание инструментов (`tools/list`) занимает **около 16 800 токенов** — 8,4% окна на 200k и 1,7% на 1M. Три четверти веса приходятся на JSON-схемы параметров, на текстовые описания — 17%.\n\nСокращённый режим (отдельные методы «список / описание / вызов») **решено не вводить**: выигрыш не оправдывает потерю штатной валидации аргументов на стороне клиента и лишние round-trip'ы, а доля окна не критична. Решение пересмотреть, если число инструментов заметно вырастет.\n\nЗамер воспроизводится:\n\n```bash\nbun run scripts/measure-context.ts\n```\n\n### Что осознанно вне этого моста\n\nМост покрывает **только API Яндекс.Директа**. Смежные задачи живут в других контурах и сюда не встраиваются:\n\n- **Вордстат** (подбор семантики, частота запросов, спрос) — отдельный API Яндекса, не Директ. Остаётся за скиллом или отдельным MCP. Граница проходит по смыслу данных: частота и спрос — там, аукционные деньги (прогноз цены клика) — здесь, инструментом `forecast_bids`.\n- **Метрика как сервис** (создание целей, чтение статистики, сегменты) — отдельный API Метрики. Мост Директа привязывает цель по готовому ID (`counter_ids`, `priority_goals`, `goal_id` в стратегиях) — на этом граница.\n\nПричина: «одно подключение к Яндексу = Директ + Метрика + Вордстат» — это уровень пакета или прокси (например Click.ru), а не одного сервера. Смешение трёх API в одном мосте увеличивает связность и зону отказа.\n\n## Лицензия\n\n[Apache License 2.0](LICENSE)\n","readmeFilename":"README.md"}