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 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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