Roman Kryvolapov Engineering Blog

MCP-сервер блогу: як підключити статті до Claude Code, Cursor та інших асистентів

Привіт!

У цього блогу є власний MCP-сервер. MCP (Model Context Protocol) — спільний протокол, за яким AI-асистент підключає зовнішні інструменти й дані; його розуміють майже всі сучасні асистенти та агенти для програмування (порівняння AI-агентів). Коли сервер підключено, асистент сам знаходить статтю під ваше запитання й читає її повністю разом із лістингами коду — без пошуку посилання, копіювання тексту та вставляння його в чат.

Адреса і що вміє сервер

  • Адреса: https://mcp.romankryvolapov.com/
  • Транспорт: Streamable HTTP. Авторизації немає — ні реєстрації, ні ключа.
  • Лише читання: сервер віддає опубліковані статті й більше нічого не вміє; доступу до ваших файлів і даних у нього немає.
ІнструментЩо робить
searchшукає по всіх статтях англійською, російською та українською, запит можна писати будь-якою з трьох мов; повертає до 20 статей із заголовком, адресою та фрагментом тексту
get_pageповертає статтю повністю в markdown за її адресою, наприклад https://romankryvolapov.com/uk/ktor-manual/; лістинги коду збігаються із сайтом байт у байт

Сервер бере текст із самого сайту й оновлює свій індекс приблизно раз на годину, тож нова стаття знаходиться через годину-дві після публікації.

Як підключити

Ім'я сервера в прикладах нижче — romankryvolapov; воно може бути будь-яким, асистент показує його у списку інструментів.

Claude Code

Одна команда в терміналі, потім перевірка зв'язку:

Terminal window
claude mcp add --transport http --scope user romankryvolapov https://mcp.romankryvolapov.com/
claude mcp list

З --scope user сервер доступний в усіх проєктах; без цього прапорця — лише в поточному. У виводі claude mcp list біля сервера має стояти «✔ Connected», усередині сесії те саме показує команда /mcp. Докладніше про команди й налаштування — у довіднику з Claude Code.

Claude (сайт і застосунок)

У Claude сервер підключається як власний конектор — один раз для акаунта, після чого працює і на сайті, і в застосунку:

  1. Customize → Connectors → «+ Add» → «Add custom connector».
  2. Ім'я — будь-яке, адреса — https://mcp.romankryvolapov.com/, далі «Continue».
  3. У розділі Authentication вибрати «No sign in» і натиснути «Add».
  4. У чаті: «+» ліворуч унизу → Connectors → увімкнути конектор.

На безкоштовному тарифі можна додати один власний конектор. Звертається до сервера хмара Anthropic, а не ваш комп'ютер, — цьому серверу саме так і треба: він публічний.

Cursor

Файл ~/.cursor/mcp.json підключає сервер до всіх проєктів, .cursor/mcp.json у корені проєкту — лише до нього:

{
"mcpServers": {
"romankryvolapov": {
"url": "https://mcp.romankryvolapov.com/"
}
}
}

Транспорт зазначати не треба: запис із полем url Cursor сам вважає віддаленим сервером.

VS Code (GitHub Copilot)

Найпростіше — командою MCP: Add Server з палітри команд: тип HTTP, потім адреса й ім'я. Вручну — у файлі .vscode/mcp.json проєкту:

{
"servers": {
"romankryvolapov": {
"type": "http",
"url": "https://mcp.romankryvolapov.com/"
}
}
}

Тут поле type обов'язкове, а кореневий ключ називається servers, а не mcpServers, як у Cursor і Gemini CLI.

Codex

Terminal window
codex mcp add romankryvolapov --url https://mcp.romankryvolapov.com/

Той самий запис вручну, у ~/.codex/config.toml:

[mcp_servers.romankryvolapov]
url = "https://mcp.romankryvolapov.com/"

Перевірка — codex mcp list у терміналі або /mcp усередині сесії.

Gemini CLI

Terminal window
gemini mcp add --transport http --scope user romankryvolapov https://mcp.romankryvolapov.com/

Без --scope user сервер запишеться в налаштування поточного проєкту, .gemini/settings.json. Вручну це виглядає так:

{
"mcpServers": {
"romankryvolapov": {
"httpUrl": "https://mcp.romankryvolapov.com/"
}
}
}

Ключ саме httpUrl: поле url у Gemini CLI означає старий транспорт SSE, і з ним сервер не підключиться.

Інші клієнти

Підійде будь-який клієнт, що вміє підключати віддалені MCP-сервери. Потрібні три речі: адреса https://mcp.romankryvolapov.com/, транспорт Streamable HTTP (у налаштуваннях його називають HTTP або streamable-http) і відсутність авторизації. Та сама інформація в машиночитному вигляді лежить у картці сервера: https://romankryvolapov.com/.well-known/mcp.json.

Як користуватися

Коли викликати інструмент, асистент вирішує сам — за тим, про що ви питаєте. Найнадійніше — назвати блог прямо:

  • «Знайди в блозі romankryvolapov.com, як у Ktor підключити Exposed і Koin».
  • «Прочитай статтю про хуки Claude Code і склади за нею чек-лист для мого проєкту».
  • «Що в блозі написано про LoRA і чим донавчання відрізняється від RAG?»

Асистент спершу викличе search, отримає список статей з адресами, а потім забере потрібну через get_page — повністю, а не переказ із видачі пошуковика.

Перевірити сервер без клієнта

Сервер відповідає на звичайні JSON-RPC-запити, тож перевірити його можна й без асистента — одним запитом із термінала:

Terminal window
curl -s https://mcp.romankryvolapov.com/ \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search","arguments":{"query":"Project Loom","limit":3}}}'

У відповідь прийде JSON зі знайденими статтями: заголовок, адреса й фрагмент тексту навколо збігу.

Як він влаштований

Сервер — невеликий Cloudflare Worker без бази даних. Під час першого звернення він завантажує із сайту llms-full.txt — повний текст усіх статей у markdown, — ділить його на статті й будує в пам'яті пошуковий індекс BM25: слово тим вагоміше, чим рідше воно трапляється на сайті загалом і чим частіше в конкретній статті. Окрема пошукова бібліотека для цього не потрібна, а сервер віддає рівно те, що опубліковано на сайті, з тими самими лістингами.