이 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.