Skip to main content

woodpecker-mcp

An MCP server for Woodpecker CI, generated from the Woodpecker OpenAPI spec with fastmcp. Both streamable HTTP (default) and stdio are supported.

The server supports stateless MCP (spec 2026-07-28), so any number of replicas can run behind a plain load balancer without session affinity.

Only a subset of the Woodpecker API is exposed: read access to repos, pipelines, logs, orgs, and agents, plus five pipeline write operations (trigger, restart, cancel, approve, decline). Management of repos, secrets, crons, and agents is not exposed, and neither is forge or system administration.

Tools

Area Tools
Repos list_repos, lookup_repo, get_repo, get_repo_permissions, list_branches, list_pull_requests
Pipelines list_pipelines, get_pipeline, get_pipeline_config, get_pipeline_metadata
Pipeline ops (write) trigger_pipeline, restart_pipeline, cancel_pipeline, approve_pipeline, decline_pipeline
Logs get_step_logs
Orgs lookup_org, get_org, get_org_permissions
Queue & agents get_queue_info, list_agents, get_agent, list_agent_tasks
Secrets & registries (metadata only) list_repo_secrets, list_org_secrets, list_repo_registries, list_org_registries

get_step_logs returns plain text and defaults to the last 200 lines.

Configuration

Variable Required Description
WOODPECKER_SERVER yes Woodpecker server URL, e.g. https://ci.example.com (/api is appended).
WOODPECKER_TOKEN stdio only Personal access token. Optional with streamable HTTP, see below.
WOODPECKER_MCP_READ_ONLY no true, 1, yes, or on removes the five write tools.
WOODPECKER_MCP_TRANSPORT no http (default) or stdio.
HOST no Bind address for streamable HTTP. Default 0.0.0.0.
PORT no Bind port for streamable HTTP. Default 8000.

Authentication

With streamable HTTP, each client sends its own Woodpecker personal access token as a bearer header:

Authorization: Bearer <woodpecker-token>

The token is forwarded to Woodpecker for that request only, so clients never share credentials. Requests without a token fall back to WOODPECKER_TOKEN if set and are rejected otherwise.

With stdio there are no request headers, so WOODPECKER_TOKEN is required.

The server does not authenticate clients itself, so run it on a trusted network or behind TLS. token fields in Woodpecker responses, such as agent registration tokens, are redacted before they reach the client.

Running

Docker (streamable HTTP)

docker run -p 8000:8000 \
  -e WOODPECKER_SERVER=https://ci.example.com \
  ghcr.io/rtuszik/woodpecker-mcp:latest

Clients send their own tokens, so WOODPECKER_TOKEN is optional here. Set it to provide a fallback for clients without one.

The streamable HTTP endpoint is http://<host>:8000/mcp.

Clients on protocol versions older than 2026-07-28 are served in stateless mode, without an Mcp-Session-Id or a standalone SSE stream.

Connecting a client (streamable HTTP)

Claude Code:

claude mcp add --transport http woodpecker https://your-mcp-host/mcp \
  --header "Authorization: Bearer <your-woodpecker-token>"

Generic MCP client config:

{
  "mcpServers": {
    "woodpecker": {
      "type": "http",
      "url": "https://your-mcp-host/mcp",
      "headers": {
        "Authorization": "Bearer <your-woodpecker-token>"
      }
    }
  }
}

Replace your-mcp-host with your server's address. Some clients may refuse to send an Authorization header over plain http://, so terminate TLS at a reverse proxy for anything beyond localhost.

uvx (stdio)

The package is published on PyPI as woodpecker-ci-mcp. With WOODPECKER_MCP_TRANSPORT=stdio, a client can start the server directly.

Claude Code:

claude mcp add woodpecker \
  --env WOODPECKER_SERVER=https://ci.example.com \
  --env WOODPECKER_TOKEN=... \
  --env WOODPECKER_MCP_TRANSPORT=stdio \
  -- uvx woodpecker-ci-mcp

Generic MCP client config:

{
  "mcpServers": {
    "woodpecker": {
      "command": "uvx",
      "args": ["woodpecker-ci-mcp"],
      "env": {
        "WOODPECKER_SERVER": "https://ci.example.com",
        "WOODPECKER_TOKEN": "...",
        "WOODPECKER_MCP_TRANSPORT": "stdio"
      }
    }
  }
}

Development

mise install
uv sync            # install
uv run pytest      # tests
mise run check     # format, lint, typecheck, tests

The OpenAPI spec is in src/woodpecker_mcp/openapi.yaml and the tool allowlist is in src/woodpecker_mcp/spec.py.

Metadata

Release files for woodpecker-ci-mcp 0.5.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for woodpecker-ci-mcp 0.5.3
File Size Uploaded Provenance Actions
woodpecker_ci_mcp-0.5.3.tar.gz 21.4 kB Without provenance Details for woodpecker_ci_mcp-0.5.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for woodpecker-ci-mcp 0.5.3
File Interpreter ABI Platform Actions
woodpecker_ci_mcp-0.5.3-py3-none-any.whl Python 3 none any Details for woodpecker_ci_mcp-0.5.3-py3-none-any.whl

Total release size: 45.2 kB

Release files / woodpecker_ci_mcp-0.5.3.tar.gz

Download URL woodpecker_ci_mcp-0.5.3.tar.gz
Size 21.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4ef83dea6aa465d00fe56c4fdd847f97d2f527525078de919d983817de501492
BLAKE2b-256 checksum
How to use checksums
6c4c8de1c2b80f788acf552627b449b3016e657c40f0e55ae2dca715c3f1b74d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / woodpecker_ci_mcp-0.5.3-py3-none-any.whl

Download URL woodpecker_ci_mcp-0.5.3-py3-none-any.whl
Size 23.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
67cca010e2d8c0a8b8411fe2d9e695396c04d87d066e0fe8906cf05a2fb31e95
BLAKE2b-256 checksum
How to use checksums
45d1795f97cb8f8a799430192657bb7af1e5d63ea107c50f495296b2bd1266cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for woodpecker-ci-mcp 0.5.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page