Semaphore UI MCP server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Semaphore UI MCP server run the deploy template in project 1 and show me the logs when it finishes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Semaphore UI MCP server
A Python Model Context Protocol server for Semaphore UI. Connect an MCP client to inspect automation, manage project configuration, launch jobs, and troubleshoot task output through Semaphore's management API.
It provides named, schema-validated management API tools and a wait_for_task
helper, including routes omitted from the upstream OpenAPI document. The server
works over stdio or Streamable HTTP and uses the official Python MCP SDK.
Capabilities
Projects and project membership, global users, API tokens, and server information.
Templates, task execution, task status and logs, task cancellation, and a bounded
wait_for_taskhelper.Inventories, repositories, environments, variable groups, access keys, schedules, views, and integrations.
Management routes for runners, credentials, and edition-specific features where the Semaphore instance and account permit them.
Read-only MCP resources for discovering projects and inspecting their configuration.
Diagnostic prompts for investigating tasks and preparing template runs.
API-token or username/password authentication, custom CA certificates, bounded request timeouts, read-only mode, and a project allowlist.
See the complete API coverage reference for tool names, HTTP routes, API-source provenance, and exclusions. Edition-specific tools are advertised consistently; the Semaphore server determines whether an operation is available to the configured account.
Related MCP server: Daykeeper MCP
Install and run
Requires Python 3.13+. uv is the recommended installer; a pip installation is also supported below.
git clone https://github.com/johsem/semaphoreui-mcp.git
cd semaphoreui-mcp
uv sync --locked
export SEMAPHORE_URL="https://semaphore.example.com"
export SEMAPHORE_API_TOKEN="your-api-token"
uv run --frozen semaphoreui-mcpThe default transport is stdio. An MCP client starts the process and exchanges protocol messages through its standard input and output. Operational logs go to standard error. Running the command directly will wait for an MCP client.
Check the installed version or inspect the catalogue without contacting Semaphore:
uv run --frozen semaphoreui-mcp --version
uv run --frozen semaphoreui-mcp --list-toolsTo install without uv, create a Python 3.13+ virtual environment and run
python -m pip install . inside it. This resolves dependencies from the ranges in
pyproject.toml; uv sync --locked uses the repository's exact dependency lock.
For versioned wheels, PyPI packages, and prebuilt containers, see installing a release. Use the channels listed in the chosen GitHub release.
Connect an MCP client
Use this configuration in a client that supports the common mcpServers format,
replacing the absolute checkout path and credentials:
{
"mcpServers": {
"semaphore": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/semaphoreui-mcp",
"run",
"--frozen",
"semaphoreui-mcp"
],
"env": {
"SEMAPHORE_URL": "https://semaphore.example.com",
"SEMAPHORE_API_TOKEN": "your-api-token",
"SEMAPHORE_TOOL_PROFILE": "core",
"SEMAPHORE_READ_ONLY": "true",
"SEMAPHORE_PROJECT_IDS": "1,2"
}
}
}
}This example selects the core tool profile with read-only access to projects 1
and 2. Remove the project allowlist to use the whole account's scope;
set SEMAPHORE_READ_ONLY=false to enable task launches. Use the full profile for
configuration changes. The MCP server cannot grant permissions beyond
those of its Semaphore account.
If uv is unavailable on the MCP client's executable search path, use its absolute
path, or set command to the installed virtual environment's absolute
bin/semaphoreui-mcp path and omit args.
Configuration
Configuration is read from environment variables. The process does not implicitly
load .env; pass variables through your client, shell, or container configuration.
Variable | Default | Meaning |
| Required | Server root URL or URL ending in |
| Unset | Semaphore API token. Prefer a dedicated account with the permissions needed for your workflow. |
| Unset | Username for session login when no API token is configured. |
| Unset | Password paired with |
|
| Validate Semaphore's HTTPS certificate. Disable only for a deliberately trusted development environment. |
| Unset | Path to a PEM CA bundle for a private certificate authority. |
|
| Upstream HTTP request timeout in seconds. |
|
|
|
|
| Disable management mutations and job execution. |
| Unset | Comma-separated positive project IDs. Restrict project access and block global administration. |
| Unset | Bearer token protecting Streamable HTTP. Required for non-loopback bindings, optional on loopback. |
| Local host patterns | Comma-separated allowed HTTP host patterns. Include the hostname used by external clients. |
| Local HTTP origin patterns | Optional comma-separated origin allowlist for the MCP SDK's DNS rebinding protection. |
Configure either an API token or a complete username/password pair. For accounts
requiring interactive SSO or two-factor login, use an API token. .env.example
contains a complete environment template; .env is ignored by Git and excluded
from the Docker build context.
The project allowlist also filters project discovery. Global operations that cannot be scoped to a project are blocked, apart from safe server information and filtered project listing. Semaphore remains responsible for enforcing account permissions on each upstream request.
Keep configuration files containing tokens private. Tool responses and task logs can contain sensitive values supplied by Semaphore, including variables or output from automation. Review what your MCP client stores and shares. Read-only mode prevents mutations; it does not sanitize all upstream data.
Choose a tool profile
Use SEMAPHORE_TOOL_PROFILE=core for inspecting projects and template dependencies,
running or stopping tasks, and reading their status and output. It keeps the tool
list focused on everyday operations. Use full when you need configuration
changes, user administration, or edition-specific management operations. The
default remains full for existing configurations.
The CLI option --tool-profile core or --tool-profile full overrides the
environment variable. Inspect either profile without credentials or a connection:
uv run --frozen semaphoreui-mcp --list-tools --tool-profile core
uv run --frozen semaphoreui-mcp --list-tools --tool-profile fullOffline listing shows the selected profile's catalogue. At runtime, read-only mode
and the project allowlist further restrict available tools. Tools excluded by the
profile cannot be called by name either. The core profile still allows task
execution; combine it with SEMAPHORE_READ_ONLY=true for inspection-only access.
Resources and prompts remain available under both profiles and retain the same
access restrictions. Restart the server after changing its profile.
Common workflows
Tool inputs use named path/query parameters and a body object for JSON requests.
Inspect the tool's advertised schema before using optional fields; the catalogue
keeps the upstream field names and validates inputs locally.
For standard project-resource create/update operations, the adapter fills body
project_id and resource id from the path parameters where required by the API.
Supplying a conflicting ID is rejected before making the request.
Call
list_projectsto discover project IDs.Call
list_templateswith{"project_id": 1}to discover templates.Inspect the selected template and its inventory, environment, and repository.
Launch a task with
create_task:{ "project_id": 1, "body": { "template_id": 2 } }Use the returned task ID with
get_task,get_task_output, orget_task_raw_output, each takingproject_idandtask_id.Use
wait_for_taskto poll within a bounded time instead of repeatedly making manual status calls. A timeout ends polling; it does not cancel the job.
For example, call wait_for_task with:
{
"project_id": 1,
"task_id": 123,
"timeout": 60,
"poll_interval": 2,
"include_output": true,
"tail_lines": 100
}Its timeout stops further polling. The initial status request and optional
output fetch follow SEMAPHORE_TIMEOUT and the HTTP client's retry rules
separately, so total elapsed time can exceed the polling timeout. The result
includes the last task state, finished, and timed_out.
The optional output is a snapshot. Semaphore can persist final log lines after the task reports completion; fetch task output again if those lines are not yet available.
For task history, list_recent_tasks and list_recent_template_tasks accept
count and a before task ID cursor. A template listing supports its advertised
sort/order/app filters; task output endpoints do not support pagination.
Task creation runs real automation with the template's privileges. For an Ansible
template that supports check mode, the task body can include
"params": {"dry_run": true}. The task API's environment and arguments
fields are JSON-encoded strings, when supplied, rather than nested JSON values.
To cancel a task:
{
"project_id": 1,
"task_id": 123,
"body": {
"force": false
}
}Send that input to stop_task. Use the task's latest status and output to verify
what stopped and whether any changes had already been made.
Resources and prompts
MCP clients that support resources can read:
Resource URI | Content |
| Server capabilities and API compatibility information. |
| Visible projects, respecting the allowlist. |
| Project data; collection is |
| An individual task. |
The investigate_task prompt guides diagnosis using task metadata and output. The
plan_template_run prompt guides inspection of the template and its dependencies
before execution. Prompts provide a workflow; they do not launch jobs themselves.
Streamable HTTP
Start locally:
export MCP_HTTP_TOKEN="a-separate-long-random-token"
uv run --frozen semaphoreui-mcp \
--transport streamable-http --host 127.0.0.1 --port 8000Connect your client's Streamable HTTP transport to http://127.0.0.1:8000/mcp,
with an Authorization: Bearer <MCP_HTTP_TOKEN> request header when the token is
configured. All MCP HTTP requests must carry the configured token. This service
uses one Semaphore credential identity for every connected client and stateless
MCP HTTP sessions. It does not implement per-user OAuth or a multi-tenant login.
For a LAN or reverse-proxy deployment, set MCP_HTTP_TOKEN and add the public host
to MCP_ALLOWED_HOSTS, for example mcp.example.com. Configure
MCP_ALLOWED_ORIGINS if your client sends an Origin header. Terminate HTTPS at your
reverse proxy before sending credentials across an untrusted network. Binding to
0.0.0.0 or :: requires a token even when the container port is published only
on the host's loopback interface.
Docker
cp .env.example .env
# Edit .env: set the Semaphore URL/token and a separate MCP_HTTP_TOKEN.
docker compose up --build -dThe container runs as an unprivileged user and Compose publishes port 8000 only on
127.0.0.1. Connect to http://127.0.0.1:8000/mcp with the bearer token. The image
installs runtime dependencies from uv.lock; Compose uses a read-only root
filesystem and a writable temporary directory. For a custom CA bundle, mount the
PEM file read-only and set SEMAPHORE_CA_BUNDLE to its path inside the container.
To use the image over stdio instead:
docker build -t semaphoreui-mcp .
docker run --rm -i --env-file .env semaphoreui-mcp --transport stdioDo not allocate a TTY (-t) for stdio MCP. The image's default command starts HTTP;
the explicit --transport stdio argument overrides it.
systemd service
To run the HTTP transport as a supervised service on a Linux host or container
running systemd, install the package into a uv-managed virtual environment and use
deploy/semaphoreui-mcp.service as a template.
Run these commands from a source checkout or extracted source distribution, with
Git and uv installed. The example expects a system-wide uv executable at
/usr/local/bin/uv; adjust that path if needed. A uv installation in your personal
home directory may not be accessible to the service user.
sudo useradd --system --user-group --home /opt/semaphoreui-mcp --shell /usr/sbin/nologin semaphoreui-mcp
sudo mkdir -p /opt/semaphoreui-mcp && sudo chown semaphoreui-mcp: /opt/semaphoreui-mcp
sudo -u semaphoreui-mcp env UV_PYTHON_INSTALL_DIR=/opt/semaphoreui-mcp/uv sh -c '
/usr/local/bin/uv venv /opt/semaphoreui-mcp/venv --python 3.13 &&
/usr/local/bin/uv pip install --python /opt/semaphoreui-mcp/venv/bin/python \
"semaphoreui-mcp @ git+https://github.com/johsem/semaphoreui-mcp"'
sudo install -o root -g semaphoreui-mcp -m 0640 .env.example /etc/semaphoreui-mcp.env
sudoedit /etc/semaphoreui-mcp.envReplace the placeholder Semaphore URL and credentials and set MCP_HTTP_TOKEN
before starting the service. The unit loads this file via EnvironmentFile and
runs with NoNewPrivileges/ProtectSystem=strict. Pin the package source to a
commit (...semaphoreui-mcp@<sha>) when deploying a specific revision; dependency
versions are still resolved from the package's allowed ranges.
The template listens on 127.0.0.1:8000. Adjust --host, --port,
MCP_ALLOWED_HOSTS, and the paths for your environment before installing it:
sudo install -o root -g root -m 0644 deploy/semaphoreui-mcp.service /etc/systemd/system/semaphoreui-mcp.service
sudo systemctl daemon-reload
sudo systemctl enable --now semaphoreui-mcp
sudo systemctl status semaphoreui-mcpConnect to http://127.0.0.1:8000/mcp with the configured bearer token. Follow the
HTTP configuration guidance when exposing it through a TLS
reverse proxy. View service logs with sudo journalctl -u semaphoreui-mcp.
Development and validation
uv sync --locked --group dev
uv run --frozen ruff check .
uv run --frozen ruff format --check .
uv run --frozen pytest --cov=semaphoreui_mcp --cov-report=term-missing
uv run --frozen python -m buildUnit and protocol tests use controlled HTTP responses and local MCP sessions. They do not need live Semaphore credentials or execute real automation. GitHub Actions runs lint, tests, catalogue discovery, package builds, and disposable-container compatibility tests on pushes, pull requests, and manual runs. Test reports and built distributions are saved as workflow artifacts. GitLab CI remains available for GitLab-hosted repositories. Python tests run on 3.13, 3.14, and 3.15. Weekly Dependabot pull requests cover Python dependencies, GitHub Actions, and Docker base images.
An optional integration smoke test verifies the adapter against a disposable Semaphore Community container:
uv run --frozen python scripts/smoke_test.py --dockerUse --image semaphoreui/semaphore:<tag> to test another release. The default
image and recorded results are listed in API coverage.
It requires Docker and downloads the Semaphore image if needed. The script creates a unique container with temporary credentials and a random loopback port. It exercises cookie login and API-token creation/use/revocation, project CRUD, access-key/repository/inventory/environment/template/schedule creation and cleanup, template listing, schedule reads, task execution and output, and project backup. Its Ansible task runs a debug-only playbook inside that container. The script removes its container and anonymous volumes afterwards; the downloaded image remains cached. It does not use your configured Semaphore instance.
The tested releases and scope are recorded in API coverage. Deployment-specific permissions, SSO policy, external runner connectivity, and Pro-only routes still need validation against the intended deployment.
The catalogue is bundled with the package so discovery does not require network
access or a running Semaphore server. When adding or updating API coverage, review
upstream API and router changes, update the bundled specification and
src/semaphoreui_mcp/data/overrides.json as needed, update the coverage reference,
and run the test suite and relevant smoke tests. Tool schemas are built from these
files at startup; keep existing tool names stable.
Compatibility and scope
The server does not require a particular Semaphore release or reject instances based on their version. Existing tools are expected to work with newer releases that preserve the API routes, request formats, and behavior they use. They can also work with older releases where those APIs are available. New upstream features may require a catalogue update before they are exposed as tools.
Compatibility is per operation: older versions may lack routes or fields, and breaking API changes may require adapter updates. The catalogue does not automatically detect or hide operations missing from a particular installation. See API coverage for tested versions, validation scope, and the source release used to build the bundled schemas. That source records API provenance, not a required server version.
The bundled OpenAPI source and applicable upstream license are included in package data. This is an independent integration with the Semaphore project.
The MCP exposes management operations. Interactive login/SSO flows, WebSocket subscriptions, runner agent transport, incoming integration webhooks, the Terraform backend protocol, and JWKS endpoints are outside that interface. Username/password session setup is handled internally by the HTTP client. Unsupported routes and account/edition limitations return errors from Semaphore; consult API coverage for the precise boundary.
Help and contributions
Bug reports and contributions are welcome through GitHub issues and pull requests. For a compatibility or connection problem, include the MCP server version, Semaphore version and edition, MCP client, transport, affected tool, and a minimal reproduction with sanitized error output. Remove tokens, passwords, private configuration, and sensitive task output before sharing.
For code changes, use the development checks above and add regression coverage for changed behavior. API changes should include updated tool schemas, coverage documentation, and a smoke-test result for the affected Semaphore release when possible.
See CONTRIBUTING.md for the development workflow and catalogue maintenance for API updates. Report vulnerabilities privately using SECURITY.md. Maintainers can follow the release guide; user-facing changes are recorded in the changelog.
License
This project is licensed under the MIT License. The bundled Semaphore API specification retains its upstream copyright notices and MIT license.
Available Tools
213 toolsactivate_subscriptionBDestructive
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.
Inputs: body (required).
attach_template_inventoryCDestructive
Attach Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/attach.
Inputs: project_id (required), template_id (required), inventory_id (required).
clear_cluster_tasksCDestructiveIdempotent
clear Cluster Tasks. DELETE /cluster/tasks. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
clear_global_runner_cacheCDestructiveIdempotent
Clear global runner cache. DELETE /runners/{runner_id}/cache.
Inputs: runner_id (required).
clear_project_cacheCDestructiveIdempotent
Clear Cache. DELETE /project/{project_id}/cache.
Inputs: project_id (required).
clear_project_runner_cacheCDestructiveIdempotent
Clear project runner cache. DELETE /project/{project_id}/runners/{runner_id}/cache.
Inputs: runner_id (required), project_id (required).
clear_server_cacheCDestructiveIdempotent
clear Cache. DELETE /cache.
Inputs: no named parameters.
confirm_taskCDestructive
Confirm Task. POST /project/{project_id}/tasks/{task_id}/confirm.
Inputs: task_id (required), project_id (required).
create_access_keyCDestructive
Add access key. POST /project/{project_id}/keys. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_api_tokenCDestructive
Create an API token. POST /user/tokens. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body.
create_environmentCDestructive
Add environment. POST /project/{project_id}/environment. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_global_roleBDestructive
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.
Inputs: body (required).
create_global_runnerCDestructive
Add global runner. POST /runners. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
create_integrationBDestructive
create a new integration. POST /project/{project_id}/integrations. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_integration_aliasCDestructive
Create a new alias for an integration. POST /project/{project_id}/integrations/{integration_id}/aliases.
Inputs: project_id (required), integration_id (required).
create_integration_matcherBDestructive
Add Integration Matcher. POST /project/{project_id}/integrations/{integration_id}/matchers. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), integration_id (required).
create_integration_valueBDestructive
Add Integration Extracted Value. POST /project/{project_id}/integrations/{integration_id}/values. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), integration_id (required).
create_inventoryCDestructive
create inventory. POST /project/{project_id}/inventory. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_projectBDestructive
Create a new project. POST /projects. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
create_project_integration_aliasCDestructive
Create a new integration alias for the project. POST /project/{project_id}/integrations/aliases.
Inputs: project_id (required).
create_project_roleBDestructive
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.
Inputs: body (required), project_id (required).
create_project_runnerCDestructive
Add project runner. POST /project/{project_id}/runners. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_project_userCDestructive
Link user to project. POST /project/{project_id}/users. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_repositoryCDestructive
Add repository. POST /project/{project_id}/repositories. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_scheduleCDestructive
create schedule. POST /project/{project_id}/schedules. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_secret_storageCDestructive
Add. POST /project/{project_id}/secret_storages. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_taskBDestructive
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.
Inputs: body (required), project_id (required).
create_templateCDestructive
create template. POST /project/{project_id}/templates. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_template_permissionCDestructive
Add Template Perm. POST /project/{project_id}/templates/{template_id}/perms. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), template_id (required).
create_terraform_aliasCDestructive
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.
Inputs: body (required), project_id (required), inventory_id (required).
create_userBDestructive
Creates a user. POST /users. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
create_viewBDestructive
create view. POST /project/{project_id}/views. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
create_workflowBDestructive
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.
Inputs: body (required), project_id (required).
delete_access_keyCDestructiveIdempotent
Removes access key. DELETE /project/{project_id}/keys/{key_id}.
Inputs: key_id (required), project_id (required).
delete_api_tokenCDestructiveIdempotent
Expires API token. DELETE /user/tokens/{token_id}.
Inputs: token_id (required).
delete_appCDestructiveIdempotent
delete App. DELETE /apps/{app_id}.
Inputs: app_id (required).
delete_environmentCDestructiveIdempotent
Removes environment. DELETE /project/{project_id}/environment/{environment_id}.
Inputs: project_id (required), environment_id (required).
delete_global_roleCDestructiveIdempotent
delete global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /roles/{role_slug}.
Inputs: role_slug (required).
delete_global_runnerCDestructiveIdempotent
Delete global runner. DELETE /runners/{runner_id}.
Inputs: runner_id (required).
delete_global_taskBDestructiveIdempotent
Stop or remove a task from the global running/queued task pool (administrator only). DELETE /tasks/{task_id}.
Inputs: task_id (required).
delete_integrationBDestructiveIdempotent
Remove integration. DELETE /project/{project_id}/integrations/{integration_id}.
Inputs: project_id (required), integration_id (required).
delete_integration_aliasBDestructiveIdempotent
Remove integration alias. DELETE /project/{project_id}/integrations/{integration_id}/aliases/{alias_id}.
Inputs: alias_id (required), project_id (required), integration_id (required).
delete_integration_matcherCDestructiveIdempotent
Removes integration matcher. DELETE /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}.
Inputs: matcher_id (required), project_id (required), integration_id (required).
delete_integration_valueCDestructiveIdempotent
Removes integration extract value. DELETE /project/{project_id}/integrations/{integration_id}/values/{value_id}.
Inputs: value_id (required), project_id (required), integration_id (required).
delete_inventoryCDestructiveIdempotent
Removes inventory. DELETE /project/{project_id}/inventory/{inventory_id}.
Inputs: project_id (required), inventory_id (required).
delete_projectCDestructiveIdempotent
Delete project. DELETE /project/{project_id}.
Inputs: project_id (required).
delete_project_integration_aliasBDestructiveIdempotent
Remove integration alias. DELETE /project/{project_id}/integrations/aliases/{alias_id}.
Inputs: alias_id (required), project_id (required).
delete_project_roleBDestructiveIdempotent
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}.
Inputs: role_slug (required), project_id (required).
delete_project_runnerCDestructiveIdempotent
Delete project runner. DELETE /project/{project_id}/runners/{runner_id}.
Inputs: runner_id (required), project_id (required).
delete_project_userBDestructiveIdempotent
Removes user from project. DELETE /project/{project_id}/users/{user_id}.
Inputs: user_id (required), project_id (required).
delete_repositoryCDestructiveIdempotent
Removes repository. DELETE /project/{project_id}/repositories/{repository_id}.
Inputs: project_id (required), repository_id (required).
delete_scheduleCDestructiveIdempotent
Deletes schedule. DELETE /project/{project_id}/schedules/{schedule_id}.
Inputs: project_id (required), schedule_id (required).
delete_secret_storageCDestructiveIdempotent
Remove. DELETE /project/{project_id}/secret_storages/{storage_id}.
Inputs: project_id (required), storage_id (required).
delete_subscriptionADestructiveIdempotent
delete subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. DELETE /subscription.
Inputs: no named parameters.
delete_taskBDestructiveIdempotent
Deletes task (including output). DELETE /project/{project_id}/tasks/{task_id}.
Inputs: task_id (required), project_id (required).
delete_templateCDestructiveIdempotent
Removes template. DELETE /project/{project_id}/templates/{template_id}.
Inputs: project_id (required), template_id (required).
delete_template_permissionCDestructiveIdempotent
Delete Template Perm. DELETE /project/{project_id}/templates/{template_id}/perms/{perm_id}.
Inputs: perm_id (required), project_id (required), template_id (required).
delete_terraform_aliasADestructiveIdempotent
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}.
Inputs: alias_id (required), project_id (required), inventory_id (required).
delete_terraform_stateADestructiveIdempotent
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}.
Inputs: state_id (required), project_id (required), inventory_id (required).
delete_userCDestructiveIdempotent
Deletes user. DELETE /users/{user_id}.
Inputs: user_id (required).
delete_viewCDestructiveIdempotent
Removes view. DELETE /project/{project_id}/views/{view_id}.
Inputs: view_id (required), project_id (required).
delete_workflowBDestructiveIdempotent
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}.
Inputs: project_id (required), workflow_id (required).
detach_template_inventoryCDestructive
Detach Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/detach.
Inputs: project_id (required), template_id (required), inventory_id (required).
disable_user_totpCDestructiveIdempotent
Disable Totp. DELETE /users/{user_id}/2fas/totp/{totp_id}.
Inputs: totp_id (required), user_id (required).
enable_user_totpDDestructive
Enable Totp. POST /users/{user_id}/2fas/totp.
Inputs: user_id (required).
get_access_keyCRead-onlyIdempotent
Get Keys. GET /project/{project_id}/keys/{key_id}.
Inputs: key_id (required), project_id (required).
get_access_key_referencesDRead-onlyIdempotent
Get Key Refs. GET /project/{project_id}/keys/{key_id}/refs.
Inputs: key_id (required), project_id (required).
get_admin_infoCRead-onlyIdempotent
get Admin Info. GET /admin/info.
Inputs: no named parameters.
get_appCRead-onlyIdempotent
get App. GET /apps/{app_id}.
Inputs: app_id (required).
get_cluster_statusCRead-onlyIdempotent
get Cluster Status. GET /cluster.
Inputs: no named parameters.
get_current_userARead-onlyIdempotent
Fetch logged in user. GET /user.
Inputs: no named parameters.
get_environmentCRead-onlyIdempotent
Get environment. GET /project/{project_id}/environment/{environment_id}.
Inputs: project_id (required), environment_id (required).
get_environment_referencesCRead-onlyIdempotent
Get Environment Refs. GET /project/{project_id}/environment/{environment_id}/refs.
Inputs: project_id (required), environment_id (required).
get_global_roleARead-onlyIdempotent
get global role. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /roles/{role_slug}.
Inputs: role_slug (required).
get_global_runnerCRead-onlyIdempotent
Get global runner. GET /runners/{runner_id}.
Inputs: runner_id (required).
get_global_taskARead-onlyIdempotent
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}.
Inputs: task_id (required).
get_integrationCRead-onlyIdempotent
Get Integration. GET /project/{project_id}/integrations/{integration_id}.
Inputs: project_id (required), integration_id (required).
get_integration_matcherCRead-onlyIdempotent
Get Integration Matcher. GET /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}.
Inputs: matcher_id (required), project_id (required), integration_id (required).
get_integration_matcher_referencesDRead-onlyIdempotent
Get Integration Matcher Refs. GET /project/{project_id}/integrations/{integration_id}/matchers/{matcher_id}/refs.
Inputs: matcher_id (required), project_id (required), integration_id (required).
get_integration_referencesCRead-onlyIdempotent
Get Integration Refs. GET /project/{project_id}/integrations/{integration_id}/refs.
Inputs: project_id (required), integration_id (required).
get_integration_valueCRead-onlyIdempotent
Get Integration Extract Value. GET /project/{project_id}/integrations/{integration_id}/values/{value_id}.
Inputs: value_id (required), project_id (required), integration_id (required).
get_integration_value_referencesCRead-onlyIdempotent
Get Integration Extract Value Refs. GET /project/{project_id}/integrations/{integration_id}/values/{value_id}/refs.
Inputs: value_id (required), project_id (required), integration_id (required).
get_inventoryDRead-onlyIdempotent
Get inventory. GET /project/{project_id}/inventory/{inventory_id}.
Inputs: project_id (required), inventory_id (required).
get_inventory_referencesDRead-onlyIdempotent
Get Inventory Refs. GET /project/{project_id}/inventory/{inventory_id}/refs.
Inputs: project_id (required), inventory_id (required).
get_latest_terraform_stateARead-onlyIdempotent
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.
Inputs: project_id (required), inventory_id (required).
get_projectCRead-onlyIdempotent
Fetch project. GET /project/{project_id}.
Inputs: project_id (required).
get_project_backupCRead-onlyIdempotent
Backup A Project. GET /project/{project_id}/backup.
Inputs: project_id (required).
get_project_permissionsBRead-onlyIdempotent
Fetch permissions of the current user for project. GET /project/{project_id}/role.
Inputs: project_id (required).
get_project_roleARead-onlyIdempotent
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}.
Inputs: role_slug (required), project_id (required).
get_project_runnerCRead-onlyIdempotent
Get project runner. GET /project/{project_id}/runners/{runner_id}.
Inputs: runner_id (required), project_id (required).
get_project_task_statsCRead-onlyIdempotent
Get Task Stats. GET /project/{project_id}/stats.
Inputs: project_id (required), end, start, user_id.
get_project_userCRead-onlyIdempotent
Get Users. GET /project/{project_id}/users/{user_id}.
Inputs: user_id (required), project_id (required).
get_repositoryCRead-onlyIdempotent
Get repository. GET /project/{project_id}/repositories/{repository_id}.
Inputs: project_id (required), repository_id (required).
get_repository_referencesDRead-onlyIdempotent
Get Repository Refs. GET /project/{project_id}/repositories/{repository_id}/refs.
Inputs: project_id (required), repository_id (required).
get_scheduleCRead-onlyIdempotent
Get schedule. GET /project/{project_id}/schedules/{schedule_id}.
Inputs: project_id (required), schedule_id (required).
get_secret_storageCRead-onlyIdempotent
Get Secret Storage. GET /project/{project_id}/secret_storages/{storage_id}.
Inputs: project_id (required), storage_id (required).
get_secret_storage_referencesCRead-onlyIdempotent
Get Refs. GET /project/{project_id}/secret_storages/{storage_id}/refs.
Inputs: project_id (required), storage_id (required).
get_server_optionsCRead-onlyIdempotent
get Options. GET /options.
Inputs: no named parameters.
get_subscriptionARead-onlyIdempotent
get subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /subscription.
Inputs: no named parameters.
get_system_infoCRead-onlyIdempotent
you must be authenticated to use this. GET /info.
Inputs: no named parameters.
get_taskCRead-onlyIdempotent
Get a single task. GET /project/{project_id}/tasks/{task_id}.
Inputs: task_id (required), project_id (required).
get_task_outputARead-onlyIdempotent
Get every persisted task log line as structured output; upstream does not support output pagination. GET /project/{project_id}/tasks/{task_id}/output.
Inputs: task_id (required), project_id (required).
get_task_raw_outputBRead-onlyIdempotent
Get complete task logs as plain text with ANSI escape codes removed. GET /project/{project_id}/tasks/{task_id}/raw_output.
Inputs: task_id (required), project_id (required).
get_templateCRead-onlyIdempotent
Get template. GET /project/{project_id}/templates/{template_id}.
Inputs: project_id (required), template_id (required).
get_template_permissionCRead-onlyIdempotent
Get Template Perm. GET /project/{project_id}/templates/{template_id}/perms/{perm_id}.
Inputs: perm_id (required), project_id (required), template_id (required).
get_template_referencesCRead-onlyIdempotent
Get Template Refs. GET /project/{project_id}/templates/{template_id}/refs.
Inputs: project_id (required), template_id (required).
get_template_task_statsCRead-onlyIdempotent
Get Task Stats. GET /project/{project_id}/templates/{template_id}/stats.
Inputs: project_id (required), template_id (required), end, start, +1 more.
get_terraform_aliasARead-onlyIdempotent
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}.
Inputs: alias_id (required), project_id (required), inventory_id (required).
get_terraform_stateBRead-onlyIdempotent
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}.
Inputs: state_id (required), project_id (required), inventory_id (required).
get_userCRead-onlyIdempotent
Fetches a user profile. GET /users/{user_id}.
Inputs: user_id (required).
get_user_optionsARead-onlyIdempotent
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.
Inputs: no named parameters.
get_user_totp_qrDRead-onlyIdempotent
Totp Qr. GET /users/{user_id}/2fas/totp/{totp_id}/qr.
Inputs: totp_id (required), user_id (required).
get_viewCRead-onlyIdempotent
Get view. GET /project/{project_id}/views/{view_id}.
Inputs: view_id (required), project_id (required).
get_workflowARead-onlyIdempotent
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}.
Inputs: project_id (required), workflow_id (required).
get_workflow_runBRead-onlyIdempotent
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}.
Inputs: run_id (required), project_id (required), workflow_id (required).
get_workflow_run_artifactsARead-onlyIdempotent
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.
Inputs: run_id (required), project_id (required), workflow_id (required).
leave_projectCDestructiveIdempotent
Left Project. DELETE /project/{project_id}/me.
Inputs: project_id (required).
list_access_keysCRead-onlyIdempotent
Get access keys linked to project. GET /project/{project_id}/keys.
Inputs: project_id (required), sort, order.
list_api_tokensBRead-onlyIdempotent
Fetch API tokens for user. GET /user/tokens.
Inputs: no named parameters.
list_appsCRead-onlyIdempotent
Get apps. GET /apps.
Inputs: no named parameters.
list_available_project_rolesARead-onlyIdempotent
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.
Inputs: project_id (required).
list_cluster_tasksCRead-onlyIdempotent
get Cluster Tasks. GET /cluster/tasks.
Inputs: no named parameters.
list_environmentsCRead-onlyIdempotent
Get environment. GET /project/{project_id}/environment.
Inputs: project_id (required), sort, order.
list_eventsBRead-onlyIdempotent
Get Events related to Semaphore and projects you are part of. GET /events.
Inputs: no named parameters.
list_global_rolesARead-onlyIdempotent
list global roles. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /roles.
Inputs: no named parameters.
list_global_runnersBRead-onlyIdempotent
Get all global runners. GET /runners.
Inputs: no named parameters.
list_global_runner_tagsBRead-onlyIdempotent
Get global runner tags. GET /runner_tags.
Inputs: no named parameters.
list_global_tasksCRead-onlyIdempotent
Get Tasks. GET /tasks.
Inputs: no named parameters.
list_integration_aliasesBRead-onlyIdempotent
Get all aliases for an integration. GET /project/{project_id}/integrations/{integration_id}/aliases.
Inputs: project_id (required), integration_id (required).
list_integration_matchersCRead-onlyIdempotent
Get Integration Matcher linked to integration extractor. GET /project/{project_id}/integrations/{integration_id}/matchers.
Inputs: project_id (required), integration_id (required).
list_integrationsCRead-onlyIdempotent
get all integrations. GET /project/{project_id}/integrations.
Inputs: project_id (required).
list_integration_valuesBRead-onlyIdempotent
Get Integration Extracted Values linked to integration extractor. GET /project/{project_id}/integrations/{integration_id}/values.
Inputs: project_id (required), integration_id (required).
list_inventoriesCRead-onlyIdempotent
Get inventory. GET /project/{project_id}/inventory.
Inputs: project_id (required), app, sort, order, +1 more.
list_project_eventsBRead-onlyIdempotent
Get Events related to this project. GET /project/{project_id}/events.
Inputs: project_id (required).
list_project_integration_aliasesBRead-onlyIdempotent
Get all integration aliases for the project. GET /project/{project_id}/integrations/aliases.
Inputs: project_id (required).
list_project_rolesBRead-onlyIdempotent
list project roles. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/roles.
Inputs: project_id (required), mode.
list_project_runnersARead-onlyIdempotent
Returns runners owned by the project together with global runners that have tags. GET /project/{project_id}/runners.
Inputs: project_id (required).
list_project_runner_tagsCRead-onlyIdempotent
Get project runner tags. GET /project/{project_id}/runner_tags.
Inputs: project_id (required).
list_projectsCRead-onlyIdempotent
Get projects. GET /projects.
Inputs: no named parameters.
list_project_usersCRead-onlyIdempotent
Get users linked to project. GET /project/{project_id}/users.
Inputs: project_id (required), sort, order.
list_recent_eventsARead-onlyIdempotent
Get last 200 Events related to Semaphore and projects you are part of. GET /events/last.
Inputs: no named parameters.
list_recent_project_eventsDRead-onlyIdempotent
get Last Events. GET /project/{project_id}/events/last.
Inputs: project_id (required).
list_recent_tasksBRead-onlyIdempotent
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.
Inputs: project_id (required), count, limit, before.
list_recent_template_tasksARead-onlyIdempotent
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.
Inputs: project_id (required), template_id (required), count, limit, +1 more.
list_repositoriesCRead-onlyIdempotent
Get repositories. GET /project/{project_id}/repositories.
Inputs: project_id (required), sort, order.
list_repository_branchesCRead-onlyIdempotent
Get Repository Branches. GET /project/{project_id}/repositories/{repository_id}/branches.
Inputs: project_id (required), repository_id (required).
list_repository_playbooksCRead-onlyIdempotent
Get Repository Playbooks. GET /project/{project_id}/repositories/{repository_id}/playbooks.
Inputs: project_id (required), repository_id (required), branch.
list_schedulesCRead-onlyIdempotent
Get Project Schedules. GET /project/{project_id}/schedules.
Inputs: project_id (required).
list_secret_storagesCRead-onlyIdempotent
Get Secret Storages. GET /project/{project_id}/secret_storages.
Inputs: project_id (required).
list_task_ansible_errorsCRead-onlyIdempotent
Get Ansible Task Errors. GET /project/{project_id}/tasks/{task_id}/ansible/errors.
Inputs: task_id (required), project_id (required).
list_task_ansible_hostsCRead-onlyIdempotent
Get Ansible Task Hosts. GET /project/{project_id}/tasks/{task_id}/ansible/hosts.
Inputs: task_id (required), project_id (required).
list_tasksARead-onlyIdempotent
List up to 1000 project tasks. Use list_recent_tasks or list_recent_template_tasks for supported cursor pagination. GET /project/{project_id}/tasks.
Inputs: project_id (required), sort, order.
list_task_stagesCRead-onlyIdempotent
Get Task Stages. GET /project/{project_id}/tasks/{task_id}/stages.
Inputs: task_id (required), project_id (required).
list_template_permissionsCRead-onlyIdempotent
Get Template Perms. GET /project/{project_id}/templates/{template_id}/perms.
Inputs: project_id (required), template_id (required).
list_templatesCRead-onlyIdempotent
Get template. GET /project/{project_id}/templates.
Inputs: project_id (required), app, sort, order.
list_template_schedulesCRead-onlyIdempotent
Get Template Schedules. GET /project/{project_id}/templates/{template_id}/schedules.
Inputs: project_id (required), template_id (required).
list_template_tasksARead-onlyIdempotent
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.
Inputs: project_id (required), template_id (required), sort, order.
list_terraform_aliasesARead-onlyIdempotent
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.
Inputs: project_id (required), inventory_id (required).
list_terraform_statesARead-onlyIdempotent
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.
Inputs: project_id (required), inventory_id (required).
list_usersBRead-onlyIdempotent
Fetches all users. GET /users.
Inputs: no named parameters.
list_viewsCRead-onlyIdempotent
Get view. GET /project/{project_id}/views.
Inputs: project_id (required).
list_view_templatesCRead-onlyIdempotent
Get View Templates. GET /project/{project_id}/views/{view_id}/templates.
Inputs: view_id (required), project_id (required).
list_workflow_run_approvalsARead-onlyIdempotent
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.
Inputs: run_id (required), project_id (required), workflow_id (required).
list_workflow_runsBRead-onlyIdempotent
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.
Inputs: project_id (required), workflow_id (required).
list_workflowsBRead-onlyIdempotent
Get workflows. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. GET /project/{project_id}/workflows.
Inputs: project_id (required).
pingBRead-onlyIdempotent
PING test. GET /ping.
Inputs: no named parameters.
refresh_subscriptionADestructive
refresh subscription. Availability depends on Semaphore edition, license, and permissions; some Community routes return 404 or empty lists. POST /subscription/refresh.
Inputs: no named parameters.
regenerate_global_runner_registration_tokenADestructive
Regenerate the one-time registration token of an unregistered global runner. POST /runners/{runner_id}/registration-token.
Inputs: runner_id (required).
regenerate_project_runner_registration_tokenADestructive
Regenerate the one-time registration token of an unregistered project runner. POST /project/{project_id}/runners/{runner_id}/registration-token.
Inputs: runner_id (required), project_id (required).
reject_taskCDestructive
Reject Task. POST /project/{project_id}/tasks/{task_id}/reject.
Inputs: task_id (required), project_id (required).
resolve_workflow_approvalBDestructive
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.
Inputs: body (required), run_id (required), node_id (required), project_id (required), +1 more.
restore_projectCDestructive
Restore Project. POST /projects/restore. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
run_workflowBDestructive
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.
Inputs: project_id (required), workflow_id (required), body.
set_app_activeCDestructive
set App Active. POST /apps/{app_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), app_id (required).
set_global_runner_activeBDestructive
Set global runner active state. POST /runners/{runner_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), runner_id (required).
set_project_runner_activeCDestructive
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.
Inputs: body (required), runner_id (required), project_id (required).
set_schedule_activeCDestructiveIdempotent
Set Schedule Active. PUT /project/{project_id}/schedules/{schedule_id}/active. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), schedule_id (required).
set_server_optionCDestructive
set Option. POST /options. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required).
set_template_default_inventoryCDestructive
Set Template Inventory. POST /project/{project_id}/templates/{template_id}/inventory/{inventory_id}/set_default.
Inputs: project_id (required), template_id (required), inventory_id (required).
set_user_optionADestructive
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.
Inputs: body (required).
set_view_positionsCDestructive
Set View Positions. POST /project/{project_id}/views/positions. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
stop_taskCDestructive
Stop a job. POST /project/{project_id}/tasks/{task_id}/stop. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: task_id (required), project_id (required), body.
stop_template_tasksCDestructive
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.
Inputs: project_id (required), template_id (required), body.
stop_workflow_runADestructive
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.
Inputs: run_id (required), project_id (required), workflow_id (required), body.
sync_environmentCDestructive
Sync Environment. POST /project/{project_id}/environment/{environment_id}/sync.
Inputs: project_id (required), environment_id (required).
sync_secret_storageCDestructive
Sync Secrets. POST /project/{project_id}/secret_storages/{storage_id}/sync. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), storage_id (required).
test_project_notificationADestructive
Sends a test notification to all enabled messengers for the project. POST /project/{project_id}/notifications/test.
Inputs: project_id (required).
update_access_keyCDestructiveIdempotent
Updates access key. PUT /project/{project_id}/keys/{key_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), key_id (required), project_id (required).
update_appCDestructiveIdempotent
set App. PUT /apps/{app_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), app_id (required).
update_environmentCDestructiveIdempotent
Update environment. PUT /project/{project_id}/environment/{environment_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), environment_id (required).
update_global_roleBDestructiveIdempotent
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.
Inputs: body (required), role_slug (required).
update_global_runnerCDestructiveIdempotent
Update global runner. PUT /runners/{runner_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), runner_id (required).
update_integrationCDestructiveIdempotent
Update Integration. PUT /project/{project_id}/integrations/{integration_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), integration_id (required).
update_integration_matcherCDestructiveIdempotent
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.
Inputs: body (required), matcher_id (required), project_id (required), integration_id (required).
update_integration_valueCDestructiveIdempotent
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.
Inputs: body (required), value_id (required), project_id (required), integration_id (required).
update_inventoryCDestructiveIdempotent
Updates inventory. PUT /project/{project_id}/inventory/{inventory_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), inventory_id (required).
update_projectCDestructiveIdempotent
Update project. PUT /project/{project_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
update_project_roleBDestructiveIdempotent
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.
Inputs: body (required), role_slug (required), project_id (required).
update_project_runnerCDestructiveIdempotent
Update project runner. PUT /project/{project_id}/runners/{runner_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), runner_id (required), project_id (required).
update_project_userCDestructiveIdempotent
Update user role. PUT /project/{project_id}/users/{user_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), user_id (required), project_id (required).
update_repositoryCDestructiveIdempotent
Updates repository. PUT /project/{project_id}/repositories/{repository_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), repository_id (required).
update_scheduleCDestructiveIdempotent
Updates schedule. PUT /project/{project_id}/schedules/{schedule_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), schedule_id (required).
update_secret_storageCDestructiveIdempotent
Update. PUT /project/{project_id}/secret_storages/{storage_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), storage_id (required).
update_templateCDestructiveIdempotent
Updates template. PUT /project/{project_id}/templates/{template_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), template_id (required).
update_template_descriptionBDestructiveIdempotent
Update Template Description. PUT /project/{project_id}/templates/{template_id}/description. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required), template_id (required).
update_template_permissionCDestructiveIdempotent
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.
Inputs: body (required), perm_id (required), project_id (required), template_id (required).
update_terraform_aliasBDestructiveIdempotent
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.
Inputs: body (required), alias_id (required), project_id (required), inventory_id (required).
update_userCDestructiveIdempotent
Updates user details. PUT /users/{user_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), user_id (required).
update_user_passwordCDestructive
Updates user password. POST /users/{user_id}/password. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), user_id (required).
update_viewCDestructiveIdempotent
Updates view. PUT /project/{project_id}/views/{view_id}. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), view_id (required), project_id (required).
update_workflowADestructiveIdempotent
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.
Inputs: body (required), project_id (required), workflow_id (required).
validate_scheduleCRead-onlyIdempotent
Validate Schedule Cron Format. POST /project/{project_id}/schedules/validate. Supply API fields in body; JSON-encoded string fields must remain strings.
Inputs: body (required), project_id (required).
wait_for_taskARead-onlyIdempotent
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.
Inputs: task_id (required), project_id (required), timeout, tail_lines, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 213 tools
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.
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.
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.
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
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Streamable HTTP MCP gateway for NV oOS fleets — one API key, namespaced tools, quotas and policy.
Manage Pipefork API projects, drafts, connections, secrets, and deployments through MCP.
Toolstile is a managed MCP gateway that connects remote MCP servers behind one endpoint, with per-agent permissions, shared accounts and activity logs. Connect at https://mcp.toolstile.com/mcp over Streamable HTTP with OAuth; sign in at https://toolstile.com, select a workspace and connect your upstream servers. Available tools, resources and prompts depend on that workspace and the agent's granted access.
Related MCP Servers
- FlicenseCqualityDmaintenanceSchema-driven MCP server that exposes all Paperclip API operations as typed MCP tools over stdio or Streamable HTTP, supporting both authenticated and local_mode deployments.100-

Daykeeper MCPofficial
AlicenseAqualityBmaintenanceA local stdio MCP adapter for the Daykeeper management API. It uses separately issued scoped credentials and exposes read-only tools by default; planning and mutations require explicit opt-in.825 npmApache 2.0- AlicenseDqualityCmaintenanceEnables secure, configurable access to one or more Syncthing instances over MCP, with read-only defaults and opt-in write, destructive, and administrative operations. Supports stdio and authenticated Streamable HTTP transports, typed tools, bounded responses, and multi-instance configuration.40MIT
- AlicenseNot gradedqualityCmaintenanceTurns any API with an OpenAPI 3.0/3.1/3.2 spec into callable MCP tools: it generates a tool per supported operation, validates arguments, and forwards authenticated requests, served over stdio or local HTTP or embedded as a library. No hand-written tool per endpoint is required.MIT