MCP server
WebPinch ships an MCP server (@webpinch/mcp) that exposes your tasks, projects, site audits, and stats to Claude Code, Cursor, and any other MCP client.
It’s a thin client over the REST API — same auth, same authorization, same response data. Where the REST API gives you raw HTTP endpoints, MCP gives you tools the model can call directly.
What you get
- 13 tools for reading and writing tasks, projects, audits, and stats
- 4 resources for browseable, mention-able data (projects, tasks, audit reports)
- 3 prompts for common workflows (triage, audit summary, weekly status)
- Pre-flight scope checks so write attempts fail fast with a clear message instead of an HTTP 403
Install
You’ll need:
- A WebPinch personal access token. Mint at
Dashboard → API Tokens. - Node 18+ on the machine running the MCP client.
Claude Code
Edit ~/.claude.json and add to (or merge with) your mcpServers block:
{
"mcpServers": {
"webpinch": {
"command": "npx",
"args": ["-y", "@webpinch/mcp"],
"env": {
"WEBPINCH_TOKEN": "wp_pat_...",
"WEBPINCH_API_URL": "https://www.webpinch.com"
}
}
}
}Fully restart Claude Code (quit, don’t just close the window). Run /mcp — webpinch should be listed as connected with 13 tools, 4 resources, 3 prompts.
Local development? Replace WEBPINCH_API_URL with http://localhost:3000. If you’re running the MCP server from a checkout (not yet published to npm), swap the command/args to node /absolute/path/to/mcp-server/src/index.js.
Environment variables
| Var | Default | Notes |
|---|---|---|
WEBPINCH_TOKEN | (required) | Your wp_pat_… token |
WEBPINCH_API_URL | https://www.webpinch.com | Base URL of the WebPinch instance |
WEBPINCH_TRANSPORT | stdio | Set to http to self-host over Streamable HTTP instead — see Hosted HTTP transport |
PORT | 8787 | Only used when WEBPINCH_TRANSPORT=http |
The token is read at server startup and never logged or echoed in tool output. Network errors redact it explicitly.
Tools
Read
| Tool | Args | Returns |
|---|---|---|
whoami | — | User, token name + scopes, accessible orgs and projects |
list_projects | orgSlug? | Project list, optionally scoped to one org |
get_project | projectId | Project detail incl. columns + members |
list_tasks | projectId?, status?, priority?, assigneeId?, label?, q?, limit?, page? | Compact task list |
get_task | taskId | Full task incl. comments, checklists, attachments, screenshot/pin |
list_audits | projectId? or orgSlug?, limit? | Audit summaries |
get_audit | auditId | Full audit report |
dashboard_stats | orgSlug? | Counts by status/priority, recent projects |
Write
| Tool | Args | Scope |
|---|---|---|
create_task | projectId, title, description?, priority?, status?, labels?, assigneeIds?, pageUrl?, dueDate? | tasks:write |
update_task | taskId, any of title/description/status/priority/assigneeIds/labels/dueDate/dueDateComplete | tasks:write |
comment_on_task | taskId, body | tasks:write |
start_audit | projectId, maxDepth?, maxPages? | audits:run |
reanalyze_audit | auditId | audits:run |
Output is pruned for token efficiency. List tools never include descriptionHtml or full activity logs — call the matching get_* tool when you need detail.
Scope pre-flight
Write tools fetch your scopes once via whoami and cache them. If you ask the model to do something your token can’t do, the tool throws before any HTTP request:
This action requires the “tasks:write” scope. Your token does not have it. Mint a new token with that scope at /dashboard/settings/api.
Server-side scope enforcement still runs as the source of truth — pre-flight is purely a UX optimization to give the model a useful error message instead of an opaque HTTP 403.
Resources
Resources are URIs the model can pull without you naming a tool. In Claude Code’s resource picker / Cursor’s @-mention:
| URI | Type | Content |
|---|---|---|
webpinch://projects | JSON | All accessible projects |
webpinch://projects/{projectId}/tasks | JSON | Task list for a project |
webpinch://tasks/{taskId} | JSON | Single task detail |
webpinch://audits/{auditId}/report.md | Markdown | Audit rendered as a Markdown report — sections for Crawl, Links, SEO, General checks |
The Markdown audit report is the friendliest way to feed audit results into a chat — it’s pre-formatted, prioritized, and short.
Prompts
Prompts are saved instructions that compose tools. They show up as slash commands or prompt picks in your client.
triage_new_tasks
Args: projectId?, sinceHours? (default 24).
Pulls tasks created in the last N hours, walks each for context (description, screenshot, reporter), and proposes priority + assignee + a one-sentence rationale as a markdown table. Doesn’t mutate anything — review before applying.
summarize_audit
Args: projectId.
Fetches the latest audit for the project, categorizes findings (Critical / High / Medium / Low), and writes a fix list with affected URLs and one-sentence fixes. Ends with a “Top 3 actions for this week” section.
weekly_status
Args: orgSlug?.
Pulls stats and recent activity, drafts a < 200-word status note in Markdown — what’s new, what’s at risk, per-project progress, what’s coming due.
Hosted HTTP transport
The MCP spec supports both stdio (process-per-client) and Streamable HTTP (hosted) transports. WebPinch runs both, and they expose the same tools, resources and prompts — pick whichever your client supports.
Use ours (no install)
WebPinch hosts an MCP endpoint at https://www.webpinch.com/api/mcp. Nothing to install and nothing to keep running — useful for clients that accept a remote MCP URL, such as the Claude.ai and ChatGPT connectors.
{
"mcpServers": {
"webpinch": {
"url": "https://www.webpinch.com/api/mcp",
"headers": { "Authorization": "Bearer wp_pat_..." }
}
}
}Authentication is per request via the Authorization header rather than an environment variable, so the same endpoint serves every user — the token decides what you can see. The endpoint is stateless and CORS-enabled.
A GET returns a small discovery document, which is a quick way to confirm reachability:
curl https://www.webpinch.com/api/mcp
# {"ok":true,"name":"webpinch-mcp","version":"0.2.1","transport":"http","endpoint":"/api/mcp"}Self-host it
If you’d rather run it inside your own network, the same server speaks HTTP:
WEBPINCH_TRANSPORT=http PORT=8787 WEBPINCH_TOKEN=wp_pat_... npx -y @webpinch/mcpIt listens on POST /mcp (and /v1/mcp for compatibility).
stdio remains the right default for local editors — Claude Code, Cursor and Windsurf all launch the process themselves, so there’s nothing to host and the token stays in your local config.
Troubleshooting
| Symptom | Likely cause |
|---|---|
Server shows “disconnected” in /mcp | The startup command failed. Run npx -y @webpinch/mcp manually with the same env vars — the error message is the bug. |
WEBPINCH_TOKEN is required | The env var isn’t being passed by the MCP client. Check the env block in your config — env vars from your shell are NOT inherited. |
INSUFFICIENT_SCOPE after pre-flight passes | The whoami cache is stale because you re-minted the token mid-session. Fully restart the MCP client. |
Project has no URL configured on start_audit | Set the project URL in Dashboard → Project Settings. |
| Read tools work but everything is empty | Token is valid but inherits no project access. Run whoami to verify what’s visible. |