Skip to main content
Glama

MCP cldkctl Server

by raffelprama
MIT License
1
  • Linux
  • Apple
howtouse.md24.8 kB
# MCP CLDKCTL - Model Context Protocol Server for Cloudeka CLI ## 🏠 Home Page ### Description MCP CLDKCTL is a Model Context Protocol (MCP) server that provides seamless integration between AI assistants (Claude Desktop, Cursor) and Cloudeka's cloud infrastructure management platform. It transforms the cldkctl CLI functionality into AI-accessible tools, enabling natural language interaction with Kubernetes clusters, virtual machines, container registries, billing systems, and more. ### Key Benefits - **🤖 AI-Native Interface**: Control your entire cloud infrastructure through natural language conversations - **🔐 Smart Authentication**: Automatic token management with environment fallback (production → staging) - **⚡ Persistent Caching**: JWT tokens cached locally for optimal performance - **🔄 Auto-Reauthentication**: Seamless token renewal without manual intervention - **🌍 Multi-Environment Support**: Easy switching between production and staging environments - **📊 Complete API Coverage**: Access to all cldkctl endpoints as MCP tools ### Quick Preview Tools - **Kubernetes Management**: Pods, deployments, services, configmaps, secrets - **Virtual Machine Operations**: Create, manage, start/stop VMs - **Container Registry**: Manage Docker registries and artifacts - **Billing & Cost Management**: Monitor usage, view invoices, track expenses - **Project & Organization**: User management, role assignments, project configuration - **Notebook Management**: Create and manage Deka notebooks - **Audit & Security**: View audit logs, manage tokens --- ## 1. Prerequisites and Setup ### Required Components - **Python 3.8+** with pip or uv package manager - **cldkctl Token**: Valid authentication token from Cloudeka platform - **MCP-Compatible Client**: Claude Desktop, Cursor, or other MCP hosts - **Network Access**: Connection to Cloudeka API endpoints ### Installation Options #### Option A: From PyPI (Recommended) ```bash # Using uvx (recommended) uvx mcp-cldkctl-t # Using pip pip install mcp-cldkctl-t ``` #### Option B: From Source ```bash git clone https://github.com/cloudeka/mcp-cldkctl.git cd mcp-cldkctl pip install -e . # or uv sync ``` ### Environment Configuration #### Environment Variables | Variable | Required | Default | Description | |----------|----------|---------|-------------| | `CLDKCTL_TOKEN` | Yes | - | Your cldkctl token (starts with `cldkctl_`) | | `CLDKCTL_BASE_URL` | No | `https://ai.cloudeka.id` | Base URL (auto-fallback to staging) | | `CLDKCTL_DEFAULT_PROJECT_ID` | No | - | Default project ID for convenience | #### Setup Examples **Linux/macOS:** ```bash export CLDKCTL_TOKEN="cldkctl_your_token_here" export CLDKCTL_BASE_URL="https://ai.cloudeka.id" export CLDKCTL_DEFAULT_PROJECT_ID="your_project_id" ``` **Windows:** ```cmd set CLDKCTL_TOKEN=cldkctl_your_token_here set CLDKCTL_BASE_URL=https://ai.cloudeka.id set CLDKCTL_DEFAULT_PROJECT_ID=your_project_id ``` --- ## 2. Integration with AI (Claude Desktop, Cursor) ### Claude Desktop Configuration Add to your Claude Desktop configuration file: ```json { "mcpServers": { "cldkctl": { "command": "uvx", "args": ["mcp-cldkctl-t@0.1.12"], "env": { "CLDKCTL_TOKEN": "cldkctl_4Lyn6i2vRslxqQi5d0SiNXN5XHyvGRzU", "CLDKCTL_BASE_URL": "https://staging.ai.cloudeka.id" } } } } ``` ### Cursor Configuration Add to your Cursor settings (`~/.cursor/mcp.json`): ```json { "mcpServers": { "cldkctl": { "command": "uvx", "args": ["mcp-cldkctl-t@0.1.12"], "env": { "CLDKCTL_TOKEN": "your_cldkctl_token_here", "CLDKCTL_BASE_URL": "https://staging.ai.cloudeka.id" } } } } ``` ### Configuration Features - **Automatic Token Loading**: Reads from environment variables or `mcp.json` - **Environment Fallback**: Automatically switches to staging if production fails - **Persistent Caching**: Stores authentication tokens locally - **Cross-Platform Support**: Works on Windows, macOS, and Linux --- ## 3. Core Functions (Tools) ### Authentication & Environment Management #### `auth` Authenticate with your cldkctl token to get JWT access. ```python auth(token="cldkctl_your_token_here", force_staging=False) ``` #### `switch_environment` Switch between production and staging environments. ```python switch_environment(environment="staging") # or "production" ``` #### `status` Check current authentication and environment status. ```python status() ``` ### Project & Organization Management #### `project_list` List all projects in your organization. ```python project_list() ``` #### `project_detail` Get detailed information about a specific project. ```python project_detail(project_id="your_project_id") ``` #### `org_detail` Get organization details and information. ```python org_detail() ``` #### `org_members` List all members in your organization. ```python org_members() ``` ### Kubernetes Management #### `k8s_pods` List Kubernetes pods in a namespace. ```python k8s_pods(project_id="your_project_id", namespace="default") ``` #### `k8s_deployments` List Kubernetes deployments. ```python k8s_deployments(project_id="your_project_id", namespace="default") ``` #### `k8s_services` List Kubernetes services. ```python k8s_services(project_id="your_project_id", namespace="default") ``` #### `k8s_configmaps` List Kubernetes configmaps. ```python k8s_configmaps(project_id="your_project_id", namespace="default") ``` #### `k8s_secrets` List Kubernetes secrets. ```python k8s_secrets(project_id="your_project_id", namespace="default") ``` ### Virtual Machine Management #### `vm_list` List all virtual machines. ```python vm_list() ``` #### `vm_detail` Get detailed information about a specific VM. ```python vm_detail(vm_id="your_vm_id") ``` #### `vm_create` Create a new virtual machine. ```python vm_create( project_id="your_project_id", name="my-vm", flavor="flavor_id", image="image_id", network="network_id", storage="100GB" ) ``` #### `vm_turn_on` / `vm_turn_off` Control VM power states. ```python vm_turn_on(vm_id="your_vm_id") vm_turn_off(vm_id="your_vm_id") ``` ### Container Registry Management #### `registry_list` List container registries in a project. ```python registry_list(project_id="your_project_id") ``` #### `registry_repositories` List repositories in a registry. ```python registry_repositories(registry_id="your_registry_id") ``` #### `registry_detail` Get detailed registry information. ```python registry_detail(registry_id="your_registry_id") ``` ### Billing & Cost Management #### `balance_detail` Get project balance details. ```python balance_detail(project_id="your_project_id") ``` #### `billing_daily_cost` Get daily billing costs for a project. ```python billing_daily_cost(project_id="your_project_id") ``` #### `billing_monthly_cost` Get monthly billing costs for a project. ```python billing_monthly_cost(project_id="your_project_id") ``` #### `billing_history` Get billing history for a date range. ```python billing_history( project_id="your_project_id", start="2024-01-01", end="2024-01-31" ) ``` #### `billing_invoice_sme` List SME invoices. ```python billing_invoice_sme() ``` ### Notebook Management #### `notebook_list` List Deka notebooks in a project. ```python notebook_list(project_id="your_project_id") ``` #### `notebook_create` Create a new Deka notebook. ```python notebook_create( project_id="your_project_id", name="my-notebook", namespace="default", image="image_id", cpu="2", memory="4GB", storage="50GB" ) ``` ### Voucher & Token Management #### `voucher_list` List available vouchers. ```python voucher_list() ``` #### `voucher_apply` Apply a voucher code. ```python voucher_apply(voucher_code="VOUCHER123") ``` #### `token_list` List your cldkctl tokens. ```python token_list() ``` #### `token_create` Create a new cldkctl token. ```python token_create(name="my-token", expiration_days=30) ``` ### Audit & Security #### `audit_logs` Get audit logs. ```python audit_logs() ``` ### Advanced Kubernetes Operations #### `k8s_pod_create` Create a new Kubernetes pod. ```python k8s_pod_create( project_id="your_project_id", namespace="default", spec={"apiVersion": "v1", "kind": "Pod", ...} ) ``` #### `k8s_pod_edit` Edit an existing Kubernetes pod. ```python k8s_pod_edit( project_id="your_project_id", namespace="default", name="pod-name", spec={"apiVersion": "v1", "kind": "Pod", ...} ) ``` #### `k8s_pod_delete` Delete a Kubernetes pod. ```python k8s_pod_delete( project_id="your_project_id", namespace="default", name="pod-name" ) ``` --- ## 4. Local Testing and Development ### Running the Server Locally #### Direct Execution ```bash # Using uvx (recommended) uvx mcp-cldkctl-t # Direct Python execution python -m mcp_cldkctl.server # Using the installed script mcp-cldkctl-t ``` ### Development Setup #### Install Development Dependencies ```bash pip install -e ".[dev]" # or uv sync --dev ``` #### Available Test Files - `test_auth.py` - Basic authentication tests - `test_production_auth.py` - Production environment auth tests - `test_staging_auth.py` - Staging environment auth tests - `test_api_endpoint.py` - API endpoint tests - `test_package.py` - Package functionality tests #### Running Tests ```bash # Run all tests pytest # Run specific test file pytest test_auth.py # Run with verbose output pytest -v # Run with coverage pytest --cov=mcp_cldkctl ``` ### Debugging Tools #### Debug Authentication ```bash python debug_auth.py ``` #### Debug Environment Switching ```bash python debug_production_vs_staging.py ``` #### Debug API Endpoints ```bash python debug_tools.py ``` ### Building and Publishing #### Build Package ```bash python build_and_publish.py ``` #### Manual Build ```bash # Build wheel python -m build # Build source distribution python setup.py sdist bdist_wheel ``` --- ## 5. Architecture Overview ### System Components ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ MCP Client │ │ MCP Server │ │ Cloudeka API │ │ (Claude/Cursor)│◄──►│ (mcp-cldkctl) │◄──►│ (ai.cloudeka.id)│ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ ▼ ┌──────────────────┐ │ Local Cache │ │ (~/.cldkctl/) │ └──────────────────┘ ``` ### Data Flow 1. **MCP Client Request**: AI assistant sends tool call request 2. **MCP Server Processing**: Server validates and processes the request 3. **Authentication Check**: Verify JWT token or re-authenticate if needed 4. **API Call**: Make authenticated request to Cloudeka API 5. **Response Processing**: Format and return response to client 6. **Caching**: Store authentication tokens locally ### Authentication Flow ``` ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌─────────────┐ │ cldkctl │───►│ JWT Token │───►│ API Call │───►│ Response │ │ Token │ │ (24h exp) │ │ │ │ │ └─────────────┘ └──────────────┘ └─────────────┘ └─────────────┘ │ ▼ ┌──────────────┐ │ Local Cache │ │ (~/.cldkctl) │ └──────────────┘ ``` ### Environment Fallback Mechanism ``` ┌─────────────────┐ │ Try Production │ │ (ai.cloudeka.id)│ └─────────┬───────┘ │ ▼ ┌─────────────────┐ │ Database Error? │ │ (cldkctl_tokens)│ └─────────┬───────┘ │ Yes ▼ ┌─────────────────┐ │ Try Staging │ │ (staging.ai...) │ └─────────┬───────┘ │ ▼ ┌─────────────────┐ │ Cache Working │ │ Environment │ └─────────────────┘ ``` ### File Structure ``` mcp-cldkctl/ ├── mcp_cldkctl/ │ ├── __init__.py # Package initialization, token loading │ ├── __main__.py # CLI entry point │ ├── server.py # Main MCP server implementation │ └── tool_param_map.py # Tool definitions and API mappings ├── pyproject.toml # Package configuration ├── README.md # Package documentation └── build_and_publish.py # Build and deployment script ``` ### Key Features #### Smart Token Management - **Automatic Loading**: Reads from environment variables, `mcp.json`, or cache - **Persistent Storage**: Caches JWT tokens locally with expiration tracking - **Auto-Reauthentication**: Seamlessly renews expired tokens - **Environment Persistence**: Remembers working environment (production/staging) #### Tool Generation - **Dynamic Tool Creation**: Generates MCP tools from `TOOL_PARAM_MAP` - **Parameter Validation**: Validates required and optional parameters - **Type Mapping**: Converts API types to JSON schema types - **Error Handling**: Comprehensive error handling and reporting #### API Integration - **RESTful Interface**: Full REST API coverage for all cldkctl endpoints - **Method Support**: GET, POST, PUT, PATCH, DELETE operations - **Path Parameters**: Dynamic URL parameter substitution - **Query/Body Handling**: Automatic parameter routing based on HTTP method ### Security Considerations - **Token Encryption**: JWT tokens stored with base64 encoding - **Local Storage**: Authentication data stored in user's home directory - **Environment Isolation**: Separate configurations for production/staging - **Automatic Cleanup**: Expired tokens automatically removed from cache ### Performance Optimizations - **Connection Pooling**: Reuses HTTP connections for better performance - **Caching Strategy**: 24-hour JWT token caching reduces authentication overhead - **Lazy Loading**: Tools loaded only when needed - **Error Recovery**: Automatic retry mechanisms for transient failures ## 5. API Testing Summary | Group | Tool Name / Action | Endpoint (from note.txt) | Result / Notes | Status | |------------------|---------------------------|------------------------------------------------------------------|------------------------------------------------|----------| | **User & Profile** | Auth (token) | /core/cldkctl/auth | Success, valid JWT | ✅ | | | Login | /core/user/login | 400 Bad Request (no backend handler) | ❌ | | | ProfileDetail | /core/user/profile | Success | ✅ | | | UpdateProfile | /core/user/organization/profile/member/:user_id | 400 Bad Request (invalid user) | ❌ | | | ChangePassword | /core/user/change-password | 400 Bad Request (invalid password) | ❌ | | **Project** | ProjectList | /core/user/organization/projects/byOrg | Success (1 project found) | ✅ | | | ProjectDetail | /core/user/project/detail/:project_id | Success | ✅ | | | UpdateProject | /core/user/projects/:project_id | 400 Bad Request | ❌ | | | CheckBeforeDeleteProject | /core/user/checking/projects/:project_id | Success | ✅ | | | DeleteProject | /core/user/projects/:project_id | Not tested (no delete performed) | - | | | ProjectRQuotaPost | /mid/billing/projectdekagpu/quota/:project_id | Not tested | - | | | ProjectRQuotaPre | /mid/billing/projectflavorgpu/project/:project_id | Not tested | - | | **Balance & Billing** | BalanceDetail | /core/balance/accumulated/:project_id | Success (all balances 0) | ✅ | | | PaymentHistory | /core/payment/history | Not tested | - | | | BillingDailyCost | /core/billing/v2/daily-cost/:project_id | Not tested | - | | | BillingMonthlyCostTotalBilled | /core/billing/monthly-cost/total-billed/:project_id | Not tested | - | | | BillingHistoryDetail | /core/billing/v2/history | Success (empty) | ✅ | | | BillingInvoiceEnterprise | /core/billing/invoice/:project_id | Success (empty) | ✅ | | **VM** | GetVm | /core/virtual-machine/list/all | 400 Bad Request (Python client/tool), CLI works| ❌/✅ | | | VmDetail | /core/virtual-machine/detail-vm | Not tested (no VM ID) | - | | | CreateVm | /core/virtual-machine | Not tested | - | | | DeleteVm | /core/virtual-machine/delete | Not tested | - | | **Organization** | OrgDetail | /core/user/organization | Success | ✅ | | | OrgMemberList | /core/user/organization/member | Success (1 member: you) | ✅ | | | OrgRoleList | /core/user/organization/role | Success (Owner, Member) | ✅ | | | OrgMemberAdd/Edit/Delete | /core/user/organization/member | 400 Bad Request or restricted | ❌ | | | OrgMemberActivate | /core/user/manageuser/active/:user_id | Success | ✅ | | | OrgMemberDeactivate | /core/user/manageuser/deactive/:user_id | No result (restricted) | ❌ | | | OrgMemberResendInvitation | /core/superadmin/manageuser/resend-verified/:user_id | 400 Bad Request | ❌ | | **Kubernetes** | KubeDashboard | /core/user/projects/:project_id/vcluster/dashboard | API Error | ❌ | | | Kubeconfig | /core/user/projects/:project_id/vcluster/kubeconfig | 400 Bad Request | ❌ | | | GetPod | /core/pods | Success (1 pod: coredns) | ✅ | | | GetDeployment | /core/deployment | Success (1 deployment: coredns) | ✅ | | | GetService | /core/kubernetes/services | Success (3 services) | ✅ | | | GetNamespace | /core/user/projects/:project_id/vcluster/namespaces | Success (3 namespaces) | ✅ | | | GetConfigMap | /core/kubernetes/configmaps | Success (multiple configmaps) | ✅ | | | GetSecret | /core/kubernetes/secrets | Success (1 secret) | ✅ | | **Registry** | RegistryList | /core/dekaregistry/v2/registry | 400 Bad Request (no registry) | ❌ | | | RegistryDetail/Overview | /core/dekaregistry/v2/registry/:registry_id | 400 Bad Request (invalid registry ID) | ❌ | | | RegistryMemberList/Add | /core/dekaregistry/v2/member/:registry_id | 400 Bad Request (invalid registry ID) | ❌ | | **Notebook** | NotebookList | /core/deka-notebook | Success (empty) | ✅ | | | NotebookCreate | /core/deka-notebook | 400 Bad Request (invalid image/spec) | ❌ | | **Voucher** | VoucherClaimedList | /core/user/voucher-credit/claimed | Success (empty) | ✅ | | | VoucherTrialClaimedList | /core/user/voucher/claimed | Success (empty) | ✅ | | | VoucherClaim | /core/user/voucher-credit/claim | Requires claim data | ❌ | | **Audit** | AuditLog | /core/api/v1.1/user/activity/sp/get-auditlog | 404 Not Found | ❌ | | **Superadmin** | SuperadminBalanceDetail | /core/superadmin/balance/accumulated/:organization_id/:project_id| Success (all balances 0) | ✅ | | | SuperadminBillingInvoiceEnterprise | /core/superadmin/invoice/:organization_id/:project_id | Success (empty) | ✅ | | | SuperadminProjectDetail | /core/user/project/detail/:project_id | Success | ✅ |

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/raffelprama/mcp-cldkctl'

If you have feedback or need assistance with the MCP directory API, please join our Discord server