Roman Kryvolapov Engineering Blog

This blog's MCP server: connect the articles to Claude Code, Cursor and other assistants

Hi!

This blog has its own MCP server. MCP (Model Context Protocol) is the common protocol an AI assistant uses to plug in external tools and data; nearly every current assistant and coding agent speaks it (harnesses compared). Once the server is connected, the assistant finds the article that answers your question on its own and reads all of it, code listings included — no hunting for a link, no copying text and pasting it into the chat.

Address and what the server does

  • Address: https://mcp.romankryvolapov.com/
  • Transport: Streamable HTTP. No authentication — no sign-up and no key.
  • Read-only: the server serves the published articles and can do nothing else; it has no access to your files or data.
ToolWhat it does
searchsearches every article in English, Russian and Ukrainian, and the query may be in any of the three; returns up to 20 articles with title, URL and a text snippet
get_pagereturns one article in full as markdown by its URL, for example https://romankryvolapov.com/en/ktor-manual/; code listings match the site byte for byte

The server takes its text from the site itself and refreshes its index about once an hour, so a new article becomes searchable an hour or two after it goes live.

How to connect

The server name in the examples below is romankryvolapov; any name works, it is simply what the assistant shows in its tool list.

Claude Code

One command in the terminal, then a connection check:

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

With --scope user the server is available in every project; without the flag, only in the current one. claude mcp list should show "✔ Connected" next to the server, and inside a session the /mcp command shows the same. More on commands and settings in the Claude Code reference.

Claude (web and app)

In Claude the server is added as a custom connector — once per account, after which it works both on the web and in the app:

  1. Customize → Connectors → "+ Add" → "Add custom connector".
  2. Any name, URL https://mcp.romankryvolapov.com/, then "Continue".
  3. Under Authentication choose "No sign in" and click "Add".
  4. In a chat: "+" at the lower left → Connectors → switch the connector on.

The free plan allows one custom connector. Requests to the server come from Anthropic's cloud, not from your computer — which is exactly what this server needs: it is public.

Cursor

~/.cursor/mcp.json connects the server to every project, .cursor/mcp.json in the project root to that project only:

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

No transport needs to be specified: Cursor treats an entry with a url field as a remote server.

VS Code (GitHub Copilot)

The easiest way is the MCP: Add Server command in the Command Palette: pick HTTP, then enter the URL and a name. By hand, in the project's .vscode/mcp.json:

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

Here the type field is required, and the top-level key is servers, not mcpServers as in Cursor and Gemini CLI.

Codex

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

The same entry by hand, in ~/.codex/config.toml:

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

To check it, run codex mcp list in the terminal or /mcp inside a session.

Gemini CLI

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

Without --scope user the server goes into the current project's settings, .gemini/settings.json. By hand it looks like this:

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

The key has to be httpUrl: in Gemini CLI the url field means the old SSE transport, and with it the server will not connect.

Other clients

Any client that can connect remote MCP servers will do. It needs three things: the address https://mcp.romankryvolapov.com/, the Streamable HTTP transport (settings call it HTTP or streamable-http) and no authentication. The same information in machine-readable form is in the server card: https://romankryvolapov.com/.well-known/mcp.json.

How to use it

The assistant decides on its own when to call a tool, based on what you ask. The most reliable way is to name the blog outright:

  • "Search the romankryvolapov.com blog for how to wire Exposed and Koin into Ktor."
  • "Read the article on Claude Code hooks and turn it into a checklist for my project."
  • "What does the blog say about LoRA, and how is fine-tuning different from RAG?"

The assistant will call search first, get a list of articles with their URLs, and then fetch the one it needs through get_page — the whole article, not a retelling from a search results page.

Checking the server without a client

The server answers plain JSON-RPC requests, so you can check it without an assistant — with a single request from the terminal:

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}}}'

The reply is JSON with the articles it found: title, URL and the text around the match.

How it works

The server is a small Cloudflare Worker with no database. On the first request it downloads llms-full.txt from the site — the full text of every article in markdown — splits it into articles and builds a BM25 search index in memory: a word weighs more the rarer it is across the whole site and the more often it appears in a given article. No separate search library is needed, and the server returns exactly what is published on the site, with the same listings.