Every Netlify API endpoint, plus a local SQLite mirror of your whole account so you can search, diff, and audit across all sites at once — offline and agent-native.
The official netlify-cli is stateless and per-site. netlify-pp-cli syncs your sites, deploys, DNS, env vars, and form submissions into a local database, then adds cross-site commands no other tool has: env-drift compares variables across sites, submissions search runs offline full-text search over every form, dns-audit flags dangling records, and overview shows the health of every site in one view.
Learn more at Netlify.
Created by @Selrach84 (Charles Denzel Segovia).
The recommended path installs both the netlify-pp-cli binary and the pp-netlify agent skill (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, and other agents supported by the upstream skills CLI) in one shot:
npx -y @mvanhorn/printing-press-library install netlifyFor CLI only (no skill):
npx -y @mvanhorn/printing-press-library install netlify --cli-onlyFor skill only — installs the skill into the same agents as the default command above, but skips the CLI binary (use this to update or reinstall just the skill):
npx -y @mvanhorn/printing-press-library install netlify --skill-onlyTo constrain the skill install to one or more specific agents (repeatable — agent names match the skills CLI):
npx -y @mvanhorn/printing-press-library install netlify --agent claude-code
npx -y @mvanhorn/printing-press-library install netlify --agent claude-code --agent codexIf npx isn't available (no Node, offline), install the CLI directly via Go (requires Go 1.26.6 or newer):
go install github.com/mvanhorn/printing-press-library/library/cloud/netlify/cmd/netlify-pp-cli@latestThis installs the CLI only — no skill.
Download a pre-built binary for your platform from the latest release. On macOS, clear the Gatekeeper quarantine: xattr -d com.apple.quarantine <binary>. On Unix, mark it executable: chmod +x <binary>.
Install the CLI binary first. The installer writes binaries to a per-user managed bin directory by default: $HOME/.local/bin on macOS/Linux and %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows.
npx -y @mvanhorn/printing-press-library install netlify --cli-onlyThen install the focused Hermes skill.
From the Hermes CLI:
hermes skills install mvanhorn/printing-press-library/cli-skills/pp-netlify --forceInside a Hermes chat session:
/skills install mvanhorn/printing-press-library/cli-skills/pp-netlify --forceRestart the Hermes session or gateway if the newly installed skill is not visible immediately.
Install both the CLI binary and the focused OpenClaw skill. The installer defaults binaries to a per-user bin directory ($HOME/.local/bin on macOS/Linux, %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows):
npx -y @mvanhorn/printing-press-library install netlify --agent openclawRestart the OpenClaw session or gateway if the newly installed skill is not visible immediately.
This CLI ships an MCPB bundle — Claude Desktop's standard format for one-click MCP extension installs (no JSON config required).
To install:
- Download the
.mcpbfor your platform from the latest release. - Double-click the
.mcpbfile. Claude Desktop opens and walks you through the install. - Fill in
NETLIFY_AUTH_TOKENwhen Claude Desktop prompts you.
Requires Claude Desktop 1.0.0 or later. Pre-built bundles ship for macOS Apple Silicon (darwin-arm64) and Windows (amd64, arm64); for other platforms, use the manual config below.
Manual JSON config (advanced)
If you can't use the MCPB bundle (older Claude Desktop, unsupported platform), install the MCP binary and configure it manually.
go install github.com/mvanhorn/printing-press-library/library/cloud/netlify/cmd/netlify-pp-mcp@latestAdd to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"netlify": {
"command": "netlify-pp-mcp",
"env": {
"NETLIFY_FORM_ID": "<form_id>",
"NETLIFY_AUTH_TOKEN": "<your-key>"
}
}
}
}# check config and API reachability before anything else
netlify-pp-cli doctor --dry-run
# confirm auth works and list your sites
netlify-pp-cli sites list --json
# mirror your account into the local database
netlify-pp-cli sync --json
# cross-site health once the mirror is populated
netlify-pp-cli overview --json
These capabilities aren't available in any other tool for this API.
-
overview— One command shows build status, last deploy time, and form counts for every site in your account.Reach for this to survey an entire account at once instead of paging through the dashboard per site.
netlify-pp-cli overview --json --select name,last_deploy,state
-
env-drift— Finds env vars that exist on some sites but are missing or differ on others, across contexts.Use before a release to catch a secret set on staging but missing on production.
netlify-pp-cli env-drift --json
-
dns-audit— Aggregates DNS records across all zones and flags records pointing at deleted sites and soon-expiring SNI certs.Use to find dangling DNS after tearing down sites, in one pass over the whole account.
netlify-pp-cli dns-audit --json
-
submissions search— Full-text search across every form submission from every site, offline.Reach for this to find a specific contact/lead across all forms without clicking through the UI.
netlify-pp-cli submissions search "refund" --json --limit 20 -
since— Shows deploys and builds across all sites within a time window (e.g. last 2h).Reach for this to answer 'what shipped recently' across an account after an incident.
netlify-pp-cli since 2h --json
-
deploy-diff— Compares two deploys of a site (state, commit, context, error) side by side from the local mirror.Use to see exactly what changed between a working deploy and a broken one when hunting a regression.
netlify-pp-cli deploy-diff <deploy-a> <deploy-b> --json
netlify-pp-cli env-drift --json --select key,sites_missingLists variables set on some sites but missing on others so nothing ships half-configured.
netlify-pp-cli submissions search "acme corp" --json --select site_name,form_name,email,created_atOffline full-text search over every submission with only the fields an agent needs.
netlify-pp-cli since 4h --json --select site_name,state,commit_refShows every deploy across the account in the last four hours.
Run netlify-pp-cli --help for the full command reference and flag list.
This CLI separates local files into four path kinds:
| Kind | Contents |
|---|---|
config |
User-editable settings such as config.toml and saved profiles |
data |
Durable local data: credentials.toml, data.db, cookies, browser-session proof files, and other auth sidecars |
state |
Runtime state such as persisted queries, jobs, and teach.log |
cache |
Regenerable HTTP/cache files |
Each kind resolves independently. The ladder is:
- Per-kind env var:
NETLIFY_CONFIG_DIR,NETLIFY_DATA_DIR,NETLIFY_STATE_DIR, orNETLIFY_CACHE_DIR --home <dir>for this invocationNETLIFY_HOMEfor a flat relocated root- XDG env vars:
XDG_CONFIG_HOME,XDG_DATA_HOME,XDG_STATE_HOME,XDG_CACHE_HOME - Platform defaults matching existing installs
For containers and agent sandboxes, prefer a single relocated root:
export NETLIFY_HOME=/srv/netlify
netlify-pp-cli doctorUnder NETLIFY_HOME=/srv/netlify, the four dirs resolve to /srv/netlify/config, /srv/netlify/data, /srv/netlify/state, and /srv/netlify/cache.
MCP servers do not receive CLI flags from the host. Put relocation in the host env block:
{
"mcpServers": {
"netlify": {
"command": "netlify-pp-mcp",
"env": {
"NETLIFY_HOME": "/srv/netlify"
}
}
}
}Precedence matters in fleets: an ambient per-kind variable such as NETLIFY_DATA_DIR overrides an explicit --home for that kind. Use NETLIFY_HOME or the per-kind variables for durable fleet relocation; treat --home as the weaker per-invocation lever.
Relocation is one-way. Unsetting NETLIFY_HOME does not move files back to platform defaults, and doctor cannot find credentials left under a former root. Move the files manually before unsetting relocation variables.
Existing installs keep working because the platform-default rung matches the legacy layout. On the first auth write, stored secrets leave config.toml and are consolidated into credentials.toml under the data directory. Run netlify-pp-cli doctor --fail-on warn to check path and credential-location warnings in automation.
Manage accounts
netlify-pp-cli accounts cancel- Cancelnetlify-pp-cli accounts create- Createnetlify-pp-cli accounts get- Getnetlify-pp-cli accounts list-for-user- List for usernetlify-pp-cli accounts list-types-for-user- List types for usernetlify-pp-cli accounts update- Update
Manage agent runners
netlify-pp-cli agent-runners create- Createnetlify-pp-cli agent-runners create-upload-url- Create upload urlnetlify-pp-cli agent-runners delete- Deletenetlify-pp-cli agent-runners get- Getnetlify-pp-cli agent-runners list- Listnetlify-pp-cli agent-runners update- Update
Manage ai gateway
netlify-pp-cli ai-gateway- Get providers
Manage billing
netlify-pp-cli billing- List payment methods for user
Manage builds
netlify-pp-cli builds <build_id>- Get site
Manage deploy keys
netlify-pp-cli deploy-keys create- Createnetlify-pp-cli deploy-keys delete- Deletenetlify-pp-cli deploy-keys get- Getnetlify-pp-cli deploy-keys list- List
Manage deploys
netlify-pp-cli deploys delete- Deletenetlify-pp-cli deploys get- Get
Manage dns zones
netlify-pp-cli dns-zones create- Createnetlify-pp-cli dns-zones delete- Deletenetlify-pp-cli dns-zones get- Getnetlify-pp-cli dns-zones get-dnszones- Get dnszones
Manage forms
Manage hooks
netlify-pp-cli hooks create-by-site-id- Create by site idnetlify-pp-cli hooks delete- Deletenetlify-pp-cli hooks get- Getnetlify-pp-cli hooks list-by-site-id- List by site idnetlify-pp-cli hooks list-types- List typesnetlify-pp-cli hooks update- Update
Manage oauth
netlify-pp-cli oauth create-ticket- Create ticketnetlify-pp-cli oauth exchange-ticket- Exchange ticketnetlify-pp-cli oauth show-ticket- Show ticket
Manage purge
netlify-pp-cli purge- Purges cached content from Netlify's CDN. Supports purging by Cache-Tag.
Manage services
netlify-pp-cli services get- Getnetlify-pp-cli services show- Show
Manage sites
netlify-pp-cli sites create- Note: Environment variable keys and values have moved frombuild_settings.envandrepo.envto a new endpoint. Please use createEnvVars to create environment variables for a site.netlify-pp-cli sites delete- Deletenetlify-pp-cli sites get- Note: Environment variable keys and values have moved frombuild_settings.envandrepo.envto a new endpoint. Please use getEnvVars to retrieve site environment variables.netlify-pp-cli sites list- Note: Environment variable keys and values have moved frombuild_settings.envandrepo.envto a new endpoint. Please use getEnvVars to retrieve site environment variables.netlify-pp-cli sites update- Note: Environment variable keys and values have moved frombuild_settings.envandrepo.envto a new endpoint. Please use updateEnvVar to update a site's environment variables.
Manage submissions
netlify-pp-cli submissions delete- Deletenetlify-pp-cli submissions list-form- List form
Manage user
netlify-pp-cli user- Get current
# Human-readable table (default in terminal, JSON when piped)
netlify-pp-cli accounts get mock-value
# JSON for scripting and agents
netlify-pp-cli accounts get mock-value --json
# Filter to specific fields
netlify-pp-cli accounts get mock-value --json --select id,name,status
# Dry run — show the request without sending
netlify-pp-cli accounts get mock-value --dry-run
# Agent mode — JSON + compact + no prompts in one flag
netlify-pp-cli accounts get mock-value --agentThis CLI is designed for AI agent consumption:
- Non-interactive - never prompts, every input is a flag
- Pipeable -
--jsonoutput to stdout, errors to stderr - Filterable -
--select id,namereturns only fields you need - Previewable -
--dry-runshows the request without sending - Explicit retries - add
--idempotentto create retries and add--ignore-missingto delete retries when a no-op success is acceptable - Confirmable -
--yesfor explicit confirmation of destructive actions - Piped input - write commands can accept structured input when their help lists
--stdin - Offline-friendly - sync/search commands can use the local SQLite store when available
- Agent-safe by default - no colors or formatting unless
--human-friendlyis set
Exit codes: 0 success, 2 usage error, 3 not found, 4 auth error, 5 API error, 7 rate limited, 10 config error.
This CLI resolves endpoint placeholders at runtime, so one installed binary can target different tenants or API versions without regeneration.
Endpoint environment variables:
NETLIFY_FORM_IDresolves{form_id}
Base URL: https://api.netlify.com/api/v1
netlify-pp-cli doctorVerifies configuration, credentials, and connectivity to the API.
Run netlify-pp-cli doctor to see the resolved config, data, state, and cache directories. The platform-default config path is ~/.config/netlifys-documentation-pp-cli/config.toml; --home, NETLIFY_HOME, and per-kind env vars can relocate it.
Static request headers can be configured under headers; per-command header overrides take precedence.
Environment variables:
| Name | Kind | Required | Description |
|---|---|---|---|
NETLIFY_FORM_ID |
endpoint | Yes | |
NETLIFY_AUTH_TOKEN |
per_call | No | Set to your API credential. |
NETLIFY_NETLIFY_AUTH |
per_call | No | Set to your API credential. |
If you use agentcookie to sync secrets across machines, this CLI auto-adopts agentcookie-managed credentials with no extra setup. When the daemon writes to this CLI's config, netlify-pp-cli doctor reports agentcookie: detected and auth-status labels the source as agentcookie. Skip this section if you don't use agentcookie - the CLI works the same as any other.
Authentication errors (exit code 4)
- Run
netlify-pp-cli doctorto check credentials - Verify the environment variable is set:
echo $NETLIFY_AUTH_TOKENNot found errors (exit code 3) - Check the resource ID is correct
- Run the
listcommand to see available items
- 401 Unauthorized on every call — export NETLIFY_AUTH_TOKEN=<personal access token from app.netlify.com/user/applications>
- overview or search returns empty — run netlify-pp-cli sync first to populate the local mirror