Быстрый старт. Подключить сервер и навык к нему — три команды:

claude mcp add brave-search -e BRAVE_API_KEY=<ключ> -- npx @brave/brave-search-mcp-server
dz init --target claude-code --preset mcp
claude mcp list

Первая регистрирует сервер (пример — Brave Search, ключ из его кабинета), вторая кладёт 16 навыков-инструкций, третья проверяет, что сервер в списке. dz ставится командой npm install -g @dzhechkov/harness-cli. Подробно — почему именно в таком порядке.

Начни здесь

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

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

Знакомься: Лена

Лена — техлид команды из трёх человек. Её утро начинается одинаково: разгрести почту, найти в вебе ответ на вчерашний вопрос, завести задачи в ClickUp и переписать итоги в Notion. Она хочет, чтобы всё это делал агент, а не она. В каждой секции Лена наступает на грабли первой — и показывает тебе, как их обойти.

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

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 add — claude 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, freshness — pd (день), 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_library → get_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_request → merge_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.

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

Лицензии шрифтов

Onest

Copyright 2021 The Onest Project Authors (https://github.com/googlefonts/onest)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

JetBrainsMono

Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.