# mcpctl Architecture ## Overview mcpctl is a kubectl-like management tool for MCP (Model Context Protocol) servers. It consists of a CLI, a daemon server, a database layer, a local proxy, and shared utilities. ## Package Structure ``` src/ ├── cli/ @mcpctl/cli - Command-line interface ├── mcpd/ @mcpctl/mcpd - Daemon server (REST API) ├── db/ @mcpctl/db - Database layer (Prisma + PostgreSQL) ├── local-proxy/ @mcpctl/local-proxy - MCP protocol proxy └── shared/ @mcpctl/shared - Shared constants and utilities ``` ## Component Diagram ``` ┌─────────────────┐ HTTP ┌──────────────┐ Prisma ┌────────────┐ │ mcpctl CLI │ ──────────────│ mcpd │ ──────────────│ PostgreSQL │ │ (Commander.js) │ │ (Fastify 5) │ │ │ └─────────────────┘ └──────┬───────┘ └────────────┘ │ │ Docker/Podman API ▼ ┌──────────────┐ │ Containers │ │ (MCP servers)│ └──────────────┘ ┌─────────────────┐ STDIO ┌──────────────┐ STDIO/HTTP ┌────────────┐ │ Claude / LLM │ ────────────│ local-proxy │ ──────────────│ MCP Servers│ │ │ │ (McpRouter) │ │ │ └─────────────────┘ └──────────────┘ └────────────┘ ``` ## CLI (`@mcpctl/cli`) The CLI is built with Commander.js and communicates with mcpd via HTTP REST. ### Commands | Command | Description | |---------|-------------| | `mcpctl get ` | List resources (servers, profiles, projects, instances) | | `mcpctl describe ` | Show detailed resource info | | `mcpctl apply ` | Apply declarative YAML/JSON configuration | | `mcpctl setup [name]` | Interactive server setup wizard | | `mcpctl instance list/start/stop/restart/remove/logs/inspect` | Manage instances | | `mcpctl claude generate/show/add/remove` | Manage .mcp.json files | | `mcpctl project list/create/delete/show/profiles/set-profiles` | Manage projects | | `mcpctl config get/set/path` | Manage CLI configuration | | `mcpctl status` | Check daemon connectivity | ### Configuration CLI config is stored at `~/.config/mcpctl/config.json` with: - `daemonUrl`: mcpd server URL (default: `http://localhost:4444`) ## Daemon (`@mcpctl/mcpd`) Fastify 5-based REST API server that manages MCP server lifecycle. ### Layers 1. **Routes** - HTTP handlers, parameter extraction 2. **Services** - Business logic, validation (Zod schemas), error handling 3. **Repositories** - Data access via Prisma (interface-based for testability) ### API Endpoints | Endpoint | Methods | Description | |----------|---------|-------------| | `/api/v1/servers` | GET, POST | MCP server definitions | | `/api/v1/servers/:id` | GET, PUT, DELETE | Single server operations | | `/api/v1/profiles` | GET, POST | Server configuration profiles | | `/api/v1/profiles/:id` | GET, PUT, DELETE | Single profile operations | | `/api/v1/projects` | GET, POST | Project management | | `/api/v1/projects/:id` | GET, PUT, DELETE | Single project operations | | `/api/v1/projects/:id/profiles` | GET, PUT | Project profile assignments | | `/api/v1/projects/:id/mcp-config` | GET | Generate .mcp.json | | `/api/v1/instances` | GET, POST | Instance lifecycle | | `/api/v1/instances/:id` | GET, DELETE | Instance operations | | `/api/v1/instances/:id/stop` | POST | Stop instance | | `/api/v1/instances/:id/restart` | POST | Restart instance | | `/api/v1/instances/:id/inspect` | GET | Container inspection | | `/api/v1/instances/:id/logs` | GET | Container logs | | `/api/v1/audit-logs` | GET | Query audit logs | | `/api/v1/audit-logs/:id` | GET | Single audit log | | `/api/v1/audit-logs/purge` | POST | Purge expired logs | | `/health` | GET | Health check (detailed) | | `/healthz` | GET | Liveness probe | ### Container Orchestration The `McpOrchestrator` interface abstracts container management: - `DockerContainerManager` - Docker/Podman implementation via dockerode - Future: `KubernetesOrchestrator` for k8s deployments ## Local Proxy (`@mcpctl/local-proxy`) Aggregates multiple MCP servers behind a single STDIO endpoint. ### Features - **Tool namespacing**: `servername/toolname` routing - **Resource forwarding**: `resources/list` and `resources/read` - **Prompt forwarding**: `prompts/list` and `prompts/get` - **Notification pass-through**: Upstream notifications forwarded to client - **Health monitoring**: Periodic health checks with state tracking - **Transport support**: STDIO (child process) and HTTP (SSE/Streamable HTTP) ### Usage ```bash # Via config file mcpctl-proxy --config proxy.json # Via CLI flags mcpctl-proxy --upstream "slack:npx -y @anthropic/slack-mcp" \ --upstream "github:npx -y @anthropic/github-mcp" ``` ## Database (`@mcpctl/db`) Prisma ORM with PostgreSQL. Key models: - **User** / **Session** - Authentication - **McpServer** - Server definitions (name, transport, package, docker image) - **McpProfile** - Per-server configurations (env overrides, permissions) - **Project** - Grouping of profiles for a workspace - **McpInstance** - Running container instances with lifecycle state - **AuditLog** - Immutable operation audit trail ## Shared (`@mcpctl/shared`) Constants and utilities shared across packages: - `APP_NAME`, `APP_VERSION` - Common type definitions ## Design Principles 1. **Interface-based repositories** - All data access through interfaces for testability 2. **Dependency injection** - Services receive dependencies via constructor 3. **Zod validation** - All user input validated with Zod schemas 4. **Namespaced errors** - Custom error classes with HTTP status codes 5. **TypeScript strict mode** - `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`