Бесплатный интерактивный курс · aicoding.space

MCP-навыки: агент выходит в мир

Практический курс по @dzhechkov/skills-mcp — 16 навыков-инструкций к MCP-серверам: поиск, почта, календарь, таблицы, задачи, Notion и Obsidian, git и GitLab, ComfyUI и самообучающаяся память AgentDB. Вместе с Леной ты поймёшь, чем навык отличается от сервера, соберёшь связку «сервер + навык + агент», разберёшься с транспортами и ключами, научишься подбирать поисковый навык под вопрос, безопасно работать с почтой и доводить правку до слияния — и узнаешь, почему самая честная страница пакета говорит «измерено, не запомнено».

Содержание курса

1. Навык — это не сервер

Что лежит в @dzhechkov/skills-mcp на самом деле — и почему после установки пакета почта сама не прочитается.

Ключевая мысль: навык — это инструкция к MCP-серверу, а не сам сервер

Лена поставила пакет, открыла Claude Code и сказала: «найди в почте письмо от бухгалтерии». Агент ответил, что не умеет читать почту. Лена решила, что пакет сломан. Пакет цел — сломано было её ожидание, и оно, скорее всего, совпадает с твоим.

Навык — это инструкция к MCP-серверу, а не сам сервер. MCP (Model Context Protocol) — протокол, по которому агент вызывает внешние инструменты: поиск, почту, календарь. Сервер — отдельная программа, которая эти инструменты реально выполняет. А навык из этого пакета — файл SKILL.md: он объясняет агенту, какой сервер поставить, какие у него инструменты, какие параметры, когда что вызывать и на какие грабли не наступать.

Пакет @dzhechkov/skills-mcp на npm — это 16 таких инструкций для шестнадцати серверов: поиск (brave-search, exa-search, jina-reader, context7, reddit), почта и календарь (gmail, google-calendar), таблицы и задачи (google-sheets, google-tasks, clickup), знание (notion, obsidian), код (git-mcp, gitlab), картинки (comfyui) и самообучающаяся память (agentdb-memory). Исходники — в зеркале на GitHub.

Значит, рабочая связка всегда из трёх частей:

  • сервер — программа, которую ты добавляешь командой claude mcp add …;
  • навык — инструкция, которую раскладывает dz init;
  • агент — тот, кто читает инструкцию и вызывает сервер.

Убери любую часть — и ничего не заработает. Лена убрала первую: сервер Gmail она не добавляла, поэтому агенту было нечего вызывать, сколько бы инструкций у него ни лежало.

Компромисс: такое разделение честнее, чем «поставил пакет — всё работает», но требует понимать, где кончается навык и начинается сервер. Зато один и тот же навык годится для Claude Code, Claude Desktop, Cursor и VS Code — в SKILL.md есть блоки конфигурации для каждого.

💬 Скажи словами. Как только связка собрана, команды больше не нужны: «найди письмо от бухгалтерии» — и агент сам возьмёт gmail_search. Команды в этом курсе — чтобы ты понимал, что происходит под капотом.

2. Три способа установить навыки

Пресет mcp, точечный --select и голый npm install — что выбирает Лена и почему.

Ключевая мысль: dz init --preset mcp ставит все 16 навыков разом

Лена открыла README и увидела три команды установки. «Какая правильная?» — правильные все три, но для разных ситуаций. Выбирай по тому, что ты знаешь заранее.

  1. Пресет — если хочешь всё. dz init --target claude-code --preset mcp ставит все 16 навыков разом. Пресет mcp — именованный набор в каталоге dz (пакет harness-presets), и его состав — ровно этот пакет.
  2. Точечно — если знаешь имена. dz init --target claude-code --select brave-search,exa-search,gmail кладёт только перечисленные. Имена — из таблицы Skill Inventory в README.
  3. Голый npm — если dz не нужен. npm install @dzhechkov/skills-mcp просто скачает папки с SKILL.md в node_modules; раскладывать их по проекту придётся самому.

Лена выбрала пресет — и правильно для первой недели: пока не знаешь, что понадобится, дешевле иметь все инструкции под рукой. Инструкции ничего не стоят в работе: навык активируется только когда задача совпала с его триггерами (об этом — секция 4), а лишние просто лежат.

Что реально стоит ресурсов — серверы, а их пресет не добавляет. Так что «поставить все 16 навыков» ≠ «запустить 16 серверов»: серверы ты добавишь по одному, когда дойдёшь до каждого.

