@humanagencyp/deploy-mcp
OfficialThe @humanagencyp/deploy-mcp server lets you securely manage and trigger deployments for GitHub-hosted repositories, gating real user releases behind a signed receipt. It never builds code—only activates existing workflow runs. You can:
List deployments (
list_deployments): Retrieve recent workflow runs available for release, with their URLs and states.Get deployment details (
get_deployment): Fetch a specific workflow run's details by ID.Resolve references (
resolve_ref): Convert a branch, tag, or partial commit SHA into a full commit SHA, ensuring deploys target an exact commit.List environments (
list_environments): Enumerate repository environments (e.g., production, staging) using the host's naming.Deploy (
deploy): Dispatch a GitHub Actions workflow to deploy a specific commit to a target environment, optionally on a custom branch. Requires areceipt_id(injected by the gateway) that the pipeline verifies before promoting the build.
Provides tools for resolving branch/tag references to commit SHAs, listing environments, and dispatching deployment workflows on GitHub repositories.
Allows dispatching GitHub Actions workflow runs for deployment, listing recent workflow runs, and retrieving deployment status.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@humanagencyp/deploy-mcp what's the latest commit on main?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@humanagencyp/deploy-mcp
Deploy MCP server — make already-built software live, under bounded human authority.
Implements the executor side of the Human Agency Protocol
deploy@0.7 profile. Backend: GitHub Actions.
What it does
Exposes releasing as gated tools so an agent can put software in front of real users only with a signed receipt behind it. It does not decide whether a release is allowed — that is the Gatekeeper's job, and then the pipeline's.
The gated action is a release, not a build. Building harms nobody: a preview at a URL nobody visits has no consequence. Serving it does. So this server never builds — it activates a build that already exists, which means a human can open it and look before approving, and no rebuild can diverge from what was approved.
Tool | Kind | |
| read | builds that can be released, with their URLs |
| read | one build, with URL, state, and git-derived provenance ( |
| read | branch/tag → commit SHA |
| read | the repo's real environments |
| consequential | make an existing build live |
Related MCP server: OpsMCP
Setup
GITHUB_TOKEN=<fine-grained token>
HAP_DEPLOY_ARTIFACT_PATH=website/dist # optional — see "What the receipt binds"Fine-grained, scoped to one repository:
Permission | Why |
Actions: read & write | dispatch the workflow |
Environments: read | list environments for the authorization wizard |
Contents: read | resolve a branch to a commit |
Not Contents: write. This server releases builds that already exist; it
never authors or builds anything.
Two properties that are easy to lose
1. release declares ticket_id (HAP v0.7 wire vocabulary — was
receipt_id). That declaration is what makes a Suveren gateway inject the
ticket it just minted. Remove it and the pipeline has nothing to verify — the
chain quietly degrades to an unproven release. The tool refuses to dispatch
when the field is missing, so the failure is loud. release forwards the
value to the downstream GitHub Actions workflow as that workflow's
receipt_id input — the workflow's input name is unchanged (it lives in a
different repository, out of scope for this rename).
2. A build URL is required, not a commit or branch. release rejects
anything that is not a URL. The receipt binds that exact build — the same bytes
a human inspected. Call list_deployments first.
Deployment URLs come from GitHub's Deployments API, which hosts with a GitHub
integration (Vercel, Netlify, Render) populate with environment_url. So this
server never needs the host's credentials — GitHub already knows the address,
and that one value identifies the artifact, shows the human what they are
approving, and is what the host's promote command accepts.
What the receipt binds, and how the release checks it
The receipt binds the source commit the build came from — the value the released page shows in its footer, so a reader can tie the page to an approval without any account. GitHub's Deployments API reports only the trigger sha, and for a repository that commits its built artifact those differ: the trigger is the artifact commit, the source is the commit before it. Binding the trigger sha would certify a commit the page never displays.
get_deployment therefore derives provenance from git history, by the same
rule a build workflow uses to stamp the page (the last commit that touched
anything outside the artifact directory):
Field | Meaning |
| what to pass as |
|
|
| the page footer's value, when the page is reachable |
release re-derives sourceCommit itself and refuses if the supplied commit
differs. The footer is a cross-check that can only refuse — a reachable page
naming a different commit blocks the release — never the gate. So a staged
build behind SSO or a password releases normally; nothing here needs to fetch
it. Two things it does not do: it does not prove the artifact commit was
authored by the official build (an attestation does that), and it does not
verify repository, environment or pipeline (those live in the receipt's private
execution context — see the protocol's forward ledger).
The pipeline must verify
Dispatching is not the control point — anyone with repository write access can dispatch a workflow. The workflow itself must check the receipt before serving anything:
on:
workflow_dispatch:
inputs:
deployment_url: { required: true }
receipt_id: { required: true }
environment: { required: true }
jobs:
verify: # signature, action is a release, freshness,
# and that the receipt BINDS THIS BUILD
...
release:
needs: verify
steps:
- run: vercel promote "${{ inputs.deployment_url }}" --token "$VERCEL_TOKEN"Nothing is built here. promote re-points production at bytes that already
exist, so what goes live is exactly what was inspected.
on:
workflow_dispatch:
inputs:
sha: { required: true }
receipt_id: { required: true }
environment: { required: true }
jobs:
verify: # signature, scope, commit binding, freshness
...
deploy:
needs: verify
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.sha }} # the APPROVED commit, not the branch headBuilding the branch head instead of inputs.sha means a receipt for one commit
can ship another — and the receipt still verifies, certifying something false.
That is worse than having no receipt at all.
Limits, stated plainly
This server dispatches; it does not hold the deploy credentials the pipeline uses. The boundary is the receipt requirement, not the whole path.
GitHub returns no run id from a dispatch, so the run is matched by workflow and creation time. Best-effort: it reports no run rather than guessing wrong.
Licence
MIT
Available Tools
5 toolsdeployA
Deploy a specific commit by running a deployment pipeline. Requires a receipt: the pipeline verifies it before anything is released.
Inputs: sha (required), repo (required), workflow (required), environment (required), +2 more.
get_deploymentB
Get one workflow run by id.
Inputs: repo (required), run_id (required).
list_deploymentsB
List recent workflow runs for a repository.
Inputs: repo (required), limit, workflow.
list_environmentsA
List the deployment environments a repository defines. Names are the host's own vocabulary, not a fixed set.
Inputs: repo (required).
resolve_refA
Resolve a branch, tag or commit to a concrete commit SHA. Call this BEFORE deploying: a deploy is authorised for one specific commit, not for whatever a branch points at later.
Inputs: ref (required), repo (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: resolving a ref, listing deployments, getting a specific deployment, listing environments, and triggering a deploy. There is no overlap or ambiguity between the tools.
Most tools follow a verb_noun pattern (resolve_ref, list_deployments, get_deployment, list_environments). 'deploy' is a single verb, which is a minor deviation but still understandable and consistent in style.
The five tools are well-scoped for a deployment-focused server. Each tool covers a necessary part of the deployment workflow without being overly granular or redundant.
The core deployment lifecycle is covered: resolving a commit, deploying, listing, and getting deployments. Missing features like cancellation or rollback are minor gaps that do not critically hinder the main workflow.
Maintenance
Related MCP Connectors
Authorize AI agent tool calls before they run: policy-as-code, human approval, signed receipts.
Governed access to sensitive data, secrets and APIs for AI agents. A signed proof for each decision.
1AI agent infrastructure for discovery, authorization, execution, identity, and signed receipts.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables autonomous AI agents to securely access and execute external tools, such as GitHub REST API operations, with per-user authentication, authorization, audit logging, and observability.MIT
- FlicenseAqualityBmaintenanceEnables AI agents to safely interact with GitHub, query Postgres read-only, check deployment status, and search/read files within an allowlisted sandbox—all with dry-run writes and SQL/path safety gates.8-
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to request and perform registered deployment and login actions without exposing credentials, using local human approval and redacted verification receipts.2 npm1MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI coding agents to request bounded GitHub changes through a default-deny policy, independent human approval, one-time execution with a GitHub App credential, and verifiable receipts.1-