Pincushion
NPM · PINCUSHION-MCP · SCANNED SEP 21
Stakeholders pin feedback on your live app; your AI agent reads the pins via MCP and fixes them.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- Known CVEs were checked across the 127 of 128 dependencies we could resolve, so this covers what we could see, not the whole tree.Partial
- No install/post-install scripts declared.Pass
- Dependency health was assessed across the 127 of 128 dependencies we could resolve, so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency6
- Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (SEE LICENSE IN LICENSE.md) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 9 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 11932 tokens (~178/item across 67 items; 65 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management83
- Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 86% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 67 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Pincushion MCP server?
Pincushion runs locally as an npm package, launched with npx -y pincushion-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · pincushion-mcp
claude mcp add jcooley8-pincushion -- npx -y pincushion-mcp
{
"mcpServers": {
"jcooley8-pincushion": {
"command": "npx",
"args": [
"-y",
"pincushion-mcp"
]
}
}
} {
"servers": {
"jcooley8-pincushion": {
"command": "npx",
"args": [
"-y",
"pincushion-mcp"
]
}
}
} codex mcp add jcooley8-pincushion -- npx -y pincushion-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"jcooley8-pincushion": {
"type": "local",
"command": [
"npx",
"-y",
"pincushion-mcp"
],
"enabled": true
}
}
} openclaw mcp add jcooley8-pincushion --command npx --arg -y --arg pincushion-mcp
mcp_servers:
jcooley8-pincushion:
command: "npx"
args: ["-y", "pincushion-mcp"] {
"McpServers": {
"jcooley8-pincushion": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"pincushion-mcp"
]
}
}
} assistant mcp add jcooley8-pincushion -t stdio -c npx -a -y pincushion-mcp
{
"mcpServers": {
"jcooley8-pincushion": {
"command": "npx",
"args": [
"-y",
"pincushion-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 −2
- Stability: pass → 0.80 functional
- 19 Sept 26 0
- Stability: 0.97 → pass security
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +58
- Malware scan: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- Tool coverage: unverified → 100 ▲ functional
- Schema quality: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Stability: unverified → 0.80 ▲ functional
- 12 Sept 26 0
- Package version: 1.11.21 → 1.11.22 functional
- 11 Sept 26 −45
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 1.11.19 → 1.11.21 functional
- Package version: 1.11.19 → 1.11.20 functional
- 10 Sept 26 −13
- Malware scan: pass → unverified ▼ security
- CVE-2026-54285 no longer affects this package ▲ security
- Known CVEs: fail → partial ▲ security
- Tool coverage: 93% → 86% ▼ functional
- Schema quality: 10812 → 11932 ▼ functional
- Package version: 1.11.17 → 1.11.19 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/pincushion-mcp@1.11.22
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 127 packages
| Packages resolved | 127 |
|---|---|
| Stale | 31 |
| Tree resolution | Partial |
The dependency tree was only partially resolved, so these counts may be incomplete.
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_agency_internal_message Add Agency Internal Message ~92
Pilot: append an owner/editor-only internal thread note to one pin. It never enters the public pin thread, report, widget, attachment system, search, or notification pipeline. Reuse the idempotency key only for an identical retry.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | – |
| body | string | yes | – |
| idempotencyKey | string | yes | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
add_agent_reply Add Agent Reply ~68
Add a reply to an annotation thread (e.g. to ask a clarifying question or note a finding).
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The annotation ID |
| author | string | – | Author name (defaults to "AI Agent") |
| body | string | yes | The reply message body |
No output schema declared.
No examples provided.
add_bot_reply Add Bot Reply ~147
Post a Pincushion AI reply to a pin's thread. Hardcodes author="Pincushion AI" and authorEmail="pincushion-bot@pincushion.io" so the Chrome extension applies bot styling. ONLY call from the /pincushion-replies flow — never as a generic reply. Refuses to post if the latest thread message is already bot-authored (defense-in-depth idempotency).
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The pin to reply on. |
| body | string | yes | Reply text. Concrete, useful, on-brand. <2 short paragraphs. Same tone constraints as the critic — no UX-blog hedging. |
No output schema declared.
No examples provided.
add_member Add Member ~117
Add a collaborator to a Pincushion project. Developers consume a paid seat and can implement pins. Commenters are free and unlimited. Returns an upgrade prompt if the seat limit is reached.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email of the person to add | |
| name | string | – | Display name (defaults to email prefix) |
| projectId | string | yes | The project ID |
| role | string | yes | Role: "developer" (paid seat, can implement) or "commenter" (free, can drop pins and comment) |
No output schema declared.
No examples provided.
approve_pin Approve Pin ~78
Mark a pin as approved for implementation. Only approved pins should be implemented by agents. This transitions the pin from "open" to "approved" status.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | Pin ID to approve (e.g. "ann_abc123") |
| approvedBy | string | – | Who approved the pin (e.g. "Josh") |
No output schema declared.
No examples provided.
archive_agency_label Archive Agency Label ~48
Pilot: archive one owner/editor-only agency label. Archived labels cannot be applied or used in a filtered read.
| Name | Type | Req | Description |
|---|---|---|---|
| labelId | string | yes | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
assign_pin_to_agent Assign Pin to Agent ~151
Assign a pin directly to your local coding agent. Promotes the pin to "ready" (if not already), marks it as pending_implementation, and drops a trigger file in .feedback/.agent-queue/ that agent-loop.mjs picks up and dispatches to Cursor / Claude Code / Codex. This is the first-class "assign to agent" action — turns a pin into agent work in one call. Workflow: assign_pin_to_agent → (agent-loop dispatches) → fix_and_resolve.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The pin ID to assign (e.g. "ann_abc123") |
| assignedBy | string | – | Who assigned it (defaults to "Unknown") |
No output schema declared.
No examples provided.
attach_verification_run Attach Verification Run ~97
Pilot: ask Pincushion to retrieve and validate a configured GitHub Actions run for an existing verification report. The server selects the trusted repository, workflow, checks, and artifacts. This starts no runner and cannot record client acceptance.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | – |
| projectId | string | yes | – |
| reportId | string | yes | – |
| runAttempt | integer | yes | – |
| runId | integer | yes | – |
No output schema declared.
No examples provided.
claim_pending_slack_install Claim Slack Install ~263
LEGACY FALLBACK. Since May 2026, Slack installs auto-link to a Pincushion license when the installer's Slack email matches, and channels are subscribed via /pincushion subscribe inside Slack — no claim token needed. This tool only applies when the installer's Slack email did NOT match an active Pincushion license at install time (the user sees a claim_token on the post-install page in that case). Pass claimToken (the on-page token, valid 7 days) + projectId to attach the webhook. Calling with no claimToken returns the new flow instructions instead of an error.
| Name | Type | Req | Description |
|---|---|---|---|
| claimToken | string | yes | The one-time token shown on the post-install page after Add to Slack. |
| events | array | – | Optional events override. Defaults to whatever the storefront install captured (pin_ready, mention, follow_up). |
| name | string | – | Subscription name. Default: default. |
| pageUrlPatterns | array | – | Optional URL substrings for page-specific subscriptions. |
| projectId | string | yes | The Pincushion project ID to attach the webhook to. Caller must be owner or editor. |
| targetLabel | string | – | Optional human-readable label override; defaults to the Slack channel name from install. |
No output schema declared.
No examples provided.
claim_pin Claim Pin ~101
Claim an actionable pin before starting work on it. Transitions the pin from "pending_implementation" to "implementing" so other agents know it is being worked on. Call this before making changes, then call fix_and_resolve when done.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The annotation ID to claim (e.g. "ann_abc123") |
| implementer | string | – | Name of the agent/person claiming it (defaults to "AI Agent") |
No output schema declared.
No examples provided.
complete_critique_request Complete Critique Run ~116
Mark a critique_queue request as completed after the critic subagent has run on its page URLs. Pass the request id (from get_pending_critiques) and the total pin_count produced. The server scopes the update to your license — you cannot complete another tenant's request even if you know the id.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The critique_queue row id from get_pending_critiques. |
| pinCount | number | – | Total bot pins created for this request across all page URLs. Defaults to 0 if omitted. |
No output schema declared.
No examples provided.
complete_deployment_capture_run Complete Frame Refresh ~119
Requests server-side frame-refresh completion after all exact page/device receipts have been recorded. The server rejects missing, stale, replayed, cross-deployment, or expired capture-run evidence and never treats a queue state as a current frame.
| Name | Type | Req | Description |
|---|---|---|---|
| captureProof | string | yes | Opaque short-lived proof returned once by start_deployment_capture_run. Never persist or log it. |
| captureRunId | string | yes | Capture-run ID returned by start_deployment_capture_run. |
| deploymentId | string | yes | Exact deployment ID for the active capture run. |
No output schema declared.
No examples provided.
configure_collaboration_integration Configure Integration ~320
Connect a Pincushion project to Slack, Microsoft Teams, or Discord using an incoming webhook. Low-noise defaults mirror Figma-style subscriptions: pin activity plus the deploy/verify loop, where pin_deployed/pin_verified attach as a quiet threaded reply under the pin (never a new top-level message). The louder agent-pin, email-pin, and share-report events are opt-in. For Discord, create a channel Incoming Webhook (Channel Settings → Integrations → Webhooks) and pass its URL.
| Name | Type | Req | Description |
|---|---|---|---|
| events | array | – | Events to send. Default: pin_ready, new_pin, mention, follow_up, resolved, pin_verified, pin_deployed. |
| name | string | – | Subscription name. Use multiple names for separate project/page subscriptions. Default: default. |
| pageUrlPatterns | array | – | Optional URL substrings for page-specific subscriptions. Empty means all project URLs. |
| projectId | string | yes | The Pincushion project ID. |
| provider | string | yes | Destination provider. |
| sendTest | boolean | – | When true, posts a one-time test message to the webhook after saving. |
| status | string | – | Pause without deleting the subscription. Default: active. |
| targetLabel | string | – | Human label for the destination, such as #design-review or Teams QA channel. |
| webhookUrl | string | yes | Slack incoming webhook URL, Microsoft Teams incoming webhook/workflow URL, or Discord channel webhook URL (https://discord.com/api/webhooks/...). Stored server-side and not returned in full. |
No output schema declared.
No examples provided.
configure_project Configure Project ~1,319
Register a Pincushion project and associate it with your app's URLs. Registration does not call a deployment provider or modify source/CI. The response includes a redacted provider-neutral manual setup handoff. An agent may set deploymentAutomation to "auto" only after explicit owner consent; it first detects all local candidates, requires deploymentProvider when they are ambiguous, and begins an owner-keyed lifecycle only when an admitted provider adapter and private receiver setup are available. Otherwise it stays manual and redacted. Provider read-back is not proof of a first accepted production receipt, reconciliation, fresh desktop/mobile frames, queue completion, or external Crit evidence. Use get_deployment_reconciliation_status for those independent states. **NOTE for read-only use cases:** if you only need to look up brand context, URLs, or other project metadata, call `get_project_context` instead — `configure_project` mutates project registration state.
| Name | Type | Req | Description |
|---|---|---|---|
| allowedDomains | array | – | Bare domains permitted to comment when commentAccess is "domain" (e.g. ["acme.com", "acme.co.uk"]). Required for "domain" mode, ignored otherwise. |
| attributionComments | string | – | When the implementing agent should leave inline source comments. "off" (default): never — keep code clean, rely on the commit. "context-warrants": one-line comment ONLY when the pin captures a non-ob… |
| autoCritique | boolean | – | When true (default for Pro/Team), every deploy-hook trigger enqueues an AI critique request the dev can run via /critique-latest-deploy. Set false to opt out without dropping plan. Free licenses igno… |
| brandContext | string | – | LEGACY single-blob brand context (max 2048 chars). Kept for back-compat. Prefer the layered `critiqueContext` + `critiquePolicy` + `critiqueSignals` triplet — `get_project_context` falls back to bran… |
| commentAccess | string | – | Who can drop pins on this project. "open" (default — Free, Pro, Team) — anyone with the URL. "domain" (Pro/Team) — only emails in the allowedDomains list. "invited" (Pro/Team) — only emails added via… |
| commitTrailers | string | – | Which trailers go in the body of pin commits. "minimal" (default): Pin-ID only — today's behavior. "standard": adds Reviewed-By with the pin's approver, suppressed when the approver is the same perso… |
| critiqueContext | string | – | Compiled critique brief (max 8192 chars). The Pincushion AI critic loads THIS into its prompt at pin time. Produced by the dev agent at /setup or /refresh-brand by synthesizing `critiqueSignals` + `c… |
| critiquePolicy | string | – | User-editable critique policy override (max 4096 chars). Survives recompiles, so users can hand-tune what good critique looks like for their project. Example: "Weight copy concerns 2x. Ignore AAA con… |
| critiqueSignals | object | – | Raw brand signals the dev agent gathered from the repo at /setup or /refresh-brand. Shape is flexible JSONB — recommended keys: { framework: e.g. "next-app-router"|"astro"|"static-html", projectType:… |
| deploymentAutomation | string | – | EXPLICIT OWNER CONSENT REQUIRED. Never set this by default. "auto" performs read-only detection and never guesses between multiple candidates. It begins the owner-keyed lifecycle only when an admitte… |
| deploymentProvider | string | – | Optional explicit deployment provider selector. Required with deploymentAutomation="auto" when read-only detection finds multiple candidates. It must match a detected candidate; Pincushion never choo… |
| name | string | yes | Human-readable project name (e.g. "Superbill Pro", "My SaaS Staging") |
| projectId | string | – | Optional exact immutable Pincushion project ID. Use this to preserve identity across a rename. |
| recordCommitSha | boolean | – | Whether fix_and_resolve stores the implementing commit SHA on the pin for the dashboard backlink. Default: true. Invisible plumbing — has no source-code or commit-log cost. Set false only if you spec… |
| urls | array | – | URLs or origins where this project lives. Include both local and live environments (e.g. ["localhost:3000", "superbill-pro.vercel.app"]). The extension activates automatically on any matching URL. |
No output schema declared.
No examples provided.
create_agency_label Create Agency Label ~79
Pilot: create an owner/editor-only custom label. Labels are private agency metadata and never alter public annotation tags or appear in a public report.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | Optional display color. Metadata only; it does not restyle any public Pincushion surface. |
| name | string | yes | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
create_agent_pin Create Agent Pin ~524
File a pin as a THIRD-PARTY agent — the write half of the browser-agent → coding-agent handoff. Use when a QA/browser agent (Claude in Chrome, computer-use, a Playwright a11y/visual check, a CI checker) finds a concrete issue on a page and wants to hand it to the implementing agent as a work packet. NOT the Pincushion AI voice: the pin renders as "<agentName> (agent)" with an agent chip (enforced server-side; is_bot/bot styling stays reserved for the critic). Pins start "open" and get triaged like any pin — never pre-approved. Each pin should be one specific element + problem + suggested fix; include acceptanceCriteria when the finding has a testable definition of done. Metered as an AI action (agent_pin). Repeating the same semantic finding on the same route and selector with only query values changed returns `duplicate_variant`; inspect a distinct state, scenario, or element instead.
| Name | Type | Req | Description |
|---|---|---|---|
| acceptanceCriteria | string | – | Optional testable definition of done (e.g. "axe-core reports 0 contrast violations on .checkout-form"). |
| agentName | string | yes | The filing agent's name, shown as the pin author (e.g. "Playwright a11y check", "Claude in Chrome", "nightly-qa-patrol"). Max 80 chars. |
| body | string | yes | What the agent found + the suggested fix. Concrete and actionable; becomes the first thread message. |
| operationId | string | – | Optional opaque idempotency ID. When a response is pending_reconciliation, retry the same submission with the returned operationId; use a new ID for an intentionally separate pin. |
| pageTitle | string | – | Optional page title for the .feedback file header. |
| pageUrl | string | yes | Full URL of the page the finding is on. |
| projectId | string | – | Project ID to associate the pin with. Defaults to the MCP server's configured project. |
| selector | string | – | CSS selector for the element the finding targets. Be specific — the implementing agent greps the repo with it and the extension positions the pin from it. |
| severity | string | – | "high" = broken behavior/blocked flow. "medium" = worth fixing. "low" intentionally not allowed — agent pins must be worth a human triage. |
| tags | array | – | Optional tags. "agent-pin" is added automatically; add domain tags like "a11y", "visual-regression", "broken-link". |
No output schema declared.
No examples provided.
create_critique_pin Create Critique Pin ~698
Create a pin authored by Pincushion AI. ONLY call this from the pincushion-critic subagent or the /critique-latest-deploy flow — never from a regular user prompt, since the bot voice is reserved for AI-driven UI/copy/a11y and product-experience feedback (flows, empty/error states, terminology, trust). Each call should produce one tasteful, high-signal pin (max 3 per page in a critique run). The body must be concrete and actionable: name the specific element + the specific problem + the suggested fix in <40 words (up to 55 for a flow critique that must name the step before/after). Forbidden: layout philosophy, business-model commentary, roadmap ideation (a missing affordance at a specific element IS in scope), generic "consider improving hierarchy" advice. Always read the project's critique context (`ai.critique.effectiveContext` from get_project_context — falls back to `brandContext` when no compiled brief exists) before drafting the body so the critique is on-brand. If `ai.critique.staleness` is "stale" or "missing", suggest the user run /refresh-brand before continuing. Repeating the same semantic finding on the same route and selector with only query values changed returns `duplicate_variant`; inspect a distinct state, scenario, or element instead.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The critique itself. Concrete + actionable, <40 words, names the element and proposes a fix. This becomes the first thread message on the pin. |
| componentName | string | – | Optional component name (e.g. LWC component, React component) for grouping. Used by get_component_feedback. |
| critiqueRunId | string | yes | Required stable ID for this Crit run. Reuse the exact same value for every pin in the run; Pincushion stores it as critique-run:<id> and verifies it before a Crit report can be minted. |
| operationId | string | – | Optional opaque idempotency ID. When a response is pending_reconciliation, retry the same submission with the returned operationId; use a new ID for an intentionally separate pin. |
| pageTitle | string | – | Optional page title for the .feedback file header. Defaults to pageUrl if omitted. |
| pageUrl | string | yes | Full URL of the page being critiqued (e.g. "http://localhost:3000/dashboard"). |
| projectId | string | – | Project ID to associate the pin with. Defaults to the MCP server's configured project. |
| selector | string | – | CSS selector for the element the critique targets. The Chrome extension uses this to position the pin since the bot has no live page coords. Be specific (e.g. 'main button[type="submit"]' not just 'b… |
| severity | string | – | "high" = ships-blocking (broken contrast, broken keyboard nav, misleading CTA copy, a workflow dead-end in a core flow). "medium" = worth-fixing (minor copy issues, cramped spacing, terminology drift… |
| tags | array | – | Optional tags. "pincushion-ai" is added automatically. Add domain tags like "a11y", "copy", "flow", "empty-state", "terminology", "deploy:<hash>" for traceability. |
No output schema declared.
No examples provided.
create_invite_link Create Invite Link ~186
Generate a Figma-style shareable invite URL for a project. The recipient opens it, enters their name + email, and joins as the specified role. Returns the share URL plus expiry. Owners can mint Editor and Commenter links; Editors can mint Commenter links only. Editor links consume a paid seat on redemption.
| Name | Type | Req | Description |
|---|---|---|---|
| expiresInDays | number | – | Days until the link expires. 1–365. Default: 30. |
| maxUses | integer | – | How many people can redeem this link. 0 = unlimited. Default: 0. |
| projectId | string | yes | The project ID |
| returnTo | string | – | Optional existing same-project Pincushion report URL to open after joining. Does not publish a report or bypass its access rules. |
| role | string | – | Role granted on redemption. Default: commenter (free, unlimited). |
No output schema declared.
No examples provided.
create_share_report Create Share Report ~218
Mint a public read-only crit report link (pincushion.io/r/<token>) for a project: numbered pins with threads, screenshots, status, and the branch/PR/deploy/AI-verification trail. Anyone with the link can view it — no extension, no account, nothing to install. Free on every plan. Perfect for handing a design crit to a founder/client, or showing stakeholders what shipped. Optionally scope to a single page URL. Links never expire unless expiresInDays is set; viewers see live pin status.
| Name | Type | Req | Description |
|---|---|---|---|
| expiresInDays | number | – | Optional: days until the link expires (1–365). Omit for a non-expiring link. |
| pageUrl | string | – | Optional: limit the report to pins on this exact page URL. Omit for the whole project. |
| projectId | string | yes | The project ID |
| title | string | – | Optional report title, e.g. "Design crit — June 9". Defaults to "<N> design notes on <domain>". |
No output schema declared.
No examples provided.
create_slack_install_link Create Slack Install Link ~206
Generate an Add-to-Slack OAuth URL pre-bound to a project. Most users should prefer the public storefront URL (also returned, https://pincushion.io/install/slack) — since May 2026, that auto-links to a Pincushion license when the installer's Slack email matches, and channels are subscribed afterward via /pincushion subscribe inside Slack. Use this agent-flow URL only when you want the install to attach to one specific project up front.
| Name | Type | Req | Description |
|---|---|---|---|
| events | array | – | Events to send. Default: pin_ready, new_pin, mention, follow_up, resolved, pin_verified, pin_deployed. |
| name | string | – | Subscription name. Default: default. |
| pageUrlPatterns | array | – | Optional URL substrings for page-specific subscriptions. |
| projectId | string | yes | The Pincushion project ID. |
| targetLabel | string | – | Optional expected channel label, used only before Slack returns the selected channel. |
No output schema declared.
No examples provided.
export_agency_evidence Export Agency Evidence ~95
Pilot: produce a bounded owner/editor-only structured export for one project, filtered exactly like list_agency_pins. Includes review version and evidence provenance; it omits reviewer email, guest sessions, tokens, attachment locators, signed URLs, and provider payloads. The authenticated browser export relay can render this same authoritative projection as CSV or PDF.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | – | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
fix_and_resolve Fix & Resolve Pin ~310
Resolve a pin after applying a code fix. Transitions the pin directly to "resolved" status so it disappears from the stakeholder view. No thread comment is added — the commit is the record of the fix. Pass commitSha (from `git rev-parse HEAD`), branchName (`git branch --show-current`), and prUrl (from `gh pr view --json url -q .url` if a PR was opened) so the Pincushion dashboard can link the pin to the implementing commit, branch, and PR.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The annotation ID to fix |
| branchName | string | – | Optional branch name the fix was implemented on. Surfaces on the pin in the dashboard so stakeholders can see where the change shipped. |
| commitSha | string | – | Optional git commit SHA that implemented the fix. Stored on the annotation for bidirectional pin↔commit traceability when the project has recordCommitSha enabled (default: true). |
| filePath | string | – | Optional file path where the fix was made |
| fixDescription | string | yes | Description of the fix applied (e.g. "Updated button label to match design spec") |
| lineNumber | number | – | Optional line number of the fix |
| prUrl | string | – | Optional pull request URL (GitHub/GitLab/Bitbucket). Validated against PR-URL shape before storage. Surfaces as a clickable "Resolved in PR #N" link on the pin. |
No output schema declared.
No examples provided.
generate_critique_report ~280
Turns supplied real captures into a report receipt; it does not inspect a page or generate feedback. By default it mints a Crit and therefore requires the exact Pincushion AI pin IDs the critic just created, each positioned in a supplied capture. Set purpose:"capture" only for an explicitly capture-only report.
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | object | – | – |
| critiquePinIds | array | – | Required for purpose:"critique": exact Pincushion AI annotation IDs created by this run. Every ID must appear in pinPositions for a supplied capture. |
| critiqueRunId | string | – | Required for purpose:"critique": a stable ID shared by every critic pin in this run. The generated Crit receives a unique immutable generation key derived from it. |
| generationKey | string | – | Default canonical; stable key makes refreshes idempotent. owner-workspace is reserved for private browser captures. |
| journey | object | – | – |
| preset | string | – | – |
| projectId | string | yes | – |
| purpose | string | – | Defaults to critique. capture is for a truthful screenshot/report without AI findings. |
| reportUrl | string | – | Existing /r URL only for purpose:"capture" refreshes. A Crit always mints and binds its own new verified link. |
| screens | array | yes | – |
| title | string | – | – |
No output schema declared.
No examples provided.
get_actionable_pins Actionable Pins ~189
Get all pins waiting for developer attention. Returns three categories: (1) "auto-agent" — pins explicitly sent to the agent via "Send to Agent"; (2) "follow-up" — previously implemented pins with new user comments; (3) "review" — open reviewer comments that a developer has not yet picked up (the standard team collaboration queue). Use this as your starting point for both auto-agent workflows and manual review sessions.
| Name | Type | Req | Description |
|---|---|---|---|
| mentionedUser | string | – | Optional username to filter by @mention. Returns only pins where the thread contains "@username". Leading @ is optional (e.g. "josh" or "@josh"). |
| mode | string | – | Optional filter to return only pins of a specific mode. Omit to return all. |
| projectId | string | – | Optional project ID to filter by. If omitted, returns actionable pins across all projects. |
No output schema declared.
No examples provided.
get_agency_coordination_state Agency Pilot State ~85
Pilot: read the exact owner/editor-only agency coordination state for one project. This does not enable the pilot, grant membership, or reveal internal data to commenters, public reports, widgets, search, attachments, or notifications.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Exact Pincushion project ID. Required; local auto-discovery is not sufficient for this private surface. |
No output schema declared.
No examples provided.
get_agency_internal_thread Agency Internal Thread ~61
Pilot: read the append-only internal agency thread for one exact pin. This is restricted server-side to the current project owner/editor and is separate from the public pin discussion.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
get_annotations Get Feedback Pins ~110
Retrieve annotation pins from the .feedback/ directory. Filter by page URL, LWC component name, or status. Use this to understand what feedback exists before making changes.
| Name | Type | Req | Description |
|---|---|---|---|
| componentName | string | – | Filter by LWC component name. e.g. "wmlHomePage" or "c-wml-home-page" |
| pageUrl | string | – | Filter by page URL (partial match OK). e.g. "WML_Care_Home" |
| status | string | – | Filter by status |
No output schema declared.
No examples provided.
get_component_feedback Component Feedback ~74
Get all feedback pins targeting a specific LWC component, with a plain-language summary ready for implementation. Returns element selectors, comments, and thread history.
| Name | Type | Req | Description |
|---|---|---|---|
| componentName | string | yes | LWC component name. e.g. "wmlHomePage", "wmlAgentSidebar", or "c-wml-home-page" |
No output schema declared.
No examples provided.
get_deployment_reconciliation_status Deployment Reconciliation Status ~103
Read a compact, provider-neutral deployment readiness diagnostic. It never creates a binding, rotates a credential, or calls a provider writer. Binding state, first accepted production receipt, reconciliation, fresh desktop/mobile frame state, capture run, queue, and external Crit evidence are reported independently. A claimed Vercel project ID is ownership provenance only and is never treated as a provider binding.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Pincushion project ID to inspect. |
No output schema declared.
No examples provided.
get_feedback_summary Feedback Summary ~38
Get a high-level rollup of all open feedback: counts by status, page, and component. Use this to plan what to address first.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_implementation_packet Implementation Packet ~111
Get a single implementation packet for one page URL. Useful when you want to batch-fix one page at a time. Returns the same shape as a single entry in implement_approved_pins.packets — pins, aggregated selectors, suggested branch, traceability config. Matches by exact URL or partial substring.
| Name | Type | Req | Description |
|---|---|---|---|
| pageUrl | string | yes | The page URL to fetch the packet for (exact match or substring, case-insensitive). |
| projectId | string | – | Optional project ID to scope the search. |
No output schema declared.
No examples provided.
get_pending_critiques Pending Critiques ~134
Used by /critique-latest-deploy. Lists pending critique requests queued by the deploy-hook for the current license. Newer receipts also include a deployment event, prior page outcomes, project-page inventory, and latest per-device capture receipts for truthful local reconciliation before Crit runs. Newest-first. Free on all plans (the gating happened at enqueue time on the deploy-hook side: Pro/Team — including trial-Pro — always enqueue; free licenses enqueue while their monthly AI-action pool has headroom).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional project ID filter. Omit to list across all the license's projects. |
No output schema declared.
No examples provided.
get_pending_deployment_frame_refreshes Pending Frame Refreshes ~91
Lists production deployment frame-refresh work independently of the Critique queue. Use this even when autoCritique is false. The result is redacted: it contains no deployment URL/hash, browser state, storage path, or capture proof. Start a selected run before capturing.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional project ID filter. Omit to list eligible production frame refreshes for this license. |
No output schema declared.
No examples provided.
get_pin_verification Get Verification Evidence ~58
Read authoritative verification evidence for one explicit project and pin. Separates caller reports, deployment receipts, independently retrieved checks, and client acceptance. Missing evidence stays unknown.
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
get_project_context Project Context ~171
Read-only lookup of a project's context (name, URLs, brand context, autoCritique flag, traceability settings). Use this whenever you only need to inspect — never mutates, never touches the network. The Pincushion AI critic subagent calls this before generating any pin, since `configure_project` would otherwise upsert the project, sync to cloud, and create a deploy hook on a typo'd project name. Pass `projectId` for an exact lookup, `name` to look up by display name, or no arguments to list all projects in this workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Optional project display name. Returns the matching project if found, or `availableProjects` if not. |
| projectId | string | – | Optional exact project ID. Mutually exclusive with `name`. |
No output schema declared.
No examples provided.
get_project_identity_diagnostic Project Identity Diagnostic ~89
Read-only diagnostic for project identity repair. Returns only authentication state, safe key source/last-4 provenance, local project-cache state, candidate statuses, and URL/ID ambiguity. Never returns credentials or performs a network request or mutation.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional exact cached project ID to diagnose. |
| urls | array | – | Optional workspace URLs used only for local ambiguity matching. |
No output schema declared.
No examples provided.
get_reply_candidates Get Reply Candidates ~155
Used by /pincushion-replies. Returns pins where Pincushion AI should respond, with each candidate tagged by trigger reason. Two triggers: (a) "mention" — the latest thread message contains @pincushion AND was authored by a human; (b) "reply-on-bot-pin" — the pin was originally authored by Pincushion AI and the latest message is from a human. Skips resolved/archived pins and any pin where the latest message is already bot-authored (idempotency). Newest-first ordering so the slash command can pace replies.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional project ID to filter by. If omitted, returns candidates across all projects. |
No output schema declared.
No examples provided.
get_review_activity Review Activity ~54
Pilot: read authenticated client-review decisions and completion for exact frozen review versions. It intentionally reports no speculative online/presence state and does not expose reviewers' emails or guest-session identifiers.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | – |
No output schema declared.
No examples provided.
get_selected_pins Selected Pins ~60
Get pins that the developer has selected for implementation from the dashboard or PINS.md checkboxes. Returns the selected pin IDs with full context (element, thread, deep link). Use this to know which pins the developer wants you to work on next.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_setup_instructions Setup Instructions ~45
Continue an existing critique with claim, or start a project with setup and explicit editor selection. Includes authenticated project checks and exact approved-pin implementation guidance; the browser extension is optional.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_time_to_fix_metrics Time-to-Fix Metrics ~136
Compute median + p25/p75 time-to-fix from resolved pins. Returns sample size + threshold flag so callers can honestly hide the metric when the dataset is too small (< 5 resolved pins). This is the marketing proof point that distinguishes Pincushion from "manage feedback" tools — agent-native means fast.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional project ID to scope the metrics. Required when scope = "project". |
| scope | string | – | "project" (default) restricts to one project. "global" computes across all projects accessible in this workspace — used by the landing widget for aggregate proof. |
No output schema declared.
No examples provided.
implement_approved_pins Approved Pin Packets ~145
CALL THIS FIRST when approved pins exist. Returns all stakeholder-approved pins grouped into **implementation packets** by page URL, each containing aggregated CSS selectors, full comment threads, and a suggested git branch name. One packet = one branch / one PR. Use the selectors to grep the source code, read the thread to understand what the stakeholder wants, then implement the fix. Workflow: implement_approved_pins → claim_pin → code change → fix_and_resolve. The result exposes both `packets` (canonical) and `pages` (alias).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | – | Optional project ID to filter by. If omitted, returns approved pins across all projects. |
No output schema declared.
No examples provided.
import_qa_results Import QA Results ~367
Pilot: import already-parsed axe JSON or Playwright JSON from an authenticated owner/editor/developer. Use dryRun=true to preview normalization and exact deduplication identities without writing. Repeated imports update one project + canonical page + device + rule + target record and preserve provenance. Failed observations may create or update open agent pins; passed, skipped, and inconclusive observations never resolve pins, change pin statuses, or qualify as trusted verification. The importer never reads files, fetches URLs, calls a provider, or uploads repository contents.
| Name | Type | Req | Description |
|---|---|---|---|
| branch | string | – | Optional branch metadata. |
| commitSha | string | – | Optional exact commit SHA associated with the run; metadata only, not deployment proof. |
| device | string | yes | Viewport/device class. phone and handset normalize to mobile; pc and laptop normalize to desktop. |
| dryRun | boolean | – | Preview only. No cloud request, pins, statuses, or verification records are changed. |
| environment | string | – | Optional environment metadata such as staging or production. |
| format | string | yes | Supported result adapter. |
| formatVersion | string | – | Exact producer/result format version. Required when it cannot be inferred from the result payload. |
| pageUrl | string | yes | Canonical page under the registered project URL. Query variants remain distinct; credentials and fragments are rejected/removed. |
| projectId | string | yes | Exact Pincushion project ID. The server re-checks immutable owner/editor/developer access. |
| results | object | yes | Already-parsed axe or Playwright JSON. No file path, URL fetch, or provider reference is accepted. |
| runId | string | yes | Stable producer run identifier for safe replay and provenance. |
| source | string | yes | Bounded source label such as github-actions or playwright-ci. |
No output schema declared.
No examples provided.
link_pin_deploy Link Deploy URL ~137
Link a deploy URL to a resolved pin. Typically called by the deploy-hook edge function once a deploy that includes the pin's fix goes live. Stakeholders see the deploy URL on the resolved pin in the dashboard. Re-runs overwrite the previous deploy URL (latest deploy wins).
| Name | Type | Req | Description |
|---|---|---|---|
| annotationId | string | yes | The annotation ID to link |
| deployUrl | string | yes | The http(s) URL of the deploy that includes the fix (e.g. "https://pincushion.io" or a Vercel preview URL) |
| deployedAt | string | – | Optional ISO timestamp of the deploy. Defaults to now. |
No output schema declared.
No examples provided.
list_agency_pins Agency Pins ~81
Pilot: read owner/editor-only pins with private labels and evidence summaries. `status`, `pageUrl`, `device`, and `labelIds` compose as an AND filter. The result contains no public-thread expansion, attachments, reviewer email, guest session, or presence data.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | – | – |
| projectId | string | yes | – |
No output schema declared.
No examples provided.
list_collaboration_integrations List Integrations ~47
List Slack and Microsoft Teams webhook subscriptions for a Pincushion project. Webhook URLs are masked.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | The Pincushion project ID. |
No output schema declared.
No examples provided.
list_members List Members ~38
List all members of a Pincushion project with their roles, plus seat usage info.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | The project ID |
No output schema declared.
No examples provided.
manage_deployment_automation Manage Deployment Automation ~147
Owner-keyed deployment automation management. inspect is read-only. repair is available only for a reported orphaned external provisioning attempt. rotate and revoke require confirmed: true. Results are redacted: no endpoint, credential, signing material, provider webhook IDs, or cleanup-debt IDs are returned.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | Lifecycle action. Defaults to inspect. |
| confirmed | boolean | – | Must be true for rotate or revoke. Omit or false for a dry status response. |
| deploymentProvider | string | – | Optional explicit provider. It must match the owner lifecycle binding when supplied. |
| projectId | string | yes | Pincushion project ID whose owner lifecycle should be managed. |
No output schema declared.
No examples provided.
preview_collaboration_notification Preview Notification ~60
Preview the Slack, Teams, or Discord notification shape and recommended event routing before connecting a real webhook.
| Name | Type | Req | Description |
|---|---|---|---|
| event | string | – | Event to preview. Default: pin_ready. |
| provider | string | – | Provider payload to preview. Default: slack. |
No output schema declared.
No examples provided.
record_deployment_page_result Record Deployment Page ~468
Record one terminal page result for a deployment frame refresh. Every non-removed page in an initialized frame refresh must upload a newly staged desktop/mobile image pair from the exact active run, then submit those newly staged desktop/mobile version IDs and hashes with captureRunId and opaque captureProof. For unchanged, the server recomputes the image-byte hashes, accepts only an exact match to the frozen canonical pair, records the new evidence as observed, and discards the private duplicate pair; use updated if either byte hash differs. The deploy hook alone freezes removed rows, so callers cannot submit removed for an initialized run. Only server-confirmed historical pre-frame not_requested receipts retain a legacy no-run route. The server finalizes only after every initialized page has the current exact capture-run pair; a Critique queue state alone is never frame-current.
| Name | Type | Req | Description |
|---|---|---|---|
| captureProof | string | – | Opaque proof from start_deployment_capture_run. Required with captureRunId for every initialized terminal result; never persist, log, or pass it through shell argv. |
| captureRunId | string | – | Active capture-run ID from start_deployment_capture_run. Required for every initialized frame-refresh terminal result. An initialized removed result is forbidden because the deploy hook freezes remov… |
| contentHashes | array | – | Server-recomputed SHA-256 hashes of the exact newly uploaded image bytes, paired with versionIds. |
| deploymentId | string | yes | Deployment event ID supplied by get_pending_critiques. |
| error | string | – | Bounded truthful reason for failed, inaccessible, or skipped results. Never include credentials or raw page content. |
| outcome | string | – | Optional local classifier outcome. The local MCP maps changed to updated and unknown to failed when status is omitted. |
| pageUrl | string | yes | Exact inventoried page URL. Query variants remain distinct. |
| status | string | yes | Terminal result. Use updated for a persistent change; use failed rather than labeling uncertain evidence unchanged. |
| versionIds | array | – | Newly staged desktop/mobile version IDs for updated, added, or unchanged. Unchanged still requires fresh current-run byte uploads; the server deduplicates only after verifying both byte hashes match… |
No output schema declared.
No examples provided.
What is the Pincushion MCP server?
Pincushion is an MCP server listed in the public MCP registry as io.github.jcooley8/pincushion. Stakeholders pin feedback on your live app; your AI agent reads the pins via MCP and fixes them. This page covers its npm package (pincushion-mcp).
Is the Pincushion MCP server safe to use?
Pincushion scores 74 out of 100 on VerifyMCP. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Pincushion MCP server expose?
Pincushion exposes 65 tools: get_annotations, search_annotations, get_feedback_summary, get_component_feedback, resolve_annotation, and 60 more. Their descriptions and schemas cost roughly 11,629 tokens of context every time the server is loaded.
Is the Pincushion MCP server still maintained?
Pincushion is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.