PinAppAI
Was dieses MCP kann
Manages visual website feedback, screenshots, reviewer change requests, workflow iterations, and applying approved source changes.
Tools
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug to archive.'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id (from list_api_keys).'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'required': ['user_id'], 'properties': {'user_id': {'type': 'string', 'minLength': 1, 'description': "The member's user_id (from list_members)."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id to restore.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'The api_keys.id to revoke.'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'required': ['project'], 'properties': {'project': {'type': 'string', 'minLength': 1, 'description': 'The project slug to unarchive.'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'The new display name.'}}, 'additionalProperties': False}
Eingabeschema
{'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}
Eingabeschema
{'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}
Letzte Tool-Änderungen
Ähnliche MCP-Server
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.