Skip to main content
Glama
Semaphore UI MCP server

Semaphore UI MCP server

by johsem

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_task helper.

  • 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-mcp

The 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-tools

To 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

SEMAPHORE_URL

Required

Server root URL or URL ending in /api; reverse-proxy path prefixes are supported.

SEMAPHORE_API_TOKEN

Unset

Semaphore API token. Prefer a dedicated account with the permissions needed for your workflow.

SEMAPHORE_USERNAME

Unset

Username for session login when no API token is configured.

SEMAPHORE_PASSWORD

Unset

Password paired with SEMAPHORE_USERNAME.

SEMAPHORE_VERIFY_TLS

true

Validate Semaphore's HTTPS certificate. Disable only for a deliberately trusted development environment.

SEMAPHORE_CA_BUNDLE

Unset

Path to a PEM CA bundle for a private certificate authority.

SEMAPHORE_TIMEOUT

30

Upstream HTTP request timeout in seconds.

SEMAPHORE_TOOL_PROFILE

full

core exposes everyday inspection and task tools; full exposes the management catalogue.

SEMAPHORE_READ_ONLY

false

Disable management mutations and job execution.

SEMAPHORE_PROJECT_IDS

Unset

Comma-separated positive project IDs. Restrict project access and block global administration.

MCP_HTTP_TOKEN

Unset

Bearer token protecting Streamable HTTP. Required for non-loopback bindings, optional on loopback.

MCP_ALLOWED_HOSTS

Local host patterns

Comma-separated allowed HTTP host patterns. Include the hostname used by external clients.

MCP_ALLOWED_ORIGINS

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 full

Offline 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.

  1. Call list_projects to discover project IDs.

  2. Call list_templates with {"project_id": 1} to discover templates.

  3. Inspect the selected template and its inventory, environment, and repository.

  4. Launch a task with create_task:

    {
      "project_id": 1,
      "body": {
        "template_id": 2
      }
    }
  5. Use the returned task ID with get_task, get_task_output, or get_task_raw_output, each taking project_id and task_id.

  6. Use wait_for_task to 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

semaphore://capabilities

Server capabilities and API compatibility information.

semaphore://projects

Visible projects, respecting the allowlist.

semaphore://projects/{project_id}/{collection}

Project data; collection is project, templates, tasks, inventory, repositories, environments, or schedules.

semaphore://projects/{project_id}/tasks/{task_id}

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 8000

Connect 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 -d

The 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 stdio

Do 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.env

Replace 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-mcp

Connect 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 build

Unit 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 --docker

Use --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 tools
activate_subscriptionB
Destructive

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_inventoryC
Destructive

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_tasksC
DestructiveIdempotent

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

Inputs: body (required).

clear_global_runner_cacheC
DestructiveIdempotent

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

Inputs: runner_id (required).

clear_project_cacheC
DestructiveIdempotent

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

Inputs: project_id (required).

clear_project_runner_cacheC
DestructiveIdempotent

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

Inputs: runner_id (required), project_id (required).

clear_server_cacheC
DestructiveIdempotent

clear Cache. DELETE /cache.

Inputs: no named parameters.

confirm_taskC
Destructive

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

Inputs: task_id (required), project_id (required).

create_access_keyC
Destructive

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_tokenC
Destructive

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

Inputs: body.

create_environmentC
Destructive

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_roleB
Destructive

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_runnerC
Destructive

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

Inputs: body (required).

create_integrationB
Destructive

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_aliasC
Destructive

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

Inputs: project_id (required), integration_id (required).

create_integration_matcherB
Destructive

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_valueB
Destructive

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_inventoryC
Destructive

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_projectB
Destructive

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

Inputs: body (required).

create_project_integration_aliasC
Destructive

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

Inputs: project_id (required).

create_project_roleB
Destructive

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_runnerC
Destructive

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_userC
Destructive

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_repositoryC
Destructive

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_scheduleC
Destructive

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_storageC
Destructive

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_taskB
Destructive

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_templateC
Destructive

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_permissionC
Destructive

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_aliasC
Destructive

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_userB
Destructive

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

Inputs: body (required).

create_viewB
Destructive

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_workflowB
Destructive

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_keyC
DestructiveIdempotent

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

Inputs: key_id (required), project_id (required).

