Skip to main content
Glama
semaphore-mcp-server

semaphore-mcp-server

Semaphore MCP Server

Semaphore MCP Server Packaging: deb M8ven Score

A Model Context Protocol (MCP) server for Semaphore UI - the modern open-source alternative to Ansible Tower/AWX.

This server enables AI assistants and MCP-compatible tools to interact with Semaphore UI for managing Ansible, Terraform, and other automation workflows.

Features

  • Project Management — List, create, and delete projects

  • Task Management — Launch, monitor, stop, and retrieve output of tasks

  • Template Management — CRUD operations on job templates

  • Inventory Management — Manage Ansible inventories

  • Repository Management — Manage Git repositories

  • Environment Management — Manage environment variable sets

  • Key Store — List and manage SSH keys and credentials

  • Schedule Management — Create and manage cron-based schedules

  • User & Events — Get user info and project event logs

  • Server Info — Check server health and version

Related MCP server: SemaphoreUI MCP Server

Installation

pip install -e .

Or with the semaphore client from a local path:

pip install -e /path/to/python3-semaphore-client
pip install -e .

Configuration

Copy .env.example to .env and configure:

cp .env.example .env

Required environment variables:

Variable

Description

SEMAPHORE_URL

Base URL of your Semaphore UI instance (e.g., http://localhost:3000)

SEMAPHORE_TOKEN

API Bearer token (create via Semaphore UI or API)

Optional environment variables:

Variable

Default

Description

READ_ONLY

true

Set to false to enable write operations

DEBUG

(unset)

Set to true for verbose logging

Creating an API Token

  1. Via Web UI (Semaphore 2.14+): Go to your user settings and create a token

  2. Via API:

    # Login
    curl -c /tmp/semaphore-cookie -XPOST \
      -H 'Content-Type: application/json' \
      -d '{"auth": "YOUR_LOGIN", "password": "YOUR_PASSWORD"}' \
      http://localhost:3000/api/auth/login
    
    # Generate token
    curl -b /tmp/semaphore-cookie -XPOST \
      http://localhost:3000/api/user/tokens

Usage

Running the MCP Server

semaphore-mcp

MCP Configuration

Add to your MCP client configuration (e.g., VS Code mcp.json):

{
  "servers": {
    "semaphore": {
      "command": "semaphore-mcp",
      "env": {
        "SEMAPHORE_URL": "http://localhost:3000",
        "SEMAPHORE_TOKEN": "your-token-here",
        "READ_ONLY": "false"
      }
    }
  }
}

Or for Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "semaphore": {
      "command": "semaphore-mcp",
      "env": {
        "SEMAPHORE_URL": "http://localhost:3000",
        "SEMAPHORE_TOKEN": "your-token-here"
      }
    }
  }
}

Available Tools

Tools declare MCP annotations (readOnlyHint, destructiveHint, …). Write tools call validate_read_only() and refuse when READ_ONLY=true (default).

Tool

Description

Mode

project_list

List all projects

read

project_get

Get project details

read

project_create

Create a new project

write

project_delete

Delete a project

write

task_list

List tasks in a project

read

task_get

Get task details

read

task_launch

Launch a task from a template

write

task_stop

Stop a running task

write

task_output

Get task output/log

read

task_delete

Delete a task

write

template_list

List templates in a project

read

template_get

Get template details

read

template_create

Create a new template

write

template_delete

Delete a template

write

inventory_list

List inventories in a project

read

inventory_get

Get inventory details

read

inventory_create

Create a new inventory

write

inventory_delete

Delete an inventory

write

repository_list

List repositories in a project

read

repository_get

Get repository details

read

repository_create

Create a new repository

write

repository_delete

Delete a repository

write

environment_list

List environments in a project

read

environment_get

Get environment details

read

environment_create

Create a new environment

write

environment_delete

Delete an environment

write

key_list

List keys/credentials in a project

read

key_get

Get key details

read

key_delete

Delete a key

write

schedule_list

List schedules in a project

read

schedule_create

Create a new schedule

write

schedule_delete

Delete a schedule

write

user_get_current

Get current user info

read

user_tokens

List user API tokens

read

event_list

List project events

read

server_info

Get server version/info

read

server_ping

Check server connectivity

read

When READ_ONLY=true (default), create/update/delete/launch/stop tools raise a clear error. Set READ_ONLY=false to allow mutating operations.

Dependencies

This project uses python3-semaphore-client — an OpenAPI-generated Python client library for the Semaphore UI API (v2.16.14).

Development

