469 lines
15 KiB
Markdown
469 lines
15 KiB
Markdown
# LazyBear MCP Server
|
||
|
||

|
||
|
||
**.NET 10 сервер Model Context Protocol (MCP) для интеграции с Jira, Confluence, Kubernetes и GitLab.**
|
||
|
||
---
|
||
|
||
## ✨ Возможности
|
||
|
||
| Модуль | Описание | Статус |
|
||
|--------|----------|--------|
|
||
| 📋 **Jira** | Работа с задачами, JQL, комментариями | ✅ Доступно |
|
||
| 📄 **Confluence** | Работа со страницами и пространствами | ✅ Доступно |
|
||
| ☸️ **Kubernetes** | Управление деплоями, подами, сетями | ✅ Доступно |
|
||
| 🌳 **GitLab** | Работа с репозиториями, MR, Issue, ветками, тегами | ✅ Доступно |
|
||
| 🖥️ **TUI** | Интерактивная консольная панель | ✅ Доступно |
|
||
| 🌐 **Localization** | Многоязычный интерфейс (RU/EN) | ✅ Доступно |
|
||
|
||
---
|
||
|
||
## 🏗️ Архитектура
|
||
|
||
```
|
||
┌───────────────────────────────────────────────────────────┐
|
||
│ HTTP Transport Layer (ASP.NET Core) │
|
||
│ └── ModelContextProtocol 1.2.0 HTTP транспорт │
|
||
└───────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌───────────────────────────────────────────────────────────┐
|
||
│ Application Layer (Razor Pages UI) │
|
||
│ └── Web-страницы для мониторинга K8s │
|
||
└───────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌───────────────────────────────────────────────────────────┐
|
||
│ Integration Layers │
|
||
│ ├── Jira API (REST) │
|
||
│ ├── Confluence API (REST) │
|
||
│ ├── Kubernetes API (REST) │
|
||
│ └── GitLab API (REST) │
|
||
└───────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Потоки данных:**
|
||
|
||
1. **Initialize Flow**: Клиент → HTTP → Application → Integration Client → API
|
||
2. **Tools Flow**: Клиент → RPC → Tools → [Jira/Confluence/K8s/GitLab] → Возврат результата
|
||
3. **Health Check Flow**: `/health` → HTTP → Liveness probe → Status
|
||
|
||
---
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### Требования
|
||
|
||
- .NET 10 SDK
|
||
- Kubectl и kubeconfig
|
||
- GitLab Personal Access Token (опционально)
|
||
- Docker Desktop (опционально)
|
||
|
||
### Запуск
|
||
|
||
```bash
|
||
cd LazyBear.MCP
|
||
dotnet run
|
||
```
|
||
|
||
Сервер запустится на `http://localhost:5000`
|
||
|
||
### Docker
|
||
|
||
```bash
|
||
docker build -t lazybear-mcp .
|
||
docker run -p 5000:5000 -v $HOME/.kube:/root/.kube:ro lazybear-mcp
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 Основные модули MCP
|
||
|
||
### 📋 Jira
|
||
|
||
Работа с Jira Issues и JQL запросами.
|
||
|
||
**Методы:**
|
||
- `createIssue` – Создать новый тикет
|
||
- `updateIssue` – Обновить существующий тикет
|
||
- `getIssueDetails` – Получить детали тикета
|
||
- `searchIssues` – Поиск тикетов по JQL
|
||
- `addComment` – Добавить комментарий
|
||
- `getIssueStatuses` – Получение доступных переходов статуса
|
||
- `listIssueComments` – Список комментариев задачи
|
||
|
||
**Пример вызова:**
|
||
|
||
```json
|
||
{
|
||
"method": "jiraTools/createIssue",
|
||
"params": {
|
||
"projectKey": "LAZYBEAR",
|
||
"summary": "Fix memory leak in K8s deployment",
|
||
"description": "Memory leak detected in pod nginx-pod-abc123",
|
||
"type": "BUG",
|
||
"priority": "High",
|
||
"assignee": "dev@example.com"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 📄 Confluence
|
||
|
||
Работа с Confluence страницами и пространствами.
|
||
|
||
**Методы:**
|
||
- `createPage` – Создать новую страницу
|
||
- `updatePage` – Обновить существующую страницу
|
||
- `deletePage` – Удалить страницу
|
||
- `getPageContent` – Получить содержимое страницы
|
||
- `searchPages` – Поиск страниц по ключевым словам
|
||
- `getSpace` – Получить информацию о пространстве
|
||
- `movePage` – Переместить страницу
|
||
|
||
**Пример вызова:**
|
||
|
||
```json
|
||
{
|
||
"method": "confluenceTools/createPage",
|
||
"params": {
|
||
"spaceKey": "LAZYBEAR",
|
||
"title": "Инструкция по развёртыванию",
|
||
"body": "# Инструкция по развёртыванию\n\nШаг 1: Клонируйте репозиторий.
|
||
|
||
---
|
||
|
||
### ☸️ Kubernetes
|
||
|
||
Управление K8s кластером.
|
||
|
||
**Методы:**
|
||
|
||
**Конфигурация:**
|
||
- `readConfig` – Чтение конфигурации кластера
|
||
- `writeConfig` – Обновление конфигурации
|
||
- `deleteConfig` – Удаление конфигурации
|
||
|
||
**Деплои:**
|
||
- `createDeployment` – Создать деплой
|
||
- `updateDeployment` – Обновить деплой
|
||
- `deleteDeployment` – Удалить деплой
|
||
- `scaleDeployment` – Масштабировать деплой
|
||
|
||
**Сети:**
|
||
- `createService` – Создать сервис
|
||
- `updateService` – Обновить сервис
|
||
- `deleteService` – Удалить сервис
|
||
- `createIngress` – Создать ingress
|
||
- `deleteIngress` – Удалить ingress
|
||
|
||
**Поды:**
|
||
- `getPodStatus` – Получить статус пода
|
||
- `restartPod` – Перезапустить под
|
||
- `execIntoPod` – Выполнить команду в поде
|
||
- `deletePod` – Удалить под
|
||
|
||
**Примеры вызова:**
|
||
|
||
```json
|
||
{
|
||
"method": "k8sDeploymentTools/createDeployment",
|
||
"params": {
|
||
"name": "nginx",
|
||
"replicas": 3,
|
||
"image": "nginx:latest"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🌳 GitLab
|
||
|
||
Работа с GitLab API для управления репозиториями, MR, Issue, ветками и тегами.
|
||
|
||
**Методы:**
|
||
|
||
**Репозитории:**
|
||
- `list_projects` – Список всех репозиториев
|
||
- `get_project` – Информация о репозитории по ID/path
|
||
|
||
**Теги (Версии):**
|
||
- `list_versions` – Список тегов репозитория
|
||
- `create_version` – Создание нового тега
|
||
- `delete_version` – Удаление тега
|
||
|
||
**Merge Requests:**
|
||
- `list_merge_requests` – Список всех MR
|
||
- `get_merge_request` – Информация о конкретном MR
|
||
- `create_merge_request` – Создание MR
|
||
- `close_merge_request` – Закрытие MR
|
||
- `open_merge_request` – Открытие MR
|
||
- `list_merge_request_notes` – Замечания к MR
|
||
- `create_merge_request_note` – Добавление замечания
|
||
- `delete_merge_request_note` – Удаление замечания
|
||
|
||
**Issues:**
|
||
- `list_issues` – Список Issues
|
||
- `list_issues_simple` – Быстрый список Issues
|
||
- `get_issue` – Информация об Issue
|
||
- `create_issue` – Создание Issue
|
||
- `update_issue` – Обновление Issue
|
||
- `close_issue` – Закрытие Issue
|
||
- `open_issue` – Открытие Issue
|
||
- `list_issue_notes` – Замечания к Issue
|
||
- `create_issue_note` – Добавление замечания
|
||
- `delete_issue_note` – Удаление замечания
|
||
|
||
**Ветки:**
|
||
- `list_branches` – Список веток
|
||
- `get_branch` – Информация о ветке
|
||
- `create_branch` – Создание ветки
|
||
- `delete_branch` – Удаление ветки
|
||
- `protect_branch` – Защита ветки
|
||
- `unprotect_branch` – Удаление защиты
|
||
|
||
**Примеры вызова:**
|
||
|
||
```json
|
||
{
|
||
"method": "gitlabTools/list_projects",
|
||
"params": {}
|
||
}
|
||
```
|
||
|
||
```json
|
||
{
|
||
"method": "gitlabTools/create_merge_request",
|
||
"params": {
|
||
"sourceBranch": "feature-xyz",
|
||
"targetBranch": "main",
|
||
"title": "Add new feature",
|
||
"description": "Implements new feature xyz"
|
||
}
|
||
}
|
||
```
|
||
|
||
```json
|
||
{
|
||
"method": "gitlabTools/create_issue",
|
||
"params": {
|
||
"title": "Fix production bug",
|
||
"description": "Critical bug in production environment",
|
||
"assigneeId": 123,
|
||
"labels": ["bug", "critical"]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 Структура проекта
|
||
|
||
```
|
||
LazyBear.MCP/
|
||
├── Program.cs # HTTP transport MCP сервер
|
||
├── Pages/ # Razor Pages UI
|
||
│ ├── Index.cshtml # Главная страница
|
||
│ └── Shared/ # Общие компоненты
|
||
├── Services/
|
||
│ ├── Jira/
|
||
│ │ └── JiraIssueTools.cs # Инструменты для Jira
|
||
│ ├── Confluence/
|
||
│ │ └── ConfluencePagesTools.cs # Инструменты для Confluence
|
||
│ ├── Kubernetes/
|
||
│ │ ├── K8sConfigTools.cs # Инструменты конфигурации
|
||
│ │ ├── K8sDeploymentTools.cs # Инструменты деплоя
|
||
│ │ ├── K8sNetworkTools.cs # Инструменты сети
|
||
│ │ ├── K8sPodsTools.cs # Инструменты подов
|
||
│ │ ├── K8sClientFactory.cs # Factory для клиентов
|
||
│ │ └── K8sClientProvider.cs # Provider для клиентов
|
||
│ └── GitLab/
|
||
│ ├── GitLabToolModule.cs # Регистрация инструментов
|
||
│ ├── GitLabToolsBase.cs # Базовый класс с common-методами
|
||
│ ├── GitLabApiClient.cs # REST клиент (RestSharp)
|
||
│ ├── GitLabClientProvider.cs # Provider
|
||
│ ├── GitLabClientFactory.cs # Factory
|
||
│ ├── GitLabRepositoryTools.cs # Репозитории
|
||
│ ├── GitLabVersionTools.cs # Теги
|
||
│ ├── GitLabMergeRequestTools.cs # MR
|
||
│ ├── GitLabIssueTools.cs # Issues
|
||
│ └── GitLabBranchTools.cs # Ветки
|
||
├── appsettings.json # Конфиг
|
||
└── global.json # Пин SDK
|
||
```
|
||
|
||
---
|
||
|
||
## 🖥️ Интерактивная панель
|
||
|
||
```
|
||
┌───────────────────────────────────────────┐
|
||
│ Dashboard: Обзор состояния кластера │
|
||
├───────────────────────────────────────────┤
|
||
│ Logs & Events: Журналы событий │
|
||
│ Containers & Images: Контейнеры │
|
||
│ Workloads & Nodes: Распределение │
|
||
└───────────────────────────────────────────┘
|
||
```
|
||
|
||
**Настройка в appsettings.json:**
|
||
|
||
```json
|
||
{
|
||
"Kubernetes": {
|
||
"KubeconfigPath": "~/.kube/config",
|
||
"DefaultNamespace": "default"
|
||
},
|
||
"Jira": {
|
||
"Url": "https://jira.example.com",
|
||
"Token": "your_jira_token",
|
||
"Project": ""
|
||
},
|
||
"Confluence": {
|
||
"Url": "https://confluence.example.com",
|
||
"Token": "your_confluence_token"
|
||
},
|
||
"GitLab": {
|
||
"Url": "https://gitlab.com",
|
||
"Token": "your_gitlab_pat",
|
||
"Project": ""
|
||
},
|
||
"Logging": {
|
||
"LogLevel": {
|
||
"Default": "Information",
|
||
"ModelContextProtocol": "Debug"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔌 Интеграция
|
||
|
||
### Codex (Windows)
|
||
|
||
Файл: `.mcp.json`
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"lazybear": {
|
||
"command": "dotnet",
|
||
"args": ["run", "--project", "E:\\Codex\\LazyBearWorks\\LazyBear.MCP"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### Continue (VS Code)
|
||
|
||
Файл: `.vscode/continue/config.json`
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"lazybear": {
|
||
"command": "dotnet",
|
||
"args": ["run", "--project", "${workspaceFolder}/LazyBear.MCP"],
|
||
"type": "stdio"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### OpenCode (Linux/Mac)
|
||
|
||
Файл: `~/.opencode/.mcp.json`
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"lazybear": {
|
||
"command": "dotnet",
|
||
"args": ["run", "--project", "~/LazyBearWorks/LazyBear.MCP"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### MCP Inspector
|
||
|
||
```bash
|
||
npm install -g @modelcontextprotocol/inspector
|
||
npx @modelcontextprotocol/inspector dotnet run --project LazyBear.MCP
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 CLI тестирование
|
||
|
||
```bash
|
||
# Прямое тестирование через stdin
|
||
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0"}}}' | dotnet run --project LazyBear.MCP
|
||
```
|
||
|
||
---
|
||
|
||
## 🛠️ Разработка
|
||
|
||
### Сборка
|
||
|
||
```bash
|
||
dotnet build
|
||
```
|
||
|
||
### Запуск
|
||
|
||
```bash
|
||
dotnet run
|
||
```
|
||
|
||
### Тестирование
|
||
|
||
```bash
|
||
npx @modelcontextprotocol/inspector dotnet run --project LazyBear.MCP
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 Stack
|
||
|
||
- **Язык:** C#
|
||
- **Framework:** .NET 10
|
||
- **Framework Web:** ASP.NET Core 9
|
||
- **UI:** Razor Pages
|
||
- **Protocol:** Model Context Protocol (MCP)
|
||
- **API Clients:** RestSharp (для Jira, Confluence, GitLab), Kubernetes Client (для K8s)
|
||
|
||
**Документация:**
|
||
- **Сгенерированный API**: `/swagger` — Swagger UI
|
||
- **Метаданные методов**: MCP Tools — авт. описание от `Summary/Description`
|
||
|
||
### OpenAPI/Swagger
|
||
|
||
**Включите для просмотра API:**
|
||
|
||
```xml
|
||
<!-- LazyBear.MCP/Program.cs -->
|
||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.OpenApi.Models;
|
||
|
||
var config = new OpenApiInfo { Title = "LazyBear MCP Server", Version = "1.0.0" };
|
||
builder.Services.AddEndpointsApiExplorer();
|
||
builder.Services.AddSwaggerGen(c => c.SwaggerDoc("v1", config));
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 Ссылки
|
||
|
||
- [GitLab API Documentation](https://docs.gitlab.com/ee/api/)
|
||
- [MCP Specification](https://modelcontextprotocol.io)
|
||
|
||
---
|
||
|
||
*Встроенная документация по MCP* |