MCP IT Help Desk
by minasenel
README.md
<div align="center">
# π€ MCP IT Help Desk
[](https://www.python.org/)
[](https://github.com/modelcontextprotocol)
[](https://github.com/evalstate/fast-agent)
[](LICENSE)
AI-powered IT support: understands issues (TR/EN), suggests fixes, and routes to the right experts. Experts are stored in Django DB.
</div>
<p align="center">
<img src="docs/images/image2.png" alt="MCP IT Help Desk architecture and Django API breakdown" width="100%" />
<!-- Place the diagram image at images/api_service_breakdown.png -->
<!-- The image illustrates overall system flow and Django API key files/routes -->
<!-- If rendering on GitHub Pages, ensure the relative path is correct for the site base URL. -->
</p>
---
## β¨ Features
- **AI-Powered Classification (100% LLM)**: Turkish + English via Gemini; no heuristics
- **Auto-Solutions**: Common hardware/software/network fixes for non-critical cases
- **Smart Expert Assignment**: Availability + expertise + load consideration
- **Modern Web UI**: Real-time chat via Flask + Socket.IO + Tailwind
- **MCP Tools**: Add/process issues, AI try-solve, assign experts
## π§ Table of Contents
- π§ MCP Tools
- π Quick Start
- π§± Architecture
- ποΈ File Structure
- π Comprehensive Documentation
- βοΈ Advanced Configuration
- π§ͺ Usage Examples
- π§ Design Philosophy
- π€ Contributing & Support
## π§ MCP Tools
| Tool | Purpose | Inputs | Output |
|---|---|---|---|
| `add_issue` | Create a new ticket with normalized fields and timestamps | `employee_id, description, category, subcategory, priority` | `Issue created: ISSnnn` |
| `ai_try_solve` | Attempt auto-resolution for common issues (non-critical) | `description, category, subcategory, priority` | Solution text or suggestion to assign expert |
| `assign_expert` | Classify description and pick best available expert | `description` | `Assigned expert: T00x - Name (category/subcategory)` |
| `process_issues` | Batch normalize + auto-solve + assign/queue | none | Summary: closed_by_ai, assigned/queued, skipped |
### π©βπ» Expert Data Format (Django DB)
| Field | Type | Example | Notes |
|---|---|---|---|
| `id` | string (pk) | `T001` | Human-friendly ID |
| `name` | string | `Elif HanΔ±m, AΔ UzmanΔ±` | Display name |
| `expertise` | JSON/list | `["network","vpn"]` | Tags matched by classifier |
| `contact` | string | `elif@example.com` | Optional |
| `availability` | boolean | `true` | Considered for assignment |
| `current_load` | integer | `0` | Incremented on assignment |
## π Quick Start
### Prerequisites
- Python 3.11+
- [uv](https://docs.astral.sh/uv/) (recommended)
- Gemini API key (required): set `GEMINI_API_KEY` or `GOOGLE_API_KEY`
### Install dependencies
```bash
uv sync
```
### π₯ Most Important: Start Project (2 terminals)
Terminal 1 β start Django API (port 8000):
```bash
cd django_api_service
python3 manage.py runserver 8000
```
Terminal 2 β start Web UI (Flask + Socket.IO):
```bash
cd .. # back to project root (mcp-it-helpdesk)
uv run python start_web_agent.py
```
### Set up Django (migrations + import experts)
```bash
cd django_api_service
uv run python manage.py makemigrations
uv run python manage.py migrate
uv run python import_experts.py # imports tech_experts.json into DB
```
### Run services
```bash
# MCP (via Fast Agent)
uv run fast-agent go --stdio "uv run python main.py"
# Django API (serves at http://localhost:8000; root "/" returns 404 by design)
uv run python django_api_service/manage.py runserver
# health check: http://localhost:8000/api/health/
# Web UI (Flask, serves at http://localhost:5001)
uv run python web_agent.py
# open http://localhost:5001
```
Notes:
- API routes live under `/api/` (e.g., `/api/health/`, `/api/issues/`). The root `/` returns 404 by design.
- The web frontend at `http://localhost:5001` calls the API at `http://localhost:8000` by default.
## π§± Architecture
```
Web UI (Flask/Socket.IO) Django API (REST + ORM) MCP Server (main.py)
β β β
β create/assign issues (HTTP) β β
ββββββββββββββββΊ /api/issues/ ββββΌβββββββββββ β
β β β
βΌ β β
SQLite (Issues, Experts) β
β² β
βββ load experts βββββ
```
## ποΈ File Structure
```
mcp-it-helpdesk/
ββ main.py # MCP server with tools
ββ problems.txt # Legacy issue store (MCP-only)
ββ tech_experts.json # Legacy sample; data is stored in Django DB
ββ web_agent.py # Flask web chat
ββ templates/index.html # Web UI
ββ django_api_service/
β ββ api/settings.py # Django settings
β ββ manage.py
β ββ issues/
β ββ models.py # Issue, Expert models
β ββ serializers.py # Validation + Gemini integration
β ββ views.py # REST endpoints and actions
β ββ migrations/ # Django migrations
ββ docs/images/ # (add your screenshots/diagrams here)
```
## π Comprehensive Documentation
### Detailed Features and Benefits
- **Bilingual understanding (TR/EN)**: Reduces back-and-forth with users
- **AI-first classification**: Requires Gemini key; ensures consistent, accurate categorization
- **Human-in-the-loop**: Assign experts for high/critical cases or when AI canβt resolve
### Installation Guide (Step-by-Step)
1. Install dependencies with `uv sync`
2. Run Django migrations and import experts (see Quick Start)
3. Launch MCP, Django API, and the Web UI
4. Test with the usage examples below
### Practical Usage Examples
Inside Fast Agent:
```
/tools
/call main-add_issue {"employee_id":"E001","description":"VPN baΔlantΔ± sorunu","category":"network","subcategory":"vpn","priority":"medium"}
/call main-ai_try_solve {"description":"VPN baΔlantΔ± sorunu","category":"network","subcategory":"vpn","priority":"medium"}
/call main-process_issues
```
## βοΈ Advanced Configuration
- **Gemini model**: Set `GEMINI_MODEL` env (default: `gemini-1.5-flash`)
- **API Keys (required)**: Provide `GEMINI_API_KEY` or `GOOGLE_API_KEY`. The app maps `GEMINI_API_KEY` to `GOOGLE_API_KEY` automatically.
- **CORS**: `settings.py` allows `http://localhost:5001` for the web UI; adjust for production
- **Secrets & DB**: `.gitignore` excludes local DBs and secrets; use `.env` files locally (donβt commit)
## π§ Design Philosophy
- **LLM-first**: Classification and validation are fully AI-driven
- **Single Source of Truth for Experts**: Experts live in Django DB (no runtime JSON fallback)
## π§ͺ Testing Ideas
- Unit test serializers and classification (LLM prompts and outputs)
- Integration test Django actions that shell into MCP (`assign_expert`, `ai_solve`)
- E2E test via Web UI: create issue β assign expert β verify DB state
## π³ Docker
### Official Image
- Pull and run:
```bash
docker pull minasenel/mcp-it-helpdesk:latest
docker run --rm --name mcp_api -p 8000:8000 \
-e GEMINI_API_KEY="<your_key>" \
minasenel/mcp-it-helpdesk:latest
# open http://localhost:8000/api/health/
```
- If port 8000 is busy on your host, map another host port:
```bash
docker run --rm --name mcp_api -p 8001:8000 \
-e GEMINI_API_KEY="<your_key>" \
minasenel/mcp-it-helpdesk:latest
# then use http://localhost:8001
```
Notes:
- API routes live under `/api/`. The root `/` returns 404 by design.
- The frontend typically runs at `http://localhost:5001` and talks to the API at `http://localhost:8000`.
### Environment Variables
- `GEMINI_API_KEY` or `GOOGLE_API_KEY` (required)
- `SECRET_KEY` (recommended for production; generated if missing in dev)
- `DJANGO_ALLOWED_HOSTS` (set domains for production)
Examples:
```bash
docker run --rm -p 8000:8000 \
-e GEMINI_API_KEY="<your_key>" \
-e DJANGO_ALLOWED_HOSTS="localhost,127.0.0.1" \
-e SECRET_KEY="change-me" \
minasenel/mcp-it-helpdesk:latest
```
### Data Persistence
- The image uses SQLite by default inside the container. Data will be ephemeral unless you mount a volume:
```bash
# Persist the Django project folder (including db.sqlite3)
docker run --rm -p 8000:8000 \
-e GEMINI_API_KEY="<your_key>" \
-v "$PWD/django_data":/app/django_api_service \
minasenel/mcp-it-helpdesk:latest
```
### Build locally (optional)
If you prefer to build from source:
```bash
# from repo root
docker build -t YOUR_USERNAME/mcp-it-helpdesk:latest .
docker run --rm -p 8000:8000 \
-e GEMINI_API_KEY="<your_key>" \
YOUR_USERNAME/mcp-it-helpdesk:latest
```
---
Licensed under **MIT**.
TDQS
C2.1/5.0
Scored across 4 tools
Disambiguation3/5
Tools appear distinct but 'add_issue' lacks description, causing ambiguity about its exact role relative to 'ai_try_solve' and 'assign_expert'.
Naming Consistency3/5
Most tools use verb_noun pattern, but 'ai_try_solve' deviates with an awkward structure mixing AI and action verb.
Tool Count4/5
Four tools are reasonable for a simple help desk server, covering core steps without being excessive.
Completeness2/5
Missing essential operations like listing, updating, or deleting issues, and lacks a tool for viewing a single issue's details.
Maintenance
ActivityInactive
ResponsivenessNo issues