delete_api_tokenC
DestructiveIdempotent

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

Inputs: token_id (required).

delete_appC
DestructiveIdempotent

delete App. DELETE /apps/{app_id}.

Inputs: app_id (required).

delete_environmentC
DestructiveIdempotent

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

Inputs: project_id (required), environment_id (required).

delete_global_roleC
DestructiveIdempotent

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_runnerC
DestructiveIdempotent

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

Inputs: runner_id (required).

delete_global_taskB
DestructiveIdempotent

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

Inputs: task_id (required).

delete_integrationB
DestructiveIdempotent

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

Inputs: project_id (required), integration_id (required).

delete_integration_aliasB
DestructiveIdempotent

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_matcherC
DestructiveIdempotent

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_valueC
DestructiveIdempotent

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_inventoryC
DestructiveIdempotent

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

Inputs: project_id (required), inventory_id (required).

delete_projectC
DestructiveIdempotent

Delete project. DELETE /project/{project_id}.

Inputs: project_id (required).

delete_project_integration_aliasB
DestructiveIdempotent

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

Inputs: alias_id (required), project_id (required).

delete_project_roleB
DestructiveIdempotent

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_runnerC
DestructiveIdempotent

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

Inputs: runner_id (required), project_id (required).

delete_project_userB
DestructiveIdempotent

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

Inputs: user_id (required), project_id (required).

delete_repositoryC
DestructiveIdempotent

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

Inputs: project_id (required), repository_id (required).

delete_scheduleC
DestructiveIdempotent

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

Inputs: project_id (required), schedule_id (required).

delete_secret_storageC
DestructiveIdempotent

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

Inputs: project_id (required), storage_id (required).

delete_subscriptionA
DestructiveIdempotent

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_taskB
DestructiveIdempotent

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

Inputs: task_id (required), project_id (required).

delete_templateC
DestructiveIdempotent

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

Inputs: project_id (required), template_id (required).

delete_template_permissionC
DestructiveIdempotent

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_aliasA
DestructiveIdempotent

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_stateA
DestructiveIdempotent

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_userC
DestructiveIdempotent

Deletes user. DELETE /users/{user_id}.

Inputs: user_id (required).

delete_viewC
DestructiveIdempotent

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

Inputs: view_id (required), project_id (required).

delete_workflowB
DestructiveIdempotent

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_inventoryC
Destructive

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_totpC
DestructiveIdempotent

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

Inputs: totp_id (required), user_id (required).

enable_user_totpD
Destructive

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

Inputs: user_id (required).

get_access_keyC
Read-onlyIdempotent

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

Inputs: key_id (required), project_id (required).

get_access_key_referencesD
Read-onlyIdempotent

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

Inputs: key_id (required), project_id (required).

get_admin_infoC
Read-onlyIdempotent

get Admin Info. GET /admin/info.

Inputs: no named parameters.

get_appC
Read-onlyIdempotent

get App. GET /apps/{app_id}.

Inputs: app_id (required).

get_cluster_statusC
Read-onlyIdempotent

get Cluster Status. GET /cluster.

Inputs: no named parameters.

get_current_userA
Read-onlyIdempotent

Fetch logged in user. GET /user.

Inputs: no named parameters.

get_environmentC
Read-onlyIdempotent

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

Inputs: project_id (required), environment_id (required).

get_environment_referencesC
Read-onlyIdempotent

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

Inputs: project_id (required), environment_id (required).

get_global_roleA
Read-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_runnerC
Read-onlyIdempotent

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

Inputs: runner_id (required).

get_global_taskA
Read-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_integrationC
Read-onlyIdempotent

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

Inputs: project_id (required), integration_id (required).

get_integration_matcherC
Read-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_referencesD
Read-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_referencesC
Read-onlyIdempotent

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

Inputs: project_id (required), integration_id (required).

get_integration_valueC
Read-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_referencesC
Read-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_inventoryD
Read-onlyIdempotent

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

Inputs: project_id (required), inventory_id (required).

get_inventory_referencesD
Read-onlyIdempotent

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

Inputs: project_id (required), inventory_id (required).

get_latest_terraform_stateA
Read-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_projectC
Read-onlyIdempotent

Fetch project. GET /project/{project_id}.

