woodpecker-ci-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ELICITATION | No | false replaces the approval dialog with the two-call token. Not prefixed | true |
| WOODPECKER_URL | Yes | Root URL of the server, e.g. https://woodpecker.example.com | |
| WOODPECKER_TOKEN | Yes | Personal access token from your user settings | |
| WOODPECKER_READ_ONLY | No | true registers only the 34 read tools | false |
| WOODPECKER_DENY_TOOLS | No | Same syntax; removed from whatever WOODPECKER_ALLOW_TOOLS left | |
| WOODPECKER_ALLOW_TOOLS | No | Comma-separated tool names, list_* prefixes, or essential for a curated preset | |
| WOODPECKER_INSECURE_TLS | No | true accepts self-signed certificates (scoped to this connection) | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_repositoriesA | Lists repositories. By default the ones the authenticated account can see in Woodpecker; with include_inactive it also lists repositories that exist in the forge but were never activated, which is where the forge_remote_id for activate_repository comes from. scope="instance" lists every repository on the server and needs an administrator. |
| get_repositoryA | Returns the full Woodpecker configuration of one repository: trusted flags, timeout, approval mode, config file path and the extension endpoints. |
| lookup_repositoryA | Resolves an "owner/name" pair to a repository id. Every other repository tool takes the numeric id, and this is how you get one. A repository that exists in the forge but was never activated in Woodpecker answers 404 — use list_repositories with include_inactive to find it. |
| get_repository_permissionsA | What the authenticated account may do with this repository: pull, push and admin. Woodpecker inherits these from the forge, so this answers "why was that 403" without guessing. |
| list_repository_branchesA | Lists the branches of a repository, as Woodpecker sees them in the forge. Useful before trigger_pipeline, which fails with a bare 400 on a branch that does not exist. |
| list_pull_requestsB | Lists the open pull requests of a repository, with the index a pipeline ref like "refs/pull/42/head" refers to. |
| activate_repositoryA | Turns on Woodpecker for a repository that exists in the forge, which installs the webhook and makes pipelines run. Takes the forge-side id, NOT an owner/name pair and not a Woodpecker id — call list_repositories with include_inactive=true and read forge_remote_id from the entry. |
| update_repositoryA | Changes Woodpecker settings of a repository. Only the fields you pass are touched. Note that "trusted" grants pipelines of this repository elevated container privileges and is an administrator-only change. |
| repair_repositoryA | Re-installs the forge webhook and refreshes the stored repository data. This is the fix for "pushes no longer start a pipeline" after a repository was renamed or the Woodpecker URL changed. With scope="instance" it does that for every repository on the server, which is two-step and hits the forge API once per repository. |
| move_repositoryA | Tells Woodpecker that a repository moved to a different owner or name in the forge. It does NOT move anything in the forge — do that first, then call this so Woodpecker follows. Two-step. IMPORTANT on older instances: verified against 3.11, this endpoint performs the move and THEN answers HTTP 500 ("could not determine repo for permission") when the caller is an instance administrator. The move has happened — read the repository back with get_repository before deciding anything, and do not retry, which would move it a second time. Verified against 3.18, the call answers cleanly. Most of the time it is not needed at all: forges that send webhooks report a rename and Woodpecker follows it by itself, and calling this afterwards fails on a duplicate redirection. |
| chown_repositoryA | Makes the authenticated account the repository's owner in Woodpecker. The owner's forge token is what Woodpecker uses to read the repository and report build status, so this is the fix when the previous owner left. Asks a person first; where the client cannot show a dialog, call once to receive a token and again with it. |
| delete_repositoryA | Removes a repository from Woodpecker: the webhook, every pipeline, all logs, secrets, registries and cron jobs of that repository. The forge repository itself is untouched. Two-step. |
| list_pipelinesA | Lists a repository's pipelines, newest first, summarised to what a list needs. Filters are applied by the server. Note that "number" — not the pipeline id — is what every other pipeline tool takes. |
| get_pipelineA | Returns one pipeline with its workflows and steps, including each step id — which is what get_step_logs needs. Step state and exit_code say which step to look at. |
| get_pipeline_configA | Returns the pipeline YAML files this run was built from, as they were at that commit. This is the config that actually ran, not the one currently in the branch. |
| get_pipeline_metadataA | Returns the metadata Woodpecker exposes to the pipeline itself — the CI_* environment a step sees, plus the previous pipeline of the same workflow. Useful when a step behaves differently than its config suggests. |
| list_queued_pipelinesA | Lists the pipelines waiting in the server queue across all repositories. This is the instance-wide view: what is stuck, and behind what. get_queue_info adds the agent side of the same picture. |
| trigger_pipelineA | Starts a pipeline manually on a branch. It runs the config as it is in that branch right now, with event "manual". A branch that does not exist is rejected with a bare 400, so check list_repository_branches first. Not idempotent and there is no way to make it so — Woodpecker has no idempotency key — so a retry after a timeout starts a second pipeline. Read list_pipelines before calling again. |
| restart_pipelineA | Runs an existing pipeline again, at the same commit and with the same config it used then. The re-run gets a new number; the original is kept. Every call is another run — a retry after a timeout starts a second one, and Woodpecker offers no idempotency key to prevent that. |
| cancel_pipelineA | Stops a pipeline that is pending or running. Its steps are killed where they are, so anything half-written stays half-written. The pipeline can be restarted afterwards. |
| approve_pipelineA | Releases a pipeline that is waiting for approval (status "blocked") and lets it run. Read what you are approving first: pipelines are usually blocked because they come from a fork, and approving one runs code from that fork with this repository's secrets. |
| decline_pipelineA | Refuses a pipeline that is waiting for approval. It ends as "declined" and never runs; the pipeline entry and its metadata stay. |
| delete_pipelineA | Removes a pipeline and everything attached to it, including its logs. A running pipeline cannot be deleted — cancel it first. Two-step. |
| get_step_logsA | Returns the output of one pipeline step as text, newest end first by default — a failing step almost always explains itself in its last lines. The step id comes from get_pipeline (workflows[].steps[].id). Woodpecker returns these lines base64-encoded; this tool decodes and reassembles them. |
| delete_step_logsA | Deletes the stored output of a single step. The step and the pipeline stay, their logs do not. This is what you use when a step printed a secret. Two-step. Rotate the leaked credential as well — the log was readable until now, and deleting it does not un-read it. |
| delete_pipeline_logsA | Deletes the stored output of every step of a pipeline. The pipeline and its step results stay, so it still shows which step failed — just not why. Two-step. |
| list_secretsA | Lists the secrets at one level — repository, organization or instance-wide. Values are never returned by Woodpecker, not even here; you get names, events and image restrictions. Note that a pipeline sees all three levels, so a name missing here may still exist one level up. |
| get_secretA | Returns one secret's metadata: which events and images it applies to, and its note. The value is not part of the answer — Woodpecker strips it from every response, including the one right after creating it. |
| create_secretA | Creates a secret at the chosen level. The value is write-only: it is never readable again through the API, so store it somewhere else too. At least one event is required — the API has no defaults, and a secret without pull_request is invisible to pull-request builds. |
| update_secretA | Changes a secret. Only the fields you pass are touched — but "events" and "images" are replaced wholesale, not merged, so pass the complete list. Passing "value" rotates the secret. |
| delete_secretA | Deletes a secret. Any pipeline that reads it starts failing — or worse, keeps running with an empty value. Two-step. |
| list_registriesA | Lists the container registry credentials at one level. These are what let a pipeline pull private images. Passwords are never returned. |
| get_registryA | Returns one registry entry — its address and username. The password is stripped by Woodpecker (Registry.Copy), so it is never in the answer. |
| create_registryA | Stores credentials for a container registry so pipelines can pull private images from it. The address is the identifier — there is no separate name — so "docker.io" and "index.docker.io" are two different entries. |
| update_registryA | Changes the username or password of a registry entry. The address itself cannot be changed — it is the identifier; delete and re-create instead. |
| delete_registryA | Removes stored credentials for a registry. Pipelines that pull private images from it start failing at the pull step. Two-step. |
| list_cronsA | Lists the scheduled pipeline runs of a repository, with the next execution time of each. |
| get_cronA | Returns one cron job, including the variables it passes. |
| create_cronA | Schedules a pipeline run. The pipeline runs with event "cron", so steps and secrets restricted to other events do not apply to it — a cron job whose steps all have "when: event: push" runs and does nothing. |
| update_cronA | Changes a cron job. Only the fields you pass are touched — including "enabled", which is how a schedule is paused without losing it. |
| run_cronA | Starts the cron job's pipeline immediately, without waiting for its schedule. The schedule itself is unchanged, and the run counts as a cron event — which is the point: this is how you test that a nightly job works before waiting a night for it. Every call is another run; a retry after a timeout starts a second one. |
| delete_cronA | Removes a scheduled run. If you only want it to stop for now, update_cron with enabled=false keeps the definition. Two-step. |
| list_organizationsA | Lists the organizations known to this Woodpecker instance. Admin only. Note that an entry with is_user=true is a personal account, not a real organization — Woodpecker models both the same way, and org-level secrets work for both. |
| get_organizationA | Returns one organization by its numeric id. |
| lookup_organizationA | Resolves an organization name to its id — the id every other org-level call needs, including org-scoped secrets and registries. |
| get_organization_permissionsA | What the authenticated account may do in this organization: member and admin. Org-level secrets and agents need admin here. |
| delete_organizationA | Removes an organization from Woodpecker together with its org-level secrets, registries and agents. Admin only. It does not touch the forge, and it does not delete the repositories — but anything of theirs that relied on an org-level secret stops working. Two-step. |
| get_current_userA | Returns the account WOODPECKER_TOKEN belongs to, including whether it is an instance administrator. This is the first thing to call when a tool answers 403: the admin-only tools need admin=true here. |
| get_pipeline_feedA | The activity feed of the authenticated account: the latest pipeline of every repository it can see, newest first. This is the "what is the state of everything" call — one request instead of list_pipelines per repository. |
| list_usersA | Lists the accounts known to this Woodpecker instance. Admin only. Woodpecker creates an account the first time someone logs in, so this is everyone who has ever used it, not a managed roster. |
| get_userA | Returns one account by its login. Admin only. forge_id is required — see list_users for the value. |
| create_userA | Registers an account ahead of its first login. Admin only. This does not create anything in the forge and grants no access there — the person still signs in through the forge; this only pre-creates the Woodpecker record, which is how you make someone an admin before they first log in. Passing admin=true asks a person first. |
| update_userA | Changes an account. Admin only. The one that matters is "admin": granting it gives full control of the instance, including every secret of every repository. Fields you do not pass are preserved. |
| delete_userA | Removes an account from Woodpecker. Admin only. Repositories the account owned keep running on a token that no longer exists, which shows up later as pipelines that stop starting — chown_repository moves ownership to someone else, and doing that first is the point. Two-step. |
| list_agentsA | Lists the build agents, with their platform, capacity, version and last contact — the call that answers "why is nothing being built". Without org_id this is the instance-wide list and needs an administrator. Agent tokens are redacted. |
| get_agentA | Returns one agent. Admin only. Its token is redacted; an agent that lost its token needs a new one, which means delete_agent and create_agent. |
| list_agent_tasksA | The work an agent is currently running. Admin only. This is how you find out what is occupying a busy agent, and which pipeline to cancel. |
| create_agentA | Registers a new build agent and returns its token. THE TOKEN IS A CREDENTIAL: whoever holds it can attach a machine to this server, receive pipeline workloads and read every secret those pipelines use. It is part of this answer because it is the only way to get it — put it straight into the agent's configuration and do not paste it anywhere else. |
| update_agentA | Changes an agent. Admin only. no_schedule=true is the drain switch: the agent finishes its current work and takes nothing new. |
| delete_agentA | Removes an agent and invalidates its token. Anything it was running is lost and has to be restarted. Drain it first with update_agent no_schedule=true. Two-step. |
| list_forgesA | Lists the forges this Woodpecker authenticates against. Admin only. The forge_id shown here is what get_user and delete_user require. |
| get_forgeA | Returns one forge configuration. Admin only. The OAuth client secret is not part of the read model and is never returned. |
| create_forgeA | Registers an additional forge. Admin only. The OAuth application has to exist on the forge side first, with this Woodpecker as its callback. |
| update_forgeA | Changes a forge configuration. Admin only, and two-step: this is the setting every login and every repository read depends on, and a wrong value locks everyone out of the instance — including whoever is fixing it. |
| delete_forgeA | Removes a forge from Woodpecker. Admin only. Everyone who signs in through it loses access, and its repositories can no longer be read. Two-step. |
| get_server_infoA | Returns the Woodpecker version and whether the server reports itself healthy. Works without a token, which makes it the call to use when nothing else does: if this answers, WOODPECKER_URL is right and the problem is WOODPECKER_TOKEN. |
| get_queue_infoA | The server-side build queue: what is pending, running and waiting on an agent, plus the agent statistics. Admin only. Together with list_queued_pipelines this is the whole answer to "why is my build not starting". |
| get_log_levelA | Returns the current log level of the Woodpecker server. Admin only. |
| pause_queueA | Stops the server from handing new work to agents. Running pipelines finish; everything else queues up. Admin only, and instance-wide — this stops CI for everybody, and it stays paused until someone calls resume_queue. Two-step. |
| resume_queueA | Lets the server hand work to agents again. Admin only. Queued pipelines start at once, so expect a burst. |
| set_log_levelA | Changes the log level of the running Woodpecker server, without a restart. Admin only. "debug" and "trace" are loud — set it back when you are done, and remember that trace logs request bodies. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ni-c/woodpecker-ci-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server