Skip to main content
Glama
johsem

Semaphore UI MCP server

by johsem

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
SEMAPHORE_URLYesServer root URL or URL ending in /api; reverse-proxy path prefixes are supported. Required.
MCP_HTTP_TOKENNoBearer token protecting Streamable HTTP. Required for non-loopback bindings, optional on loopback.
MCP_ALLOWED_HOSTSNoComma-separated allowed HTTP host patterns. Include the hostname used by external clients.
SEMAPHORE_TIMEOUTNoUpstream HTTP request timeout in seconds.30
SEMAPHORE_PASSWORDNoPassword paired with SEMAPHORE_USERNAME.
SEMAPHORE_USERNAMENoUsername for session login when no API token is configured.
MCP_ALLOWED_ORIGINSNoOptional comma-separated origin allowlist for the MCP SDK's DNS rebinding protection.
SEMAPHORE_API_TOKENNoSemaphore API token. Prefer a dedicated account with the permissions needed for your workflow. Unset by default.
SEMAPHORE_CA_BUNDLENoPath to a PEM CA bundle for a private certificate authority.
SEMAPHORE_READ_ONLYNoDisable management mutations and job execution.false
SEMAPHORE_VERIFY_TLSNoValidate Semaphore's HTTPS certificate. Disable only for a deliberately trusted development environment.true
SEMAPHORE_PROJECT_IDSNoComma-separated positive project IDs. Restrict project access and block global administration.
SEMAPHORE_TOOL_PROFILENocore exposes everyday inspection and task tools; full exposes the management catalogue.full

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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
activate_subscriptionB

activate subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /subscription. Supply API fields in body; JSON-encoded string fields must remain strings.

attach_template_inventoryC

Attach Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/attach.

clear_cluster_tasksC

clear Cluster Tasks. DELETE /cluster/tasks. Supply API fields in body; JSON-encoded string fields must remain strings.

clear_global_runner_cacheC

Clear global runner cache. DELETE /runners/{runner_id}/cache.

clear_project_cacheC

Clear Cache. DELETE /project/{project_id}/cache.

clear_project_runner_cacheC

Clear project runner cache. DELETE /project/{project_id}/runners/{runner_id}/cache.

clear_server_cacheC

clear Cache. DELETE /cache.

confirm_taskC

Confirm Task. POST /project/{project_id}/tasks/{task_id}/confirm.

create_access_keyC

Add access key. POST /project/{project_id}/keys. Supply API fields in body; JSON-encoded string fields must remain strings.

create_api_tokenC

Create an API token. POST /user/tokens. Supply API fields in body; JSON-encoded string fields must remain strings.

create_environmentC

Add environment. POST /project/{project_id}/environment. Supply API fields in body; JSON-encoded string fields must remain strings.

create_global_roleB

create global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /roles. Supply API fields in body; JSON-encoded string fields must remain strings.

create_global_runnerC

Add global runner. POST /runners. Supply API fields in body; JSON-encoded string fields must remain strings.

create_integrationB

create a new integration. POST /project/{project_id}/integrations. Supply API fields in body; JSON-encoded string fields must remain strings.

create_integration_aliasC

Create a new alias for an integration. POST /project/{project_id}/integrations/{integration_id}/aliases.

create_integration_matcherB

Add Integration Matcher. POST /project/{project_id}/integrations/{integration_id}/matchers. Supply API fields in body; JSON-encoded string fields must remain strings.

create_integration_valueB

Add Integration Extracted Value. POST /project/{project_id}/integrations/{integration_id}/values. Supply API fields in body; JSON-encoded string fields must remain strings.

create_inventoryC

create inventory. POST /project/{project_id}/inventory. Supply API fields in body; JSON-encoded string fields must remain strings.

create_projectB

Create a new project. POST /projects. Supply API fields in body; JSON-encoded string fields must remain strings.

create_project_integration_aliasC

Create a new integration alias for the project. POST /project/{project_id}/integrations/aliases.

create_project_roleB

create project role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/roles. Supply API fields in body; JSON-encoded string fields must remain strings.

create_project_runnerC

Add project runner. POST /project/{project_id}/runners. Supply API fields in body; JSON-encoded string fields must remain strings.

create_project_userC

Link user to project. POST /project/{project_id}/users. Supply API fields in body; JSON-encoded string fields must remain strings.