Inputs: project_id (required).

get_project_backupC
Read-onlyIdempotent

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

Inputs: project_id (required).

get_project_permissionsB
Read-onlyIdempotent

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

Inputs: project_id (required).

get_project_roleA
Read-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_runnerC
Read-onlyIdempotent

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

Inputs: runner_id (required), project_id (required).

get_project_task_statsC
Read-onlyIdempotent

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

Inputs: project_id (required), end, start, user_id.

get_project_userC
Read-onlyIdempotent

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

Inputs: user_id (required), project_id (required).

get_repositoryC
Read-onlyIdempotent

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

Inputs: project_id (required), repository_id (required).

get_repository_referencesD
Read-onlyIdempotent

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

Inputs: project_id (required), repository_id (required).

get_scheduleC
Read-onlyIdempotent

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

Inputs: project_id (required), schedule_id (required).

get_secret_storageC
Read-onlyIdempotent

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

Inputs: project_id (required), storage_id (required).

get_secret_storage_referencesC
Read-onlyIdempotent

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

Inputs: project_id (required), storage_id (required).

get_server_optionsC
Read-onlyIdempotent

get Options. GET /options.

Inputs: no named parameters.

get_subscriptionA
Read-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_infoC
Read-onlyIdempotent

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

Inputs: no named parameters.

get_taskC
Read-onlyIdempotent

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

Inputs: task_id (required), project_id (required).

get_task_outputA
Read-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_outputB
Read-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_templateC
Read-onlyIdempotent

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

Inputs: project_id (required), template_id (required).

get_template_permissionC
Read-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_referencesC
Read-onlyIdempotent

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

Inputs: project_id (required), template_id (required).

get_template_task_statsC
Read-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_aliasA
Read-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_stateB
Read-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_userC
Read-onlyIdempotent

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

Inputs: user_id (required).

get_user_optionsA
Read-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_qrD
Read-onlyIdempotent

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

Inputs: totp_id (required), user_id (required).

get_viewC
Read-onlyIdempotent

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

Inputs: view_id (required), project_id (required).

get_workflowA
Read-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_runB
Read-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_artifactsA
Read-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_projectC
DestructiveIdempotent

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

Inputs: project_id (required).

list_access_keysC
Read-onlyIdempotent

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

Inputs: project_id (required), sort, order.

list_api_tokensB
Read-onlyIdempotent

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

Inputs: no named parameters.

list_appsC
Read-onlyIdempotent

Get apps. GET /apps.

Inputs: no named parameters.

list_available_project_rolesA
Read-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_tasksC
Read-onlyIdempotent

get Cluster Tasks. GET /cluster/tasks.

Inputs: no named parameters.

list_environmentsC
Read-onlyIdempotent

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

Inputs: project_id (required), sort, order.

list_eventsB
Read-onlyIdempotent

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

Inputs: no named parameters.

list_global_rolesA
Read-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_runnersB
Read-onlyIdempotent

Get all global runners. GET /runners.

Inputs: no named parameters.

list_global_runner_tagsB
Read-onlyIdempotent

Get global runner tags. GET /runner_tags.

Inputs: no named parameters.

list_global_tasksC
Read-onlyIdempotent

Get Tasks. GET /tasks.

Inputs: no named parameters.

list_integration_aliasesB
Read-onlyIdempotent

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

Inputs: project_id (required), integration_id (required).

list_integration_matchersC
Read-onlyIdempotent

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

Inputs: project_id (required), integration_id (required).

list_integrationsC
Read-onlyIdempotent

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

Inputs: project_id (required).

list_integration_valuesB
Read-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_inventoriesC
Read-onlyIdempotent

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

Inputs: project_id (required), app, sort, order, +1 more.

list_project_eventsB
Read-onlyIdempotent

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

Inputs: project_id (required).

list_project_integration_aliasesB
Read-onlyIdempotent

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

Inputs: project_id (required).

list_project_rolesB
Read-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_runnersA
Read-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_tagsC
Read-onlyIdempotent

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

Inputs: project_id (required).

list_projectsC
Read-onlyIdempotent

Get projects. GET /projects.

Inputs: no named parameters.

list_project_usersC
Read-onlyIdempotent

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

Inputs: project_id (required), sort, order.