Компромисс: пресет быстр, но прячет от тебя список; --select прозрачен, но требует знать имена; npm install не зависит от dz вовсе, но и не раскладывает ничего. Лена через месяц пересобрала арсенал через --select — когда уже знала, чем пользуется.

💬 Скажи словами. «Поставь мне все MCP-навыки» → ассистент выполнит dz init --preset mcp. Лена так и сделала — команду она увидела уже в ответе.

3. Две половины запуска

Quick Setup из README: сервер регистрирует claude mcp add, инструкцию кладёт dz init — и порядок имеет значение.

Ключевая мысль: claude mcp add регистрирует сервер, dz init — навык

После секции 1 Лена поняла, чего не хватает, и открыла раздел Quick Setup. Там шесть строк claude mcp add и одна dz init. Это и есть вся механика: claude mcp add регистрирует сервер, dz init — навык. Две половины, и обе обязательны.

Вот те самые строки из README — обрати внимание, что они разные по форме:

  • claude mcp add brave-search -- npx @brave/brave-search-mcp-server — локальный сервер, запускается через npx;
  • claude mcp add --transport http exa https://mcp.exa.ai/mcp — размещённый сервер, ходим по HTTP;
  • claude mcp add gogcli-gmail -- gogcli-mcp-gmail — локальный, но не через npx: бинарник ставится заранее;
  • claude mcp add clickup -- npx @taazkareem/clickup-mcp-server;
  • claude mcp add context7 -- npx @upstash/context7-mcp;
  • claude mcp add --transport http jina https://mcp.jina.ai/mcp.

Всё после -- — команда запуска сервера; всё до — имя, под которым Claude Code его запомнит. Потом одна строка dz init --target claude-code --preset mcp кладёт инструкции.

Порядок на самом деле такой: выбрать сервер → добавить его → дать ему ключ (если нужен) → положить навык → проверить. Проверка — claude mcp list: если сервера в списке нет, первая половина не сделана, и никакой навык этого не исправит. Лена сначала запускала dz init и удивлялась тишине; теперь она начинает с claude mcp list и смотрит, кого не хватает.

Компромисс: две команды вместо одной — лишний шаг, зато каждую половину можно менять независимо: сервер обновится через npx, навык — через dz upgrade, и они не сломают друг друга.

💬 Скажи словами. «Подключи Brave Search» → ассистент выполнит claude mcp add brave-search -- npx @brave/brave-search-mcp-server и сам спросит про ключ. Лена перестала вспоминать синтаксис -- уже на второй день.

4. Навык включается сам

Как агент понимает, что пора брать gmail, а не notion — и что делать, если он выбрал не то.

Ключевая мысль: триггерные фразы во frontmatter SKILL.md

Связка собрана. Лена ничего не вызывает руками — она пишет «найди в почте счёт от подрядчика», и агент берёт gmail. Пишет «сделай страницу в Notion из этих заметок» — берёт notion. Кто решает, какой навык брать?

Решает совпадение. У каждого навыка в шапке SKILL.md (это frontmatter — блок метаданных в начале файла) есть описание и триггерные фразы: слова и обороты, при которых навык уместен. Агент сравнивает твою задачу с ними и подгружает подходящую инструкцию. Ни команды, ни меню — только слова.

Два инструмента, когда совпадение не сработало:

  1. dz info <skill-id> — показывает точные триггеры и файлы навыка. Лена так узнала, что exa-search реагирует на «семантический поиск» и «исследование компании», а brave-search — на «свежие новости» и «местные заведения».
  2. dz registry search <term> — ищет навык по слову в каталоге. Полезно, когда не помнишь имя.

Есть и обратная сторона: два навыка могут претендовать на одну задачу. «Поищи в вебе» подходит и brave, и exa, и jina. Тогда агент выберет по описанию — а ты можешь подсказать: «поищи в Exa, нужен именно смысловой поиск». Уточнение словами дешевле, чем правка триггеров.

Компромисс: авто-активация избавляет от заучивания имён, но делает выбор непрозрачным — пока не заглянешь в dz info. Лена держит за правило: если агент взял не тот навык дважды подряд, она смотрит триггеры обоих и уточняет формулировку.

💬 Скажи словами. Это и есть вся секция: слова — единственный интерфейс. «Какие триггеры у gmail?» → ассистент выполнит dz info gmail.

5. stdio или http: где живёт сервер

