Itmcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Itmcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Прокси-сервер между MCP-клиентами (Claude Desktop, Cursor) и 1С:Предприятие. Транслирует MCP-протокол в JSON-RPC вызовы к HTTP-сервису 1С.
Предназначен для конфигурации «Управление IT-отделом 8» — встроенный в неё MCP-сервис предоставляет AI-агентам инструменты для работы с задачами, проектами, базой знаний, файлами и лентой уведомлений.
Возможности:
# Установка зависимостей
npm install
# Сборка
npm run build#### Stdio режим
Для локальных MCP-клиентов (Claude Desktop, Cursor).
Настройки указываются в конфигурации клиента через переменные окружения.
Минимальная конфигурация клиента:
{
"mcpServers": {
"uit": {
"command": "node",
"args": ["dist/index.js"],
"cwd": "/path/to/mcp",
"env": {
"MCP_ONEC_URL": "http://localhost/base",
"MCP_ONEC_USERNAME": "admin",
"MCP_ONEC_PASSWORD": "password"
}
}
}
}#### HTTP режим
Для веб-приложений и множественных клиентов.
Настройки указываются в файле .env в корне проекта или через переменные окружения:
# Скопируйте пример
cp .env.example .envМинимальный .env:
MCP_ONEC_URL=http://localhost/base
MCP_ONEC_USERNAME=admin
MCP_ONEC_PASSWORD=passwordЗапуск:
node dist/index.js http --port 8000Минимальная конфигурация клиента если запуск через Docker:
{
"mcpServers": {
"uit": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}Запуск в контейнере для изоляции и упрощения развертывания.
#### Первичная установка
# 1. Клонируем репозиторий
git clone https://github.com/Diversus23/itmcp.git
# 2. Переходим в папку, где находится клонированный itmcp
cd itmcp
# 3. Скопировать конфигурацию
cp .env.docker.example .env
# 4. Отредактировать .env (обязательно: MCP_ONEC_URL, MCP_ONEC_USERNAME, MCP_ONEC_PASSWORD)
# 5. Запустить через docker compose
docker compose build --no-cache
docker compose up -d
# 6. Проверка, что все работает
curl http://localhost:8000/healthИли напрямую через Docker:
# Сборка образа
docker build -t 1c-mcp-proxy .
# Запуск с переменными окружения
docker run -d \
-p 8000:8000 \
-e MCP_ONEC_URL=http://host.docker.internal/base \
-e MCP_ONEC_USERNAME=admin \
-e MCP_ONEC_PASSWORD=password \
--name mcp-proxy \
1c-mcp-proxyВажно про сеть:
host.docker.internal (Mac/Windows) или IP хоста 172.17.0.1 (Linux) вместо localhostЛоги:
docker compose logs -fОстановка:
docker compose down#### Обновление в docker
Когда выходит новая версия необходимо пересобрать образ MCP в docker. Необходимо перейти в папку, куда клонировали репозиторий itmcp.
# 1. Получаем изменения новой версии
git pull
# 2. Останавливаем контейер
docker compose down
# 3. Пересобираем образ
docker compose build --no-cache
# 4. Запускаем новый образ (обновленный)
docker compose up -dMCP_AUTH_MODE=oauth2 запуск завершится ошибкой)Endpoints:
/mcp - Streamable HTTP транспорт/health - проверка состояния/info - информация о сервере/ - список endpointsПроверка работы:
curl http://localhost:8000/healthMCP_AUTH_MODE=none # по умолчаниюПоведение:
MCP_ONEC_USERNAME и MCP_ONEC_PASSWORDMCP_AUTH_MODE=oauth2
MCP_PUBLIC_URL=http://your-server:8000Поведение:
MCP_ONEC_USERNAME и MCP_ONEC_PASSWORD не используются (если заданы, будут проигнорированы)Поддерживаемые OAuth2 flows:
Дополнительные endpoints (для OAuth2):
/.well-known/oauth-protected-resource - Protected Resource Metadata/.well-known/oauth-authorization-server - Authorization Server Metadata/register - регистрация клиентов/authorize - HTML форма авторизации/token - получение/обновление токеновВсе настройки задаются через переменные окружения с префиксом MCP_ или через CLI аргументы.
| Переменная | Описание | По умолчанию | Обязательная |
|---|---|---|---|
MCP_ONEC_URL | URL базы 1С | - | Всегда |
MCP_ONEC_USERNAME | Имя пользователя | - | При AUTH_MODE=none |
MCP_ONEC_PASSWORD | Пароль | - | При AUTH_MODE=none |
MCP_ONEC_SERVICE_ROOT | Корень HTTP-сервиса | mcp | Нет |
| Переменная | Описание | По умолчанию | Обязательная |
|---|---|---|---|
MCP_HOST | Хост для прослушивания | 127.0.0.1 | Нет |
MCP_PORT | Порт | 8000 | Нет |
MCP_CORS_ORIGINS | CORS origins (JSON array) | ["*"] | Нет |
| Переменная | Описание | По умолчанию | Обязательная |
|---|---|---|---|
MCP_SERVER_NAME | Имя сервера | Управление IT-отделом 8 MCP | Нет |
MCP_SERVER_VERSION | Версия | 1.0.0 | Нет |
MCP_LOG_LEVEL | Уровень логирования | INFO | Нет |
Допустимые уровни: DEBUG, INFO, WARNING, ERROR
| Переменная | Описание | По умолчанию | Обязательная |
|---|---|---|---|
MCP_AUTH_MODE | Режим: none или oauth2 | none | Нет |
MCP_PUBLIC_URL | Публичный URL прокси | (определяется из запроса) | При AUTH_MODE=oauth2 |
MCP_OAUTH2_CODE_TTL | TTL authorization code (сек) | 120 | Нет |
MCP_OAUTH2_ACCESS_TTL | TTL access token (сек) | 3600 | Нет |
MCP_OAUTH2_REFRESH_TTL | TTL refresh token (сек) | 1209600 | Нет |
MCP_OAUTH2_STORE_PATH | Путь к JSON-снапшоту токенов | (только в памяти) | Нет |
MCP_OAUTH2_REFRESH_GRACE_MS | Окно идемпотентности refresh-rotation (мс) | 60000 | Нет |
Персистентность токенов. При указанном MCP_OAUTH2_STORE_PATH access- и refresh-токены сериализуются в JSON-файл (атомарная запись через временный файл) каждые 30 секунд и при graceful shutdown. После рестарта прокси загружает снапшот, отбрасывая истекшие записи. Это устраняет повторные логины пользователей при перезапуске контейнера / краше процесса.
⚠️ Безопасность снапшота. Файл содержит логины и пароли пользователей 1С в открытом виде (Basic Auth требуется для каждого запроса к 1С). Файл создаётся с правами0o600(только владелец) на POSIX-системах; на Windows mode игнорируется — обеспечьте ограниченные NTFS ACL на каталог. Не храните снапшот в общем томе, не коммитьте в репозиторий (./dataуже игнорируется через.gitignore).
Grace-window для refresh-rotation. При повторном использовании одного и того же refresh_token в течение MCP_OAUTH2_REFRESH_GRACE_MS сервер возвращает ранее выпущенную пару токенов (идемпотентно) — защита от race condition при параллельных refresh-запросах клиента. По истечении окна повторное использование считается атакой и приводит к отзыву всей цепочки токенов этой сессии (RFC 6819 §5.2.2.3).
Переопределяют переменные окружения:
node dist/index.js http \
--onec-url http://server/base \
--onec-username admin \
--onec-password secret \
--auth-mode oauth2 \
--public-url http://proxy:8000 \
--port 8000 \
--log-level DEBUGПолный список аргументов:
node dist/index.js --help+------------------+
| MCP Client | (Claude Desktop, Cursor)
| (stdio/HTTP) |
+--------+---------+
| MCP Protocol
v
+--------------------+
| Node.js Proxy |
| - mcp-proxy | Проксирование MCP -> JSON-RPC
| - http-server | Express + Streamable HTTP + OAuth2
| - stdio-server | Stdio транспорт
| - onec-client | HTTP-клиент для 1С
+--------+-----------+
| JSON-RPC over HTTP
| Basic Auth (username:password)
v
+--------------------+
| 1C HTTP Service | /hs/mcp/rpc
| МСP-подсистема | 39 tools, resources, prompts
+--------------------+Все MCP-запросы транслируются в JSON-RPC к 1С:
Tools (инструменты):
tools/list -> список доступных инструментовtools/call -> вызов инструмента с аргументамиResources (ресурсы):
resources/list -> список доступных ресурсовresources/read -> чтение содержимого ресурсаPrompts (промпты):
prompts/list -> список доступных промптовprompts/get -> получение промпта с параметрамиПрокси ожидает HTTP-сервис в 1С по адресу:
{MCP_ONEC_URL}/hs/{MCP_ONEC_SERVICE_ROOT}/Например: http://localhost/base/hs/mcp/
{"status": "ok"}application/jsonusername:password{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "get_metadata",
"description": "Получить метаданные объекта",
"inputSchema": {}
}
]
}
}# Установка зависимостей (заодно ставит git-хуки через husky)
npm install
# Сборка
npm run build
# Сборка в watch-режиме
npm run dev
# Запуск stdio
npm start
# Запуск HTTP
npm run start:httpnpm run typecheck # проверка типов без сборки
npm run lint # ESLint
npm run lint:fix # ESLint с автоисправлением
npm run format # Prettier: отформатировать
npm run format:check # Prettier: только проверка
npm test # запуск тестов (Vitest)
npm run test:watch # тесты в watch-режиме
npm run test:coverage # тесты с отчётом о покрытии
npm run check # format:check + lint + typecheck + test (как в CI)Перед каждым коммитом husky + lint-staged автоматически прогоняют ESLint и Prettier по изменённым файлам. CI (GitHub Actions) дополнительно проверяет сборку на Node 22 и 24, собирает Docker-образ и запускает CodeQL.
История изменений — в CHANGELOG.md.
MIT License
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.