create_repositoryC

Add repository. POST /project/{project_id}/repositories. Supply API fields in body; JSON-encoded string fields must remain strings.

create_scheduleC

create schedule. POST /project/{project_id}/schedules. Supply API fields in body; JSON-encoded string fields must remain strings.

create_secret_storageC

Add. POST /project/{project_id}/secret_storages. Supply API fields in body; JSON-encoded string fields must remain strings.

create_taskB

Start an automation task. Ansible and Terraform switches belong in body.params; environment and arguments are JSON-encoded strings. This executes code on managed infrastructure. POST /project/{project_id}/tasks. Supply API fields in body; JSON-encoded string fields must remain strings.

create_templateC

create template. POST /project/{project_id}/templates. Supply API fields in body; JSON-encoded string fields must remain strings.

create_template_permissionC

Add Template Perm. POST /project/{project_id}/templates/{template_id}/perms. Supply API fields in body; JSON-encoded string fields must remain strings.

create_terraform_aliasC

create terraform alias. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/inventory/{inventory_id}/terraform/aliases. Supply API fields in body; JSON-encoded string fields must remain strings.

create_userB

Creates a user. POST /users. Supply API fields in body; JSON-encoded string fields must remain strings.

create_viewB

create view. POST /project/{project_id}/views. Supply API fields in body; JSON-encoded string fields must remain strings.

create_workflowB

Add workflow. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/workflows. Supply API fields in body; JSON-encoded string fields must remain strings.

delete_access_keyC

Removes access key. DELETE /project/{project_id}/keys/{key_id}.

delete_api_tokenC

Expires API token. DELETE /user/tokens/{token_id}.

delete_appC

delete App. DELETE /apps/{app_id}.

delete_environmentC

Removes environment. DELETE /project/{project_id}/environment/{environment_id}.

delete_global_roleC

delete global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /roles/{role_slug}.

delete_global_runnerC

Delete global runner. DELETE /runners/{runner_id}.

delete_global_taskB

Stop or remove a task from the global running/queued task pool (administrator only). DELETE /tasks/{task_id}.

delete_integrationB

Remove integration. DELETE /project/{project_id}/integrations/{integration_id}.

delete_integration_aliasB

Remove integration alias. DELETE /project/{project_id}/integrations/{integration_id}/aliases/{alias_id}.

delete_integration_matcherC

Removes integration matcher. DELETE /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}.

delete_integration_valueC

Removes integration extract value. DELETE /project/{project_id}/integrations/{integration_id}/values/{value_id}.

delete_inventoryC

Removes inventory. DELETE /project/{project_id}/inventory/{inventory_id}.

delete_projectC

Delete project. DELETE /project/{project_id}.

delete_project_integration_aliasB

Remove integration alias. DELETE /project/{project_id}/integrations/aliases/{alias_id}.

delete_project_roleB

delete project role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /project/{project_id}/roles/{role_slug}.

delete_project_runnerC

Delete project runner. DELETE /project/{project_id}/runners/{runner_id}.

delete_project_userB

Removes user from project. DELETE /project/{project_id}/users/{user_id}.

delete_repositoryC

Removes repository. DELETE /project/{project_id}/repositories/{repository_id}.

delete_scheduleC

Deletes schedule. DELETE /project/{project_id}/schedules/{schedule_id}.

delete_secret_storageC

Remove. DELETE /project/{project_id}/secret_storages/{storage_id}.

delete_subscriptionA

delete subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /subscription.

delete_taskB

Deletes task (including output). DELETE /project/{project_id}/tasks/{task_id}.

delete_templateC

Removes template. DELETE /project/{project_id}/templates/{template_id}.

delete_template_permissionC

Delete Template Perm. DELETE /project/{project_id}/templates/{template_id}/perms/{perm_id}.

delete_terraform_aliasA

delete terraform alias. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /project/{project_id}/inventory/{inventory_id}/terraform/aliases/{alias_id}.

delete_terraform_stateA

delete terraform state. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /project/{project_id}/inventory/{inventory_id}/terraform/states/{state_id}.

delete_userC

Deletes user. DELETE /users/{user_id}.

delete_viewC

Removes view. DELETE /project/{project_id}/views/{view_id}.

delete_workflowB

