Мы опубликовали на GitHub проект cioinside/ragmir-mcp-server — универсальный MCP-сервер для локальной RAG-системы Ragmir. Сервер превращает CLI-инструмент Ragmir в управляемый HTTP/SSE-сервис с 14 MCP-инструментами и двумя дополнительными инструментами для загрузки бинарных файлов, к которому могут подключаться OpenCode, Claude, Cursor, Open WebUI и любые другие MCP-совместимые агенты — без SSH, без CLI на хостах агентов и без отправки данных во внешние облака.
Ragmir (npm-пакет @jcode.labs/ragmir, v4.0.0) — это «конфиденциальный локальный RAG для кодинг-агентов и Node.js-приложений». Его ключевая идея — retrieval-only ядро, которое:
Сам Ragmir изначально поставляется с локальным stdio-MCP для разработчика, сидящего прямо в редакторе, и с CLI rgr для скриптов. Этого достаточно для сценария «одиночный разработчик + свой редактор», но не работает в трёх типичных ситуациях:
.docx, .pdf, .xlsx, изображения), которые невозможно передать через JSON-RPC MCP-вызов.Ragmir MCP Server закрывает все три сценария, оборачивая один и тот же server.js (внутренний MCP-адаптер Ragmir) в три параллельных транспорта и автоматизируя их развёртывание через systemd.
mcpo для Open WebUI (порт 8000), отдельный HTTP-эндпоинт для загрузки бинарных файлов (порт 8002).upload-client — для агентов на Windows, чтобы они могли загружать .docx/.pdf/.xlsx/изображения с локального диска на удалённый сервер без копипасты shell-команд и без лимита undici/fetch в 50 МБ.ragmir-mcp.service, ragmir-sse.service, ragmir-upload.service), которые стартуют автоматически.curl -sSL ... | bash — скрипт раскладывает всё по /usr/local/lib/ragmir-server/, /etc/ragmir/, /opt/ragmir-projects/ и прописывает переменные окружения./docs (через mcpo) — интерактивный Swagger UI без ручного труда. AI-агент (OpenCode / Claude / Cursor) Open WebUI / любой REST-клиент
│ │
│ SSE (MCP-транспорт) │ REST / OpenAPI
▼ ▼
mcp-proxy :8001 mcpo :8000
│ │
│ stdio (stdin/stdout) │ stdio
└────────────────┬──────────────────────┘
│
▼
server.js
(Node.js, MCP-адаптер)
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
rgr CLI (search, upload-server :8002 /opt/ragmir-projects/
ingest, ask, research) (multipart/form-data) (по каталогу на проект)
│ │
└───────── LanceDB ──────┘
Два порта для агентов, один порт для файлов. Порты 8000 и 8001 обслуживают один и тот же серверный процесс через разные транспортные адаптеры: REST/OpenAPI для интеграции с Open WebUI и классических HTTP-клиентов, SSE — то, что нативно понимают OpenCode, Claude Desktop и Cursor. Порт 8002 вынесен в отдельный легковесный Node.js-процесс (upload-server.js), потому что принимает multipart-формы и отдаёт файлы напрямую, минуя JSON-RPC.
Под капотом — три независимых systemd-сервиса, которые шарят каталог /opt/ragmir-projects/:
| Сервис | Порт | Транспорт | Для кого |
|---|---|---|---|
ragmir-mcp.service | 8000 | HTTP / OpenAPI (mcpo) | Open WebUI, интеграции, скрипты |
ragmir-sse.service | 8001 | SSE (mcp-proxy) | OpenCode, Claude, Cursor |
ragmir-upload.service | 8002 | HTTP multipart | загрузка .docx/.pdf/.xlsx/изображений |
Все инструменты доступны через любой из транспортов с одинаковой сигнатурой.
| Инструмент | Назначение |
|---|---|
ragmir_create_project | Создать проект (каталог + rgr init) |
ragmir_delete_project | Удалить проект и все его данные |
ragmir_list_projects | Список всех проектов на сервере |
ragmir_project_status | Статус: количество файлов, чанков, состояние индекса |
| Инструмент | Назначение |
|---|---|
ragmir_write_file | Записать один файл в проект |
ragmir_write_files_batch | Записать пачку файлов одним вызовом |
ragmir_read_file | Прочитать файл из проекта |
ragmir_list_files | Показать состав файлов проекта |
ragmir_delete_file | Удалить файл из проекта |
| Инструмент | Назначение |
|---|---|
ragmir_add_sources | Добавить glob-паттерны для индексации (["docs/**/*.md", "src/**/*.py", "README.md"]) |
ragmir_ingest | Запустить индексацию (после добавления файлов) |
ragmir_search | Семантический + лексический поиск с цитатами |
ragmir_ask | Получить контекст по вопросу (без LLM, чистый retrieval) |
ragmir_research | Multi-query research — синтез из нескольких запросов |
Особенность ragmir_write_file / ragmir_write_files_batch: флаг autoIngest (по умолчанию true) заставляет сервер сразу же запустить индексацию — файл становится доступен поиску в течение одной операции, без отдельного шага.
# Требования: Node.js >= 22, npm, uv или pip (для mcpo)
curl -sSL https://raw.githubusercontent.com/cioinside/ragmir-mcp-server/main/install.sh | bash
Ручной режим — для случая, когда хочется явно контролировать каждый шаг:
# 1. Установить CLI Ragmir
npm install -g @jcode.labs/ragmir
# 2. Положить MCP-сервер
sudo mkdir -p /usr/local/lib/ragmir-server
sudo cp server.js /usr/local/lib/ragmir-server/
sudo chmod +x /usr/local/lib/ragmir-server/server.js
# 3. Каталоги
sudo mkdir -p /opt/ragmir-projects
sudo mkdir -p /etc/ragmir
# 4. Конфиг mcpo
sudo tee /etc/ragmir/mcpo-config.json << 'EOF'
{
"mcpServers": {
"ragmir": {
"command": "node",
"args": ["/usr/local/lib/ragmir-server/server.js"],
"env": { "RAGMIR_PROJECTS_DIR": "/opt/ragmir-projects" }
}
}
}
EOF
# 5. systemd-юнит (не забудьте подставить свой API-ключ!)
sudo cp ragmir-mcp.service /etc/systemd/system/
sudo sed -i 's/CHANGE-ME/YOUR_SECRET_KEY/' /etc/systemd/system/ragmir-mcp.service
sudo systemctl daemon-reload && sudo systemctl enable --now ragmir-mcp
# 6. Открыть порт
sudo ufw allow 8000/tcp
OpenCode / Claude / Cursor — добавить в ~/.config/opencode/opencode.jsonc:
{
"mcp": {
"ragmir": {
"type": "remote",
"url": "http://192.168.1.100:8001/sse",
"enabled": true
}
}
}
Open WebUI — Admin Settings → Connections → OpenAPI Servers → Add:
| Поле | Значение |
|---|---|
| Name | Ragmir |
| URL | http://192.168.1.100:8000/ragmir |
| API Key | ваш ключ из ragmir-mcp.service |
upload-client для WindowsПередача бинарных вложений через JSON-RPC MCP неудобна — base64 раздувает размер, undici/fetch режет на 50 МБ. Поэтому:
.py, .md, .js, конфиги) — через ragmir_write_files_batch, привычным MCP-вызовом..docx, .pdf, .xlsx, изображения) — через отдельный HTTP-эндпоинт на 8002:curl -X POST http://192.168.1.100:8002/upload \
-F "project=my-project" \
-F "path=docs/report.docx" \
-F "file=@/path/to/report.docx"
Ответ:
{ "ok": true, "project": "my-project", "path": "docs/report.docx", "bytes": 12345, "ingested": true }
При autoIngest=true файл автоматически попадает в индекс сразу после загрузки.
Для агентов на Windows, которые не должны писать shell-команды самостоятельно, в репозитории есть подпроект upload-client/ — локальный MCP-сервер с двумя инструментами:
upload_to_ragmir(project, path, localPath) — читает файл с локального диска и отправляет на удалённый сервер.list_local_files(directory, extensions?) — показывает агенту, что вообще есть на диске, чтобы агенту не приходилось угадывать.Важная деталь: клиент работает через http.request напрямую, без undici, поэтому лимит 50 МБ отсутствует в принципе — файлы любого размера проходят без разбиения на чанки.
| Слой | Технология | Версия / детали |
|---|---|---|
| Рантайм | Node.js | >= 22 (LTS) |
| MCP-SSE адаптер | mcp-proxy | стабильные переподключения (раньше пробовали supergateway, не выдержал нагрузочных кейсов — переехали) |
| OpenAPI-адаптер | mcpo | auto-generated Swagger UI на /docs |
| MCP-SDK | @modelcontextprotocol/sdk | официальный, для совместимости с OpenCode |
| Загрузка файлов | собственный upload-server.js на http | без undici, без лимита 50 МБ |
| File-watcher | file-watcher.js | авто-ингест при изменении файлов на диске (опционально) |
| Backend-движок | @jcode.labs/ragmir v4.0.0 | LanceDB, Transformers.js (опционально), Node 22+ |
| Деплой | systemd, install.sh, переменные окружения | RAGMIR_MCP_PORT, RAGMIR_MCP_API_KEY, RAGMIR_PROJECTS_DIR, RAGMIR_MCP_INSTALL_DIR |
| Лицензия | MIT (MCP-сервер) / AGPL-3.0 + commercial (Ragmir Core) |
upload-server есть multipart-эндпоинт и есть MCP-клиент для Windows; агенту достаточно одного вызова upload_to_ragmir(...).@jcode.labs/ragmir-chat, который даёт цитируемую генерацию на локальной GGUF-модели.Authorization: Bearer, без TLS-терминации внутри — подразумевается, что рядом стоит reverse-proxy с Let’s Encrypt или сеть приватная. Запуск на публичном IP без TLS — на ваш страх и риск..pages, .numbers, .key — за пределами.Репозиторий живёт всего несколько недель, но уже прошёл через несколько итераций, видных по истории коммитов:
server.js с 14 инструментами и OpenAPI-прокси.supergateway, затем замена на mcp-proxy ради стабильных реконнектов.ragmir_upload_binary (base64), затем рефакторинг в единый write_file/write_files_batch с авто-ингестом, наконец — выделенный HTTP-эндпоинт на порт 8002, потому что JSON-RPC для этого избыточен.file-watcher.js, который автоматически запускает ингест при изменении файлов на диске.upload-client для Windows-агентов — локальный MCP-сервер с инструментами загрузки, без лимита 50 МБ (через http.request вместо fetch).@modelcontextprotocol/sdk — переход с самописной реализации ради совместимости с растущим числом MCP-клиентов.LICENSE в корне репозитория).curl -sSL https://raw.githubusercontent.com/cioinside/ragmir-mcp-server/main/install.sh | bash
Что важно запомнить. Ragmir MCP Server — это «тонкая» обёртка над ядром Ragmir с правильно подобранными транспортами: SSE для современных агентов, OpenAPI для Open WebUI, multipart-HTTP для бинарных файлов, локальный MCP-клиент для Windows. Всё работает на Node.js 22+, разворачивается одной командой и не отправляет данные никуда, кроме вашей локальной сети. Если вы уже пользуетесь Ragmir как CLI — это превращение его в полноценный backend для команды AI-агентов. Если не пользуетесь — порог входа низкий, пакет один,
npm installи вперёд.