A scalable MCP-based execution platform for HR, ERP, and DevOps domains.
MCP Platform
A scalable MCP-based execution platform that allows users to interact via a chat UI, with an LLM (via LlamaIndex) interpreting intent and controlled execution of application-specific actions via MCP.
Architecture Overview
┌─────────────┐
│ Chat UI │ React-based frontend
└──────┬──────┘
│
▼
┌─────────────────────────────┐
│ Orchestrator (AI Gateway) │ FastAPI - Conversation management, LLM orchestration
└──────┬──────────────────────┘
│
├────────────────────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ LLM │ │ MCP Client │
│ (LlamaIndex)│ │ │
└─────────────┘ └──────┬──────┘
│
▼
┌─────────────┐
│ MCP Server │ Tool registry, auth, audit, routing
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ HR │ │ ERP │ │ DevOps │
│ Domain │ │ Domain │ │ Domain │
└───────────┘ └───────────┘ └───────────┘
Key Principles
- Separation of Concerns: Each component has a single responsibility
- Domain Isolation: Applications are isolated with no cross-domain calls
- Configuration-Driven: New domains added via configuration, not code changes
- LLM is Advisory, MCP is Authoritative: LLM suggests actions, MCP enforces them
Components
Frontend (Chat UI)
- Captures user input
- Displays assistant responses
- No business logic
- No direct LLM or MCP access
Orchestrator (AI Gateway)
- Manages conversation state
- Interfaces with LLM via LlamaIndex
- Supplies tool definitions to LLM
- Parses structured tool calls
- Invokes MCP Client
MCP Server
- Registers and exposes MCP tools
- Enforces authorization
- Routes calls to application domains
- Audits all executions
- No LLM or UI logic
Application Domains
Each domain contains:
- Tool definitions (namespaced, e.g.,
hr.get_employee) - Adapter implementation
- Permission model
- Configuration
Included domains:
- HR: Employee lookup, department info
- ERP: Invoices, inventory management
- DevOps: Kubernetes operations, logs, scaling
Quick Start
Prerequisites
- Python 3.10+
- Node.js 18+
- Docker (optional)
Local Development
- Clone and setup:
cd mcp_poc
cp .env.example .env
# Edit .env with your LLM API keys
- Install Python dependencies:
pip install -e ".[dev]"
- Start MCP Server (terminal 1):
export PYTHONPATH=$PWD/src
python -m mcp_server.main
- Start Orchestrator (terminal 2):
export PYTHONPATH=$PWD/src
python -m orchestrator.main
- Start Frontend (terminal 3):
cd frontend
npm install
npm run dev
- Open browser: http://localhost:3000
Using Docker
# Build and run all services
docker-compose up --build
# Access:
# - Frontend: http://localhost:3000
# - Orchestrator API: http://localhost:8000
# - MCP Server API: http://localhost:8001
Testing with Mock LLM
For testing without LLM API keys, use the mock provider:
# config/settings.yaml
llm:
provider: mock
API Endpoints
Orchestrator (port 8000)
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Health check |
/chat |
POST | Send chat message |
/conversations |
GET | List conversations |
/conversations/{id} |
GET | Get conversation history |
/conversations/{id} |
DELETE | Delete conversation |
/tools |
GET | List available tools |
MCP Server (port 8001)
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Health check |
/tools |
GET | List registered tools |
/tools/{name} |
GET | Get tool details |
/execute |
POST | Execute a tool |
/domains |
GET | List registered domains |
Tool Examples
HR Domain
# Get employee information
hr.get_employee(employee_id="E001")
# Search employees
hr.search_employees(department="Engineering", query="developer")
# List departments
hr.list_departments()
ERP Domain
# Get invoice
erp.get_invoice(invoice_id="INV-001")
# Create invoice
erp.create_invoice(
customer="Acme Corp",
items=[{"description": "Service", "quantity": 1, "unit_price": 1000}]
)
# Check low stock
erp.check_low_stock(category="Components")
DevOps Domain
# List pods
devops.list_pods(namespace="production")
# Get pod logs
devops.get_pod_logs(pod_name="api-server-xyz")
# Scale deployment
devops.scale_deployment(deployment_name="api-server", replicas=3)
Adding a New Domain
- Create domain directory:
src/domains/mydomain/
├── __init__.py
└── config.yaml (optional)
- Implement adapter
Tools (9)
hr.get_employeeGet employee information by IDhr.search_employeesSearch for employees by department and queryhr.list_departmentsList all available departmentserp.get_invoiceRetrieve invoice details by IDerp.create_invoiceCreate a new invoice for a customererp.check_low_stockCheck for low stock items in a categorydevops.list_podsList Kubernetes pods in a namespacedevops.get_pod_logsRetrieve logs for a specific poddevops.scale_deploymentScale a deployment to a specific number of replicasEnvironment Variables
PYTHONPATHrequiredPath to the source directoryConfiguration
{"mcpServers": {"mcp-platform": {"command": "python", "args": ["-m", "mcp_server.main"]}}}