Skip to main content
Glama
workflowlint-mcp
by 0xmortuex

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
--dirNoOnly files inside this directory can be read (default: the current directory). Server flag, e.g. `uvx workflowlint-mcp --dir /path/to/repo`..
--disableNoComma-separated rule ids to turn off, e.g. `--disable GHA1013,GHA1021`. Repeatable.
GITHUB_TOKENNoOptional. If set in the server's environment it is sent only as the Authorization header to api.github.com for the opt-in online SHA lookup (`pin_actions_plan(online=true)`), avoiding the 60 requests/hour limit. Never printed.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

Audit GitHub Actions workflows (.github/workflows/*.yml and local composite actions) for security and correctness problems. Read-only and offline by default. Pass a workflow file, a repo root, or the workflows directory (relative to the server's --dir, or absolute inside it). Typical flow: workflows_overview to see what exists, lint_workflows for rule IDs + line numbers + concrete fixes, fix_preview for a diff of the safe fixes, pin_actions_plan to pin actions to commit SHAs, permissions_review for least-privilege GITHUB_TOKEN permissions, explain_triggers for when a workflow runs (cron explained with next run times), job_graph for the needs graph. Silence a finding with a # workflowlint-ignore: GHA1003 comment on the line above it.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
workflows_overviewA

Summarize GitHub Actions workflows: triggers, jobs with runners and needs, permissions per job, every action used (version, whether pinned to a commit SHA), environments, and the NAMES of the secrets each job references (values are never read). Also covers local composite actions under .github/actions. path is a workflow file, a repo root containing .github/workflows, or the workflows directory. Invalid YAML is reported with its line instead of failing. Start here.

lint_workflowsA

Lint workflows and composite actions with 33 rules (GHA1001-GHA1033). Each finding has a rule id, severity (error/warning/info), file:line (exact line inside multi-line run: | blocks), an explanation and a concrete fix. Covers: actions not pinned to a commit SHA, pwn requests (pull_request_target / workflow_run + checkout of PR code), script injection through github.event.* / head_ref / inputs inside run: or github-script, missing or write-all permissions, secrets: inherit, secrets echoed or on command lines, curl | bash, checkout credentials left behind, self-hosted runners on PR triggers, deprecated commands (set-output, set-env), timeouts, concurrency, needs mistakes and cycles, always-true if: expressions, unknown/misspelled contexts, matrix size, reusable-workflow input/secret mismatches, retired action versions (dated table), cache keys, continue-on-error, unquoted 3.10 versions, invalid cron. Suppress with # workflowlint-ignore: GHA1003 above the line. Never modifies anything.

explain_triggersB

Explain in plain English when each workflow runs: push/PR filters, which pull request types, fork behaviour, manual inputs, reusable-workflow interface, workflow_run chains, and schedule cron expressions explained with the next 5 run times in UTC (computed by a built-in cron implementation, including the day-of-month OR day-of-week rule). Flags congested schedules (minute 0), intervals under 5 minutes, and reminds that scheduled workflows run only on the default branch and are disabled after 60 days of repository inactivity.

permissions_reviewA

Show the effective GITHUB_TOKEN permissions of every job (job-level replaces workflow-level; absent means the repository default), infer what each job actually needs from the actions and gh/git commands it uses, flag write access that looks unnecessary and permissions that are missing, and print a least-privilege permissions: block per job. The inference is heuristic and says when it is partial.

job_graphB

Draw each workflow's job needs: graph as text and as a Mermaid diagram, group jobs into waves that can run in parallel, and show the critical path (longest dependency chain) plus a worst-case duration bound from timeout-minutes. Reports cycles.

pin_actions_planA

List every uses: that is not pinned to a full commit SHA (grouped by action version, with file:line) and how to pin each. With online=false (default) nothing touches the network and you get git ls-remote instructions. With online=true each tag or branch is resolved to its commit SHA through api.github.com only (annotated tags are dereferenced; results cached; honest rate-limit messages; an optional GITHUB_TOKEN in the server's environment raises the limit and is sent only to that host). Output is a plan as text: nothing is written.

fix_previewA

Show a unified diff of the safe automatic fixes for a workflow file (or every workflow under a directory): add a top-level permissions: contents: read when every job is recognised as read-only, move injectable ${{ github.event.* }} expressions out of run: scripts into step env: variables, and replace ::set-output with $GITHUB_OUTPUT. The patched text is re-linted to prove the findings disappear and none are introduced. Never writes the file: apply the diff yourself. Lists what needs a manual change.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a recognizable specialization: summary, rule-based linting, trigger explanation, token permissions, job dependency graph, action pinning, and fix diffs. There is mild overlap where workflows_overview already reports permissions and pinned/unpinned actions that permissions_review and pin_actions_plan dig into, and lint_workflows also flags unpinned actions and permission issues. The descriptions make clear which is the deep-dive versus the summary, so misselection is unlikely but not impossible.

Naming Consistency3/5

All names are snake_case and readable, but the verb/noun ordering is inconsistent: verb_noun in lint_workflows, explain_triggers, pin_actions_plan, fix_preview, versus noun_verb in workflows_overview and permissions_review, plus the bare noun job_graph. An agent can still infer behavior, but there is no single predictable pattern.

Tool Count5/5

Seven tools is well within the ideal range and each one maps to a distinct analysis concern of a GitHub Actions auditing server. No tool feels redundant padding or conspicuously absent from the set.

Completeness4/5

The surface covers the full read-only audit lifecycle: inventory, linting, trigger semantics, permissions, dependency graph, pinning plan, and a fix diff with re-lint verification. The main gap is that fix_preview never applies changes and there is no write/apply tool, so remediation is a manual dead end by design; cross-file or multi-repo bulk analysis is also absent. These are workaroundable but limit end-to-end automation.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues