{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_xmgyaazr2y8q","handle":"pinappai","url":"https://wellknown.network/agents/pinappai","links":{"self":"https://wellknown.network/agents/pinappai/record.json","html":"https://wellknown.network/agents/pinappai","markdown":"https://wellknown.network/agents/pinappai/record.md","api":"https://wellknown.network/api/v1/agents/pinappai","status":"https://wellknown.network/api/v1/agents/pinappai/status","claim":"https://wellknown.network/agents/pinappai/claim","claimApi":"https://wellknown.network/api/v1/claims","badge":"https://wellknown.network/agents/pinappai/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:mcp.pinappai.com:server:pinappai","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"PinAppAI","summary":"Visual website feedback your coding agent applies: pin change requests on the live site over MCP.","description":"Visual website feedback your coding agent applies: pin change requests on the live site over MCP.","publisher":{"name":"com.pinappai","url":null},"homepage":"https://pinappai.com/docs/mcp/","repository":null,"version":"0.9.9","license":"SEE LICENSE IN LICENSE","protocols":["mcp"],"tags":["mcp","model-context-protocol","pinappai","claude","cursor","ai"],"pricing":null,"endpoints":[{"url":"https://mcp.pinappai.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"npm:@pinappai/mcp","type":"package_npm","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-07-25T22:26:59.086832Z","npmKeywords":["mcp","model-context-protocol","pinappai","claude","cursor","ai"],"publishedAt":"2026-07-25T22:26:59.086832Z","registryName":"com.pinappai/mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","license":"npm","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"security.identity","name":"Identity & Access","confidence":1,"provenance":"derived"},{"slug":"productivity.email","name":"Email","confidence":0.962,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":0.54,"provenance":"derived"},{"slug":"content.writing","name":"Writing & Editing","confidence":0.51,"provenance":"derived"}],"categories":["analytics","content","productivity","security"]},"observed":{"status":"live","statusReason":"Responded 1h ago.","lastOkAt":"2026-09-05T22:26:23.200Z","lastProbedAt":"2026-09-05T22:26:23.200Z","statusComputedAt":"2026-09-05T22:26:44.413Z","reliability30d":{"probes":1,"successRate":1,"p50Ms":16},"latestObservations":[{"at":"2026-09-05T22:26:23.200Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":16,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List PinAppAI projects this API key can access. Returns one entry per project in the key's workspace, with slug, name, derived domain, and created_at. Call this"},{"name":"get_review_summary","description":"Cheap one-call summary of change-request state for a project. Returns totals + by-page + by-reviewer breakdowns + oldest/newest unresolved timestamps. Call this"},{"name":"list_change_requests","description":"List change requests for a project with filters + cursor pagination. Defaults to include=['change_requested'] (highest-signal subset). Returns digest fields per"},{"name":"get_change_request","description":"Full detail for one change request. Returns the CR (including element_kind=text|mixed|field|null and suggested_text — a literal text-replacement the reviewer ty"},{"name":"analyze_patterns","description":"Server-side deterministic groupings (by selector / page / reviewer / keyword) plus heuristic suggested_clusters of change requests. Set ai_clusters=\"auto\" (defa"},{"name":"get_screenshot","description":"Return the screenshot for a change request as an inline MCP image content block. Use when you want vision context without the full JSON envelope from get_change"},{"name":"get_project","description":"Get a single project by slug — name, allowed_origins, archive state, and the embeddable widget api_key. Scoped to the API key's workspace."},{"name":"create_project","description":"Create a new PinAppAI project inside the API key's workspace. Returns the project plus its widget api_key for embedding. Requires editor role on the workspace."},{"name":"update_project","description":"Update editable fields on a project — slug, name, owner_email, allowed_origins, allow_anonymous_reviewers, primary_origin (review link), preview_origin (preview"},{"name":"archive_project","description":"Soft-archive a project — the widget stops accepting new feedback but the project + history is preserved. Reversible via unarchive_project. Owner role required."},{"name":"unarchive_project","description":"Restore an archived project — the widget starts accepting feedback again on pages that still embed the snippet. Owner role required."},{"name":"list_workspaces","description":"List all workspaces the API key's user is a member of, with role per workspace. The api-key remains bound to its original workspace — to operate on another, min"},{"name":"create_workspace","description":"Create a new workspace owned by the API key's user. Free/Pro plans cap at 1 workspace; Team/Business unlimited. To use the new workspace from MCP, mint a fresh "},{"name":"get_workspace","description":"Get the API key's workspace details (slug, name, plan, tier) plus the user's role in that workspace. Useful as a permissions probe."},{"name":"update_workspace","description":"Rename or re-slug the API key's workspace. Owner role required. Slug changes break existing dashboard URLs."},{"name":"delete_workspace","description":"Schedule the API key's workspace for permanent deletion (7-day grace window). Reversible only via the email magic-link sent to the owner. Subsequent MCP calls w"},{"name":"list_members","description":"List members of the API key's workspace with their roles, sorted owner → admin → editor → viewer. The user_id field is the lookup key for update_member_role and"},{"name":"invite_member","description":"Invite a user to the API key's workspace as admin / editor / viewer (default editor). Admin role required to call. Sends a welcome email."},{"name":"update_member_role","description":"Change a workspace member's role. Caller must outrank both the current role and the new role; promoting to owner requires owner role. Last-owner demotion is rej"},{"name":"remove_member","description":"Remove a member from the API key's workspace. Self-removal works for any role; cross-removal requires admin+ and outranking the target. Last-owner removal retur"},{"name":"list_reviewers","description":"List external reviewers on a project (people invited via invite_reviewer). Workspace members are implicitly authorized and not listed here. Status: pending / ve"},{"name":"invite_reviewer","description":"Invite an external reviewer to a project. They'll get a welcome email; status starts pending and flips to verified when they OTP through the widget. Editor role"},{"name":"revoke_reviewer","description":"Revoke an external reviewer's access. First call soft-revokes (status=revoked, audit trail preserved); second call hard-deletes (status=removed). Editor role re"},{"name":"list_audit_events","description":"Read audit log entries for the API key's workspace. Owner role + Business tier required. Returns newest-first; supports filters action / actor (email substring)"},{"name":"list_api_keys","description":"List API keys (active + recently-revoked) in the calling key's workspace. Plaintext / hash never returned. Owner or admin role required."},{"name":"get_api_key","description":"Get a single API key's metadata by id (no plaintext / hash). Owner or admin role required. Wrong-role and nonexistent-id both surface as not_found."},{"name":"revoke_api_key","description":"Soft-revoke an API key (reversible via restore_api_key for 7 days). Owner or admin role required. Refuses to revoke the calling key with cannot_revoke_self."},{"name":"restore_api_key","description":"Restore a soft-revoked API key (within 7 days of revocation). Owner or admin role required. Returns restore_window_expired if the row was never revoked or was r"},{"name":"get_me","description":"Whoami probe — returns the user behind the API key, the workspace it's bound to, the user's role in that workspace, and the API key's metadata. Run this first t"},{"name":"update_me_profile","description":"Update the API key user's display name. Email is identity and not editable."},{"name":"export_my_data","description":"GDPR Art. 15 right-of-access export — every row PinAppAI holds about the API key's user. Sensitive columns (password hash, OAuth tokens) are server-side redacte"},{"name":"pinappai_get_iteration_coverage","description":"Read coverage metrics for an iteration: items_decided / manifest_size + items_undecided + per-reviewer decided_count + disagreement_count. Useful for the AI to "},{"name":"pinappai_list_iterations","description":"Paginated history of iterations for a project, newest first. Each entry includes seq_no, opened_at, applied_at (NULL while open), bundle_summary, and the frozen"},{"name":"pinappai_list_apply_inbox","description":"v3 Apply-inbox listing. Returns every change request in an Apply-eligible inbox substate (inbox_new / inbox_rejected / inbox_change_requested) with the prior cr"},{"name":"pinappai_apply_change_requests","description":"v3 atomic apply primitive. Takes a list of {cr_id, before_text, after_text} after the AI has edited source for each. Creates one iteration record (audit trail v"},{"name":"pinappai_reset_review_data","description":"Permanently deletes a project's review data: all change requests (+ their event history), iterations, reviewer decisions, ALL freeform pins/comments with their "},{"name":"pinappai_register_change_items","description":"Register the items of a freshly written /changes/ review page with the server — REQUIRED after generating or regenerating the page, or the in-page review chip a"},{"name":"pinappai_get_workflow","description":"Return the full procedure for a PinAppAI guided workflow, rendered exactly as the\n/pinappai:<name> prompt delivers it. Call this when the user asks for one of t"}],"toolCount":38,"serverName":"pinappai","capabilities":["tools","prompts"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_projects","description":"List PinAppAI projects this API key can access. Returns one entry per project in the key's workspace, with slug, name, derived domain, and created_at. Call this"},{"name":"get_review_summary","description":"Cheap one-call summary of change-request state for a project. Returns totals + by-page + by-reviewer breakdowns + oldest/newest unresolved timestamps. Call this"},{"name":"list_change_requests","description":"List change requests for a project with filters + cursor pagination. Defaults to include=['change_requested'] (highest-signal subset). Returns digest fields per"},{"name":"get_change_request","description":"Full detail for one change request. Returns the CR (including element_kind=text|mixed|field|null and suggested_text — a literal text-replacement the reviewer ty"},{"name":"analyze_patterns","description":"Server-side deterministic groupings (by selector / page / reviewer / keyword) plus heuristic suggested_clusters of change requests. Set ai_clusters=\"auto\" (defa"},{"name":"get_screenshot","description":"Return the screenshot for a change request as an inline MCP image content block. Use when you want vision context without the full JSON envelope from get_change"},{"name":"get_project","description":"Get a single project by slug — name, allowed_origins, archive state, and the embeddable widget api_key. Scoped to the API key's workspace."},{"name":"create_project","description":"Create a new PinAppAI project inside the API key's workspace. Returns the project plus its widget api_key for embedding. Requires editor role on the workspace."},{"name":"update_project","description":"Update editable fields on a project — slug, name, owner_email, allowed_origins, allow_anonymous_reviewers, primary_origin (review link), preview_origin (preview"},{"name":"archive_project","description":"Soft-archive a project — the widget stops accepting new feedback but the project + history is preserved. Reversible via unarchive_project. Owner role required."},{"name":"unarchive_project","description":"Restore an archived project — the widget starts accepting feedback again on pages that still embed the snippet. Owner role required."},{"name":"list_workspaces","description":"List all workspaces the API key's user is a member of, with role per workspace. The api-key remains bound to its original workspace — to operate on another, min"},{"name":"create_workspace","description":"Create a new workspace owned by the API key's user. Free/Pro plans cap at 1 workspace; Team/Business unlimited. To use the new workspace from MCP, mint a fresh "},{"name":"get_workspace","description":"Get the API key's workspace details (slug, name, plan, tier) plus the user's role in that workspace. Useful as a permissions probe."},{"name":"update_workspace","description":"Rename or re-slug the API key's workspace. Owner role required. Slug changes break existing dashboard URLs."},{"name":"delete_workspace","description":"Schedule the API key's workspace for permanent deletion (7-day grace window). Reversible only via the email magic-link sent to the owner. Subsequent MCP calls w"},{"name":"list_members","description":"List members of the API key's workspace with their roles, sorted owner → admin → editor → viewer. The user_id field is the lookup key for update_member_role and"},{"name":"invite_member","description":"Invite a user to the API key's workspace as admin / editor / viewer (default editor). Admin role required to call. Sends a welcome email."},{"name":"update_member_role","description":"Change a workspace member's role. Caller must outrank both the current role and the new role; promoting to owner requires owner role. Last-owner demotion is rej"},{"name":"remove_member","description":"Remove a member from the API key's workspace. Self-removal works for any role; cross-removal requires admin+ and outranking the target. Last-owner removal retur"},{"name":"list_reviewers","description":"List external reviewers on a project (people invited via invite_reviewer). Workspace members are implicitly authorized and not listed here. Status: pending / ve"},{"name":"invite_reviewer","description":"Invite an external reviewer to a project. They'll get a welcome email; status starts pending and flips to verified when they OTP through the widget. Editor role"},{"name":"revoke_reviewer","description":"Revoke an external reviewer's access. First call soft-revokes (status=revoked, audit trail preserved); second call hard-deletes (status=removed). Editor role re"},{"name":"list_audit_events","description":"Read audit log entries for the API key's workspace. Owner role + Business tier required. Returns newest-first; supports filters action / actor (email substring)"},{"name":"list_api_keys","description":"List API keys (active + recently-revoked) in the calling key's workspace. Plaintext / hash never returned. Owner or admin role required."},{"name":"get_api_key","description":"Get a single API key's metadata by id (no plaintext / hash). Owner or admin role required. Wrong-role and nonexistent-id both surface as not_found."},{"name":"revoke_api_key","description":"Soft-revoke an API key (reversible via restore_api_key for 7 days). Owner or admin role required. Refuses to revoke the calling key with cannot_revoke_self."},{"name":"restore_api_key","description":"Restore a soft-revoked API key (within 7 days of revocation). Owner or admin role required. Returns restore_window_expired if the row was never revoked or was r"},{"name":"get_me","description":"Whoami probe — returns the user behind the API key, the workspace it's bound to, the user's role in that workspace, and the API key's metadata. Run this first t"},{"name":"update_me_profile","description":"Update the API key user's display name. Email is identity and not editable."},{"name":"export_my_data","description":"GDPR Art. 15 right-of-access export — every row PinAppAI holds about the API key's user. Sensitive columns (password hash, OAuth tokens) are server-side redacte"},{"name":"pinappai_get_iteration_coverage","description":"Read coverage metrics for an iteration: items_decided / manifest_size + items_undecided + per-reviewer decided_count + disagreement_count. Useful for the AI to "},{"name":"pinappai_list_iterations","description":"Paginated history of iterations for a project, newest first. Each entry includes seq_no, opened_at, applied_at (NULL while open), bundle_summary, and the frozen"},{"name":"pinappai_list_apply_inbox","description":"v3 Apply-inbox listing. Returns every change request in an Apply-eligible inbox substate (inbox_new / inbox_rejected / inbox_change_requested) with the prior cr"},{"name":"pinappai_apply_change_requests","description":"v3 atomic apply primitive. Takes a list of {cr_id, before_text, after_text} after the AI has edited source for each. Creates one iteration record (audit trail v"},{"name":"pinappai_reset_review_data","description":"Permanently deletes a project's review data: all change requests (+ their event history), iterations, reviewer decisions, ALL freeform pins/comments with their "},{"name":"pinappai_register_change_items","description":"Register the items of a freshly written /changes/ review page with the server — REQUIRED after generating or regenerating the page, or the in-page review chip a"},{"name":"pinappai_get_workflow","description":"Return the full procedure for a PinAppAI guided workflow, rendered exactly as the\n/pinappai:<name> prompt delivers it. Call this when the user asks for one of t"}],"package":{"name":"@pinappai/mcp","registry":"npm","observedAt":"2026-09-05T23:20:22.013Z","publishedAt":"2026-08-01T17:39:55.472Z","latestVersion":"0.9.10","weeklyDownloads":160}},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.pinappai/mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/com.pinappai%2Fmcp","firstSeenAt":"2026-09-05T20:18:54.427Z","fetchedAt":"2026-09-05T20:18:54.427Z","normalizedAt":"2026-09-05T20:18:54.427Z"},{"source":"npm","key":"@pinappai/mcp","url":"https://www.npmjs.com/package/@pinappai/mcp","firstSeenAt":"2026-09-05T23:20:18.236Z","fetchedAt":"2026-09-05T23:20:18.236Z","normalizedAt":"2026-09-05T23:20:18.236Z"}]},"firstSeenAt":"2026-09-05T20:18:54.427Z","updatedAt":"2026-09-05T23:20:22.013Z"}