get_step_logs returns the output of the step that broke, decoded from the base64 chunks the API actually sends, in line order, with its exit code — and from the end of the log by default, because that is where the error is.
The whole API, not the read half
Restart a pipeline, cancel a runaway, approve a blocked one, rotate a secret, fix a cron, drain an agent. 71 tools against Woodpecker 3.18.0 — the point of an MCP server for a CI system is doing something about what it tells you.
Only the tools you want
WOODPECKER_READ_ONLY=true registers the 34 read tools and nothing else. WOODPECKER_ALLOW_TOOLS cuts finer — essential for a curated eight, your own comma-separated list, or a whole family with list_* — and WOODPECKER_DENY_TOOLS subtracts. Whatever is filtered out does not exist on the protocol rather than failing when called, and a name that matches no tool stops the server at startup instead of quietly going missing.
Safe by default
Twenty-four irreversible operations ask a person first, through MCP elicitation — a dialog the model cannot answer on its behalf, falling back to a server-issued token bound to the exact arguments where the client cannot show one. Agent tokens are redacted on read, build logs are marked untrusted, and read-only mode simply does not register the write tools.
The server reads and drives the Woodpecker server. The agents that actually run your pipelines pull their work directly from it, on a path this server never touches — which is why an agent token is a credential worth redacting.
The tool list is not fixed. WOODPECKER_ALLOW_TOOLS=essential narrows it to the eight that cover the job end to end — find the repository, read its pipelines and logs, run one again — and a name that matches nothing stops the server instead of quietly leaving a tool out of tools/list.
Recorded from docs/demo.tape against a throwaway instance. The server starts without any configuration at all, so registries and inspectors can introspect it; every call then fails with setup instructions instead of reaching the API.
A client that cannot spawn a local process — ChatGPT connectors, Claude on the web, Cursor, LibreChat — cannot start woodpecker-ci-mcp the way Claude Code does. mcp-hub is the bridge: one container serves many stdio MCP servers over Streamable HTTP, with an OAuth 2.1 login behind a single password and long-lived tokens for the clients that cannot do OAuth. Its /hub endpoint puts every server behind six meta-tools, so one connector reaches all of them without N×tool schemas in the model's context, and it speaks both protocol revisions — a question this server asks travels through it to the person at the far end instead of ending at the gateway.
Its configuration is Claude Code's mcpServers format, so the entry you already have is the entry it takes: Through mcp-hub.