Remove workflow. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /project/{project_id}/workflows/{workflow_id}.

detach_template_inventoryC

Detach Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/detach.

disable_user_totpC

Disable Totp. DELETE /users/{user_id}/2fas/totp/{totp_id}.

enable_user_totpD

Enable Totp. POST /users/{user_id}/2fas/totp.

get_access_keyC

Get Keys. GET /project/{project_id}/keys/{key_id}.

get_access_key_referencesD

Get Key Refs. GET /project/{project_id}/keys/{key_id}/refs.

get_admin_infoC

get Admin Info. GET /admin/info.

get_appC

get App. GET /apps/{app_id}.

get_cluster_statusC

get Cluster Status. GET /cluster.

get_current_userA

Fetch logged in user. GET /user.

get_environmentC

Get environment. GET /project/{project_id}/environment/{environment_id}.

get_environment_referencesC

Get Environment Refs. GET /project/{project_id}/environment/{environment_id}/refs.

get_global_roleA

get global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /roles/{role_slug}.

get_global_runnerC

Get global runner. GET /runners/{runner_id}.

get_global_taskA

Inspect the global task pool. Upstream v2.19.17 returns the full pool even for this task-specific route; use get_task for a single project task. GET /tasks/{task_id}.

get_integrationC

Get Integration. GET /project/{project_id}/integrations/{integration_id}.

get_integration_matcherC

Get Integration Matcher. GET /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}.

get_integration_matcher_referencesD

Get Integration Matcher Refs. GET /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}/refs.

get_integration_referencesC

Get Integration Refs. GET /project/{project_id}/integrations/{integration_id}/refs.

get_integration_valueC

Get Integration Extract Value. GET /project/{project_id}/integrations/{integration_id}/values/{value_id}.

get_integration_value_referencesC

Get Integration Extract Value Refs. GET /project/{project_id}/integrations/{integration_id}/values/{value_id}/refs.

get_inventoryD

Get inventory. GET /project/{project_id}/inventory/{inventory_id}.

get_inventory_referencesD

Get Inventory Refs. GET /project/{project_id}/inventory/{inventory_id}/refs.

get_latest_terraform_stateA

get latest terraform state. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/inventory/{inventory_id}/terraform/states/latest.

get_projectC

Fetch project. GET /project/{project_id}.

get_project_backupC

Backup A Project. GET /project/{project_id}/backup.

get_project_permissionsB

Fetch permissions of the current user for project. GET /project/{project_id}/role.

get_project_roleA

get project role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/roles/{role_slug}.

get_project_runnerC

Get project runner. GET /project/{project_id}/runners/{runner_id}.

get_project_task_statsC

Get Task Stats. GET /project/{project_id}/stats.

get_project_userC

Get Users. GET /project/{project_id}/users/{user_id}.

get_repositoryC

Get repository. GET /project/{project_id}/repositories/{repository_id}.

get_repository_referencesD

Get Repository Refs. GET /project/{project_id}/repositories/{repository_id}/refs.

get_scheduleC

Get schedule. GET /project/{project_id}/schedules/{schedule_id}.

get_secret_storageC

Get Secret Storage. GET /project/{project_id}/secret_storages/{storage_id}.

get_secret_storage_referencesC

Get Refs. GET /project/{project_id}/secret_storages/{storage_id}/refs.

get_server_optionsC

get Options. GET /options.

get_subscriptionA

get subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /subscription.

get_system_infoC

you must be authenticated to use this. GET /info.

get_taskC

Get a single task. GET /project/{project_id}/tasks/{task_id}.

get_task_outputA

Get every persisted task log line as structured output; upstream does not support output pagination. GET /project/{project_id}/tasks/{task_id}/output.

get_task_raw_outputB

Get complete task logs as plain text with ANSI escape codes removed. GET /project/{project_id}/tasks/{task_id}/raw_output.

get_templateC

Get template. GET /project/{project_id}/templates/{template_id}.

get_template_permissionC

Get Template Perm. GET /project/{project_id}/templates/{template_id}/perms/{perm_id}.

get_template_referencesC

Get Template Refs. GET /project/{project_id}/templates/{template_id}/refs.

get_template_task_statsC

Get Task Stats. GET /project/{project_id}/templates/{template_id}/stats.

get_terraform_aliasA