list_recent_eventsA
Read-onlyIdempotent

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

Inputs: no named parameters.

list_recent_project_eventsD
Read-onlyIdempotent

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

Inputs: project_id (required).

list_recent_tasksB
Read-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_tasksA
Read-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_repositoriesC
Read-onlyIdempotent

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

Inputs: project_id (required), sort, order.

list_repository_branchesC
Read-onlyIdempotent

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

Inputs: project_id (required), repository_id (required).

list_repository_playbooksC
Read-onlyIdempotent

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

Inputs: project_id (required), repository_id (required), branch.

list_schedulesC
Read-onlyIdempotent

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

Inputs: project_id (required).

list_secret_storagesC
Read-onlyIdempotent

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

Inputs: project_id (required).

list_task_ansible_errorsC
Read-onlyIdempotent

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

Inputs: task_id (required), project_id (required).

list_task_ansible_hostsC
Read-onlyIdempotent

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

Inputs: task_id (required), project_id (required).

list_tasksA
Read-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_stagesC
Read-onlyIdempotent

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

Inputs: task_id (required), project_id (required).

list_template_permissionsC
Read-onlyIdempotent

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

Inputs: project_id (required), template_id (required).

list_templatesC
Read-onlyIdempotent

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

Inputs: project_id (required), app, sort, order.

list_template_schedulesC
Read-onlyIdempotent

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

Inputs: project_id (required), template_id (required).

list_template_tasksA
Read-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_aliasesA
Read-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_statesA
Read-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_usersB
Read-onlyIdempotent

Fetches all users. GET /users.

Inputs: no named parameters.

list_viewsC
Read-onlyIdempotent

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

Inputs: project_id (required).

list_view_templatesC
Read-onlyIdempotent

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

Inputs: view_id (required), project_id (required).

list_workflow_run_approvalsA
Read-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_runsB
Read-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_workflowsB
Read-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).

pingB
Read-onlyIdempotent

PING test. GET /ping.

Inputs: no named parameters.

refresh_subscriptionA
Destructive

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_tokenA
Destructive

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_tokenA
Destructive

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_taskC
Destructive

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

Inputs: task_id (required), project_id (required).

resolve_workflow_approvalB
Destructive

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_projectC
Destructive

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

Inputs: body (required).

run_workflowB
Destructive

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_activeC
Destructive

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_activeB
Destructive

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_activeC
Destructive

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_activeC
DestructiveIdempotent

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_optionC
Destructive

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

Inputs: body (required).

set_template_default_inventoryC
Destructive

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_optionA
Destructive

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_positionsC
Destructive

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_taskC
Destructive

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_tasksC
Destructive

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_runA
Destructive

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_environmentC
Destructive

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

Inputs: project_id (required), environment_id (required).

sync_secret_storageC
Destructive

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_notificationA
Destructive

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

Inputs: project_id (required).

update_access_keyC
DestructiveIdempotent

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_appC
DestructiveIdempotent

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_environmentC
DestructiveIdempotent

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_roleB
DestructiveIdempotent

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_runnerC
DestructiveIdempotent

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_integrationC
DestructiveIdempotent

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_matcherC
DestructiveIdempotent

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_valueC
DestructiveIdempotent

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_inventoryC
DestructiveIdempotent

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_projectC
DestructiveIdempotent

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_roleB
DestructiveIdempotent

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_runnerC
DestructiveIdempotent

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_userC
DestructiveIdempotent

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_repositoryC
DestructiveIdempotent

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_scheduleC
DestructiveIdempotent

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_storageC
DestructiveIdempotent

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_templateC
DestructiveIdempotent

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_descriptionB
DestructiveIdempotent

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_permissionC
DestructiveIdempotent

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_aliasB
DestructiveIdempotent

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_userC
DestructiveIdempotent

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_passwordC
Destructive

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_viewC
DestructiveIdempotent

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_workflowA
DestructiveIdempotent

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_scheduleC
Read-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_taskA
Read-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

    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 recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      C
      quality
      D
      maintenance
      Schema-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
      -
    • A
      license
      A
      quality
      B
      maintenance
      A 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.
      8
      25 npm
      Apache 2.0
    • A
      license
      D
      quality
      C
      maintenance
      Enables 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.
      40
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Turns 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