# Install in development mode
pip install -e ".[dev]"

# Run directly
python -m semaphore_mcp.semaphore_mcp_server

Live capability scenario

Exercises every read tool against a real Semaphore instance and verifies that write tools refuse under READ_ONLY=true:

SEMAPHORE_URL=https://semaphore.example.com \
SEMAPHORE_TOKEN=... READ_ONLY=true \
  python tests/live_capability_scenario.py --json-out /tmp/semaphore-live.json

Or with CLI flags:

python tests/live_capability_scenario.py \
  --url https://semaphore.example.com \
  --token "$SEMAPHORE_TOKEN" \
  --json-out /tmp/semaphore-live.json

Exit code is non-zero when any non-skipped check fails.

License

MIT

Available Tools

37 tools
environment_createC

Create a new environment.

Inputs: project_id (required), name (required), json_data, password. Returns: result

environment_deleteC

Delete an environment.

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

environment_getA

Get details of a specific environment.

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

environment_listA

List all environments in a project.

Inputs: project_id (required). Returns: result

event_listC

List events for a project.

Inputs: project_id (required). Returns: result

inventory_createB

Create a new inventory.

Inputs: project_id (required), name (required), inventory (required), ssh_key_id (required), +2 more. Returns: result

inventory_deleteC

Delete an inventory.

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

inventory_getC

Get details of a specific inventory.

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

inventory_listB

List all inventories in a project.

Inputs: project_id (required), sort, order. Returns: result

key_deleteC

Delete a key.

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

key_getB

Get details of a specific key.

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

key_listB

List all keys (credentials) in a project.

Inputs: project_id (required), sort, order. Returns: result

project_createC

Create a new project.

Inputs: name (required), alert, max_parallel_tasks. Returns: result

project_deleteC

Delete a project.

Inputs: project_id (required). Returns: result

project_getB

Get details of a specific project.

Inputs: project_id (required). Returns: result

project_listA

List all projects accessible to the current user.

Returns: JSON list of projects with their details.

Inputs: no named parameters. Returns: result

repository_createC

Create a new repository.

Inputs: project_id (required), name (required), git_url (required), ssh_key_id (required), +1 more. Returns: result

repository_deleteC

Delete a repository.

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

repository_getB

Get details of a specific repository.

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

repository_listA

List all repositories in a project.

Inputs: project_id (required), sort, order. Returns: result

schedule_createB

Create a new schedule for a template.

Inputs: project_id (required), template_id (required), cron_format (required), name. Returns: result

schedule_deleteB

Delete a schedule.

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

schedule_listB

List all schedules in a project.

Inputs: project_id (required). Returns: result

server_infoA

Get Semaphore server information (version, configuration).

Returns: JSON object with server info.

Inputs: no named parameters. Returns: result

server_pingA

Ping the Semaphore server to check connectivity.

Returns: Ping response confirming the server is reachable.

Inputs: no named parameters. Returns: result

task_deleteB

Delete a task.

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

task_getC

Get details of a specific task.

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

task_launchC

Launch a new task from a template.

Inputs: project_id (required), template_id (required), debug, dry_run, +2 more. Returns: result

task_listC

List all tasks in a project.

Inputs: project_id (required). Returns: result

task_outputB

Get the output log of a task.

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

task_stopB

Stop a running task.

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

template_createC

Create a new template (job template).

Inputs: project_id (required), name (required), playbook (required), inventory_id (required), +6 more. Returns: result

template_deleteD

Delete a template.

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

template_getB

Get details of a specific template.

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

template_listB

List all templates in a project.

Inputs: project_id (required), sort, order. Returns: result

user_get_currentA

Get the current authenticated user's information.

Returns: JSON object with current user details.

Inputs: no named parameters. Returns: result

user_tokensA

List API tokens for the current user.

Returns: JSON list of API tokens.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

    TDQS

    C2.8/5.0

    Scored across 37 tools

    Disambiguation5/5

    Each tool targets a specific resource and action (e.g., environment_create, inventory_list), with no overlapping descriptions. Even similar tools like server_info and server_ping have clearly distinct purposes.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., environment_create, task_get). No mixing of conventions or abbreviations.

    Tool Count2/5

    With 37 tools, the count is well above the recommended range for coherence (16-25 feels heavy; 37 is excessive). While the domain is broad, many tools could be consolidated or are unnecessary for core workflows.

    Completeness2/5

    Missing update operations for environment, inventory, project, repository, schedule, and template. Also missing key_create. These gaps hinder full lifecycle management and may cause agent failures.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers