{
  "markdown": "# @pinappai/mcp\n\nDrive almost the full PinAppAI admin panel from any MCP-compatible AI\nclient — list and triage change requests, manage workspaces / projects /\nmembers / reviewers, read the audit log.\n\nA [Model Context Protocol](https://modelcontextprotocol.io) server.\nWorks in Claude Code, Codex CLI, Cursor, Claude Desktop, Continue, Zed,\nand any other MCP-compatible client.\n\n## Three surfaces\n\nEasy to confuse, so: **10 workflows** you invoke, **38 tools** your agent\ncalls over the protocol, and **6 CLI commands** you type in a terminal\n(`install`, `login`, `logout`, `uninstall`, `--help`, `--version`).\n\nA workflow is **not** a shell command — `npx @pinappai/mcp apply` tells you\nso rather than running anything. How you invoke one depends on your client,\nbecause the MCP spec deliberately leaves prompt UI to each host:\n\n| Client | Run the `apply` workflow |\n|---|---|\n| Claude Code | `/pinappai:apply` |\n| Codex | ask: \"run the pinappai apply workflow\" (no slash menu for prompts) |\n| Cursor | type `/` and pick it |\n| Claude Desktop | `+` menu, then pinappai, then apply |\n| Continue | `/apply`, unnamespaced (IDE extension in agent mode, not the `cn` CLI) |\n| Anything else | ask in plain language |\n\nClients that don't implement MCP prompts reach the same procedures through\nthe `pinappai_get_workflow` tool, which returns the workflow body verbatim —\nso the agent follows the real thing instead of improvising from the name.\n\n`npx @pinappai/mcp --help` lists every workflow and tool in your installed\nversion.\n\n## Requirements\n\n**Node.js ≥ 18** (the server uses the global `fetch`). MCP clients launch\n`npx` under whatever Node is first on `PATH` — a stale nvm default can pick\nan old version. Since 0.6.2 the server exits immediately with a clear\nmessage in that case instead of a cryptic `ReferenceError: fetch is not\ndefined`. Fix by pointing the client's command at a Node 18+ `npx`, or\n`nvm alias default 18` (or higher), then restart the client.\n\n## What's new in 0.9.10\n\n- `npx @pinappai/mcp install` no longer reports **Claude Code** as detected on machines that do not have it. Client detection treats \"the config file's parent directory exists\" as evidence a client is installed, which is sound for `~/.cursor`, `~/.codex`, `~/.continue` and Claude Desktop, but Claude Code's config is `~/.claude.json` whose parent is `$HOME` — present on every machine. So every install announced Claude Code and left a stray `~/.claude.json` behind, even for people running only Cursor or Codex. `$HOME` is now never treated as evidence of an install; a client whose config sits directly in `$HOME` is detected by its actual config file. Detection of every other client is unchanged, verified across all five. Knock-on: `login`'s \"no AI clients detected yet\" hint was previously unreachable and can now fire, so a client that is installed but has never been launched (no config file yet) asks you to launch it once first.\n\n## What's new in 0.9.9\n\n- `get_change_request` now surfaces `screenshot.clean_url` — the un-annotated twin of an annotated screenshot (screenshot-annotations feature, landed on `main` mid-0.9.8-cycle but never released). A field-reconstruction in the tool's response mapping was silently dropping it; now forwarded alongside `url`. `null` when a change request has no annotated screenshot or predates the feature. No other tool, workflow, or CLI changes — `list_change_requests`' canvas-pin position metadata (viewport, `pin_kind`) needed no MCP-side change, since that tool passes the API response through verbatim and the API-side fix is already live.\n\n## What's new in 0.9.8\n\n- `npx @pinappai/mcp uninstall` now also signs you out: it revokes the stored key server-side (best effort) and deletes the local credentials file, so one command fully detaches. The standalone `logout` command is unchanged, for when you want to sign out without removing the integration. A key supplied via `PINAPPAI_API_KEY` is never stored in the credentials file, so it is left untouched.\n\n## What's new in 0.9.7\n\n- Display name: MCP clients and connector directories now show **PinAppAI** as the server's title (added the `Implementation.title` field). No tool, workflow, or CLI changes.\n- The hosted HTTP connector (`https://mcp.pinappai.com/mcp`, a separate service from this npm package) now supports browser sign-in: connect with OAuth and no API key to paste. This npm package continues to authenticate with a `ppk_` key as before.\n\n## What's new in 0.9.6\n\n- The [MCP Server Registry](https://registry.modelcontextprotocol.io/) entry now also lists the hosted HTTP connector (`remotes`: `https://mcp.pinappai.com/mcp`), so registry-driven clients can connect without installing this package. The npm package is unchanged in behavior and remains fully supported.\n- Packaging: the shared tool/prompt registry is now vendored into the published tarball (internal restructuring; no API or tool changes).\n\n## What's new in 0.9.5\n\n- Published to the official [MCP Server Registry](https://registry.modelcontextprotocol.io/) as `com.pinappai/mcp` (the `mcpName` field in package.json is the registry's ownership proof; `server.json` holds the registry metadata). No runtime changes.\n\n## What's new in 0.9.4\n\n- **`logout` now revokes the key server-side** before deleting the local\n  credentials file. Previously a \"logged out\" key stayed valid forever — a\n  still-running MCP session (or a copied credentials file) kept full access\n  after an account switch. Now running sessions on the old key stop\n  authenticating the moment you log out (restart your AI client to pick up\n  the new account after `login`). If the server is unreachable, logout says\n  so and points at the dashboard's API Keys page for manual revocation.\n- **`auth-help` reports who you're signed in as.** The verification step now\n  leads with identity (name, email, workspace, role) via `get_me` before the\n  project list — so after switching accounts you can see at a glance which\n  one this session is actually using.\n\n## What's new in 0.9.3\n\n- **Answering \"n\" to apply's Case-A `/changes/` prompt no longer strands the\n  batch** (#123). The marker written at the end of an apply run used to land\n  inside the batch it points at, so the documented recovery — \"run\n  `generate-changes-page` when ready\" — always found an empty range and the\n  batch's CRs sat in `in_review` forever. Now a declined Case-A prompt records\n  `\"changes_page_pending\": true` + `\"batch_base_sha\"` (the landing commit's\n  parent) in `.pinappai/last-applied.json`; `generate-changes-page` scopes from\n  that base (including every declined batch — the oldest base is preserved\n  across repeated declines) and clears the flag once the page lands. A later\n  apply's Case-A **Y** pays the same debt inline.\n\n## What's new in 0.9.2\n\n- **`--help` answers instead of starting a server.** Any unrecognized argv used\n  to fall through to the stdio-server bootstrap, so `npx @pinappai/mcp --help`\n  silently booted a server on a terminal nobody was speaking JSON-RPC on. Now\n  `--help` / `-h` / `help` and `--version` / `-v` print, and `--help` lists every\n  workflow and tool read from the live registry. Works logged-out.\n- **`pinappai_get_workflow`** (38th tool) — returns a workflow's full procedure\n  as text, so clients that don't implement MCP prompts still run the real thing.\n  Codex and Cline have no prompt support at all; VS Code, Zed and Claude Desktop\n  each use different syntax. Tools are universal, so the workflows now ride them.\n  Read-only: it returns text, and every destructive step stays behind the\n  existing `confirm=true` tools.\n- **Server `instructions`** tell prompt-less hosts to call it rather than\n  improvise a workflow from its name.\n- **A workflow name used as a CLI command** (`npx @pinappai/mcp embed-widget`)\n  now explains where to run it and exits 2, instead of booting a stray server.\n- **Every printed invocation is the `npx` form.** `pinappai-mcp login` only\n  reaches `PATH` after a *global* install, but the documented flow is `npx` —\n  so the next step after install died with `command not found`.\n\n## What's new in 0.9.1\n\n- `/pinappai:apply` now surfaces the **device and viewport** the reviewer used.\n  Each `pinappai_list_apply_inbox` row carries `device_label` / `orientation`\n  and, for pins, `viewport_w` × `viewport_h` — so the apply run reproduces and\n  verifies the fix at the width the reviewer actually saw, not just desktop.\n\n## What's new in 0.9.0\n\n- `/pinappai:apply` now honors **workspace AI instructions** — house rules a\n  Team workspace saves once (admin → workspace settings → AI instructions)\n  and every apply run follows: code style, verification commands, file\n  boundaries. The `pinappai_list_apply_inbox` response carries them as\n  `workspace_instructions`.\n\n## What's new in 0.7.2 – 0.8.2\n\n- **0.7.2** — reset now wipes pins/comments/screenshots too (see the\n  reset bullet under 0.7.0, amended above); prompt copy matches.\n- **0.7.3** — `update_project` gains `primary_origin` / `preview_origin`\n  (the no-install review link + its branch-preview variant); the three\n  apply-flow prompts offer to wire a new branch's deploy URL to the\n  preview review link after landing.\n- **0.7.4** — /changes/ content contract: before/after texts are copied\n  verbatim from the source file, typographic punctuation included.\n- **0.7.5** — the Apply batch gate gains per-CR walkthrough modes\n  (\"only ask about the unclear ones\", \"step through every CR\") with\n  one-question-per-CR flow; per-CR outcome report.\n- **0.7.6** — prompt UX pass: legacy prompts (`fix-changes`,\n  `apply-decisions`, `triage-and-resolve`) point at `/pinappai:apply`\n  first; `setup-project` derives project fields from the repo and asks\n  once, audits Permissions-Policy, and offers the review link;\n  `remove` offers to disable the review link (the proxy outlives the\n  embed); stale-/changes/ regeneration is automatic with a landing-step\n  veto.\n- **0.7.8** — privileged /changes/ registration: new\n  `pinappai_register_change_items` tool; every /changes/-producing\n  prompt ends with a mandatory registration call (client-side\n  self-registration was removed server-side — the public endpoint\n  returns 410).\n- **0.7.9** — staleness pass: `triage-and-resolve` prompt removed (its\n  admin_status pipeline only fed the retired v1/v2 dashboards); legacy\n  iteration tools are marked LEGACY in their descriptions; `analyze` /\n  `summarize` / marker copy now point at `/pinappai:apply` and\n  understand `#N` commit references.\n- **0.8.0** — legacy dashboard sunset: the `fix-changes` and\n  `apply-decisions` prompts and the five legacy iteration tools\n  (`pinappai_open_iteration`, `pinappai_mark_iteration_applied`,\n  `pinappai_mark_change_request_applied`,\n  `pinappai_acknowledge_change_request`, `update_change_request`) are\n  REMOVED — `/pinappai:apply` +\n  `pinappai_apply_change_requests` are the only apply path. Current\n  totals: **37 tools, 10 prompts**.\n- **0.8.1** — resilience: prompt files are snapshotted into memory at\n  server startup, so a mid-session npx cache sweep (`npm cache clean`,\n  cache eviction) can no longer ENOENT the lazy prompt reads; disk stays\n  the primary source (dev edits still apply without restart). Stale\n  compiled outputs no longer ship (prebuild dist clean).\n- **0.8.2** — license change: published under the PinAppAI Client\n  License (proprietary — install and run freely to use the PinAppAI\n  service; no redistribution or derivative works). Versions ≤ 0.8.1\n  remain MIT.\n\n## What's new in 0.7.1\n\n- **✂️ Text-selection pins in the apply loop** — `/pinappai:apply` and\n  `/pinappai:fix-changes` now branch on `pin_kind: 'text'`: the reviewer\n  highlighted an exact text range; replace exactly that range using the\n  `selection_prefix` / `selection_suffix` / `selection_occurrence` anchors.\n- **`/changes/` page skeleton is now a shared contract**\n  (`_shared/changes-page-skeleton.md`, embedded in all four producer\n  prompts): self-contained page (no site layout / cookie banners over the\n  review UI), h2-per-page grouping with source-file `meta`, banner +\n  generated stamp. Previously apply-generated pages only referenced these\n  rules by name and shipped embedded in the site theme.\n- **Before/After content discipline** in the item contract: text changes\n  carry the LITERAL old/new text in `.val` (they're the revert snapshot);\n  style commentary goes on a separate line; visual-only changes may\n  describe.\n\n## What's new in 0.7.0\n\n- **`/pinappai:reset-project` prompt + `pinappai_reset_review_data` tool** —\n  reset a project's review data to zero: permanently deletes its change\n  requests, iterations, reviewer decisions, AND all pins/comments with\n  their screenshots on the server (pins joined the wipe in 0.7.2's\n  server behavior — earlier \"pins survive\" wording no longer applies),\n  then offers to remove the repo's static `/changes/` page and\n  `.pinappai/last-applied.json` marker. Explicit\n  confirmation required; admin role required; not recoverable.\n- **Deleted change requests no longer haunt the review overlay.** The\n  widget now registers each `/changes/` item's originating CR id\n  (`data-pp-applied-cr-id`), and the server drops items whose CR was\n  deleted — at registration time, at read time, and on CR delete. On the\n  `/changes/` page itself, items whose CR is gone no longer render a\n  decision bar. Regenerate `/changes/` via `/pinappai:apply` to pick up\n  the attribute on older pages.\n\n## What's new in 0.6.2\n\n- **Fail-fast on Node < 18** — actionable error instead of a deep\n  `fetch is not defined` stack trace (see Requirements).\n- **Honest version reporting** — `serverInfo.version` is read from\n  `package.json` at runtime; it was previously hardcoded and stale, so MCP\n  logs reported the wrong version.\n- **`/pinappai:apply` emits the `/changes/` locator attributes**\n  (`data-pp-page-url` + `data-pp-source-selector`) on every generated item\n  (added 0.6.1). Without `data-pp-page-url` the in-page\n  \"N changes to review\" chip never appears — regenerate `/changes/` via\n  `/pinappai:apply` to pick up the fix.\n\n> Upgrading: `npx` caches resolved builds, so a new publish doesn't take\n> effect until you clear the cache (`rm -rf ~/.npm/_npx`) and restart your\n> client.\n\n## What's new in 0.5.0\n\n**Zero-arg prompts.** The `project` argument is now optional on these\nprompts (`analyze`, `remove`, `summarize`, `generate-changes-page`). When omitted, the prompt\nresolves the project from `.pinappai/context.json` if bound, otherwise\ncalls `list_projects` and asks you to pick (auto-selects when your\nworkspace has one project). On first pick, it offers to bind the slug\nback to the repo so every subsequent run is zero-prompt.\n\nCustomer-facing impact: `/pinappai:apply-decisions` works directly — no\nslug typing. `generate-changes-page` no longer asks you to paste a\n`pk_...` widget key either; it derives the key from the resolved\nproject's `api_key` field via `get_project`.\n\n**`setup-project` writes `.pinappai/context.json` on install** so the\nfirst `/pinappai:apply-decisions` after install skips the bind-to-repo\nprompt entirely. One file ships with the install commit alongside\n`.pinappai/last-applied.json`.\n\n**`apply-decisions` Step 7 closes the iteration loop.** After applying\nthe batch, the prompt asks `Regenerate /changes/ now? [Y/n]` and stages\nthe regenerated page alongside the source edits + marker so the whole\nround lands in a single commit. Default is yes. Skip with `n` to\nregenerate manually later via `/pinappai:generate-changes-page`.\n\n**New shared block:** `_shared/project-resolution.md` centralizes the\nexplicit-arg → context.json → list_projects fallback chain so all 7\nslug-aware prompts behave identically. Same pattern as the existing\n`marker-write.md` / `landing-chooser.md` / `widget-snippet.md` shared\nblocks — change one file, every prompt updates.\n\n**5 new iteration-loop tools** from the Phase 3 server-side parallel\n`/me` API surface: `pinappai_open_iteration`,\n`pinappai_list_iterations`, `pinappai_get_iteration_coverage`,\n`pinappai_acknowledge_change_request`,\n`pinappai_mark_iteration_applied`. 32 tools total.\n\n**Two new prompts:** `/pinappai:embed-widget` (install widget into an\nexisting project) and `/pinappai:analyze` (read-only triage report,\nproduces a cluster summary without editing source). 11 prompts total.\n\n## What's new in 0.4.0\n\nThe install flow stops asking you to copy-paste a long JSON snippet:\n\n```bash\nnpx @pinappai/mcp install   # write the MCP entry into your AI client configs\nnpx @pinappai/mcp login     # browser sign-in; mints a per-machine key\n```\n\nThat's it. `login` opens a browser tab, you sign in, pick a workspace\nif you have multiple, click Authorize, and the CLI saves the freshly\nminted `ppk_…` key to a local credentials file. Restart your AI client\nand the slash commands appear.\n\nFour new subcommands: `install`, `login`, `logout`, `uninstall`.\nMirrors `gh auth login`, `wrangler login`, `vercel login`, etc. — your\nmuscle memory transfers.\n\nMatched server-side feature: a new device-code endpoint group at\n`/api/v1/cli/auth/*` and a workspace-picker page at\n`app.pinappai.com/cli-approve.html`. CI / scripted installs still work\nvia the `PINAPPAI_API_KEY` env var (see \"CI / headless\" below).\n\nPlus a small naming cleanup: the old `/pinappai:uninstall` slash\ncommand is now `/pinappai:remove` (since it removes the widget from\nyour customer's site, distinct from `pinappai-mcp uninstall` which\nremoves the MCP from your AI client config).\n\n## What's new in 0.3.0\n\nv0.3.0 adds the **two prompts that close the iteration loop** plus the\nshared infrastructure that makes the loop iteration-aware:\n\n- **`/pinappai:apply-decisions`** — fetch admin-queued decisions, group by\n  file, apply rollbacks (revert to original) and modifies (apply reviewer's\n  literal request) in one batch. Mirrors `fix-changes` shape but for the\n  Approvals path. The MCP-native version of the admin's \"Copy decisions\n  for AI\" export.\n- **`/pinappai:remove`** — strip widget + `/changes/` + helpers when\n  you're shipping the rewrite. Four `git grep` verification steps.\n  Preserves the `.pinappai/` directory by design — re-installing later\n  drops you back into the same baseline.\n\n**New shared infrastructure across all applies-to-source prompts:**\n\n- `.pinappai/last-applied.json` — iteration boundary marker (ISO timestamp).\n  Written at end of every apply run. The next `/changes/` regen scopes to\n  \"git log --since=<this timestamp>\" — reviewers only see what's drifted\n  since the last apply.\n- `.pinappai/context.json` — project-shape cache (stack, build / lint\n  commands, route convention, localization, `text_lives_in`). Detected\n  once, then read by every prompt.\n- **Landing-chooser pattern** — every prompt that edits source ends with\n  a verbatim a/b/c/d picker (new branch / commit current / stage only /\n  skip) so the AI never auto-commits. Branch protection respected;\n  `--no-verify` never used.\n\nNet: 10 prompts total, full pipeline coverage from `setup-project` through\n`remove`.\n\n## What's new in 0.2.0\n\nThe original v0.1.x release was read-only — list projects, list change\nrequests, fetch screenshots, run pattern analysis. v0.2.0 adds **write\ntools that mirror the admin panel surface** so a Claude Code user can\ndo almost everything from inside their editor:\n\n- Project lifecycle (create / update / archive / unarchive)\n- Workspace lifecycle (list / create / rename / soft-delete)\n- Members + reviewers (invite / role change / remove / revoke)\n- Change-request status transitions (open → processing → done / wontfix)\n- Audit-log review (Business tier, owner role)\n- API-key list / revoke / restore (creating new keys still happens in\n  the admin UI — by design)\n- Self-service profile + GDPR Art. 15 data export\n\nThe original 6 read tools and 5 read-prompts continue to work\nunchanged. See \"Permissions\" below for the security model.\n\n## Install\n\n### Recommended (0.4.0+) — two commands, no key copy/paste\n\n```bash\nnpx @pinappai/mcp install   # registers the MCP server in your AI client configs\nnpx @pinappai/mcp login     # opens browser, mints a per-machine key, saves it locally\n```\n\n`install` writes the MCP entry into every detected AI client config\n(Claude Code, Cursor, Claude Desktop, Codex CLI, Continue).\n`login` opens your browser for sign-in, picks a workspace if you have\nmultiple, and saves the freshly minted key to a local credentials file\nunder `~/.config/pinappai/`. Restart your AI client and the slash\ncommands appear under `/pinappai:…`.\n\nTo check who you're signed in as or change accounts, run\n`npx @pinappai/mcp login` again — it overwrites the existing\ncredentials. To sign out, `npx @pinappai/mcp logout` deletes the\ncredentials file. To remove the MCP entry from your AI client configs,\n`npx @pinappai/mcp uninstall`.\n\n### CI / headless / scripted installs\n\nThe browser-based `login` doesn't fit non-interactive environments, so\nthe MCP server also reads `PINAPPAI_API_KEY` from the env first, with\nthe credentials file as a fallback. For CI:\n\n```bash\nPINAPPAI_API_KEY=ppk_… npx -y @pinappai/mcp\n```\n\nMint a key for this in the admin UI at\n[app.pinappai.com/api-keys](https://app.pinappai.com/api-keys) — name\nit after the machine / pipeline so you can revoke it cleanly later.\n\n### Manual install (advanced)\n\nIf you'd rather wire the MCP into a single client by hand — or you need\nto pin a specific version — these are the per-client snippets the new\n`install` writes for you. You can edit them directly and skip the\n`install` command.\n\n#### Claude Code\n\n```bash\nclaude mcp add-json pinappai '{\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"@pinappai/mcp\"],\"env\":{\"PINAPPAI_API_KEY\":\"ppk_...\"}}'\n```\n\n#### Cursor\n\nEdit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"pinappai\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pinappai/mcp\"],\n      \"env\": { \"PINAPPAI_API_KEY\": \"ppk_...\" }\n    }\n  }\n}\n```\n\nRestart Cursor.\n\n#### Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"pinappai\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pinappai/mcp\"],\n      \"env\": { \"PINAPPAI_API_KEY\": \"ppk_...\" }\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\n#### Codex CLI\n\nEdit `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.pinappai]\ncommand = \"npx\"\nargs = [\"-y\", \"@pinappai/mcp\"]\n\n[mcp_servers.pinappai.env]\nPINAPPAI_API_KEY = \"ppk_...\"\n```\n\n#### Continue\n\nEdit `~/.continue/config.yaml`:\n\n```yaml\nmcpServers:\n  - name: pinappai\n    command: npx\n    args:\n      - \"-y\"\n      - \"@pinappai/mcp\"\n    env:\n      PINAPPAI_API_KEY: ppk_...\n```\n\n`PINAPPAI_API_BASE` defaults to `https://api.pinappai.com`. Override\nin the env block if you're hitting a non-prod base.\n\n### Verify\n\nIn your AI client, type `/pinappai` — the slash commands should\nauto-complete. If they don't, run `/pinappai:auth-help` and the AI\nwalks you through diagnosis.\n\n## Tools\n\n### Read tools (v0.1.x)\n\n| Tool | Returns |\n|---|---|\n| `list_projects` | Projects this key can access (slug, name, domain, counts) |\n| `get_review_summary` | Totals + by-page + by-reviewer for a project |\n| `list_change_requests` | Filtered list with cursor pagination (default: change_requested only) |\n| `get_change_request` | Full CR detail + `related[]` (same selector + same page) + optional inline image |\n| `analyze_patterns` | Deterministic groupings + heuristic clusters + (when sampling supported) AI-judged clusters |\n| `get_screenshot` | Inline image content block for a CR's screenshot |\n\n### Project + change-request writes (v0.2.0)\n\n| Tool | Effect |\n|---|---|\n| `get_project` | Single project detail (incl. embeddable widget api_key) |\n| `create_project` | Create a new project in the api-key's workspace (editor+) |\n| `update_project` | Rename / change allowed_origins / toggle anonymous reviewers (editor+) |\n| `archive_project` | Soft-archive, reversible (owner) |\n| `unarchive_project` | Restore an archived project (owner) |\n| `update_change_request` | Transition admin_status: open → processing → done / wontfix (editor+) |\n\n### Workspace + member + reviewer writes (v0.2.0)\n\n| Tool | Effect |\n|---|---|\n| `list_workspaces` | All workspaces the user is a member of (across keys) |\n| `create_workspace` | Create a new workspace owned by the user (Team / Business tier for additional ones) |\n| `get_workspace` | The api-key's workspace details + role |\n| `update_workspace` | Rename / re-slug (owner) |\n| `delete_workspace` | Soft-delete with 7-day grace, recoverable via email magic link (owner) |\n| `list_members` / `invite_member` / `update_member_role` / `remove_member` | Member CRUD (admin+). On a **full Team plan**, `invite_member` returns `409 seat_required` — the MCP surface never charges a seat; add one on the billing page (billing owner) first, then invite. |\n| `list_reviewers` / `invite_reviewer` / `revoke_reviewer` | Project reviewer CRUD (editor+) |\n\n### Audit + api-keys + me (v0.2.0)\n\n| Tool | Effect |\n|---|---|\n| `list_audit_events` | Paginated audit-log read for the workspace (owner, Business tier) |\n| `list_api_keys` / `get_api_key` | List + detail (no plaintext returned) (admin+) |\n| `revoke_api_key` | Soft-revoke; refuses to revoke the calling key (admin+) |\n| `restore_api_key` | Undo a revoke within 7 days (admin+) |\n| `get_me` | Whoami probe (user + workspace + role + key metadata) |\n| `update_me_profile` | Change the user's display name |\n| `export_my_data` | GDPR Art. 15 right-of-access export |\n\nAPI-key creation is intentionally NOT exposed — mint keys at\n[app.pinappai.com/api-keys](https://app.pinappai.com/api-keys).\nPermanent project deletion + change-request hard-delete are also\nadmin-UI-only (irreversible operations stay human-driven).\n\n## Prompts (slash commands)\n\n| Slash command | Purpose |\n|---|---|\n| `/pinappai:setup-project` | Pick / create workspace → create project → emit widget snippet → bootstrap iteration marker |\n| `/pinappai:generate-changes-page` | Generate or regenerate `/changes/`; reads `.pinappai/last-applied.json` to scope diff |\n| `/pinappai:remove` | Strip widget + `/changes/` + helpers when shipping; preserves `.pinappai/` |\n| `/pinappai:analyze` | Read-only triage report (no edits) |\n| `/pinappai:summarize` | PR body / changelog / customer email generator |\n| `/pinappai:audit-review` | Pull recent audit events, summarize unusual activity |\n| `/pinappai:auth-help` | Setup walkthrough |\n\n## Permissions\n\nA `ppk_…` key inherits the **full workspace role of the user who minted\nit**. Owner-minted keys can do owner-only things via MCP (delete the\nworkspace, invite admins, read the audit log). Viewer-minted keys are\nread-only.\n\nThis means losing a `ppk_` key is roughly as bad as losing the issuing\nuser's session for that workspace. Treat them with the same care:\n\n- Mint a separate key per machine / context, named so you can identify\n  what it's for.\n- Revoke + re-mint immediately if a key leaks.\n- Don't commit `ppk_` strings to source control.\n\nThe api-key inherits the workspace boundary too — it can only act on\nprojects / members / reviewers / audit rows of ONE workspace, regardless\nof how many other workspaces the issuing user belongs to. To act on a\ndifferent workspace, mint a new key for that workspace.\n\n## Safe-by-design omissions\n\nOperations the admin panel exposes but MCP does NOT:\n\n- **Creating new API keys** — minting a key is a \"give an LLM forever-\n  power\" action. We require a human at the dashboard.\n- **Permanent project deletion** — irreversible cascade through R2 +\n  feedback rows.\n- **Hard-deleting individual change requests** — irreversible. Use\n  `update_change_request` with `admin_status: wontfix` to remove a row\n  from the active queue without losing audit history.\n- **Account deletion / MFA setup / session management** — multi-factor\n  flows that need a human at the dashboard.\n- **Widget upload of screenshots / expected items** — those are\n  reviewer-side widget APIs, not admin operations.\n\n## Troubleshooting\n\n| Symptom | Likely cause + fix |\n|---|---|\n| `auth_invalid_key` error | Your `ppk_…` is missing, malformed, revoked, or expired. Run `/pinappai:auth-help` or visit [app.pinappai.com/api-keys](https://app.pinappai.com/api-keys). |\n| `not_found` for a project | Run `list_projects` to see what your key can access. Cross-workspace ids return `not_found` (not 403) on purpose. |\n| `forbidden` when calling a write tool | Your key's role is below what the tool requires. `get_me` shows your role; mint a key as a higher-role user, or ask one to do the action. |\n| `cannot_revoke_self` | You tried to `revoke_api_key` with the calling key's id. Mint a replacement first, then revoke from the admin UI. |\n| `plan_upgrade_required` on `list_audit_events` | Audit log is a Business-tier feature. See [pinappai.com/pricing](https://pinappai.com/pricing/). |\n| AI clusters not appearing | Your AI client may not support MCP `sampling/createMessage`. The tool degrades gracefully — it returns deterministic clusters + an `ai_clustering_hint` for the AI to apply inline. |\n| Slash commands missing | Confirm your client supports MCP `prompts/list`. Try restarting the client after install. |\n\n## Security\n\n- Plaintext keys are HMAC-hashed with a server-side pepper before storage.\n  Never logged. Never echoed.\n- Stderr redaction strips any accidentally-emitted `ppk_…` strings.\n- Write tools annotated with `destructiveHint: true` so MCP hosts can\n  surface confirmation prompts before invoke (varies by host).\n- Key rotation runbook + incident playbook live in\n  [`docs/api-keys.md`](https://github.com/DodoGit/pinappai/blob/main/docs/api-keys.md)\n  in the source repo.\n\nNEVER commit your `ppk_` key to source control. The MCP itself redacts it\nfrom logs; you should treat it the same way at the application level.\n\n## License\n\nPinAppAI Client License (proprietary) — see the LICENSE file. Install\nand run freely to use the PinAppAI service; redistribution, modification\nand derivative works are not permitted. Versions up to and including\n0.8.1 were published under MIT.",
  "bytes": 30020,
  "sha": "bec08145aa64cd7272e29b55286a1b5ec1ad19ebe0e5206292fa23e0afee6c04",
  "repo_slug": "",
  "fonte": "npm",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_pinappai_mcp_38fae2a9/readme"
}