Docker-упаковка для Singularity MCP Server — сервера протокола Model Context Protocol, который предоставляет AI-ассистентам инструменты для управления задачами, проектами и привычками в Singularity.
- Требования
- Быстрый старт
- Сборка образа
- Запуск контейнера
- Переменные среды
- Эндпоинты
- Настройка MCP-клиента
- Ресурсы и лимиты
- Структура образа
| Инструмент | Минимальная версия |
|---|---|
| Docker | 20.10+ |
| Docker Compose | v2.0+ (плагин docker compose) |
Интернет-соединение на этапе сборки — образ скачивает пакет сервера с me.singularity-app.com.
# 1. Клонировать репозиторий
git clone https://github.com/d4rk5eed/singularity-mcp-server-docker.git
cd singularity-mcp-server-docker
# 2. Создать файл с переменными среды
echo "REFRESH_TOKEN=ваш_токен" > .env
# 3. Собрать и запустить
docker compose up --build -d
# 4. Проверить работу
curl http://localhost:3000/healthИспользуется multi-stage build: на первом этапе скачивается и распаковывается .mcpb-пакет сервера, на втором — собирается минимальный runtime-образ.
docker build -t singularity-mcp-server:2.1.1 .Что происходит при сборке:
- base stage — устанавливается
curlиunzip, скачивается архивsingularity-mcp-server-2.1.1.mcpbс официального сервера, распаковывается в/app - runtime stage — копируются только распакованные файлы приложения, создаётся
docker-entrypoint.sh, открывается порт3000
Итоговый размер образа: ~139 МБ (на базе node:20-alpine).
Минимальный запуск (только обязательный токен):
docker run -d \
-p 3000:3000 \
-e REFRESH_TOKEN=ваш_токен \
singularity-mcp-server:2.1.1Расширенный запуск со всеми параметрами:
docker run -d \
--name singularity-mcp \
--restart unless-stopped \
-p 3000:3000 \
-e REFRESH_TOKEN=ваш_токен \
-e SINGULARITY_API_URL=https://api.singularity-app.com \
-e LOG_LEVEL=info \
-e CORS_ORIGINS=http://localhost:3000,http://myapp.example.com \
singularity-mcp-server:2.1.1Демо-режим (без токена, API-вызовы имитируются):
docker run -d \
-p 3000:3000 \
-e DEMO_MODE=true \
singularity-mcp-server:2.1.1- Создайте файл
.envрядом сdocker-compose.yml:
# Обязательно
REFRESH_TOKEN=ваш_токен_здесь
# Опционально (значения по умолчанию показаны ниже)
# HOST_PORT=3000
# SINGULARITY_API_URL=https://api.singularity-app.com
# LOG_LEVEL=info
# CORS_ORIGINS=http://localhost:3000
# DEMO_MODE=false- Запустите:
# Первый запуск (сборка + старт)
docker compose up --build -d
# Последующие запуски
docker compose up -d
# Просмотр логов
docker compose logs -f singularity-mcp
# Остановка
docker compose downЧтобы использовать другой порт на хосте без правки docker-compose.yml:
HOST_PORT=8080 docker compose up -d| Переменная | Обязательная | По умолчанию | Описание |
|---|---|---|---|
REFRESH_TOKEN |
Да ¹ | — | Токен доступа к Singularity API |
SINGULARITY_API_URL |
Нет | https://api.singularity-app.com |
Базовый URL API (для self-hosted инстансов) |
PORT |
Нет | 3000 |
Порт HTTP-сервера внутри контейнера |
LOG_LEVEL |
Нет | info |
Уровень логирования: debug / info / warn / error |
CORS_ORIGINS |
Нет | http://localhost:3000 |
Разрешённые CORS-источники (через запятую) |
DEMO_MODE |
Нет | false |
Запуск без токена с имитацией API-вызовов (true / false) |
¹ Обязателен, если DEMO_MODE не установлен в true. При запуске без токена контейнер завершится с ошибкой и подсказкой.
Безопасность: не передавайте
REFRESH_TOKENнапрямую вdocker-compose.yml. Используйте файл.env(добавьте его в.gitignore) или Docker Secrets.
После запуска контейнер предоставляет два HTTP-эндпоинта:
| Метод | Путь | Описание |
|---|---|---|
GET |
/health |
Проверка работоспособности сервера |
POST |
/mcp |
Обработка MCP-запросов (JSON-RPC 2.0) |
Проверка здоровья:
curl http://localhost:3000/health{
"status": "ok",
"message": "Singularity MCP Server работает",
"apiUrl": "https://api.singularity-app.com",
"demoMode": false
}MCP-запрос (пример вызова инструмента):
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"listProjects","arguments":{}}}'Для MCP-клиентов, использующих stdio-транспорт, контейнер запускается как дочерний процесс. Добавьте в конфиг MCP-клиента:
{
"mcpServers": {
"singularity": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--entrypoint", "node",
"singularity-mcp-server:2.1.1",
"/app/mcp.js",
"--accessToken", "ваш_токен",
"--noLog"
]
}
}
}Примечание: флаг
--noLogобязателен в stdio-режиме — логи идут в stdout и могут нарушить MCP-протокол.
Укажите MCP-эндпоинт запущенного контейнера:
http://localhost:3000/mcp
В docker-compose.yml заданы ограничения по умолчанию (можно изменить):
| Параметр | Значение |
|---|---|
| CPU limit | 0.5 ядра |
| Memory limit | 256 МБ |
| Memory reservation | 64 МБ |
Health check проверяет /health каждые 30 секунд (start_period: 10s, retries: 3).
/app/
├── mcp.js # Точка входа (stdio-режим, для MCP-клиентов)
├── http-server.js # Точка входа (HTTP-режим, используется контейнером)
├── server.js # Ядро MCP-сервера
├── client.js # HTTP-клиент к Singularity API
├── index.js # Экспорты библиотеки
├── docker-entrypoint.sh # Entrypoint: валидация токена → запуск http-server.js
├── modules/ # MCP-инструменты по сущностям (task, project, habit…)
├── utils/ # Вспомогательные утилиты (auth, response)
└── node_modules/ # Зависимости (поставляются в .mcpb-архиве)
MIT — см. manifest.json.