Почему exa и jina добавляются с --transport http, а brave и git — через npx, и что это меняет для тебя.

Ключевая мысль: транспорт stdio или http

Лена заметила, что строки claude mcp add бывают двух видов, и спросила: «а почему exa — по адресу, а brave — через npx?» Ответ — транспорт: stdio или http. Это то, ПО ЧЕМУ агент разговаривает с сервером.

  • stdio — сервер запускается у тебя на машине как процесс, а агент пишет ему в стандартный ввод и читает стандартный вывод. Так работают brave-search, git-mcp, gitlab, notion, obsidian, comfyui, clickup, context7, gmail, google-calendar, google-sheets, google-tasks, reddit, agentdb-memory. Признак в команде: -- npx <пакет> или -- <бинарник>.
  • http — сервер размещён у поставщика, у тебя ничего не запускается; агент ходит по URL. Так работают exa (https://mcp.exa.ai/mcp) и jina (https://mcp.jina.ai/mcp). Признак: --transport http <url>.

Иногда один сервер даёт оба варианта. У exa-search в SKILL.md две установки: размещённая (claude mcp add --transport http exa https://mcp.exa.ai/mcp, рекомендована) и локальная (claude mcp add exa-search -- npx exa-mcp-server). У jina — ещё и SSE-вариант (--transport sse https://mcp.jina.ai/sse). У gitlab заявлены stdio, SSE и Streamable HTTP.

Что это меняет для Лены:

  1. Ключ. У stdio ключ передаётся серверу через переменную окружения (-e BRAVE_API_KEY=…); у http — в заголовке запроса (x-api-key в конфигурации Claude Desktop для exa).
  2. Зависимости. stdio требует, чтобы npx или бинарник были на машине; http — только сеть.
  3. Обновления. stdio-сервер обновляется через npx при следующем запуске; http-сервер обновляет поставщик, ты этого не видишь.

Компромисс: stdio держит данные локально и работает без интернета там, где сервер локальный (git, obsidian, comfyui), но требует установки; http ставится одной строкой и не занимает машину, но твои запросы уходят к поставщику. Лена выбрала http для exa и jina и stdio для всего, что трогает её файлы.

6. Ключи: сколько прав давать

Куда класть BRAVE_API_KEY, что значит -e у clickup, и почему Лена отозвала свой первый токен GitLab.

Ключевая мысль: минимальные права для токена

Первый токен GitLab Лена сделала со скоупом api — «чтобы точно всё работало». Через неделю она его отозвала и сделала новый с read_api + read_repository. Что изменилось за неделю? Она прочитала SKILL.md до конца.

Ключи в этом пакете передаются серверу тремя способами — и все три описаны в SKILL.md каждого навыка:

  1. Флаг -e в claude mcp addclaude mcp add clickup -e CLICKUP_API_KEY=pk_xxx -- npx @taazkareem/clickup-mcp-server. Ключ уходит в окружение процесса сервера.
  2. Блок env в конфигурацииclaude_desktop_config.json, .cursor/mcp.json, .vscode/mcp.json: "env": { "BRAVE_API_KEY": "…" }. В VS Code можно ${input:clickupApiKey} — тогда редактор спросит ключ, а не хранит его в файле.
  3. Заголовок для http-серверов"headers": { "x-api-key": "…" } у размещённого exa.

Теперь про то, СКОЛЬКО прав давать. У gitlab в SKILL.md есть таблица скоупов: api — полный доступ, read_api — только чтение, read_repository — файлы репозитория, write_repository — push, merge, ветки. И прямо сказано: минимальные права для токенаread_api + read_repository, если нужно только читать; api — только когда действительно нужны записи. Это принцип минимальных привилегий: токен умеет ровно то, что ты от агента ждёшь, и ни на йоту больше.

Зачем это Лене? Агент — не она. Он может неверно понять задачу, а токен с api позволит ему слить merge request, который она хотела лишь посмотреть. Токен с read_api такого не позволит физически — отказ на стороне GitLab, до ущерба.

Где ключей нет вовсе — тоже полезно знать: context7 («Auth: None required»), jina для базового использования, reddit в анонимном режиме (~10 запросов в минуту; REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET поднимают лимит), agentdb (всё локально, в одном .db-файле).

Компромисс: узкий токен придётся расширять, когда задачи вырастут — это лишняя итерация. Зато ошибка агента с узким токеном — отказ, а с широким — инцидент.

💬 Скажи словами. «Подключи GitLab, только на чтение» → ассистент напомнит про скоупы read_api + read_repository и попросит токен — вставлять его в чат не нужно, положи в окружение.

7. Пять поисковых навыков — какой брать

brave, exa, jina, context7, reddit: пять разных вопросов, а не пять одинаковых поисков.

Ключевая мысль: подбор поискового навыка под задачу

У Лены пять поисковых навыков, и первую неделю она звала все «поиском». Потом заметила, что они отвечают на разные вопросы. Подбор поискового навыка под задачу — не про то, какой лучше, а про то, какой вопрос ты задаёшь.

  • brave-search — «что есть в вебе прямо сейчас?» Пять инструментов: brave_web_search, brave_local_search (заведения: адрес, часы, рейтинг), brave_video_search, brave_image_search, brave_news_search. Параметры: count 1–20, freshnesspd (день), pw (неделя), pm (месяц), py (год), summary: true — сводка от ИИ. Запрос не длиннее 400 символов.
  • exa-search — «найди по смыслу». web_search с type: neural (понимает намерение) или keyword (точное совпадение), num_results 1–100, category: company, research_paper, news, github, tweet, pdf; find_similar — страницы, похожие на данный URL.
  • jina-reader — «прочитай мне эту страницу». read_url превращает любой URL в чистый markdown, extract_data вынимает структуру по схеме, search_web ищет и отдаёт результаты уже markdown-ом.
  • context7 — «как сейчас выглядит API этой библиотеки?» resolve_libraryget_library_docs → актуальная документация вместо памяти модели; search_docs — по всем библиотекам сразу.
  • reddit — «что об этом говорят люди?» search_posts, get_post, get_comments, list_subreddit (hot, new, top, rising), search_subreddit, get_user_posts.

Цепочка, которую Лена собрала за один вечер: exa нашёл статьи по смыслу («как строить MCP-сервер на TypeScript», category: github), jina прочитал лучшую из них в markdown, context7 проверил, что сигнатуры в статье не устарели, reddit показал, на что жалуются те, кто уже пробовал. Четыре навыка — один вопрос, разложенный на четыре.

Компромисс: пять навыков означают пять ключей и пять наборов триггеров; агент иногда возьмёт brave там, где ты ждал exa (секция 4). Зато каждый отвечает на свой вопрос лучше универсального поиска — и ты это чувствуешь по первому же результату.

💬 Скажи словами. «Найди свежие новости про X за неделю» → brave_news_search с freshness: pw. «Найди похожие на эту страницу» → find_similar из exa. Слово «похожие» и слово «свежие» уже выбирают навык за тебя.

8. Почта: черновик, потом отправка

gog auth, синтаксис поиска Gmail, gmail_draft вместо gmail_send и один опасный gmail_bulk.

Ключевая мысль: черновик gmail_draft перед отправкой

Почта — первое, ради чего Лена вообще взялась за пакет. И первое, где агент может натворить необратимое: письмо не вернёшь, удалённое не восстановишь. Поэтому у навыка gmail в SKILL.md есть раздел Tips, и его главная строка — черновик gmail_draft перед отправкой, когда не уверен.

Сначала подключение — здесь оно самое длинное в пакете, потому что сервер не через npx:

  1. Поставить gogcli — CLI для сервисов Google: brew install gogcli на macOS или скачать бинарник gog для Linux (команда есть в SKILL.md).
  2. Поставить сам сервер: npm install -g gogcli-mcp-gmail.
  3. Авторизоваться: gog auth add your@gmail.com --services gmail — откроется браузер, ты выдаёшь права на чтение, отправку и изменение.
  4. Зарегистрировать: claude mcp add gogcli-gmail -- gogcli-mcp-gmail.

Восемь инструментов: gmail_search (синтаксис тот же, что в строке поиска Gmail: from:, to:, subject:, is:unread, has:attachment, newer_than:7d, older_than:30d; max_results 1–100), gmail_get (письмо целиком по id), gmail_send, gmail_draft, gmail_label, gmail_forward, gmail_autoreply и gmail_bulk — массовое действие над всем, что нашёл запрос: archive, delete, mark_read, mark_unread, label.

Три привычки из раздела Tips, которые Лена сделала своими:

  • Сначала искать, потом писать — чтобы не заводить второй тред там, где есть первый.
  • Черновик, когда не уверенgmail_draft, прочитать глазами, потом отправить. Особенно для писем наружу.
  • bulk — только с проверенным запросом: сперва gmail_search с тем же query, посмотреть, что попало, и лишь затем gmail_bulk. Пример из SKILL.md безопасен именно поэтому: category:promotions is:read older_than:30d + archive — архив, не удаление.

Компромисс: черновик и предварительный поиск — два лишних шага на каждое письмо; зато отправка, которую агент понял неверно, остаётся в черновиках, а не в чужом ящике.

💬 Скажи словами. «Набросай ответ подрядчику, но не отправляй» — агент возьмёт gmail_draft. Слова «не отправляй» — самый дешёвый предохранитель в этом пакете.

9. Три Google — три разных входа

Календарь, Таблицы и Задачи — один аккаунт, а способы авторизации у серверов не совпадают.

Ключевая мысль: три разных способа авторизации Google

Лена подключила календарь, обрадовалась и пошла подключать таблицы тем же способом. Не сработало. Потом задачи — снова по-другому. Сюрприз пакета: у трёх навыков одного и того же Google три разных способа авторизации, потому что за ними три разных сервера от трёх разных авторов.

  1. google-calendar (@cocal/google-calendar-mcp): переменная GOOGLE_OAUTH_CREDENTIALS — путь к JSON-файлу OAuth-клиента из Google Cloud (тип «Desktop app», например gcp-oauth.keys.json). После claude mcp add google-calendar -- npx @cocal/google-calendar-mcp нужно попросить агента пройти вход в Google — и только потом вызывать list_events или create_event.
  2. google-sheets (mcp-google-sheets): по умолчанию сервисный аккаунт — SERVICE_ACCOUNT_PATH к JSON-ключу; необязательный DRIVE_FOLDER_ID ограничивает доступ одной папкой Диска. Альтернатива — OAuth через GOOGLE_SHEETS_CLIENT_ID, GOOGLE_SHEETS_CLIENT_SECRET, TOKEN_PATH.
  3. google-tasks (@zcaceres/gtasks): проще всего через Smithery — npx -y @smithery/cli install @zcaceres/gtasks --client claude; вручную — клонировать репозиторий, npm run build, затем один раз npm run start auth (браузер, OAuth), после чего ключи лягут в .gdrive-server-credentials.json.

Заметь ещё одно расхождение, которое стоит знать: таблица Skill Inventory в README подписывает эти три сервера как «Smithery (googlecalendar)», «Smithery (googlesheets)», «Smithery (googletasks)», а SKILL.md называет конкретные пакеты. Источник истины — SKILL.md: там строка установки, там переменные. Таблица — краткая подпись, и она отстала (измерено чтением обоих файлов, 2026-09-02).

Что умеют, когда вошли:

  • календарь: list_events (диапазон time_min/time_max, query, single_events раскрывает повторяющиеся), create_event — с участниками, местом и RRULE для повторов;
  • таблицы: read_sheet (диапазон в A1-нотации, value_render_option: FORMULA покажет формулы, а не значения), write_sheet (USER_ENTERED разбирает формулы, RAW пишет как есть);
  • задачи: list_task_lists, list_tasks, create_task, update_task, complete_task, delete_task, move_task.

Компромисс: три входа — втрое больше настройки, чем хотелось бы, и DRIVE_FOLDER_ID — единственное место, где можно сузить доступ. Зато каждый сервер выбран за полноту инструментов, а не за единообразие входа.

💬 Скажи словами. «Поставь встречу с Алисой на завтра в 14:00 и повторяй каждую среду» → create_event с RRULE. Лена ни разу не писала RRULE руками — только читала, что агент собрал.

10. Notion и ClickUp: сначала открыть доступ

Почему ключ Notion работает, а страниц агент не видит — и как ClickUp закрывает дневной цикл Лены.

Ключевая мысль: интеграция Notion должна быть подключена к страницам

Лена завела интеграцию в Notion, скопировала секрет (начинается с ntn_), положила в NOTION_API_KEY, зарегистрировала сервер — и search_pages вернул пустоту. Ключ верный, сервер жив, страниц нет. Она прочитала пятый пункт раздела Notion API Key Setup — и всё встало на место.

Пятый пункт: интеграция Notion должна быть подключена к страницам. Ключ даёт интеграции право существовать, но не даёт ей ни одной страницы. Каждую страницу или базу нужно расшарить интеграции вручную: меню «⋯» на странице → Connections → выбрать свою интеграцию. Это не мелочь в сноске — это причина пустого ответа, и в SKILL.md она стоит в основной последовательности настройки.

Порядок из SKILL.md целиком:

  1. notion.so/my-integrations → New integration, имя вроде «Claude MCP».
  2. Выбрать workspace и права: читать, обновлять, вставлять содержимое.
  3. Скопировать Internal Integration Secret (ntn_…) в NOTION_API_KEY.
  4. claude mcp add notion -- npx @notionhq/notion-mcp-server.
  5. Расшарить нужные страницы и базы интеграции через Connections.

Инструменты: search_pages (по заголовку или содержимому, фильтр page/database), get_page, create_page (родитель — page_id или database_id, свойства и блоки-дети) и дальше по работе с базами и блоками.

ClickUp закрывает вторую половину утра Лены — задачи. Сервер @taazkareem/clickup-mcp-server, ключ через -e CLICKUP_API_KEY=pk_… (секция 6). Инструменты: create_task (исполнители, приоритет, срок, теги), update_task, list_tasks с фильтрами по статусу и исполнителю, add_comment с markdown, create_doc, start_timer/stop_timer, list_spaces, list_folders. Пример из SKILL.md — стендап одной фразой: «все задачи из Sprint 42 в статусе In Progress, сгруппируй по исполнителю, покажи учтённое время».

Компромисс: ручной шаринг страниц в Notion — самое частое место, где «всё настроено, а не работает»; зато интеграция видит ровно то, что ты ей открыл, — это та же минимальность прав из секции 6, только на уровне страниц.

💬 Скажи словами. «Сохрани итоги встречи страницей в Notion под проектом X и заведи в ClickUp три задачи из списка действий» — два навыка в одной фразе; Лена так закрывает каждую ретро.

11. От ветки до слияния

17 инструментов git-mcp и MR-цикл gitlab — как Лена доводит правку до слияния, не открывая браузер.

Ключевая мысль: путь merge request: ветка, коммит, push, пайплайн, слияние

У Лены два навыка про код, и она путала их первые дни. Разница простая: git-mcp — то, что происходит в репозитории на диске; gitlab — то, что происходит на сервере GitLab вокруг репозитория. Вместе они дают путь merge request: ветка, коммит, push, пайплайн, слияние — целиком через агента.

git-mcp (claude mcp add git -- npx @cyanheads/git-mcp-server) — 17 инструментов, каждый с параметром repo_path (или общий GIT_DEFAULT_PATH в окружении): git_status, git_diff (цель HEAD, main..feature, --staged, можно сузить до файла), git_log (max_count, branch, author, since, file_path), git_commit (список файлов — застейджит их сам), git_branch, git_merge, git_rebase, git_stash, git_cherry_pick, git_clone, git_fetch, git_pull, git_push, git_reset, git_tag, git_worktree, git_remote. Число 17 — это ровно столько заголовков ### git_… в SKILL.md; таблица README говорит то же.

gitlab (claude mcp add gitlab -- npx @zereight/mcp-gitlab, токен из секции 6, GITLAB_URL для своего инстанса): проекты, create_merge_request, list_merge_requests, approve_merge_request, merge_merge_request, задачи (create_issue, update_issue), пайплайны (list_pipelines, get_pipeline, retry_pipeline, cancel_pipeline), wiki, релизы, теги, вехи.

Путь Лены от правки до слияния, без единой вкладки браузера:

  1. git_branch — новая ветка.
  2. git_commit с именами файлов — застейджит и закоммитит.
  3. git_push — ветка на сервере.
  4. create_merge_request — MR из ветки в main.
  5. get_pipeline — дождаться зелёного; если красный — retry_pipeline.
  6. approve_merge_requestmerge_merge_request — только если у токена есть право на запись.

Шаг шесть — то место, где секция 6 возвращается: с read_api агент дойдёт до пятого шага и остановится. Лена так и оставила: слияние она нажимает сама, с отдельным токеном, — не потому что агент плох, а потому что необратимое действие она хочет видеть глазами.

Компромисс: два сервера вместо одного — два ключа, два набора триггеров; зато граница между «диск» и «сервер» совпадает с границей прав, и её легко удерживать.

💬 Скажи словами. «Заведи ветку fix-login, закоммить оба файла и открой MR в main» — три инструмента git-mcp и один gitlab в одной фразе.

12. Память агента: измерено, не запомнено

35 инструментов AgentDB, 23 мёртвых имени в прошлой версии навыка и мост к dz recall — самая честная страница пакета.

Ключевая мысль: измерено, не запомнено: tools/list вместо старого списка

Лена попросила агента «запомнить, как мы починили N+1 в GraphQL». Агент вызвал инструмент из старой версии навыка — и получил «no such tool». Это не её ошибка, и SKILL.md теперь говорит об этом прямо.

agentdb-memory — самообучающаяся векторная память: claude mcp add agentdb -- npx agentdb@latest mcp start, без ключей, всё в одном локальном .db-файле (SQLite). Сервер регистрирует 35 инструментов — измерено на agentdb 3.0.0-alpha.20, 2026-08-26. И вот история, ради которой эта секция существует: предыдущая версия страницы перечисляла 26 имён, из которых существовали только 3. Имена были придуманы по аналогии — к каждому приписали префикс agentdb_, а префикс носят только инструменты хранилища. 23 мёртвых имени в опубликованном пакете.

Лечение — не новый список (он сгниёт так же), а принцип измерено, не запомнено: tools/list вместо старого списка. SKILL.md даёт способ проверить самому: запустить stdio-процесс сервера, послать две строки JSON-RPC — сначала initialize, затем tools/list — и прочитать ответ на второй. Сначала initialize: голый tools/list не отвечает ничем. Если имя со страницы не нашлось — список сдвинулся, ты не ошибся (навык ставит @latest на alpha-пакет, поверхность движется).

Что в 35 — по группам из SKILL.md:

  • хранилище (12): agentdb_init, agentdb_insert, agentdb_search (HNSW — быстрый поиск ближайших векторов), agentdb_pattern_store, agentdb_pattern_search, agentdb_stats и другие;
  • Reflexion (3): reflexion_store — задача + исход + самокритика + награда, reflexion_retrieve;
  • причинный граф (3): causal_add_edge, causal_query, causal_traverse;
  • библиотека навыков (3): skill_create, skill_search;
  • обучение и RL (10): learning_feedback — сигнал «пригодилось ли», от него следующий поиск лучше;
  • опыт и аудит (4): recall_with_certificate — воспоминание с проверяемым сертификатом происхождения.

Мост к dz, ради которого Лена его поставила: dz recall --all --json выгружает всё, чему научился харнес, agentdb_pattern_store кладёт каждую запись с эмбеддингом, agentdb_pattern_search ищет по смыслу — «как мы обходили N+1?» найдёт запись и с другой формулировкой. Лексический recall остаётся в CLI, семантический — здесь.

Есть и страж, а не только слова: тест пакета tests/agentdb-skill-honesty.test.js проверяет, что число в README равно числу строк в таблицах SKILL.md, что штамп «Measured, not remembered» стоит над таблицами, что ни один пример не зовёт имя, которого нет в таблице. Число нельзя поправить в одном месте и забыть в другом — тест упадёт.

Компромисс: @latest на alpha означает, что имена будут дрейфовать и дальше — цена за свежесть. Зато страница теперь говорит, как проверить её саму, и это единственная честная форма документации для движущейся цели.

13. Мост к приложению на твоей машине

Obsidian и ComfyUI: MCP-сервер здесь — не сервис, а мост к программе, которая должна быть уже запущена.

Ключевая мысль: MCP-сервер как мост к локальному приложению

Последние два навыка Лена подключала вечером — и оба «не ответили». Сервер в claude mcp list есть, ключ на месте, а инструмент возвращает ошибку соединения. Общая причина: это MCP-сервер как мост к локальному приложению — он ничего не делает сам, а пересылает вызовы программе, которая должна быть уже запущена у тебя.

obsidian (claude mcp add obsidian -- npx obsidian-mcp-server): мост к твоему хранилищу заметок через плагин Local REST API. Порядок из SKILL.md:

  1. Obsidian → Settings → Community Plugins → Browse → найти «Local REST API» → установить.
  2. Включить плагин и взять из его настроек API-ключ → OBSIDIAN_API_KEY (обязателен).
  3. Плагин слушает https://localhost:27124 — это значение по умолчанию для OBSIDIAN_REST_URL.

Инструменты: read_note (путь внутри хранилища, например Daily Notes/2026-06-03.md), write_note (создать или перезаписать; frontmatter — часть содержимого), search_notes (по тексту или тегу, context_length — сколько символов вокруг совпадения показать).

comfyui (claude mcp add comfyui -- npx comfyui-mcp): мост к ComfyUI — генерации изображений. Требуется запущенный ComfyUI на http://127.0.0.1:8188 (или свой COMFYUI_URL) и хотя бы одна скачанная модель. Сервер даёт 80+ инструментов: execute_workflow, text_to_image, image_to_image, inpaint, list_models, switch_model, queue_status, vram_status, free_vram, upscale_image. Раздел Procedure в SKILL.md строг: проверить, что ComfyUI доступен, до любой генерации — и не пытаться запускать ComfyUI программно; разрешение под модель (SDXL — 1024×1024, SD 1.5 — 512×512); vram_status перед загрузкой модели, free_vram при нехватке; всегда сообщать seed — без него результат не повторить.

Общее у обоих: если Obsidian закрыт или ComfyUI не запущен, мост ведёт в пустоту. Проверка — не claude mcp list (сервер-мост там будет), а само приложение: открыт ли Obsidian с включённым плагином, отвечает ли 127.0.0.1:8188.

На этом арсенал Лены собран целиком: почта, календарь, таблицы, задачи, пять поисков, знание в Notion и Obsidian, код в git и GitLab, картинки, память. Ни одной команды она не набирает — только говорит. А когда что-то не отвечает, у неё есть карта: сервер (секция 3) → ключ (6) → доступ (10) → приложение (13).

Компромисс: мост зависит от приложения — ещё один движущийся элемент; зато данные никуда не уходят: заметки остаются в твоём хранилище, картинки — на твоей видеокарте.

💬 Скажи словами. «Найди в заметках всё про MCP-сервер и допиши итоги в сегодняшнюю» — search_notes + write_note. «Сгенерируй превью, seed запиши» — и Лена получает путь к файлу, параметры и seed, как требует Procedure.

Частые вопросы

Таблица README называет сервер «Smithery (googlecalendar)», а SKILL.md — @cocal/google-calendar-mcp. Кому верить?

SKILL.md: там строка установки, транспорт и переменные окружения — то, что реально выполняется. Таблица Skill Inventory — краткая подпись, и для google-calendar, google-sheets, google-tasks, notion и reddit она отстала от SKILL.md (сверено чтением обоих файлов 2026-09-02). При расхождении открывай dz info <skill-id>.

Нужно ли ставить все 16 серверов, если я поставил пресет mcp?

Нет. Пресет кладёт 16 инструкций, а они ничего не стоят в работе — навык активируется только по совпадению с триггерами. Серверы добавляй по одному командой claude mcp add, когда доходишь до задачи. Ресурсы тратят серверы, а не навыки.

Куда класть API-ключи и токены?

Никогда в SKILL.md и не в чат. Для stdio-серверов — флаг -e в claude mcp add или блок env в конфиге клиента; для http-серверов — заголовок (x-api-key у exa). В VS Code можно ${input:…}, чтобы ключ не лежал в файле. Права — минимальные: у gitlab read_api + read_repository, пока не нужна запись.

Имя инструмента из SKILL.md сервер не знает. Что делать?

Измерить: послать серверу initialize, затем tools/list, и сверить ответ со страницей. Для agentdb-memory это описано прямо в навыке — сервер ставится с @latest на alpha-пакет, имена дрейфуют; список сдвинулся, ты не ошибся.

Сервер есть в claude mcp list, ключ верный, а инструмент возвращает пустоту или ошибку соединения. Где искать?

По карте из курса: Notion — интеграция не подключена к страницам (меню ⋯ → Connections); Obsidian — не открыт или не включён плагин Local REST API на 27124; ComfyUI — не запущен на 8188. Список серверов не показывает состояние приложения за мостом.

Работает ли пакет с Cursor и VS Code, а не только с Claude Code?

Инструкции — да: в SKILL.md у clickup, context7, jina-reader, reddit, google-tasks есть готовые блоки для .cursor/mcp.json и .vscode/mcp.json, у остальных — для claude_desktop_config.json. Раскладка навыков под другую платформу — через dz init --target <платформа>.

README говорит «v0.3.0», а package.json — 0.3.10, и CHANGELOG кончается на 0.1.0 с десятью навыками. Какая версия настоящая?

Настоящая — та, что на npm: https://www.npmjs.com/package/@dzhechkov/skills-mcp. В дереве пакета package.json показывает 0.3.10, строка Status в README и CHANGELOG отстали (измерено чтением файлов 2026-09-02). Число навыков считай по таблице Skill Inventory — их 16.