此 MCP 可以做什么
Manages visual website feedback, screenshots, reviewer change requests, workflow iterations, and applying approved source changes.
工具
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'include': {'type': 'array', 'items': {'enum': ['change_requested', 'rejected', 'approved', 'comment'], 'type': 'string'}, 'description': "Which feedback kinds to pull into the analysis: change_requested (a decision requesting a change), rejected (a decision rejecting the pick), approved (a decision approving the pick), comment (a comment-only pin, no decision). Defaults to ['change_requested']."}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'group_by': {'type': 'array', 'items': {'enum': ['selector', 'page', 'reviewer', 'keyword'], 'type': 'string'}, 'description': "Which deterministic groupings to compute: selector (by CSS selector), page (by page URL), reviewer (by reviewer). Defaults to ['selector', 'page']. Keyword extraction (common_keywords) is always computed regardless of this setting."}, 'ai_clusters': {'enum': ['off', 'auto', 'on'], 'type': 'string', 'description': "Controls semantic clustering via the host's MCP sampling capability. off skips it and returns only the deterministic groupings. auto (default) attempts it and falls back to an ai_clustering_hint for the calling AI to apply inline if the host doesn't support sampling. on requires sampling support and returns a sampling_unsupported error if the host doesn't provide it."}, 'ai_model_preference': {'type': 'string', 'description': "Optional model preference hint for the sampling request. Currently accepted but not forwarded to the host's createMessage call (the sampling request always uses a fixed speed/intelligence preference); reserved for future use."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug to archive.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['slug', 'name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Human-readable project name.'}, 'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 64, 'minLength': 2, 'description': 'Project slug (lowercase, hyphens). Must be unique across all PinAppAI projects.'}, 'allowed_origins': {'type': 'array', 'items': {'type': 'string', 'maxLength': 255, 'minLength': 1}, 'maxItems': 20, 'description': 'Origins where the widget will load (e.g. https://example.com or *.example.com). Up to 20 entries.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['slug', 'name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Human-readable workspace name.'}, 'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 64, 'minLength': 2, 'description': 'Workspace slug (lowercase, hyphens). Globally unique.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id (from list_api_keys).'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': "The FEEDBACK id (fb_*), NOT a change-request id (cr_*). When you have a CR row from pinappai_list_apply_inbox / list_change_requests, pass its `source_feedback_id` (or just `id` in list_change_requests' response — same field) here. Passing a cr_* value returns 404."}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'include_image': {'type': 'boolean', 'description': "When true, also returns the change request's screenshot inline as an MCP image content block, in addition to the JSON text response. Defaults to false (JSON only)."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The FEEDBACK id (fb_*), NOT a change-request id (cr_*). When you have a CR row from pinappai_list_apply_inbox, pass its `source_feedback_id` here. Passing a cr_* value returns 404.'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['email'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'description': "Optional display name; defaults to the email's local-part."}, 'role': {'enum': ['admin', 'editor', 'viewer'], 'type': 'string', 'description': "Defaults to editor. Admins can't invite owners — that requires an existing owner."}, 'email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'maxLength': 254, 'description': "Invitee's email address."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'email'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'description': "Optional display name; defaults to the email's local-part."}, 'email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'maxLength': 254, 'description': "Reviewer's email address."}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'to': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'End of time range (Unix ms, exclusive).'}, 'from': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Start of time range (Unix ms, inclusive).'}, 'actor': {'type': 'string', 'description': 'Substring match on actor_email.'}, 'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Default 100, max 500.'}, 'action': {'type': 'string', 'description': 'Exact dotted action name (e.g. "feedback.update", "member.invite").'}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Default 0.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Max rows to return per page. Defaults to 50, maximum 200.'}, 'since': {'type': 'string', 'description': 'ISO 8601 timestamp. Only return change requests created after this time.'}, 'cursor': {'type': 'string', 'description': "Opaque pagination cursor from a previous response's next_cursor. Pass it to fetch the next page."}, 'include': {'type': 'array', 'items': {'enum': ['change_requested', 'rejected', 'approved', 'comment'], 'type': 'string'}, 'description': "Which feedback kinds to include: change_requested (a decision requesting a change), rejected (a decision rejecting the pick), approved (a decision approving the pick), comment (a comment-only pin, no decision). Defaults to ['change_requested']."}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'page_url': {'type': 'string', 'description': 'Filter to change requests captured on this exact page URL.'}, 'reviewer': {'type': 'string', 'description': 'Filter by reviewer name or email (matches either field).'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'applies'], 'properties': {'applies': {'type': 'array', 'items': {'type': 'object', 'required': ['cr_id', 'before_text', 'after_text'], 'properties': {'cr_id': {'type': 'string', 'minLength': 1, 'description': 'The change-request id (cr_*).'}, 'after_text': {'type': 'string', 'maxLength': 4000, 'description': 'The source-file content AFTER your edit.'}, 'before_text': {'type': 'string', 'maxLength': 4000, 'description': "The source-file content this CR targeted BEFORE you edited it. Stored on the cr_marked_applied event payload so admin Revert can swap byte-for-byte later. For 'inbox_rejected' CRs the AI should have already done the swap (after_text → before_text from the CR's previous cr_marked_applied event); the new before_text is the pre-revert source and after_text is the post-revert source."}}, 'additionalProperties': False}, 'minItems': 1, 'description': 'List of CRs to mark applied in one atomic batch.'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'bundle_summary': {'type': 'string', 'maxLength': 2000, 'description': 'Short human-readable summary of this Apply batch — shows up in the project history page. e.g. "applied 7 CRs across 3 pages".'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'iteration_id'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'iteration_id': {'type': 'string', 'minLength': 1, 'description': 'The iteration id (it_*).'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['name'], 'properties': {'name': {'enum': ['analyze', 'apply', 'audit-review', 'auth-help', 'embed-widget', 'generate-changes-page', 'remove', 'reset-project', 'setup-project', 'summarize'], 'type': 'string', 'description': 'The workflow to fetch. See the description for what each does.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max rows to return (default 100).'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Max iterations to return (default 50, max 200).'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'before_seq': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Pagination cursor — return iterations with seq_no strictly less than this.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'items'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'The data-pp-item value — e.g. "pricing:hero-title".'}, 'title': {'type': 'string', 'maxLength': 300, 'description': 'The data-pp-title value.'}, 'after_text': {'type': 'string', 'maxLength': 4000, 'description': 'The AFTER text, verbatim from the page.'}, 'before_text': {'type': 'string', 'maxLength': 4000, 'description': 'The BEFORE text, verbatim from the page.'}, 'applied_cr_id': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'The originating CR id (data-pp-applied-cr-id). Items whose CR no longer exists are dropped server-side; omit only for hand-authored items.'}, 'target_page_url': {'type': 'string', 'maxLength': 2048, 'description': 'Root-relative URL of the ACTUAL page the change lives on (data-pp-page-url).'}, 'target_source_files': {'type': 'string', 'maxLength': 2048, 'description': 'Comma-separated source-repo file paths (data-pp-source-files).'}, 'target_source_selector': {'type': 'string', 'maxLength': 2048, 'description': 'CSS selector to the element on the source page (data-pp-source-selector).'}}, 'additionalProperties': False}, 'maxItems': 2000, 'minItems': 1, 'description': 'Every [data-pp-item] on the page you just wrote, in DOCUMENT ORDER (order drives the review queue). The FULL active set — items you omit are deactivated server-side.'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'page_path': {'type': 'string', 'pattern': '^\\/[\\w\\-./]*$', 'maxLength': 2048, 'minLength': 1, 'description': "Path of the /changes/ page on the site. Default '/changes'."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'confirm'], 'properties': {'confirm': {'type': 'boolean', 'const': True, 'description': 'Must be literally true. The caller must have shown the user what will be deleted and received explicit confirmation first — there is no grace window; this is not recoverable.'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['user_id'], 'properties': {'user_id': {'type': 'string', 'minLength': 1, 'description': "The member's user_id (from list_members)."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id to restore.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id to revoke.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project', 'reviewer_id'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}, 'reviewer_id': {'type': 'string', 'minLength': 1, 'description': 'The project_reviewers row id (from list_reviewers).'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug to unarchive.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['user_id', 'role'], 'properties': {'role': {'enum': ['owner', 'admin', 'editor', 'viewer'], 'type': 'string', 'description': 'The new role.'}, 'user_id': {'type': 'string', 'minLength': 1, 'description': "The member's user_id (from list_members)."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'The new display name.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['project'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'New display name for the project.'}, 'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 64, 'minLength': 2, 'description': 'New slug (renames the project; widget snippets keep working since they reference api_key, not slug).'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'Current project slug (the lookup key).'}, 'owner_email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'maxLength': 254, 'description': 'Reassign project ownership to a different email (for display only — does not change permissions).'}, 'preview_origin': {'anyOf': [{'type': 'string', 'format': 'uri', 'maxLength': 255}, {'type': 'null'}], 'description': 'Optional branch/preview deploy origin. review.pinappai.com/p/<slug>~preview/ serves it so reviewers can check APPLIED changes before they ship — records still write against primary_origin. Set this after publishing an apply round to a preview deploy; null (or an empty string) clears it.'}, 'primary_origin': {'anyOf': [{'type': 'string', 'format': 'uri', 'maxLength': 255}, {'type': 'null'}], 'description': 'Canonical site origin powering the no-install review link (review.pinappai.com/p/<slug>/). Any URL is normalized down to its origin. null (or an empty string) clears it and disables the link.'}, 'allowed_origins': {'type': 'array', 'items': {'type': 'string', 'maxLength': 255, 'minLength': 1}, 'maxItems': 20, 'description': 'REPLACES the existing list. Pass an empty array [] to clear all allowed origins.'}, 'allow_anonymous_reviewers': {'type': 'boolean', 'description': 'When true, any verified email on a CORS-allowed origin can submit feedback. When false, the email must be on the workspace or project_reviewers list.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'New display name for the workspace.'}, 'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 64, 'minLength': 2, 'description': 'Renaming slug breaks every URL pointing at the old slug — use sparingly.'}}, 'additionalProperties': False}
近期工具变更
类似的 MCP 服务器
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
spriteship
Generates and manages 2D game characters, assets, animations, tilesets, UI packs, maps, and engine-ready exports for multiple gam…
Blixtworks
Offers pay-per-call utilities for text, image processing and analysis, data conversion, validation, web inspection, cryptography,…
Compose Preview Catalogs
Browses, renders, compares, audits, and edits Jetpack Compose preview catalogs and associated UI designs.
arch-tools-mcp
Provides general-purpose agent APIs for browser automation, web and PDF extraction, data conversion, email operations, fact check…
kernelcad
Authors, evaluates, reviews, simulates, edits, and exports parametric CAD assemblies and geometry from editable TypeScript-based …
floot
Creates, edits, previews, databases, and publishes full-stack web and mobile applications with hosted resources and deployment wo…
Raven
Supports coding agents with design audits, design-system guidance, and a configurable visual preference profile.