get terraform alias. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/inventory/{inventory_id}/terraform/aliases/{alias_id}.

get_terraform_stateB

get terraform state. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/inventory/{inventory_id}/terraform/states/{state_id}.

get_userC

Fetches a user profile. GET /users/{user_id}.

get_user_optionsA

Returns the per-user options of the authenticated user as a key/value map. Keys are returned without the internal user<id>. namespace prefix. Returns an empty object when the user has no stored options. GET /user/options.

get_user_totp_qrD

Totp Qr. GET /users/{user_id}/2fas/totp/{totp_id}/qr.

get_viewC

Get view. GET /project/{project_id}/views/{view_id}.

get_workflowA

Get workflow. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows/{workflow_id}.

get_workflow_runB

Get workflow run details. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows/{workflow_id}/runs/{run_id}.

get_workflow_run_artifactsA

Get merged workflow run artifacts. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows/{workflow_id}/runs/{run_id}/artifacts.

leave_projectC

Left Project. DELETE /project/{project_id}/me.

list_access_keysC

Get access keys linked to project. GET /project/{project_id}/keys.

list_api_tokensB

Fetch API tokens for user. GET /user/tokens.

list_appsC

Get apps. GET /apps.

list_available_project_rolesA

list available project roles. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/roles/all.

list_cluster_tasksC

get Cluster Tasks. GET /cluster/tasks.

list_environmentsC

Get environment. GET /project/{project_id}/environment.

list_eventsB

Get Events related to Semaphore and projects you are part of. GET /events.

list_global_rolesA

list global roles. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /roles.

list_global_runner_tagsB

Get global runner tags. GET /runner_tags.

list_global_runnersB

Get all global runners. GET /runners.

list_global_tasksC

Get Tasks. GET /tasks.

list_integration_aliasesB

Get all aliases for an integration. GET /project/{project_id}/integrations/{integration_id}/aliases.

list_integration_matchersC

Get Integration Matcher linked to integration extractor. GET /project/{project_id}/integrations/{integration_id}/matchers.

list_integration_valuesB

Get Integration Extracted Values linked to integration extractor. GET /project/{project_id}/integrations/{integration_id}/values.

list_integrationsC

get all integrations. GET /project/{project_id}/integrations.

list_inventoriesC

Get inventory. GET /project/{project_id}/inventory.

list_project_eventsB

Get Events related to this project. GET /project/{project_id}/events.

list_project_integration_aliasesB

Get all integration aliases for the project. GET /project/{project_id}/integrations/aliases.

list_project_rolesB

list project roles. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/roles.

list_project_runner_tagsC

Get project runner tags. GET /project/{project_id}/runner_tags.

list_project_runnersA

Returns runners owned by the project together with global runners that have tags. GET /project/{project_id}/runners.

list_project_usersC

Get users linked to project. GET /project/{project_id}/users.

list_projectsC

Get projects. GET /projects.

list_recent_eventsA

Get last 200 Events related to Semaphore and projects you are part of. GET /events/last.

list_recent_project_eventsD

get Last Events. GET /project/{project_id}/events/last.

list_recent_tasksB

List recent tasks, newest first. Use count and before (the last task id) for cursor pagination; the response X-Has-Next header indicates more pages. GET /project/{project_id}/tasks/last.

list_recent_template_tasksA

List recent tasks, newest first. Use count and before (the last task id) for cursor pagination; the response X-Has-Next header indicates more pages. GET /project/{project_id}/templates/{template_id}/tasks/last.

list_repositoriesC

Get repositories. GET /project/{project_id}/repositories.

list_repository_branchesC

Get Repository Branches. GET /project/{project_id}/repositories/{repository_id}/branches.

list_repository_playbooksC

Get Repository Playbooks. GET /project/{project_id}/repositories/{repository_id}/playbooks.

list_schedulesC

Get Project Schedules. GET /project/{project_id}/schedules.

list_secret_storagesC

Get Secret Storages. GET /project/{project_id}/secret_storages.

list_task_ansible_errorsC

Get Ansible Task Errors. GET /project/{project_id}/tasks/{task_id}/ansible/errors.

list_task_ansible_hostsC

Get Ansible Task Hosts. GET /project/{project_id}/tasks/{task_id}/ansible/hosts.

list_task_stagesC

