local-dev-mcp
by mfokusnik
README.md
# Local Dev MCP
Локальный MCP-сервер для работы AI-агента с несколькими проектами на одной Windows-машине.
Local Dev MCP предоставляет AI-клиенту доступ к локальным проектам, файловой системе и выполнению команд через PowerShell. Один экземпляр сервера может работать сразу с несколькими репозиториями, расположенными в одной или нескольких корневых директориях.
Docker не является обязательной зависимостью. Проекты могут использовать Docker, Node.js, PHP, Python или любой другой локально установленный стек.
## Установка
### 1. Установите Node.js
Для работы Local Dev MCP требуется Node.js версии 20 или новее.
Проверьте текущую версию:
```powershell
node --version
npm --version
```
Если Node.js не установлен, установите актуальную LTS-версию с официального сайта Node.js.
После установки закройте и повторно откройте PowerShell или Windows Terminal.
### 2. Получите Local Dev MCP
Склонируйте репозиторий:
```powershell
git clone https://github.com/mfokusnik/LocalDevMCP
cd LocalDevMCP
```
Либо скачайте архив репозитория и распакуйте его в удобную директорию, например:
```text
C:\Tools\local-dev-mcp
```
### 3. Выполните первичную настройку
Запустите:
```text
FIRST_RUN.cmd
```
Скрипт автоматически:
* проверит наличие Node.js;
* запросит корневую директорию с локальными проектами;
* создаст `config.local.json`;
* установит npm-зависимости;
* проверит TypeScript;
* запустит MCP-сервер.
Например, если проекты сотрудника находятся здесь:
```text
C:\Users\User\Documents\GitHub
```
необходимо указать эту директорию при первом запуске.
У другого сотрудника путь может быть любым:
```text
D:\Projects
```
или:
```text
C:\Development
```
Настройка хранится локально и не попадает в Git.
### 4. Проверьте запуск
После успешного запуска откройте:
```text
http://127.0.0.1:7676/health
```
Ожидаемый ответ:
```json
{
"ok": true,
"name": "local-dev-mcp",
"version": "0.1.0",
"mcp": "http://127.0.0.1:7676/mcp"
}
```
MCP endpoint:
```text
http://127.0.0.1:7676/mcp
```
### 5. Подключите MCP-клиент
В используемом локальном MCP tunnel укажите:
```text
http://127.0.0.1:7676/mcp
```
После подключения AI-клиент получит доступ к зарегистрированным MCP tools.
### 6. Проверьте MCP-интерфейс
При запущенном сервере выполните:
```text
SMOKE_TEST.cmd
```
или:
```powershell
npm run smoke
```
Тест должен успешно подключиться к MCP endpoint и вернуть список доступных инструментов.
## Последующие запуски
После первой установки повторная настройка не требуется.
Для запуска сервера используйте:
```text
START.cmd
```
или:
```powershell
npm run dev
```
Локальная конфигурация сохраняется в:
```text
config.local.json
```
Для смены директории с проектами можно отредактировать этот файл вручную или повторно выполнить первичную настройку.
## Возможности
* автоматическое обнаружение проектов в одной или нескольких корневых директориях;
* выбор активного проекта по имени или alias;
* файловые операции внутри выбранного проекта;
* выполнение PowerShell-команд с рабочей директорией выбранного проекта;
* базовое определение используемого стека;
* проверка доступности локальных CLI-инструментов;
* работа с Git и GitHub CLI через локальный shell;
* Streamable HTTP MCP endpoint;
* локальный health-check endpoint;
* защита файловых MCP-операций от выхода за пределы активного проекта.
Поддерживается автоматическое определение следующих технологий и инструментов:
* Git;
* Node.js;
* PHP / Composer;
* Laravel;
* Docker / Docker Compose;
* Python;
* Go;
* Rust.
## Архитектура
```text
AI-клиент
│
│ MCP
▼
Local Dev MCP
│
├── обнаружение проектов
├── выбор workspace
├── файловые операции
└── PowerShell
│
├── git
├── gh
├── docker
├── npm
├── composer
├── php / artisan
├── python
└── другие локальные CLI
```
Сервер не реализует отдельные MCP-инструменты для каждого фреймворка или среды выполнения.
Команды вида:
```powershell
npm test
php artisan test
docker compose ps
git status
gh pr create
```
выполняются через универсальный инструмент `shell.run`.
За счёт этого MCP-сервер не зависит от технологического стека конкретного проекта.
## Требования
Обязательно:
* Windows 10 или Windows 11;
* Node.js 20 или новее;
* хотя бы одна локальная директория с проектами.
Дополнительные инструменты устанавливаются только при необходимости:
* Git;
* GitHub CLI;
* Docker Desktop;
* PHP;
* Composer;
* Python;
* другие CLI и runtime, используемые проектами.
Docker для работы Local Dev MCP не требуется.
## Первый запуск
### 1. Склонируйте или распакуйте проект
Например:
```text
C:\Tools\local-dev-mcp
```
### 2. Запустите первичную настройку
```text
FIRST_RUN.cmd
```
Скрипт:
1. проверит наличие Node.js;
2. запросит путь к директории с проектами;
3. создаст локальный конфигурационный файл;
4. установит npm-зависимости;
5. выполнит проверку TypeScript;
6. запустит MCP-сервер.
По умолчанию предлагается путь:
```text
%USERPROFILE%\Documents\GitHub
```
При необходимости можно указать другой:
```text
D:\Projects
```
### 3. Проверьте запуск
Откройте:
```text
http://127.0.0.1:7676/health
```
Ожидаемый ответ:
```json
{
"ok": true,
"name": "local-dev-mcp",
"version": "0.1.0",
"mcp": "http://127.0.0.1:7676/mcp"
}
```
MCP endpoint:
```text
http://127.0.0.1:7676/mcp
```
По умолчанию сервер слушает только `127.0.0.1` и напрямую не публикуется в локальную сеть или интернет.
### 4. Подключите MCP-клиент
В локальном MCP tunnel или другом совместимом клиенте укажите:
```text
http://127.0.0.1:7676/mcp
```
### 5. Выполните smoke test
При запущенном сервере:
```text
SMOKE_TEST.cmd
```
или:
```powershell
npm run smoke
```
Тест проверяет подключение к MCP и выводит список зарегистрированных tools.
## Обычный запуск
После первичной настройки:
```text
START.cmd
```
или:
```powershell
npm run dev
```
## Конфигурация
Локальная конфигурация хранится в:
```text
config.local.json
```
Файл исключён из Git через `.gitignore` и предназначен для настроек конкретной рабочей станции.
Пример:
```json
{
"roots": [
"C:\\Users\\YourName\\Documents\\GitHub"
],
"scanDepth": 1,
"host": "127.0.0.1",
"port": 7676,
"mcpPath": "/mcp",
"shell": {
"executable": "powershell.exe",
"timeoutMs": 120000,
"maxOutputChars": 200000
},
"skipDirectories": [
".git",
"node_modules",
"vendor",
".next",
"dist",
"build"
],
"projects": []
}
```
## Несколько корневых директорий
```json
{
"roots": [
"C:\\Users\\YourName\\Documents\\GitHub",
"D:\\Work",
"D:\\Experiments"
]
}
```
Каждая директория сканируется независимо.
## Глубина сканирования
Если структура проектов вложенная:
```text
D:\Work
├── clients
│ ├── project-a
│ └── project-b
└── internal
└── project-c
```
можно увеличить:
```json
{
"scanDepth": 2
}
```
Максимальное значение в текущей версии — `5`.
## Явное добавление проекта и alias
Проекты можно добавлять вручную:
```json
{
"projects": [
{
"name": "sample-app",
"path": "D:\\Projects\\sample-app",
"aliases": [
"sample",
"app"
]
}
]
}
```
После этого проект можно выбрать как по основному имени, так и по alias.
## Обнаружение проектов
Директория считается проектом, если содержит хотя бы один из поддерживаемых markers:
```text
.git
package.json
composer.json
artisan
compose.yml
compose.yaml
docker-compose.yml
docker-compose.yaml
Dockerfile
pyproject.toml
requirements.txt
go.mod
Cargo.toml
```
После определения директории как проекта сканирование её внутренних папок прекращается.
Это позволяет не определять внутренние зависимости и служебные директории как отдельные workspace.
## MCP tools
### `projects.list`
Возвращает список обнаруженных и явно настроенных проектов.
### `projects.select`
Выбирает активный проект по имени или alias.
Пример:
```text
Пользователь:
Работаем с sample-app
AI:
projects.select({ "name": "sample-app" })
```
В ответ сервер возвращает:
* абсолютный путь проекта;
* обнаруженный стек;
* текущую Git-ветку;
* состояние working tree;
* список доступных локальных CLI-инструментов.
### `projects.current`
Возвращает текущий активный проект и его состояние.
### `fs.list`
Выводит содержимое директорий внутри активного проекта.
### `fs.read`
Читает UTF-8 файлы.
Поддерживается чтение диапазона строк.
### `fs.write`
Создаёт новый файл или полностью перезаписывает существующий.
### `fs.replace`
Выполняет точную замену текста в файле.
Поддерживается замена одного или всех совпадений.
### `fs.move`
Перемещает или переименовывает файл или директорию внутри активного проекта.
### `fs.delete`
Удаляет файл или директорию внутри активного проекта.
Удаление корневой директории активного проекта через этот tool запрещено.
### `shell.run`
Выполняет PowerShell-команду с рабочей директорией активного проекта.
Примеры:
```powershell
git status
```
```powershell
git switch -c feature/example
```
```powershell
npm test
```
```powershell
php artisan test
```
```powershell
docker compose ps
```
```powershell
docker compose exec app php artisan test
```
```powershell
gh pr create
```
Отдельные инструменты `docker.*`, `git.*` или `artisan.*` в текущей версии не реализуются.
Универсальным интерфейсом выполнения команд является локальный shell.
## Docker
Docker является опциональным инструментом.
Если Docker Desktop установлен, AI-клиент может использовать Docker CLI через `shell.run`.
Например:
```powershell
docker compose ps
```
или:
```powershell
docker compose exec app npm test
```
Если Docker отсутствует, MCP-сервер продолжает работать без ограничений для остальных инструментов.
То же относится к PHP, Composer, Python, GitHub CLI и другим runtime.
## Git и GitHub
Git-операции выполняются через локально установленный Git CLI.
Например:
```powershell
git status
git diff
git switch -c feature/example
git commit
```
При установленном и авторизованном GitHub CLI доступны операции через `gh`:
```powershell
gh pr create
gh pr view
gh issue list
gh issue comment
```
Local Dev MCP не хранит GitHub-токены и использует существующую локальную авторизацию.
## Модель безопасности
Файловые MCP-tools ограничены активным проектом.
Попытки обратиться к файлу через путь, выходящий за пределы workspace, блокируются.
Например:
```text
..\..\some-file.txt
```
не должен позволить `fs.read`, `fs.write` или другим файловым tools выйти за пределы выбранного проекта.
При этом `shell.run` не является sandbox.
Команда выполняется из директории активного проекта:
```text
cwd = active project
```
но сам PowerShell технически может обращаться к другим директориям и локальным ресурсам, если это указано непосредственно в команде.
Поэтому текущая версия рассчитана на доверенную локальную среду разработки:
```text
один сотрудник
=
один локальный MCP
=
одна рабочая станция
```
## Состояние активного проекта
Выбранный проект хранится в памяти процесса MCP.
После перезапуска сервера проект необходимо выбрать повторно.
Текущая версия не рассчитана на одновременную работу нескольких независимых пользователей через один экземпляр сервера.
## Структура проекта
```text
local-dev-mcp/
├── src/
│ ├── index.ts
│ ├── server.ts
│ ├── config.ts
│ ├── projects.ts
│ ├── fs-tools.ts
│ ├── shell.ts
│ ├── smoke.ts
│ └── types.ts
├── scripts/
│ └── setup.ps1
├── FIRST_RUN.cmd
├── START.cmd
├── SMOKE_TEST.cmd
├── config.example.json
├── package.json
└── tsconfig.json
```
## Команды разработки
Установка зависимостей:
```powershell
npm install
```
Запуск:
```powershell
npm run dev
```
Проверка типов:
```powershell
npm run check
```
Сборка:
```powershell
npm run build
```
Запуск собранной версии:
```powershell
npm start
```
Smoke test:
```powershell
npm run smoke
```
## Ограничения текущей версии
В текущей версии отсутствуют:
* web-интерфейс;
* система пользователей;
* база данных;
* ACL для отдельных shell-команд;
* подтверждение потенциально опасных команд на уровне сервера;
* Docker-контейнер для самого MCP;
* отдельные runtime profiles;
* сохранение активного проекта после перезапуска;
* публичный удалённый endpoint;
* многопользовательский режим.
Эти возможности могут быть добавлены по мере необходимости.
## Диагностика
### Node.js не найден
Проверьте:
```powershell
node --version
npm --version
```
Требуется Node.js 20 или новее.
### MCP запущен, но клиент не подключается
Сначала проверьте:
```text
http://127.0.0.1:7676/health
```
Если `/health` недоступен, проблема находится на стороне локального MCP.
Если `/health` работает, проверьте MCP endpoint:
```text
http://127.0.0.1:7676/mcp
```
и конфигурацию используемого MCP tunnel.
### Порт 7676 занят
Измените порт в `config.local.json`:
```json
{
"port": 7677
}
```
После этого используйте новый порт в MCP-клиенте.
### Проект не обнаруживается
Проверьте:
1. находится ли проект внутри одной из `roots`;
2. содержит ли директория поддерживаемый project marker;
3. достаточно ли значения `scanDepth`;
4. при необходимости добавьте проект явно через `projects`.
## Технологии
* TypeScript;
* Node.js;
* Model Context Protocol;
* официальный MCP TypeScript SDK.
Документация:
```text
https://modelcontextprotocol.io/
https://github.com/modelcontextprotocol/typescript-sdk
```
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues