loading…
Search for a command to run...
loading…
An MCP server and crawler for Xafari documentation that enables AI agents to search, retrieve pages, and extract code examples from a local index. It provides s
An MCP server and crawler for Xafari documentation that enables AI agents to search, retrieve pages, and extract code examples from a local index. It provides structured documentation access through stdio or HTTP interfaces for seamless IDE integration.
MCP-сервер для внутренней документации построенной на основе Markdown-документации. Строит легковесный индекс и предоставляет инструменты для поиска и объяснений. Так же включает crawler, который может скачивать документацию Xafari с официального сайта, извлекать чистый текст и примеры кода.
MCP (Model Context Protocol) позволяет IDE и агентам обращаться к локальным данным
как к «инструментам». Вместо ручного поиска по сайту документации, ассистент
вызывает методы search_docs, get_page и get_examples, а сервер отвечает
структурированными данными. Это ускоряет работу, дает воспроизводимые ответы и
снижает зависимость от внешних источников.
search_docs/get_page.data/pages.pages.json + index.json для быстрого поиска.npm run crawlnpm run startnpm run start:httpnpm run reindexDOCS_BASE_URL (например: https://documentation.galaktika-soft.com/xafari/)MAX_PAGES_PER_SESSION (по умолчанию: 10000)FETCH_ON_MISS (по умолчанию: true, только если задан DOCS_BASE_URL)DATA_DIR (по умолчанию: ./data)REQUEST_TIMEOUT_MS (по умолчанию: 15000)USER_AGENTLOG_FILE (по умолчанию: logs/mcp.jsonl, путь относительно DATA_DIR)LOG_STDOUT (по умолчанию: false) — если true, логи дублируются в stdout (удобно в Docker)CODE_LANGUAGES (по умолчанию: cs,js,ts,json,yaml,xml,html,css)HTTP_PORT (по умолчанию: 3333)TOOLS_PREFIX — если задана (непустая), инструменты будут иметь имена вида ${TOOLS_PREFIX}search_docs, ${TOOLS_PREFIX}get_page, ...CODE_LANGUAGES.c#/csharp → cs, javascript → js, typescript → ts, yml → yaml.get_page может автоматически догружать страницу, если ее нет в кэше.
Управляется флагом FETCH_ON_MISS (по умолчанию true если задан DOCS_BASE_URL).
name: custom-framework-mcpcommand: nodeargs: ["C:\\Projects\\custom-framework-mcp\\src\\index.js"]cwd: C:\\Projects\\custom-framework-mcpПример ~/.cursor/mcp.json
{
"mcpServers": {
"custom-framework-mcp": {
"command": "node",
"args": ["C:\\Projects\\custom-framework-mcp\\src\\index.js"],
"cwd": "C:\\Projects\\custom-framework-mcp"
}
}
}
Если сервис запущен в Docker, можно использовать docker exec:
{
"mcpServers": {
"custom-framework-mcp": {
"command": "docker",
"args": ["exec", "-i", "mcp-service", "node", "/app/src/index.js"]
}
}
}
Если сервис запущен в HTTP-режиме (например, через docker compose), используйте SSE transport:
{
"mcpServers": {
"custom-framework-mcp": {
"url": "http://localhost:3333/sse"
}
}
}
Примечание: HTTP-режим требует, чтобы сервис был запущен с npm run start:http или через docker compose (который автоматически запускает HTTP-сервер).
Чтобы проверить в окне чата напишите
list tools
Запросите какую-либо документацию с источника
git clone https://github.com/QuAzI/custom-framework-mcp.git
cd custom-framework-mcp
docker compose up -d
Локально в репозитории:
npm installnpx . — запустит MCP-сервер (stdio) через src/index.js.Чтобы запускать из любого каталога:
npm linknpx --no-install custom-framework-mcpЗапуск прямо из GitHub (без публикации в npm):
npx github:QuAzI/custom-framework-mcpОпции краулера:
npm run crawl — по умолчанию скачивает только новые страницы.npm run crawl -- --force — перекачать все страницы.npm run crawl -- --no-only-new — отключить режим "только новые".Примечание:
--no-only-new делает полный обход с кешем (ETag/Last-Modified), а --force перекачивает все без учета кеша.В репозитории есть пример пайплайна .gitlab-ci.yml для сценария:
npm run reindex, данные в DATA_DIR/pages)docker compose, чтобы HTTP-сервер поднялся с актуальными pages.json/index.jsonПеременные для скачивания документации:
DOCS_REPO_URL — URL внешнего репозитория документации (SSH или HTTPS)DOCS_REF — ветка/тег (по умолчанию: main)DOCS_SUBDIR — подкаталог в репозитории документации с markdown-деревом (по умолчанию: docs)DOCS_SSH_PRIVATE_KEY — опционально, SSH ключ для доступа к docs repo (если DOCS_REPO_URL по SSH)DOCS_HTTP_TOKEN — опционально, токен для доступа по HTTPS (используется через ~/.netrc)DOCS_HTTP_USER — опционально, логин для ~/.netrc (по умолчанию: oauth2, удобно для GitLab)Переменные для деплоя на VM:
DEPLOY_HOST — хост VM (DNS/IP)DEPLOY_USER — пользователь на VMDEPLOY_PATH — каталог на VM, где лежит сервисDEPLOY_SSH_PRIVATE_KEY — SSH ключ для деплояDEPLOY_SSH_PORT — опционально, порт SSH (по умолчанию: 22)DEPLOY_COMPOSE_SERVICE — опционально, имя сервиса compose (по умолчанию: mcp-service)DEPLOY_HEALTHCHECK_URL — опционально, URL для проверки после деплоя (например http://<host>:3333/health)DEPLOY_PATH)Пайплайн предполагает, что на VM уже есть каталог сервиса с docker-compose.yml и исходниками (а CI обновляет только data/):
DEPLOY_PATH/
docker-compose.yml
package.json
src/
data/ # обновляется из CI (pages/, pages.json, index.json, assets/)
После доставки data.tgz CI выполняет:
docker compose up -d --remove-orphansdocker compose restart mcp-service (чтобы сервер перечитал индекс, т.к. он кэшируется в памяти процесса)Чтобы документация/индекс обновлялись регулярно:
masterDOCS_REPO_URL, DOCS_REF, DOCS_SUBDIR)Job deploy_vm в .gitlab-ci.yml уже настроен так, чтобы запускаться только для master и schedule (и не запускаться в Merge Request pipeline).
search_docs(query, limit?)title, url, excerpt, headings.limit ограничивает количество результатов (1–20, по умолчанию 5).get_page(slug | url)slug — короткая форма (например, doc_recursive_helper).url — полный адрес страницы документации.get_examples(topic, limit?)limit ограничивает количество примеров (1–20, по умолчанию 5).explain_concept(name)related добавляет похожие разделы документации.stdio — MCP-сервер общается с IDE через стандартные потоки ввода/вывода. Это нативный режим MCP: быстрее, проще в настройке, без сети и портов. Подходит для локального использования.
Транспорт и формат обмена:
Использовать можно не только из IDE, но и как локальную сервис-утилиту:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_docs",
"arguments": {
"query": "Performance Enhancement"
}
}
}
http — режим, в котором MCP-сервер поднимает HTTP-endpoint и принимает запросы по сети. Удобно для внешних клиентов и инструментов (например, HTTPYac), но требует поднять отдельный процесс и порт.
npm run start:http (порт HTTP_PORT, по умолчанию 3333).POST /tools/{toolName} с JSON-телом аргументов.GET /health.Подходят для инструментов типа HTTPYac, плагинов HTTP Request в IDE.
POST http://localhost:3333/tools/search_docs
Content-Type: application/json
{
"query": "Как работает модуль Performance Enhancement?",
"limit": 5
}
POST http://localhost:3333/tools/search_docs
Content-Type: application/json
{
"query": "подключение к DevExpress XAF",
"limit": 5
}
POST http://localhost:3333/tools/get_page
Content-Type: application/json
{
"slug": "doc_recursive_helper"
}
POST http://localhost:3333/tools/get_page
Content-Type: application/json
{
"url": "https://documentation.galaktika-soft.com/xafari/doc_recursive_helper"
}
POST http://localhost:3333/tools/get_examples
Content-Type: application/json
{
"topic": "Business Components",
"limit": 5
}
POST http://localhost:3333/tools/explain_concept
Content-Type: application/json
{
"name": "Security System"
}
data/pages/*.md с метаданными в заголовке.pages.json формируется из markdown-файлов после завершения краулинга (по умолчанию это NDJSON: один JSON-объект на строку, чтобы файл можно было читать потоково даже при больших объёмах).data/assets, ссылки в markdown остаются абсолютными..md в data/pages (подкаталоги = breadcrumbs).---
slug: my_custom_doc
url: https://example.local/my_custom_doc
title: Мой документ
breadcrumbs:
- Custom
- Docs
---
npm run reindexСтруктурированные логи пишутся в data/logs/mcp.jsonl (JSON Lines) при DATA_DIR=./data и дефолтном LOG_FILE=logs/mcp.jsonl.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"xafari-mcp": {
"command": "npx",
"args": []
}
}
}