Get Task Stages. GET /project/{project_id}/tasks/{task_id}/stages.

list_tasksA

List up to 1000 project tasks. Use list_recent_tasks or list_recent_template_tasks for supported cursor pagination. GET /project/{project_id}/tasks.

list_template_permissionsC

Get Template Perms. GET /project/{project_id}/templates/{template_id}/perms.

list_template_schedulesC

Get Template Schedules. GET /project/{project_id}/templates/{template_id}/schedules.

list_template_tasksA

List up to 1000 project tasks. Use list_recent_tasks or list_recent_template_tasks for supported cursor pagination. GET /project/{project_id}/templates/{template_id}/tasks.

list_templatesC

Get template. GET /project/{project_id}/templates.

list_terraform_aliasesA

list terraform aliass. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/inventory/{inventory_id}/terraform/aliases.

list_terraform_statesA

list terraform states. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/inventory/{inventory_id}/terraform/states.

list_usersB

Fetches all users. GET /users.

list_view_templatesC

Get View Templates. GET /project/{project_id}/views/{view_id}/templates.

list_viewsC

Get view. GET /project/{project_id}/views.

list_workflow_run_approvalsA

Get workflow run approvals. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows/{workflow_id}/runs/{run_id}/approvals.

list_workflow_runsB

Get workflow runs. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows/{workflow_id}/runs.

list_workflowsB

Get workflows. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows.

pingB

PING test. GET /ping.

refresh_subscriptionA

refresh subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /subscription/refresh.

regenerate_global_runner_registration_tokenA

Regenerate the one-time registration token of an unregistered global runner. POST /runners/{runner_id}/registration-token.

regenerate_project_runner_registration_tokenA

Regenerate the one-time registration token of an unregistered project runner. POST /project/{project_id}/runners/{runner_id}/registration-token.

reject_taskC

Reject Task. POST /project/{project_id}/tasks/{task_id}/reject.

resolve_workflow_approvalB

