---
title: "This blog's MCP server: connect the articles to Claude Code, Cursor and other assistants"
url: "https://romankryvolapov.com/en/mcp-server/"
description: "The blog has its own MCP server: an AI assistant searches every article in three languages and reads the one it needs in full. Address, tools and setup for Claude Code, Claude, Cursor, VS Code, Codex and Gemini CLI."
language: en
published: 2026-11-03
updated: 2026-11-03
---
**Hi!**

This blog has its own MCP server. [MCP](https://modelcontextprotocol.io) (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](/en/ai-agent-harnesses/)). 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.

| Tool | What it does |
|---|---|
| `search` | searches 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_page` | returns 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:

```bash
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](/en/claude-code-commands-and-settings/).

### 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:

```json
{
  "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`:

```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

```bash
codex mcp add romankryvolapov --url https://mcp.romankryvolapov.com/
```

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

```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

```bash
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:

```json
{
  "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:

```bash
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.
