Install
$ agentstack add skill-osouthgate-agent-plus-skills-vercel-remote ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
vercel-remote
Project-scoped CLI that wraps the Vercel REST API into a read-first, JSON-output overview tool. Stdlib-only Python 3 (no pip installs, no venvs). Designed for agent-driven incident triage — one call returns the full project/deployments/domains/env-names picture so you don't burn tool calls chaining per-resource requests.
Lives at ${CLAUDE_SKILL_DIR}/../../bin/vercel-remote; the plugin auto-adds bin/ to PATH, so just run vercel-remote ....
Prerequisites
VERCEL_TOKENset (project.env/.env.localor shell env). Get one at https://vercel.com/account/tokens.- Optional:
VERCEL_TEAM_IDfor team-scoped projects. Every API call appends?teamId=…when set. - Optional:
VERCEL_PROJECTto omit--projecton every call.
The CLI bails with a clear missing-config message if VERCEL_TOKEN is absent.
When to reach for this
- User asks "what's happening on " → run
overview --project --pretty. One call → project info + recent deployments (with commit metadata) + domain health + env var NAMES + top-level warnings. - User asks "why is prod broken" → run
deployments list --project --state error --limit 5thenlogs --errors-only. - User asks "what env vars does have" → run
env list --project. Names only — values never touch output. - User asks "trigger a deploy" → run
deployments trigger --hook-url --wait. Waits up to 15 min for build completion. - User asks "is my domain verified" → run
domains list --projectordomains verify --project --wait.
Headline commands
vercel-remote projects list [--pretty]
vercel-remote projects resolve
vercel-remote overview --project [--limit 10] [--pretty]
vercel-remote deployments list [--project ] [--state ready|error|building|queued|canceled] [--limit 20]
vercel-remote deployments show
vercel-remote deployments trigger --hook-url [--wait] [--timeout 900]
vercel-remote logs [--since 1h] [--errors-only] [--limit 100]
vercel-remote domains list --project
vercel-remote domains verify --project [--wait] [--timeout 300]
vercel-remote env list --project [--env production|preview|development]
vercel-remote env set --project [--env ...] [--wait]
vercel-remote env remove --project [--env ...] [--wait]
vercel-remote whoami [--json] # identity for `agent-plus refresh` ("what's my vercel identity")
All list/show commands emit JSON to stdout. Use --pretty for indentation.
Every payload carries a top-level tool: {name, version} field so agents can self-diagnose version drift from the output alone. Run vercel-remote --version to check the installed version directly.
Offloading large responses with --output
Vercel responses get large fast — logs on a chatty deployment, overview with high --limit, deployments list across many deployments. Pulling all of that through the model's context is wasteful when you only need a slice.
Pass --output before the subcommand (it's a top-level flag, like --pretty):
vercel-remote --output /tmp/logs.json logs my-app-xyz.vercel.app --since 24h
vercel-remote --output /tmp/deps.json deployments list --project my-app --limit 50
Instead of printing the full payload, stdout returns a compact envelope:
{
"tool": {"name": "vercel-remote", "version": "..."},
"payloadPath": "/tmp/logs.json",
"bytes": 48320,
"fileLineCount": 1204,
"payloadKeys": ["deployment", "entries"],
"payloadShape": {
"deployment": {"type": "string", "length": 24},
"entries": {"type": "list", "length": 412,
"sample": {"type": "dict", "keys": 5,
"shape": {"level": {"type": "string", "length": 5},
"message": {"type": "string", "length": 187},
"timestamp": {"type": "number"}}}}
}
}
How to act on it:
- Check
payloadShapeto see where the data lives and how much there is. In the example above, the agent immediately knows there are 412 log entries with{level, message, timestamp}fields — no second call needed to discover shape. - Use
Readwith offset/limit to pull the slice you need.fileLineCountis the upper bound. - For list-shaped responses (
projects list,deployments list), the envelope haspayloadType: "list"+payloadLength+sampleShapedescribing the first item.
--shape-depth controls recursion depth. Default is 3 (two layers deep — surfaces patterns like deployments[0].meta). Drop to 1 for a minimal envelope.
When NOT to use --output: small responses (projects resolve, env list — NAMES are already tiny), or when you need the data in the same turn to act on. The envelope points at the file; it doesn't carry the data.
Piping to jq
Output is JSON-first, so pipe freely to jq for focused extraction:
# Failing deployments only
vercel-remote overview --project my-app | jq '.deployments[] | select(.state == "ERROR")'
# Unverified domain names
vercel-remote domains list --project my-app | jq '.[] | select(.verified == false) | .name'
# Env var names (no values) as a flat list
vercel-remote env list --project my-app --env production | jq -r '.names[]'
Design rules (agent-plus patterns)
- Aggregate server-side.
overviewreturns project + deployments + domains + env names in one call — you don't chain four requests. - Resolve by name. Pass
--project my-app, notprj_xxxxxxxxxxxxxxxx. The CLI resolves internally via/v9/projects/{idOrName}. --waiton every async flow.deployments trigger,domains verify,env set/removesupport--waitwith per-command sensible timeouts (15m / 5m / 30s). On timeout: non-zero exit with partial JSON including the last-known state.--jsonis the default. No human-prose output paths. Pipe tojqfreely.- Zero env-value leakage.
env listreturns NAMES only. Every API response walks through_scrub()before emission, which maskspassword,token,githubToken,value,secret,encryptedValue, and related keys. A canary-value test (test/test_vercel_remote.py) asserts a known secret substring never appears in any output path.
Config precedence (highest first)
--token/--teamCLI flags--env-fileif passed.env.local/.envwalked up from cwd (closest wins)- Shell env
Only VERCEL_* prefixed vars are picked up.
Safety
- Read-only by default. Write commands (
env set,env remove,deployments trigger) are explicit subcommands. - No
deployments triggervia the file-upload path. The command uses Vercel Deploy Hooks (pre-configured webhook URLs, stored as a project secret) — see https://vercel.com/docs/deployments/deploy-hooks. Pass the hook URL via--hook-url. - Team scoping is mandatory when
VERCEL_TEAM_IDis set. Every API call appends?teamId=…. Without it, team-scoped resources return 404.
Error message contract
Every error path emits problem + cause + fix + link:
- Missing token → "Set in project
.envor.env.local(keys prefixedVERCEL_), or~/.claude/settings.json. Get one: https://vercel.com/account/tokens" - 401 → "Token invalid or expired. Regenerate: https://vercel.com/account/tokens"
- 403 → "Token lacks required scope. Regenerate with appropriate scope."
- 429 → "Rate-limited by Vercel API. Retry after a few seconds." (
Retry-Afteris honoured automatically; you only see this on exhausted retries.) - 404 with team scope → notes the team-ID prefix so you can verify
VERCEL_TEAM_ID.
What it doesn't do
Deliberately out of scope for v1:
- Team / user CRUD (team scoping is fully supported via
VERCEL_TEAM_ID; only team management is deferred). - Billing and invoices.
- Edge Config authoring.
- Framework-specific build logic.
Use the vercel CLI or the dashboard for those. This plugin is read-first operational triage plus the minimum write surface needed by agents (env set/remove, deploy hook trigger).
When NOT to use this — fall back to the vercel CLI or the Vercel API directly
This wrapper's scope is deliberately narrow: projects (list/resolve), overview, deployments (list/show/trigger via Deploy Hook), logs, domains (list/verify), and env (list NAMES / set / remove). Anything outside that surface is not here and won't be — use the vercel CLI (already authed on the user's machine) or curl https://api.vercel.com/... with Authorization: Bearer $VERCEL_TOKEN instead.
Specific cases where you should skip vercel-remote and go straight to vercel or the raw API:
- Creating, renaming, or deleting a project, or configuring its Git integration / framework preset / build-and-output settings. →
vercel project add,vercel project rm, orPOST/PATCH/DELETE /v9/projects[/{id}].vercel-remoteonly reads and resolves projects. - DNS records CRUD, domain transfers, or buying a domain.
domains list/verifycheck project-attached domains; they don't touch the account-level domain registry. →vercel domains ...or/v4/domains,/v2/domains/{domain}/records. - Edge Config, Blob, KV/Redis, or Postgres storage (reading/writing items, creating stores, rotating tokens). →
vercel env pull+ the relevant storage SDK, or the/v1/edge-config/*,/v1/blob/*, storage integration endpoints directly. - Cron jobs, firewall rules, deployment protection, preview comments, web analytics config, log drains, integrations/marketplace, team/user management, billing/invoices. None of these are wrapped. → dashboard,
vercelCLI, or the corresponding/v1/...endpoint. - Deploying from local files (not via a pre-configured Deploy Hook).
deployments triggeronly fires Deploy Hook URLs. →vercel deploy/vercel --prod, orPOST /v13/deploymentswith a file-upload payload. - Tailing logs live / runtime (non-build) logs.
logsis a one-shot snapshot of build/function logs for a specific deployment. →vercel logs --followfor a live tail, or the runtime logs drain.
Don't get stuck in a loop. If a vercel-remote command errors with "unknown subcommand" / "not supported", or the user's request obviously needs a write or resource the wrapper doesn't expose, immediately switch to vercel or curl against api.vercel.com rather than re-trying vercel-remote with different flags. The wrapper exists to make reading faster and safer, not to replace the CLI or the REST API.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: osouthgate
- Source: osouthgate/agent-plus-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.