Resolve workflow approval. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/workflows/{workflow_id}/runs/{run_id}/approvals/{node_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

restore_projectC

Restore Project. POST /projects/restore. Supply API fields in body; JSON-encoded string fields must remain strings.

run_workflowB

Run workflow. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/workflows/{workflow_id}/run. Supply API fields in body; JSON-encoded string fields must remain strings.

set_app_activeC

set App Active. POST /apps/{app_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.

set_global_runner_activeB

Set global runner active state. POST /runners/{runner_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.

set_project_runner_activeC

Set project runner active state. POST /project/{project_id}/runners/{runner_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.

set_schedule_activeC

Set Schedule Active. PUT /project/{project_id}/schedules/{schedule_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.

set_server_optionC

set Option. POST /options. Supply API fields in body; JSON-encoded string fields must remain strings.

set_template_default_inventoryC

Set Template Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/set_default.

set_user_optionA

Stores one option for the authenticated user. The key is an allowlisted suffix (e.g. nav.unpinnedItems); the server prepends the user namespace, so a request can never read or write another user's options or a global option. Unknown keys are rejected with 400. POST /user/options. Supply API fields in body; JSON-encoded string fields must remain strings.

set_view_positionsC

Set View Positions. POST /project/{project_id}/views/positions. Supply API fields in body; JSON-encoded string fields must remain strings.

stop_taskC

Stop a job. POST /project/{project_id}/tasks/{task_id}/stop. Supply API fields in body; JSON-encoded string fields must remain strings.

stop_template_tasksC

Stop all active tasks of template. POST /project/{project_id}/templates/{template_id}/stop_all_tasks. Supply API fields in body; JSON-encoded string fields must remain strings.

stop_workflow_runA

stop workflow run. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /project/{project_id}/workflows/{workflow_id}/runs/{run_id}/stop. Supply API fields in body; JSON-encoded string fields must remain strings.

sync_environmentC

Sync Environment. POST /project/{project_id}/environment/{environment_id}/sync.

sync_secret_storageC

Sync Secrets. POST /project/{project_id}/secret_storages/{storage_id}/sync. Supply API fields in body; JSON-encoded string fields must remain strings.

test_project_notificationA

Sends a test notification to all enabled messengers for the project. POST /project/{project_id}/notifications/test.

update_access_keyC

Updates access key. PUT /project/{project_id}/keys/{key_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_appC

set App. PUT /apps/{app_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_environmentC

Update environment. PUT /project/{project_id}/environment/{environment_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_global_roleB

update global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. PUT /roles/{role_slug}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_global_runnerC

Update global runner. PUT /runners/{runner_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_integrationC

Update Integration. PUT /project/{project_id}/integrations/{integration_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_integration_matcherC

Updates Integration Matcher. PUT /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_integration_valueC

Updates Integration ExtractValue. PUT /project/{project_id}/integrations/{integration_id}/values/{value_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_inventoryC

Updates inventory. PUT /project/{project_id}/inventory/{inventory_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_projectC

Update project. PUT /project/{project_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_project_roleB

update project role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. PUT /project/{project_id}/roles/{role_slug}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_project_runnerC

Update project runner. PUT /project/{project_id}/runners/{runner_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_project_userC

Update user role. PUT /project/{project_id}/users/{user_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_repositoryC

Updates repository. PUT /project/{project_id}/repositories/{repository_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_scheduleC

Updates schedule. PUT /project/{project_id}/schedules/{schedule_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_secret_storageC

Update. PUT /project/{project_id}/secret_storages/{storage_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_templateC

Updates template. PUT /project/{project_id}/templates/{template_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_template_descriptionB

Update Template Description. PUT /project/{project_id}/templates/{template_id}/description. Supply API fields in body; JSON-encoded string fields must remain strings.

update_template_permissionC

Update Template Perm. PUT /project/{project_id}/templates/{template_id}/perms/{perm_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_terraform_aliasB

update terraform alias. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. PUT /project/{project_id}/inventory/{inventory_id}/terraform/aliases/{alias_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_userC

Updates user details. PUT /users/{user_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_user_passwordC

Updates user password. POST /users/{user_id}/password. Supply API fields in body; JSON-encoded string fields must remain strings.

update_viewC

Updates view. PUT /project/{project_id}/views/{view_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

update_workflowA

Update workflow. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. PUT /project/{project_id}/workflows/{workflow_id}. Supply API fields in body; JSON-encoded string fields must remain strings.

validate_scheduleC

Validate Schedule Cron Format. POST /project/{project_id}/schedules/validate. Supply API fields in body; JSON-encoded string fields must remain strings.

wait_for_taskA

Poll a task until success, error, stopped, or timeout. Does not start or stop jobs. Output tail is optional; timeout leaves the job running. The initial status read and optional output read use SEMAPHORE_TIMEOUT separately from the polling budget.

Prompts

Interactive templates invoked by user choice

NameDescription
investigate_taskDiagnose a task from its status and logs.
plan_template_runInspect a template and prepare an execution plan.

Resources

Contextual data attached and managed by the client

NameDescription
Semaphore MCP capabilities
Accessible Semaphore projects

TDQS

C2.7/5.0

Scored across 213 tools

Disambiguation3/5

Most tools are distinguished by resource + scope (global vs project vs template), and several descriptions explicitly disambiguate near-duplicates (e.g. get_global_task warns to use get_task). However, there are genuine near-overlaps an agent can easily mix up: get_task_output vs get_task_raw_output, list_tasks vs list_recent_tasks vs list_global_tasks, list_integrations vs list_project_integration_aliases, and confirm_task/reject_task vs wait_for_task. With 213 tools, selection pressure is high and several boundaries are only clear after reading the full description.

Naming Consistency4/5

The surface follows a very predictable verb_noun snake_case convention (list_/get_/create_/update_/delete_/set_) with clear resource nouns. Minor deviations exist in noun ordering for a few tools (detach_template_inventory, set_template_default_inventory, stop_template_tasks) and one-off verbs (ping, leave_project, test_project_notification), but overall it is highly readable.

Tool Count1/5

213 tools is an extreme mismatch for any coherent agent-facing surface; this is a 1:1 dump of the Semaphore REST API, including edition-gated routes that return 404 in Community. Many tools (permissions, terraform aliases, TOTP, subscription, cluster) will rarely or never be needed, creating enormous selection cost.

Completeness5/5

Coverage is essentially exhaustive: full CRUD for projects, templates, tasks, repositories, inventories, integrations, runners, roles, users, views, workflows, and even reference lookups, task polling, and cron validation. No obvious lifecycle gap exists for the Semaphore domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues