SemaphoreUI MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Host to bind to | 0.0.0.0 |
| MCP_PORT | No | Port to listen on | 8000 |
| MCP_LOG_LEVEL | No | Log level (e.g., DEBUG) | INFO |
| MCP_TRANSPORT | No | Transport mode: http or stdio | http |
| SEMAPHORE_URL | Yes | URL to your SemaphoreUI instance | |
| SEMAPHORE_API_TOKEN | Yes | API token from SemaphoreUI |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_eventsA | List global events visible to the current user. Args: limit: Return only the most recent N events; 0 returns all events Returns: Dictionary containing the list of events |
| get_last_eventsA | List the last global events visible to the current user. Semaphore returns the last 200 events. The optional limit trims that response further on the MCP side. Args: limit: Return only the most recent N events; 0 returns all returned events Returns: Dictionary containing the list of events |
| list_project_eventsA | List events related to a project. Args: project_id: ID of the project limit: Return only the most recent N events; 0 returns all events Returns: Dictionary containing the list of project events |
| summarize_project_activityA | Summarize recent project activity from Semaphore events. Args: project_id: ID of the project limit: Number of most recent events to analyze recent_limit: Number of recent event objects to include Returns: Counts and recent event details for project activity |
| list_projectsA | List all projects in SemaphoreUI. Returns: A dictionary containing the list of projects. |
| get_projectA | Get details of a specific project. Args: project_id: ID of the project to fetch Returns: Project details |
| create_projectA | Create a new project. Args: name: Project name alert: Enable alerts (default: False) alert_chat: Chat channel for alerts (optional) max_parallel_tasks: Maximum parallel tasks, 0 = unlimited (default: 0) project_type: Project type (optional) demo: Create demo resources (default: False) Returns: Created project details |
| update_projectB | Update an existing project. Args: project_id: ID of the project to update name: Project name (optional) alert: Enable alerts (optional) alert_chat: Chat channel for alerts (optional) max_parallel_tasks: Maximum parallel tasks (optional) project_type: Project type (optional) Returns: Empty dict on success |
| delete_projectB | Delete a project. Args: project_id: ID of the project to delete Returns: Empty dict on success |
| backup_projectA | Export a Semaphore project backup. Args: project_id: ID of the project to back up Returns: Backup payload and a resource summary. |
| restore_project_backupA | Restore a Semaphore project from a backup payload. Args: backup: Backup payload returned by backup_project project_name: Optional name override for the restored project validate: Validate payload shape and references before restore Returns: Created project and summary of the restored backup payload. |
| validate_project_backupA | Validate a project backup before attempting restore. Args: backup: Backup payload to inspect Returns: Validation result, errors, warnings, and a summary. |
| summarize_project_backupA | Summarize the resources contained in a project backup. Args: backup: Backup payload to summarize Returns: Counts, names, and secret-reference indicators for the backup. |
| clone_projectA | Clone a project by backing it up and restoring it with a new name. Args: project_id: ID of the source project name: Name for the cloned project validate: Validate backup payload before restore Returns: Source project ID, created clone, and backup summary. |
| get_project_roleA | Get the current user's role and permissions for a project. Args: project_id: ID of the project Returns: Role and permissions for the current user |
| list_project_usersA | List users linked to a project. Args: project_id: ID of the project sort: Field to sort by: name, username, email, or role order: Sort order: asc or desc Returns: Dictionary containing the list of project users |
| add_project_userA | Link a user to a project with a role. Args: project_id: ID of the project user_id: ID of the user to link role: Project role: owner, manager, task_runner, or guest Returns: Empty dict on success |
| update_project_userA | Update a linked user's project role. Args: project_id: ID of the project user_id: ID of the linked user role: Project role: owner, manager, task_runner, or guest Returns: Empty dict on success |
| remove_project_userB | Remove a user from a project. Args: project_id: ID of the project user_id: ID of the user to remove Returns: Empty dict on success |
| list_viewsB | List all views for a project. Args: project_id: ID of the project Returns: Dictionary containing the list of views |
| get_viewB | Get details of a specific view. Args: project_id: ID of the project view_id: ID of the view to fetch Returns: View details |
| create_viewC | Create a new view. Args: project_id: ID of the project title: View title position: View ordering position Returns: Created view details |
| update_viewC | Update an existing view. Args: project_id: ID of the project view_id: ID of the view to update title: View title position: View ordering position Returns: Empty dict on success |
| delete_viewB | Delete a view. Args: project_id: ID of the project view_id: ID of the view to delete Returns: Empty dict on success |
| list_templatesA | List all templates for a project. Args: project_id: ID of the project Returns: A list of templates for the project |
| get_templateB | Get details of a specific template. Args: project_id: ID of the project template_id: ID of the template to fetch Returns: Template details |
| create_templateA | Create a new template. Args: project_id: ID of the project name: Template name playbook: Playbook file path (e.g., "playbook.yml") inventory_id: Inventory ID repository_id: Repository ID environment_id: Environment ID description: Template description (optional) arguments: Extra arguments as JSON string (optional) allow_override_args_in_task: Allow overriding arguments in task (default: False) suppress_success_alerts: Suppress success alerts (default: False) app: Application type (default: "ansible") git_branch: Git branch to use (optional) survey_vars: Survey variables for prompting (optional) vaults: Vault configurations (optional) template_type: Template type - "", "build", or "deploy" (optional) start_version: Start version (optional) build_template_id: Build template ID for deploy templates (optional) autorun: Enable autorun (default: False) view_id: View ID (optional) task_params: App-specific task parameters (optional). For Ansible templates: - allow_override_limit: Allow task-level --limit override (required for run_task limit) - allow_override_inventory: Allow task-level inventory override - allow_override_tags: Allow task-level --tags override - allow_override_skip_tags: Allow task-level --skip-tags override - limit: Default limit (list of hosts/groups) - tags: Default tags (list) - skip_tags: Default skip tags (list) Returns: Created template details |
| update_templateA | Update an existing template. Args: project_id: ID of the project template_id: ID of the template to update name: Template name (optional) playbook: Playbook file path (optional) inventory_id: Inventory ID (optional) repository_id: Repository ID (optional) environment_id: Environment ID (optional) description: Template description (optional) arguments: Extra arguments (optional) allow_override_args_in_task: Allow overriding arguments (optional) suppress_success_alerts: Suppress success alerts (optional) app: Application type (optional) git_branch: Git branch (optional) survey_vars: Survey variables (optional) vaults: Vault configurations (optional) template_type: Template type (optional) start_version: Start version (optional) build_template_id: Build template ID (optional) autorun: Enable autorun (optional) view_id: View ID (optional) task_params: App-specific task parameters (optional). For Ansible templates: - allow_override_limit: Allow task-level --limit override (required for run_task limit) - allow_override_inventory: Allow task-level inventory override - allow_override_tags: Allow task-level --tags override - allow_override_skip_tags: Allow task-level --skip-tags override - limit: Default limit (list of hosts/groups) - tags: Default tags (list) - skip_tags: Default skip tags (list) Returns: Empty dict on success |
| delete_templateC | Delete a template. Args: project_id: ID of the project template_id: ID of the template to delete Returns: Empty dict on success |
| stop_all_template_tasksC | Stop all running tasks for a template. Args: project_id: ID of the project template_id: ID of the template Returns: Empty dict on success |
| list_schedulesB | List all schedules for a project. Args: project_id: ID of the project Returns: Dictionary containing list of schedules |
| list_template_schedulesA | List schedules attached to a template. Args: project_id: ID of the project template_id: ID of the template Returns: Dictionary containing list of template schedules |
| get_scheduleA | Get details of a specific schedule. Args: project_id: ID of the project schedule_id: ID of the schedule to fetch Returns: Schedule details |
| create_scheduleC | Create a new schedule. Args: project_id: ID of the project template_id: ID of the template to run name: Schedule name cron_format: Cron expression for recurring schedules active: Whether the schedule is enabled schedule_type: Schedule type: "" for cron, or "run_at" for one-time runs run_at: RFC3339 timestamp for one-time schedules task_params: Optional task parameters to pass when the schedule runs delete_after_run: Delete the one-time schedule after it runs repository_id: Optional repository ID for commit-check schedules Returns: Created schedule details |
| update_scheduleB | Update an existing schedule. Args: project_id: ID of the project schedule_id: ID of the schedule to update template_id: ID of the template to run name: Schedule name cron_format: Cron expression for recurring schedules active: Whether the schedule is enabled schedule_type: Schedule type: "" for cron, or "run_at" for one-time runs run_at: RFC3339 timestamp for one-time schedules task_params: Optional task parameters to pass when the schedule runs delete_after_run: Delete the one-time schedule after it runs repository_id: Optional repository ID for commit-check schedules Returns: Updated schedule details or empty dict on success |
| set_schedule_activeA | Enable or disable a schedule. Args: project_id: ID of the project schedule_id: ID of the schedule to update active: Whether the schedule should be active Returns: Empty dict on success |
| delete_scheduleC | Delete a schedule. Args: project_id: ID of the project schedule_id: ID of the schedule to delete Returns: Empty dict on success |
| validate_schedule_cron_formatC | Validate a cron expression for Semaphore schedules. Args: project_id: ID of the project cron_format: Cron expression to validate Returns: Empty dict on success |
| list_tasksA | List tasks for a project with a default limit of 5 to avoid overloading context windows. Args: project_id: ID of the project limit: Maximum number of tasks to return (default: 5) status: Optional status filter (e.g., 'success', 'error', 'running') tags: Optional list of tags to filter by Returns: A list of tasks for the project, limited by the specified count |
| get_taskB | Get details of a specific task. Args: project_id: ID of the project task_id: ID of the task to fetch Returns: Task details |
| run_taskA | Run a task from a template with optional 30-second monitoring. Args: template_id: ID of the template to run project_id: Optional project ID (if not provided, will attempt to determine from template) environment: Optional environment variables for the task as dictionary limit: Restrict execution to specific hosts/groups (Ansible --limit) dry_run: Run without making changes (Ansible --check) diff: Show differences when changing files (Ansible --diff) debug: Enable verbose debug output playbook: Override playbook file path git_branch: Override git branch to use message: Task description/message arguments: Additional CLI arguments inventory_id: Override inventory to use follow: Enable 30-second monitoring for startup verification (default: False) Returns: Task execution result with immediate web URLs and optional monitoring summary Template Override Requirements: Some parameters require the template to have overrides enabled in task_params. Use create_template() or update_template() with task_params to enable: Examples: # Just start the task and get URLs result = await run_task(template_id=5) |
| get_latest_failed_taskB | Get the most recent failed task for a project. Args: project_id: ID of the project Returns: The most recent failed task or a message if no failed tasks are found |
| filter_tasksB | Filter tasks by multiple criteria with bulk operation support. Args: project_id: ID of the project status: List of statuses to filter by (e.g., ['success', 'error']) limit: Maximum number of tasks to return use_last_tasks: Use efficient last 200 tasks endpoint Returns: Filtered tasks with statistics |
| stop_taskB | Stop a running task. Args: project_id: ID of the project task_id: ID of the task to stop Returns: Task stop result |
| bulk_stop_tasksA | Stop multiple tasks with confirmation. Args: project_id: ID of the project task_ids: List of task IDs to stop confirm: Set to True to execute the bulk stop operation Returns: Confirmation details or bulk stop results |
| get_waiting_tasksA | Get all tasks in waiting state for bulk operations. Args: project_id: ID of the project Returns: List of waiting tasks with bulk operation guidance |
| get_task_raw_outputA | Get raw output from a completed task for LLM analysis. Args: project_id: ID of the project task_id: ID of the task Returns: Raw task output as plain text |
| analyze_task_failureA | Analyze a failed task for LLM processing, gathering comprehensive failure context. Args: project_id: ID of the project task_id: ID of the task to analyze Returns: Comprehensive failure analysis data including task details, template context, and outputs |
| bulk_analyze_failuresA | Analyze multiple failed tasks to identify patterns and common issues. Args: project_id: ID of the project limit: Maximum number of failed tasks to analyze (default: 10) Returns: Analysis of multiple failed tasks with pattern detection |
| list_environmentsA | List all environments for a project. Args: project_id: ID of the project Returns: A list of environments for the project |
| get_environmentA | Get details of a specific environment. Args: project_id: ID of the project environment_id: ID of the environment to fetch Returns: Environment details |
| create_environmentB | Create a new environment. Args: project_id: ID of the project name: Environment name env_data: Environment variables as key-value pairs Returns: Created environment details |
| update_environmentB | Update an existing environment. Args: project_id: ID of the project environment_id: ID of the environment to update name: Environment name (optional) env_data: Environment variables as key-value pairs (optional) Returns: Updated environment details |
| delete_environmentC | Delete an environment. Args: project_id: ID of the project environment_id: ID of the environment to delete Returns: Deletion result |
| list_inventoryA | List all inventory items for a project. Args: project_id: ID of the project Returns: A list of inventory items for the project |
| get_inventoryB | Get details of a specific inventory item. Args: project_id: ID of the project inventory_id: ID of the inventory item to fetch Returns: Inventory item details |
| create_inventoryA | Create a new inventory item. Args: project_id: ID of the project name: Inventory name inventory_data: Inventory content (for "static") or file path on the Semaphore server (for "file") inventory_type: Semaphore inventory type, such as "static", "static-yaml", or "file". Defaults to "static". Returns: Created inventory item details |
| update_inventoryB | Update an existing inventory item. Args: project_id: ID of the project inventory_id: ID of the inventory item to update name: Inventory name (optional) inventory_data: Inventory content for "static", or file path for "file" (optional) inventory_type: Semaphore inventory type, such as "static", "static-yaml", or "file". Defaults to "static"; pass the existing type if you don't intend to change it. Returns: Updated inventory item details |
| delete_inventoryB | Delete an inventory item. Args: project_id: ID of the project inventory_id: ID of the inventory item to delete Returns: Deletion result |
| list_repositoriesA | List all repositories for a project. Args: project_id: ID of the project Returns: A list of repositories for the project |
| get_repositoryB | Get details of a specific repository. Args: project_id: ID of the project repository_id: ID of the repository to fetch Returns: Repository details |
| create_repositoryC | Create a new repository. Args: project_id: ID of the project name: Repository name git_url: Git repository URL git_branch: Git branch to use ssh_key_id: SSH key ID for authentication Returns: Created repository details |
| update_repositoryB | Update an existing repository. Args: project_id: ID of the project repository_id: ID of the repository to update name: Repository name (optional) git_url: Git repository URL (optional) git_branch: Git branch to use (optional) ssh_key_id: SSH key ID for authentication (optional) Returns: Updated repository details |
| delete_repositoryC | Delete a repository. Args: project_id: ID of the project repository_id: ID of the repository to delete Returns: Deletion result |
| list_access_keysA | List all access keys for a project. Args: project_id: ID of the project key_type: Optional key type filter ("none", "ssh", or "login_password") sort: Sort field ("name" or "type") order: Sort order ("asc" or "desc") Returns: Dictionary containing list of access keys |
| get_access_keyB | Get an access key by ID. Args: project_id: ID of the project key_id: ID of the access key Returns: Access key details |
| create_access_keyA | Create a new access key. Args: project_id: ID of the project name: Name for the access key key_type: Type of key - one of: - "none": For public repositories (no credentials needed) - "ssh": For SSH key authentication - "login_password": For username/password authentication login: Username (for ssh or login_password types) password: Password (for login_password type) private_key: Private key content (for ssh type) Returns: Created access key details |
| update_access_keyB | Update an existing access key. Args: project_id: ID of the project key_id: ID of the access key name: New access key name (optional) key_type: New key type (optional) login: Username for ssh or login_password keys (optional) password: Password for login_password keys (optional) private_key: Private key for ssh keys (optional) override_secret: Force updating stored secret material (optional) Returns: Empty dict on success |
| delete_access_keyB | Delete an access key by ID. Args: project_id: ID of the project key_id: ID of the access key to delete Returns: Empty dict on success |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/cloin/semaphore-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server