MCP tools for AI assistants
All 49 MCP tools
Ask your agent
Connect Percher to my AI assistant.Read the guide at percher.app/docs/mcp-tools
Show me what my assistant can do with Percher.Read the guide at percher.app/docs/mcp-tools
For agents and developers
Percher includes an MCP (Model Context Protocol) server so AI assistants like Claude Code, Cursor, and Windsurf can deploy and manage your apps directly.
Setup
// Claude Code: ~/.claude/mcp.json
// Cursor: .cursor/mcp.json
{
"mcpServers": {
"percher": {
"command": "npx",
"args": ["-y", "@percher/mcp"]
}
}
}All tools (49)
Families shown as name { action } are a single tool with an action parameter.
percher_publishPublish (primary tool)Any deploy intent. Handles login, config, build, deploy, and error diagnosis in one call. Use this. MCP defaults waitForLive=false so it returns within seconds with a queued deployId.percher_wait_for_deployShort-poll a queued deployArgs: app, deployId, timeoutSeconds (default 30, max 720). Resumes the async publish flow. Returns live/failed/replaced/still_running with recovery.nextAction pre-filled.percher_wait_for_authShort-poll a pending loginArgs: deviceCode, publishArgs. Used when percher_publish returns auth_pending — resumes packaging + deploy after the browser login finishes.percher_initGenerate percher.tomlDetects framework, runtime, port. Rarely needed — percher_publish auto-generates the config.percher_loginAuthenticateReturns a browser login URL, or accepts a token directly. Rarely needed — percher_publish handles auth.percher_redeployRedeploy a specific deployArgs: app, deployId. Replays an existing deploy without re-uploading source.percher_reproduceReproduce a deploy locallyArgs: app, deployId. Downloads the source bundle and re-runs the build for debugging.percher_rollbackRoll back to a versionArgs: app, commitSha. Redeploys exact code from that version.percher_versionsDeployment historyArgs: app. Returns commit SHAs and timestamps.percher_cache_resetReset build cacheArgs: app. Bumps the cache generation so the next deploy does a one-time cold dependency install.percher_doctorRecovery hubHealth checks (auth, API, container, route, PocketBase) plus failure diagnosis and 'what next?'. Returns recovery.nextAction. Call this whenever another tool's recovery says run_doctor, and for crash analysis (mode='runtime').percher_unsuspendResume a suspended appLifts auto-suspension after the failure-loop cooldown. Fix the cause first.percher_deploysList recent deploysArgs: app. Returns id, status, createdAt, errorMessage.percher_deploys_inspectInspect a specific deployArgs: app, id (or latestFailed). Returns full status + buildLog. Use after a failed publish.percher_logsView app logsArgs: app (name or id), lines (default 50), follow (boolean). Runtime logs, not build logs.percher_app_insightsCost + reliability suggestionsReturns idle / memory-pressure / overprovisioned / deploy-regression. Each carries an actionHint the AI follows up with.percher_app_topologyDependency snapshotSingle-app node graph (Caddy route, custom domains, container, PocketBase, volume, KV, webhooks) plus the platform-managed band (deploy history, metrics, security scan, backups) for AI introspection.percher_app_resourcesCPU + RAM time-seriesPer-app metrics for a requested window. Timestamps zipped with cpuPct / memory arrays.percher_capabilitiesDiscover instance capabilitiesAvailable runtimes, feature flags (anonymous deploys, preview branch, inspect links), plan limits + current usage. Call at session start instead of guessing from errors.percher_inspect_linkPublic read-only inspect linkCreate (default) or revoke a sanitized shareable status link for an app — live status + recent deploys, no login, no logs/env.percher_whoamiCurrent user infoShows email and token status.percher_openGet app URLReturns the public URL for the app (browser open is a no-op in MCP).percher_env_setSet env variablesArgs: app, vars (object of key-value pairs).percher_env_unsetRemove env variableArgs: app, key.percher_env_listList env variablesArgs: app. Values are masked.percher_dataDatabase statusRead-only view of PocketBase collections, stats, and admin link.percher_data_exportExport PocketBase dataArgs: app. Downloads data.db + auxiliary.db + storage/ as a .tar.gz.percher_exportExport an app bundleArgs: app. Source + percher.toml + env keys + custom domains + deploy history (+ PocketBase data) as a .tar.gz.percher_reset_superuserReset PocketBase adminGenerates a new superuser password and injects POCKETBASE_ADMIN_* env vars.percher_backupsList backupsArgs: app (optional). Returns backup_id, timestamp, size, sha256, components — no GPG decrypt.percher_restoreRestore from a backupArgs: app, source ('latest' | 'YYYY-MM-DD' | id), components, dryRun. Per-app + per-component.percher_domain { action }Custom domainsaction: add | verify | list | remove. Args: app, domain. add returns DNS records; verify activates; list shows status; remove detaches.percher_github { action }GitHub auto-deployaction: connect | setup_webhook. Args: app, repoUrl, branch, autoPreviews. connect clones + deploys + returns webhook setup; setup_webhook rotates the secret. Public repos only.percher_forgejo { action }Forgejo / Gitea auto-deployaction: connect | setup_webhook. Same flow as percher_github, for self-hosted Forgejo or Gitea.percher_set_preview_branchPin a preview branchArgs: branch, app. Auto-deploys a branch to a stable {app}-preview.percher.run; pass branch: null to clear.percher_webhook { action }Account-level webhookaction: add | list | remove. Args: url. One URL per account; signed JSON for deploy.failed / deploy.succeeded / app.crashed / app.unhealthy / app.recovered / domain.expiring. add returns signingSecret once.percher_share { action }Manage collaboratorsOwner-only. action: list | invite | set_role | revoke. Args: app, email, role, shareId. Email invites; viewer = read-only, admin = deploy + config.percher_invites { action }My incoming invitesaction: list | accept | decline. Args: shareId. Account-wide; accept is idempotent (alreadyAccepted).percher_transfer { action }Ownership transfer (sender)Owner-only. action: initiate | cancel | list (defaults to initiate). Args: app, email, transferId. The recipient must explicitly accept.percher_transfers { action }Incoming transfers (recipient)action: incoming | accept | decline. Args: transferId. Atomic ownership flip after plan-limit, terms, account-active, and app-state checks.percher_importImport from Vercel/NetlifyParses vercel.json / netlify.toml and writes a percher.toml.percher_supabase { action }Supabase migration helperaction: inspect | migrate_schema. Args: projectRef, token, outputDir. inspect reads the schema (read-only); migrate_schema writes a PocketBase migration preview to disk.percher_create_from_templateScaffold new app29 starters incl. node, python, static, nextjs, sveltekit, astro, remix, nuxt, vite-react, hono, express, fastify, flask, fastapi, django, eleventy, hugo, and more.percher_claim_appClaim an anonymous appArgs: app, claimToken. Claims an account-less deploy into your account, lifting the anonymous restrictions and expiry.percher_renameRename appChanges subdomain. Once per 30 days; old name reserved 60 days.percher_delete_appPermanently delete appRequires confirm: true. Removes container, DB, domains, env, history.percher_account_deletion_previewPreview account deletionPure read. Returns canDelete, ownedAppCount, and blockers.percher_account_deleteDelete account (GDPR)Fail-closed: rejected if the account has any blockers (owned apps, accepted collaborators, …).percher_billing { action }Billing (Polar)action: upgrade | portal. Args: plan (starter/maker/pro). upgrade returns a checkout URL; portal manages an existing subscription. User confirms in browser.