{"calls": [], "exit_before_cleanup": null, "initialize": {"capabilities": {"prompts": {"listChanged": true}, "tools": {"listChanged": true}}, "instructions": "Raven is a design-intelligence server: audits (page/layout/screen/contrast/tap-targets/typography/consistency), design systems and tokens, brand/content/service-design knowledge, creative scoring, and a Taste Engine that makes a person's design judgment portable and growable.\n\nPROJECT KICKOFF — calibrate taste BEFORE the first design work. Taste is per-surface: the same person wants different rules on a monochrome portfolio than on a product site, and a different voice on each. At the START of a new project (or the first design/copy/UI work in any project), if a taste profile exists (list_taste_profiles), call get_taste_interview with the profile and a project name (mode defaults to 'kickoff', depth defaults to 'first_run'). If it returns existing_binding: null, ask the user just its 5 core `questions` conversationally — identity, genesis (kickoff is when a project comes into existence: what already exists — a brand, a design system, brand assets — and what should be generated), aesthetic (how it should read here — multiple-choice options given), voice (three register examples so the user can pick by ear), and matchers (which URL hosts identify the project) — then persist with bind_taste_surface and proceed; when genesis says the user has no design system, the generation route is generate_mood_board (an approval stop — pass their own images via image_paths), then generate_design_system with save:true, then init_design_md, and an existing system is consumed via configure_design_system_source or base_system instead; offer the returned `more_questions` (typography/spacing/color/layout/motion/imagery/entrance/loading/navigation/libraries, references, per-rule overrides, the open-ended special question) as OPTIONAL deeper calibration rather than asking them all upfront, or re-run with depth:'full' if the user wants the complete interview at once. Dimension answers go in design_notes and are echoed in every audit. A cold-start project with no profile at all can start from create_taste_profile({ name, template: 'portfolio'|'saas-marketing'|'app' }) for a small sensible starter ruleset before the first interview even runs. The interview is a blocking gate: collect the user's answers before committing any design direction, palette, type choice, or name — never answer its questions yourself or start design work while it is pending. Every question carries skippable + priority (core|extended); skipping is fine but leaves that item uncalibrated. A 'references' question takes example links/screenshots and interviews what specifically the person likes about each. The interview ends with an open-ended 'special' question (textures, signature details, motifs — stored as design_notes.special) that suggests the person's choices from their other bound surfaces once it has them. From then on pass project:'' on every audit_taste — bindings also auto-match by URL hostname in url mode. When the surface is a website to be built, suggest building it as a Next.js app by default; if the user prefers another stack, record it in design_notes.libraries. Do NOT wait for an audit to return a calibration_hint; that is the reactive backstop, not the intended flow.\n\nWhen a user dislikes generated/designed output on an ALREADY-calibrated project, that dissatisfaction is a calibration signal, not a dead end — re-run get_taste_interview with mode:'refine' (it re-interviews against the stored binding: what fell short, then each stored design_notes value to keep/tighten/replace, then voice, then an optional reject precedent) and re-bind with bind_taste_surface.\n\nLEARNING LOOP — whenever the user makes, approves, or corrects a taste, direction, or design decision during work (not just at interview time), record it with record_taste_decision: the project, a short dimension name, what was chosen, what was rejected, why, and whether it was user-directed, user-approved, or user-corrected (a user overriding a generated choice is the highest-signal record). Recorded decisions evolve future kickoff interviews — recurring choices return as suggested defaults on their dimension's question, and decision categories no standard question covers become NEW interview questions. Record liberally; every committed decision is calibration data.\n\nJudging work: prefer audit_taste (with the profile + project) for matters of the owner's taste, and the mechanical audits (audit_page, audit_contrast, audit_tap_targets, audit_layout) for objective quality. design_notes are ACCEPTANCE CRITERIA for any build, not mood words: audit_taste verifies each note against the rendered page (note_assessments: present/partial/missing/unverifiable, each with trait-number evidence), compares the target against the binding's captured references, and flags sparse-and-empty pages whose restraint is deletion rather than craft — a build is not done until every note is visibly present or the user is told exactly which notes were dropped and why. When a note names an expensive technique (three.js/WebGL, GSAP scroll choreography, anime.js staggered motion, glassmorphism, a branded loader, lottie, kinetic display type…), bind_taste_surface and audit_taste return build_hints — a concrete recipe + canonical public example sources (threejs.org, gsap.com, animejs.com, Codrops…). The public corpus for these is vast, so an expensive note is NEVER license to drop it: consult the attached build_hints and their sources, and if a technique is genuinely infeasible, tell the user before shipping without it. Prefer url mode for verification: live traits (WebGL, animations, scroll effects) cannot be measured from static html. When a human accepts or rejects a finding, record it with label_finding — accept-verdicts suppress that exact pattern in future audits, which is how the profile learns.\n\nGRAB — click-to-change is ON BY DEFAULT for local servers. Any time you start, restart, or serve a local web page/dev server for the user (a demo, a preview, a dev build, a static file server), automatically start a grab session first (start_grab_session with the project's DESIGN.md if one exists) and make the overlay present WITHOUT the user asking or pasting anything: for a server you are starting anyway, pass proxy_target and give the user the BRIDGE url instead of the raw server url — the overlay is injected into every HTML response; for HTML files you are writing yourself, include the returned script_tag directly. Never hand the user a script tag or console snippet to paste. Mention in one line that the grab overlay is active (Alt+G or the on-page pill). The user clicks elements, swaps DESIGN.md tokens with live preview, edits computed styles inline, and sends instructions; drain them with get_grabbed_elements — while a grab session is active, drain whenever control returns to you (and before ending any turn). Sends arrive and are held. On a plain drain, acknowledge each change in one line and wait; do not implement or offer to implement until a batchCommit marker arrives. When batchCommit arrives, implement batch.pending from that same drain payload in one sweep. Apply approved token changes with update_design_md. Stop the session (stop_grab_session) when the server comes down. Skip only when the user explicitly asks for a clean page or the server is production.", "protocolVersion": "2025-11-25", "serverInfo": {"name": "raven-mcp", "version": "2.6.0"}}, "list_change_notifications": 0, "monotonic_seconds": 0.40878452499600826, "outcome": "listed tools offline", "started_utc": "2026-10-16T09:19:27.824614Z", "status": "completed", "tools": [{"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Principles"}, "description": "Get design principles relevant to a UI context. Returns usability heuristics, laws of UX, Gestalt principles, accessibility requirements, typography rules, and color theory — matched to what you're designing.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"category": {"description": "Filter to category: accessibility, brand, color-systems, color-theory, component-architecture, d4d, gestalt, laws-of-ux, mobile-ux, nielsen-heuristics, research, responsive-layout, service-design, spacing-systems, typography, ux-writing", "type": "string"}, "context": {"description": "What you're designing (e.g. 'signup form', 'pricing page', 'mobile nav', 'dark dashboard')", "type": "string"}, "format": {"description": "Output format: full (all details), checklist (implications + violations), brief (just summary). Default: full", "enum": ["full", "checklist", "brief"], "type": "string"}, "platform": {"description": "Platform context. 'ios' returns Apple HIG principles (Dynamic Type, 44pt targets, SF Symbols, safe areas, dark-mode, haptics, App Review privacy); 'react-native' returns RN principles (44/48pt+hitSlop, accessibilityLabel/Role, font scaling, SafeAreaView, dark mode, iOS+Android parity, secrets). Both replace the web/CSS-oriented set. Default: web.", "enum": ["web", "ios", "react-native"], "type": "string"}}, "required": ["context"], "type": "object"}, "name": "get_principles"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Pattern"}, "description": "Get proven UI/UX patterns for a specific design type. Returns do's, don'ts, evidence, and checklists for signup flows, pricing pages, navigation, forms, landing pages, dashboards, modals, empty states, error states, loading states, CTAs, social proof, and mobile conversion.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"goal": {"description": "Filter by primary goal", "enum": ["conversion", "usability", "accessibility", "delight"], "type": "string"}, "platform": {"description": "Filter patterns by platform context", "enum": ["desktop", "mobile", "responsive"], "type": "string"}, "type": {"description": "Pattern type (e.g. 'signup-flow', 'pricing-page', 'navigation', 'forms', 'landing-page', 'dashboard', 'modals-dialogs', 'empty-states', 'error-states', 'loading-states', 'cta', 'social-proof', 'mobile-conversion')", "type": "string"}}, "required": ["type"], "type": "object"}, "name": "get_pattern"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Business Strategy"}, "description": "Get business and monetization strategies for digital products. Covers monetization models, retention strategies, onboarding optimization, growth mechanics, and product metrics frameworks.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"stage": {"description": "Company stage for contextual filtering", "enum": ["startup", "growth", "mature"], "type": "string"}, "type": {"description": "Strategy type: monetization, retention, onboarding, growth, metrics", "type": "string"}}, "required": ["type"], "type": "object"}, "name": "get_business_strategy"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Evaluate Design"}, "description": "Evaluate a design description against UX principles. Returns relevant principles, potential violations, and improvement suggestions.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"after_screenshot": {"description": "Base64 PNG of the AFTER state. When both before+after are provided, returns a structured pixel diff with fix_confirmed.", "type": "string"}, "before_screenshot": {"description": "Base64 PNG of the BEFORE state", "type": "string"}, "compact": {"description": "Return only ids+names for matched principles/patterns (drop their full bodies) plus counts and any before/after diff. Default false. Use when the full principle library payload would blow the tool-result budget.", "type": "boolean"}, "context": {"description": "What the design is (e.g. 'pricing page for SaaS product')", "type": "string"}, "description": {"description": "Description of the design to evaluate", "type": "string"}, "goals": {"description": "What to evaluate for (e.g. ['conversion', 'accessibility', 'mobile-usability'])", "items": {"type": "string"}, "type": "array"}}, "type": "object"}, "name": "evaluate_design"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Search Knowledge"}, "description": "Search across all design principles, UI patterns, and business strategies. Use when you need to find specific guidance or don't know which category to look in.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"layer": {"description": "Which layer to search: principles, patterns, business, or all (default)", "enum": ["principles", "patterns", "business", "all"], "type": "string"}, "query": {"description": "Search term (e.g. 'touch targets', 'pricing psychology', 'color contrast')", "type": "string"}}, "required": ["query"], "type": "object"}, "name": "search_knowledge"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Checklist"}, "description": "Get a pre-publish checklist for a specific UI type. Returns actionable yes/no items to verify before shipping.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"platform": {"description": "Platform context for platform-specific checks. 'ios' = native SwiftUI/iOS (Apple HIG); 'react-native' = RN/Expo (iOS HIG + Android Material: 44/48pt+hitSlop, accessibilityLabel/Role, font scaling, SafeAreaView, dark mode, platform parity, secrets). Both replace the web/mobile-web checks.", "enum": ["desktop", "mobile", "responsive", "ios", "react-native"], "type": "string"}, "type": {"description": "What you're shipping (e.g. 'signup form', 'pricing page', 'dashboard', 'landing page', 'modal')", "type": "string"}}, "required": ["type"], "type": "object"}, "name": "get_checklist"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get D4D Framework"}, "description": "Get the Design for Delight (D4D) framework templates. Returns customer problem statement, ideal state, hypothesis, LOFA, and experiment templates for structured product thinking.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"stage": {"description": "Which stage of the D4D loop to return. Default: full (all stages)", "enum": ["frame", "empathy", "broad", "narrow", "experiment", "recommendation", "full"], "type": "string"}}, "type": "object"}, "name": "get_d4d_framework"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Design Systems"}, "description": "Browse available design systems for tokens. Filter by category (component-library, consumer, developer, fintech, framework, platform, productivity) or search by name.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"category": {"description": "Filter by category: component-library, consumer, developer, fintech, framework, platform, productivity. Saved user systems list under 'user'.", "type": "string"}, "search": {"description": "Search by name or description", "type": "string"}}, "type": "object"}, "name": "list_design_systems"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Design System"}, "description": "Get design tokens for a specific design system. Returns colors, typography, spacing, radii, elevation, and motion tokens in W3C DTCG, CSS custom properties, or flat format.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"format": {"description": "Output format: dtcg (W3C standard), css (custom properties), flat (key-value). Default: dtcg", "enum": ["dtcg", "css", "flat"], "type": "string"}, "group": {"description": "Filter to a token group: color, color-dark, color-light, typography, spacing, radius, elevation, motion", "type": "string"}, "id": {"description": "Design system ID (e.g. 'stripe', 'linear')", "type": "string"}}, "required": ["id"], "type": "object"}, "name": "get_design_system"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Read DESIGN.md"}, "description": "Parse a DESIGN.md file and return its frontmatter, Markdown body, and flattened token index.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"path": {"description": "Path to DESIGN.md", "type": "string"}}, "required": ["path"], "type": "object"}, "name": "read_design_md"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Review Diff"}, "description": "Review added UI-code lines in a unified diff against the project's own DESIGN.md tokens and active recorded design decisions. Returns a structured CI verdict with file/line findings and nearest-token suggestions. Agents should call this on every PR or diff that touches UI code before merge.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"design_md": {"description": "Inline DESIGN.md content. Overrides project file lookup when supplied.", "type": "string"}, "diff": {"description": "Unified diff to review (maximum 400KB).", "maxLength": 409600, "type": "string"}, "fail_on": {"description": "Rule names to escalate to a failing CI verdict. Valid values: important, bare-hex-color, hardcoded-font-size, hardcoded-font-family, hardcoded-spacing. Diff-scoped: only newly added lines can fail. Default: advisory-only (verdict caps at warn).", "items": {"type": "string"}, "type": "array"}, "fail_on_governed": {"description": "When true, findings a recorded decision governs become fail-eligible (severity error → verdict fail). Governance is a lexical scope+category association, NOT a verified contradiction of the decision — opt in as a team strict-mode signal, not a turnkey safe blocker. Combines with fail_on. Default: advisory-only.", "type": "boolean"}, "project": {"description": "Project directory used to resolve DESIGN.md and match decision scopes. Omit when design_md is supplied and no project hint is needed.", "type": "string"}}, "required": ["diff"], "type": "object"}, "name": "review_diff"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Polish Diff"}, "description": "Review added UI-code lines and propose deterministic DESIGN.md token substitutions without writing files. The returned unified patch applies on top of the reviewed diff's post-image; applying it is an explicit, separate step by the caller. Re-verifies the hypothetical polished lines and leaves judgment-heavy findings in manual.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"design_md": {"description": "Inline DESIGN.md content. Overrides project file lookup when supplied.", "type": "string"}, "diff": {"description": "Unified diff to review and polish (maximum 400KB).", "maxLength": 409600, "type": "string"}, "project": {"description": "Project directory used to resolve DESIGN.md and match decision scopes. Omit when design_md is supplied and no project hint is needed.", "type": "string"}}, "required": ["diff"], "type": "object"}, "name": "polish_diff"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Init DESIGN.md"}, "description": "Initialize a DESIGN.md file from a stored Raven token system, a getdesign.md starter slug, or a blank template.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"from": {"description": "Source selector: blank, stored system, or starter slug"}, "path": {"description": "Path to DESIGN.md to create", "type": "string"}}, "required": ["path"], "type": "object"}, "name": "init_design_md"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Update DESIGN.md"}, "description": "Update one DESIGN.md token surgically while preserving the Markdown body.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"path": {"description": "Path to DESIGN.md", "type": "string"}, "remove": {"additionalProperties": false, "properties": {"group": {"description": "Top-level group name", "type": "string"}, "name": {"description": "Token name or dotted nested path", "type": "string"}, "path": {"description": "Alias for name", "type": "string"}}, "required": ["group"], "type": "object"}, "rename": {"additionalProperties": false, "properties": {"from": {"description": "Old token name or dotted nested path", "type": "string"}, "group": {"description": "Top-level group name", "type": "string"}, "name": {"description": "Alias for from", "type": "string"}, "new_name": {"description": "Alias for to", "type": "string"}, "to": {"description": "New token name or dotted nested path", "type": "string"}}, "required": ["group"], "type": "object"}, "set": {"additionalProperties": false, "properties": {"group": {"description": "Top-level group name", "type": "string"}, "name": {"description": "Token name or dotted nested path", "type": "string"}, "value": {"description": "New scalar or {group.name} reference"}}, "required": ["group", "name"], "type": "object"}}, "required": ["path"], "type": "object"}, "name": "update_design_md"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Start Grab Session"}, "description": "Start a capability-keyed Raven grab bridge on loopback. Proxy mode is the preferred zero-paste path: it serves a running local app with the overlay injected into HTML; the manual script tag remains available when needed.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"path": {"description": "Path to DESIGN.md to expose over /tokens. Optional when proxy_target is set — a minimal temp DESIGN.md is created automatically. Required (and must exist) when proxy_target is omitted.", "type": "string"}, "port": {"description": "Optional port; defaults to an ephemeral loopback port", "exclusiveMinimum": 0, "type": "integer"}, "proxy_target": {"description": "URL of a running local dev server; the bridge will serve that app with the grab overlay auto-injected into every HTML page — user opens the bridge URL, zero setup", "type": "string"}, "role": {"default": "consumer", "description": "Overlay role; consumer preserves the component-request flow, maintainer enables direct design-system component creation", "enum": ["consumer", "maintainer"], "type": "string"}}, "type": "object"}, "name": "start_grab_session"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Get Grabbed Elements"}, "description": "Read newly sent grab selections without deleting their durable change records, optionally waiting up to timeout_ms. A batchCommit marker is the deterministic signal to implement the unified pending batch.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"timeout_ms": {"description": "Optional wait timeout in milliseconds", "exclusiveMinimum": 0, "type": "integer"}}, "type": "object"}, "name": "get_grabbed_elements"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Capture Reference"}, "description": "Persist a pattern grabbed from any page so it survives the browser tab. Call it after get_grabbed_elements returns a selection, passing that selection's selector/styles/html/rect/stateStyles plus the URL it was grabbed from. Stores one JSON record under ~/.raven/references; html over 8000 chars is truncated and flagged, style maps over 200 properties are rejected, and non-http(s) URLs are rejected. Every save gets a fresh ref_id, so grabbing the same element twice keeps both. When html is supplied it also renders a PNG thumbnail beside the record by rebuilding that markup offline in headless Chromium — every external request is blocked, so remote images and webfonts are absent and the record says so (image.fidelity 'offline'). The thumbnail is best-effort: if no browser is available the capture still succeeds, with no image field. It does not fetch the source URL, and does not map anything onto the project's tokens — that is map_reference_to_tokens.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"app": {"description": "Human name of the source app, e.g. 'Linear'", "type": "string"}, "html": {"description": "outerHTML of the grabbed element; truncated to 8000 chars on save", "type": "string"}, "note": {"description": "The designer's own words about why this pattern was kept; the highest-weighted field in search", "type": "string"}, "owner": {"description": "Whether the pattern came from the user's own product or someone else's site", "enum": ["self", "third-party"], "type": "string"}, "rect": {"additionalProperties": false, "description": "Bounding rect of the grabbed element in page coordinates", "properties": {"height": {"type": "number"}, "width": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "width", "height"], "type": "object"}, "selector": {"description": "CSS selector of the grabbed element, from the grab selection", "type": "string"}, "stateStyles": {"$ref": "#/properties/state_styles", "description": "Alias of state_styles, matching the field name get_grabbed_elements returns"}, "state_styles": {"additionalProperties": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"additionalProperties": true, "properties": {"declarations": {"items": {"additionalProperties": true, "properties": {"property": {"type": "string"}, "value": {"type": "string"}}, "required": ["property", "value"], "type": "object"}, "type": "array"}}, "required": ["declarations"], "type": "object"}]}, "description": "Per-state styles, either { hover: { color: 'red' } } or the grab selection's own { hover: { declarations: [{ property, value }] } }", "type": "object"}, "styles": {"additionalProperties": {"type": "string"}, "description": "Computed styles exactly as captured; rejected over 200 properties", "type": "object"}, "tags": {"description": "Topic tags for later filtering, e.g. ['hero','typography']", "items": {"type": "string"}, "type": "array"}, "taxonomy": {"description": "Stable pattern-kind ids binding this element to Raven's controlled vocabulary — this is what makes it findable by INTENT ('a scrolling mouse icon in a hero') rather than by the words that happen to be in the note. Bind every applicable kind; an unrecognized id is rejected with near matches. One of: scroll-cue, hero, sticky-nav, top-nav, sidebar-nav, breadcrumbs, command-palette, dropdown-menu, mobile-menu, cta-button, sticky-cta, pricing-card, pricing-toggle, comparison-table, testimonial, testimonial-marquee, logo-cloud, star-rating, signup-form, social-login, stepper, inline-validation, empty-state, no-results, error-message, error-page, skeleton-loader, progress-indicator, modal, confirmation-dialog, toast, bottom-sheet, kpi-card, activity-feed, feature-block, footer-cta", "items": {"type": "string"}, "type": "array"}, "url": {"description": "Full http(s) URL of the page the pattern was grabbed from", "type": "string"}}, "required": ["url", "selector", "styles", "owner", "tags"], "type": "object"}, "name": "capture_reference"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Search References"}, "description": "Find patterns previously kept with capture_reference — call it before rebuilding something already grabbed, or to recall 'that hero from Linear'. host, owner, and tags filters compose with AND; the free-text query expands recognized pattern intent through Raven's controlled vocabulary, then matches case-insensitively against note, app, tags, bound taxonomy ids, and selector. Every result carries a score and a 'why' naming the matched fields and any alias that connected the query to the record. Ordering is deterministic. Returns stored JSON records. Every result carries a `display` object holding the credit line, the source URL, and `image_path` — the PNG on disk for records captured with html, so results can be shown as pictures rather than style maps (the tool returns the path, never the bytes). **Browsing does not hand back the other site's markup.** A result reports `html_available` and `html_truncated` but omits the html itself; pass include_html:true to receive it, which is a deliberate step because that markup is the site's own authored expression rather than a measurement of it. Everything needed to LOOK at a pattern and to translate it onto this project's tokens — the picture, the selector, the rect, the computed styles — is in the default result. **Show the credit whenever you show the pattern**: this corpus holds other people's design work, Raven does not own it, and a third-party result also carries a notice saying so. Use these as references to build your own implementation, not as work to republish. Corrupt records are named in skipped[] instead of failing the call. It does not rank against live code and does not fetch the source site.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"host": {"description": "Only references grabbed from this host, e.g. 'linear.app'", "type": "string"}, "include_html": {"description": "Return each record's captured markup verbatim. Off by default: browsing a corpus of other people's work should not hand back their markup as a side effect of looking at it. Ask for it when you are actually reading the structure.", "type": "boolean"}, "owner": {"description": "Only the user's own product, or only third-party sites", "enum": ["self", "third-party"], "type": "string"}, "query": {"description": "Free text expanded through the pattern taxonomy and matched against note, app, tags, bound taxonomy ids, and selector; omit to list everything passing the filters", "type": "string"}, "tags": {"description": "Only references carrying ALL of these tags", "items": {"type": "string"}, "type": "array"}}, "type": "object"}, "name": "search_references"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Forget References"}, "description": "Remove stored patterns from the local corpus — one by ref_id, or every pattern captured from a site. This is the takedown path: if a site asks that their design work not be kept, `forget_references({ host: 'their.site', confirm: true })` removes every record and every rendered thumbnail from that host in one call. Host matching is exact plus subdomains ('linear.app' takes 'app.linear.app', never 'notlinear.app'; an IP address matches only itself), and a host-wide removal requires confirm:true because it is not reversible — there is no trash. The refusal names the ref_ids it would remove: pass them back as expected_ref_ids to pin the removal to what you were shown, and anything that appeared since is reported in appeared_since_preview[] rather than deleted. Returns the ref_ids actually removed, so a partial result is visible rather than assumed; records whose JSON could not be parsed are reported in skipped[] and left on disk rather than counted as cleared, and records that could not be deleted are reported separately in failed[]. Local only: it deletes files under the reference home and contacts nobody.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"confirm": {"description": "Required when removing by host — the removal is permanent", "type": "boolean"}, "expected_ref_ids": {"description": "The ref_ids the confirmation prompt listed. Supplying them pins the removal to that set: anything matching the host that appeared since is reported, not deleted.", "items": {"type": "string"}, "type": "array"}, "host": {"description": "Remove every reference captured from this host and its subdomains, e.g. 'linear.app'", "type": "string"}, "ref_id": {"description": "Remove exactly this one reference. Supply this or host.", "type": "string"}}, "type": "object"}, "name": "forget_references"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Map Reference To Tokens"}, "description": "Translate a captured pattern's raw literals (font-size: 64px, color: rgb(247,248,248)) onto the project's own design tokens, so generated code uses the user's type ramp and palette instead of another site's values. Pure and deterministic — no model, no network. Colours compare by RGBA distance (exact at 0, near under 12; alpha counts), lengths normalize to px at root 16 (near under 2px), unitless numbers near within 1%, font families compare on the first family. A property with a known token family (font-size, line-height, gap, radius, …) only ever binds inside that family: if the closest token by value belongs to another ramp, the result is a gap naming it, not a binding. Winners are ordered by distance, then family fit, then shortest and lexicographic token path. Percent and viewport units, unparseable colour syntaxes, shadows, gradients, and other unmatchable classes become gaps with a stated reason — never a forced match. Broken token chains are reported in diagnostics whether or not anything else matched. A project with no tokens is not an error: every property returns as a gap at coverage 0. It does not invent tokens and does not write code.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"captured": {"additionalProperties": {"type": "string"}, "description": "Raw CSS property/value pairs to translate, if not using a stored ref_id", "type": "object"}, "design_file_path": {"description": "Path to the project's DESIGN.md; its flattened tokens are the target vocabulary. Supply this or tokens.", "type": "string"}, "properties": {"description": "Only map these CSS properties; omit to attempt every captured property", "items": {"type": "string"}, "type": "array"}, "ref_id": {"description": "Captured reference to translate; its styles are the input. Supply this or captured.", "type": "string"}, "thresholds": {"additionalProperties": false, "description": "Override the near-match thresholds", "properties": {"color": {"description": "RGB distance for a near colour match, default 12", "type": "number"}, "length": {"description": "Pixels for a near length match, default 2", "type": "number"}, "rootPx": {"description": "Root font size used to normalize rem/em, default 16", "type": "number"}, "unitless": {"description": "Relative difference for a near unitless match, default 0.01", "type": "number"}}, "type": "object"}, "tokens": {"description": "Flattened design tokens directly, if not reading a DESIGN.md", "type": "array"}}, "type": "object"}, "name": "map_reference_to_tokens"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Stop Grab Session"}, "description": "Stop the current grab bridge and clear its queued selections.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "properties": {}, "type": "object"}, "name": "stop_grab_session"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Page Template"}, "description": "Read the page-scoped template slots from the active grab session's DESIGN.md and merge the overlay's latest selector validation. fixed/flexible roles and allowedTokens are cooperative advisory metadata: display labels only, not enforced.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"page": {"description": "Page pathname, matching location.pathname", "minLength": 1, "type": "string"}}, "required": ["page"], "type": "object"}, "name": "get_page_template"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Set Template Slot"}, "description": "Persist an array of page-scoped template slots in one batched DESIGN.md update. fixed/flexible roles and allowedTokens are cooperative advisory metadata: display labels only, not enforced.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"page": {"description": "Page pathname, matching location.pathname", "minLength": 1, "type": "string"}, "slots": {"description": "All template slots to persist in this batched call", "items": {"additionalProperties": false, "properties": {"role": {"enum": ["fixed", "flexible"], "type": "string"}, "selector": {"minLength": 1, "type": "string"}, "slotId": {"minLength": 1, "type": "string"}}, "required": ["slotId", "selector", "role"], "type": "object"}, "type": "array"}, "template_id": {"default": "default", "description": "Template identifier; defaults to default", "minLength": 1, "type": "string"}}, "required": ["page", "slots"], "type": "object"}, "name": "set_template_slot"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Templates"}, "description": "List templates and their registered page pathnames from the active grab session. Template permissions and allowedTokens are cooperative advisory metadata: display labels only, not enforced.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "properties": {}, "type": "object"}, "name": "list_templates"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Grab Layers"}, "description": "Read the latest non-mutating layer-tree snapshot captured by the active local grab session. Any fixed/flexible permissions are cooperative advisory metadata: display labels only, not enforced.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"page": {"description": "Optional page pathname; omit to list all latest page snapshots", "minLength": 1, "type": "string"}}, "type": "object"}, "name": "get_grab_layers"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Move Grab Layer"}, "description": "Queue a same-page layer reorder or reparent intent (previewed when measuredRects are supplied, otherwise proposed) without mutating the live page. Reparent moves a node to a different parent (toParentSelector); reorder keeps a single parentSelector. Permissions and fixed/flexible roles are cooperative advisory metadata: display labels only, not enforced; caller-supplied roles are rejected. Shadow-root and iframe boundaries are out of scope.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"approximate": {"type": "boolean"}, "baselineOrder": {"items": {"minLength": 1, "type": "string"}, "type": "array"}, "domSnapshotHash": {"minLength": 1, "type": "string"}, "fromIndex": {"minimum": 0, "type": "integer"}, "fromParentSelector": {"description": "Required for reparent — source parent", "minLength": 1, "type": "string"}, "fromSelector": {"minLength": 1, "type": "string"}, "measuredRects": {"items": {"additionalProperties": false, "properties": {"height": {"type": "number"}, "selector": {"minLength": 1, "type": "string"}, "width": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["selector", "x", "y", "width", "height"], "type": "object"}, "type": "array"}, "operation": {"enum": ["reorder", "reparent"], "type": "string"}, "orderedSelectors": {"items": {"minLength": 1, "type": "string"}, "type": "array"}, "page": {"minLength": 1, "type": "string"}, "parentSelector": {"description": "Required for reorder — single parent", "minLength": 1, "type": "string"}, "role": {"description": "Rejected: roles are never accepted from callers", "not": {}}, "selectionOrder": {"items": {"minimum": 1, "type": "integer"}, "type": "array"}, "toBaselineOrder": {"items": {"minLength": 1, "type": "string"}, "type": "array"}, "toDomSnapshotHash": {"minLength": 1, "type": "string"}, "toIndex": {"minimum": 0, "type": "integer"}, "toParentSelector": {"description": "Required for reparent — destination parent", "minLength": 1, "type": "string"}}, "required": ["operation", "page", "fromIndex", "toIndex", "orderedSelectors", "measuredRects", "approximate", "domSnapshotHash"], "type": "object"}, "name": "move_grab_layer"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Get Grab Operation"}, "description": "Read or update one durable grab change, list legacy reorder operations, or request the unified style+reorder batch. Applied/rejected/superseded changes leave the pending set.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"batch": {"description": "Return the unified current batch of reorder and style records; cannot be combined with operation_id or mark", "type": "boolean"}, "mark": {"description": "Mark a previewed reorder or sent style change", "enum": ["applied", "rejected"], "type": "string"}, "operation_id": {"description": "Operation ID; omit to list all operations", "minLength": 1, "type": "string"}}, "type": "object"}, "name": "get_grab_operation"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Compose System"}, "description": "Mix tokens from different design systems to create a custom composite. Example: Linear's colors + Stripe's typography.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"compositions": {"description": "Array of system-group pairs to compose", "items": {"additionalProperties": false, "properties": {"group": {"description": "Token group to take (color, typography, spacing, radius, elevation, motion)", "type": "string"}, "system": {"description": "Source design system ID", "type": "string"}}, "required": ["system", "group"], "type": "object"}, "type": "array"}, "format": {"description": "Output format. Default: dtcg", "enum": ["dtcg", "css"], "type": "string"}}, "required": ["compositions"], "type": "object"}, "name": "compose_system"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, "title": "Audit Page"}, "description": "Audit HTML/CSS against Raven's design quality standards. Checks typography (min 13px, weight 400+, modular-scale heading ratios, line-height consistency), accessibility (WCAG touch targets, alt text, contrast), responsive patterns (flexbox over grid, clamp sizing, max-width containers), style guide compliance (CSS custom properties, no bare hex), and visual rhythm (4/8px spacing grid, tight spacing scale, palette size). Pass containerMaxWidth (your design system's canonical container token, in px) to make the max-width check token-aware — it then flags containers that diverge from your system (too narrow OR too wide) instead of a generic 1200px heuristic. Returns pass/fail per check with specific fix instructions.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"adversarial_verify": {"description": "After generating findings, independently re-check each against the live DOM/network and tag it confirmed / likely-artifact / inconclusive. Surfaces a debunked_count.", "type": "boolean"}, "compact": {"description": "Return only the decision-grade signal — score, grade, summary, errors, warnings, fix_priority — and drop the embedded base64 screenshot and the passes list (replaced by passes_count). Default false. Use when the full payload would blow the tool-result budget.", "type": "boolean"}, "containerMaxWidth": {"description": "Your design system's canonical content-container width in px (e.g. 1152). When set, the responsive/max-width check flags divergence from this token instead of using the generic 1200px heuristic.", "type": "number"}, "html": {"description": "The full HTML content of the page to audit", "type": "string"}, "interactions": {"description": "Before capturing, fire each interaction in order (hover/click/focus the selector, then wait delay_ms). Captures the resulting dynamic state — e.g. an on-hover theme-toggle wash invisible to a static screenshot.", "items": {"additionalProperties": false, "properties": {"delay_ms": {"type": "number"}, "event": {"enum": ["hover", "click", "focus"], "type": "string"}, "selector": {"type": "string"}}, "required": ["selector", "event", "delay_ms"], "type": "object"}, "type": "array"}, "scroll_settle": {"description": "Before capturing, step through the page with short pauses so IntersectionObserver/whileInView reveals fire, then return to the top and settle. Also plays preload=none videos. Prevents blank-section false positives.", "type": "boolean"}, "strict": {"description": "Strict mode — also flags warnings as failures. Default: false", "type": "boolean"}, "url": {"description": "If set, Raven launches headless chromium, renders the page, and audits the RENDERED DOM.", "type": "string"}, "viewport": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "type": "object"}, "name": "audit_page"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Score Page"}, "description": "Score an HTML/CSS page across 7 design categories (Structure, Typography, Color & palette, Spacing & rhythm, Accessibility, Responsive layout, Design tokens), each rated 0–10. Scores are derived deterministically from the same checks as audit_page — no browser required. Pass html directly, or pass url to have Raven launch headless chromium, render the page, and score the RENDERED DOM. Also returns the same overall 0–100 score and A–D grade audit_page produces, the weakest category, and the three categories Raven does not mechanically assess (brand, conversion, motion) with guidance on which tools to use for those.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"containerMaxWidth": {"description": "Your design system's canonical content-container width in px (e.g. 1152). Forwarded to the responsive/max-width check.", "type": "number"}, "html": {"description": "The full HTML content of the page to score.", "type": "string"}, "strict": {"description": "Strict mode — count warnings as failures in the overall score. Default: false.", "type": "boolean"}, "url": {"description": "If set, Raven launches headless chromium, renders the page, and scores the RENDERED DOM.", "type": "string"}}, "type": "object"}, "name": "score_page"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Asset Integrity"}, "description": "Detect PNG exports whose content is sliced/cut off at the bottom edge (e.g. a Figma export that ended mid-form). Dimension/ratio checks cannot catch cut content inside a correctly-sized file; this measures per-pixel luminance variance in the bottom strip — uniform background = clean, high-variance UI content running into the edge = likely-sliced. Accepts filesystem paths to PNGs.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"image_paths": {"description": "Filesystem paths to PNG files to check for sliced/cut-off bottom content.", "items": {"type": "string"}, "type": "array"}}, "required": ["image_paths"], "type": "object"}, "name": "audit_asset_integrity"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Device Frame"}, "description": "Detect cropped content in device-mockup frames (phone/MacBook screenshots, app-preview clips). Three checks: (1) GEOMETRY — call with `frames` (container box + intrinsic media size + object-fit/position; call with NO args for a DevTools snippet) to flag object-fit:cover crop loss when the frame's aspect ratio ≠ the media's; (2) MOTION — pass `clips` (first/last frame PNG paths) to detect baked-in pan/zoom (Ken Burns) that drifts the composition; (3) EDGE — pass `edge_frames` (PNG paths) to flag content truncated at a frame edge. Catches the exact failure where a 16:9 clip in a 1.82-AR screen cutout silently slices the bottom, or a Ken-Burns-zoomed source crops content.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"clips": {"description": "Per-clip first/last frame PNG file paths — detects baked-in pan/zoom (Ken Burns).", "items": {"additionalProperties": false, "properties": {"first_frame": {"type": "string"}, "label": {"type": "string"}, "last_frame": {"type": "string"}}, "required": ["label", "first_frame", "last_frame"], "type": "object"}, "type": "array"}, "edge_frames": {"description": "Frame PNG file paths to check for content truncated at a frame edge (reuses edge-symmetry).", "items": {"additionalProperties": false, "properties": {"frame": {"type": "string"}, "label": {"type": "string"}}, "required": ["label", "frame"], "type": "object"}, "type": "array"}, "frames": {"description": "Device-frame geometry samples (from the DevTools snippet): container box + intrinsic media size + computed object-fit/position. Flags object-fit:cover crop loss.", "items": {"additionalProperties": false, "properties": {"container": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}, "media": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}, "objectFit": {"enum": ["fill", "cover", "contain", "none", "scale-down"], "type": "string"}, "objectPosition": {"additionalProperties": false, "properties": {"x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y"], "type": "object"}, "selector": {"type": "string"}}, "required": ["selector", "container", "media"], "type": "object"}, "type": "array"}}, "type": "object"}, "name": "audit_device_frame"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Contract"}, "description": "Verify a wire contract (token list / field set / schemaVersion) is identical across N independent source files (iOS Swift, proxy JS, Android Kotlin). Flags missing/inconsistent tokens, schemaVersion drift, and prefix-ordering bugs (a contained token matched before the longer one). BLOCK/PASS verdict.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"contract_spec": {"additionalProperties": false, "properties": {"fields": {"items": {"type": "string"}, "type": "array"}, "mode": {"enum": ["tokens", "envelope"], "type": "string"}, "schemaVersionPattern": {"type": "string"}, "tokens": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "file_paths": {"items": {"type": "string"}, "type": "array"}}, "required": ["contract_spec", "file_paths"], "type": "object"}, "name": "audit_contract"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Audit API Contract"}, "description": "Run adversarial queries against a live endpoint and return per-query verdict (shape-valid / shape-invalid / confident-wrong / uncertain) vs an expected shape schema + per-query expectations. Catches responses that are shape-valid but wrong.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"endpoint_url": {"type": "string"}, "expected_shape_schema": {"additionalProperties": false, "properties": {"required": {"items": {"type": "string"}, "type": "array"}, "types": {"additionalProperties": {"enum": ["string", "number", "boolean", "object", "array"], "type": "string"}, "type": "object"}}, "type": "object"}, "queries": {"items": {"additionalProperties": false, "properties": {"body": {}, "expect": {"additionalProperties": false, "properties": {"contains": {"items": {"type": "string"}, "type": "array"}, "equals": {"additionalProperties": {}, "type": "object"}}, "type": "object"}, "headers": {"additionalProperties": {"type": "string"}, "type": "object"}, "method": {"enum": ["GET", "POST"], "type": "string"}, "name": {"type": "string"}, "path": {"type": "string"}}, "required": ["name"], "type": "object"}, "type": "array"}}, "required": ["endpoint_url", "queries", "expected_shape_schema"], "type": "object"}, "name": "audit_api_contract"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Parity"}, "description": "Compare iOS vs Android element snapshots against a checklist of named spatial relationships (vertical centering, baseline/left alignment, equal gap/size, presence, truncation) and flag per-relation match/mismatch/uncertain — catches cross-platform layout drift like status text centered on one platform but top-aligned on the other. Provide ios+android {elements,viewport} snapshots and a checklist[].", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"android": {"additionalProperties": false, "properties": {"elements": {"items": {"additionalProperties": false, "properties": {"id": {"type": "string"}, "label": {"type": "string"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "role": {"type": "string"}}, "required": ["rect"], "type": "object"}, "type": "array"}, "viewport": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "required": ["elements", "viewport"], "type": "object"}, "checklist": {"items": {"additionalProperties": false, "properties": {"a": {"type": "string"}, "b": {"type": "string"}, "name": {"type": "string"}, "relation": {"enum": ["present", "vertically-centered", "baseline-aligned", "left-aligned", "equal-gap", "equal-size", "same-truncation"], "type": "string"}, "tolerance": {"type": "number"}}, "required": ["name", "a", "relation"], "type": "object"}, "type": "array"}, "ios": {"additionalProperties": false, "properties": {"elements": {"items": {"additionalProperties": false, "properties": {"id": {"type": "string"}, "label": {"type": "string"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "role": {"type": "string"}}, "required": ["rect"], "type": "object"}, "type": "array"}, "viewport": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "required": ["elements", "viewport"], "type": "object"}}, "required": ["ios", "android", "checklist"], "type": "object"}, "name": "audit_parity"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit iOS Accessibility"}, "description": "Score an accessibility-enriched iOS element snapshot — missing accessibilityLabel/value/traits, sub-44pt tap targets, per-text WCAG contrast, Dynamic Type clipping, and VoiceOver reading order. Provide {elements:[{label,value,hint,traits,role,rect,fontPt,fgColor,bgColor,dynamicTypeClipped}],viewport}. Capture via the AccessibilitySnapshot XCUITest / ios-capture harness.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"elements": {"items": {"additionalProperties": false, "properties": {"bgColor": {"type": "string"}, "dynamicTypeClipped": {"type": "boolean"}, "fgColor": {"type": "string"}, "fontPt": {"type": "number"}, "hint": {"type": "string"}, "label": {"type": "string"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "role": {"type": "string"}, "traits": {"items": {"type": "string"}, "type": "array"}, "value": {"type": "string"}}, "required": ["rect"], "type": "object"}, "type": "array"}, "options": {"additionalProperties": false, "properties": {"minTarget": {"type": "number"}}, "type": "object"}, "viewport": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "required": ["elements", "viewport"], "type": "object"}, "name": "audit_ios_a11y"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Audit Responsive Visibility"}, "description": "Render a URL at multiple breakpoints and flag content elements that are visible on desktop but hidden on mobile (display:none / opacity:0 / visibility:hidden / zero-size). Categorises each flag as 'likely-oversight' (content that vanishes on mobile — the hidden-on-mobile content bug) vs 'intentional' (decorative). Returns a table of selector / hiding-class / mobile-visible / desktop-visible / category. Requires headless chromium.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"breakpoints": {"description": "Viewport widths in px. Default [390, 768, 1440, 2160]", "items": {"type": "number"}, "type": "array"}, "url": {"description": "URL to render (http/https or file://)", "type": "string"}, "viewportHeight": {"description": "Render height in px. Default 900", "type": "number"}}, "required": ["url"], "type": "object"}, "name": "audit_responsive_visibility"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Audit Contrast"}, "description": "Compute WCAG contrast ratios for every text element on a rendered page (pass url) or from a supplied dom_snapshot. Reports AA (4.5:1 normal, 3:1 large) and AAA pass/fail and surfaces failing pairs with selector, ratio, and delta-to-pass — replacing manual eyedropper + ratio math. dom_snapshot mode returns a row per supplied element; url mode returns counts plus every row that needs action (aa_failures, indeterminate_bg_rows) and OMITS the per-element rows for passing elements, because a real page produces hundreds of thousands of characters of them.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"dom_snapshot": {"description": "Pre-collected text elements to score without rendering", "items": {"additionalProperties": false, "properties": {"bgColor": {"type": "string"}, "bold": {"type": "boolean"}, "color": {"type": "string"}, "fontPx": {"type": "number"}, "selector": {"type": "string"}, "text": {"type": "string"}}, "required": ["selector", "color", "bgColor"], "type": "object"}, "type": "array"}, "screenshot": {"description": "Optional base64 PNG for caller reference; ratios are computed from the DOM, not pixels", "type": "string"}, "url": {"description": "URL to render and measure (http/https or file://)", "type": "string"}}, "type": "object"}, "name": "audit_contrast"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Suggest Contrast Fix"}, "description": "Given failing WCAG color pairs, return the MINIMAL color change that clears the target ratio. For each {fg,bg} pair, computes the smallest foreground adjustment (and an alternative background adjustment) that reaches AA/AAA — with the achieved ratio and direction. Feeds directly from audit_contrast's failing pairs: pass them here to get concrete passing values instead of brute-forcing colors by hand. Pure offline math.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"level": {"description": "WCAG level when targetRatio is not given per-pair. Default AA.", "enum": ["AA", "AAA"], "type": "string"}, "pairs": {"description": "Color pairs to remediate. Each: { selector?, fg, bg, fontPx?, bold?, targetRatio? }. fontPx/bold pick the large-text threshold; targetRatio overrides the level.", "items": {"additionalProperties": false, "properties": {"bg": {"type": "string"}, "bold": {"type": "boolean"}, "fg": {"type": "string"}, "fontPx": {"type": "number"}, "ratio": {"type": ["number", "null"]}, "selector": {"type": "string"}, "status": {"enum": ["pass", "fail", "indeterminate"], "type": "string"}, "targetRatio": {"type": "number"}}, "required": ["fg", "bg"], "type": "object"}, "type": "array"}}, "type": "object"}, "name": "suggest_contrast_fix"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, "title": "Audit URL"}, "description": "Layer 0 render-and-capture audit: renders a LIVE URL at each viewport×theme, scroll-settles (fires whileInView/IntersectionObserver reveals; plays preload=none videos), optionally fires caller-supplied hover/focus/click interactions, and captures real pixels + the rendered DOM. Then runs the existing audit_page rule engine, per-element WCAG contrast, responsive-visibility (desktop-shown/mobile-hidden), blank-media detection, sliced-image edge symmetry, and hover-state white-wash detection over the captures. Every finding is tagged confirmed | likely-artifact | inconclusive with its evidence, ranked by severity. This is the tool that catches real-world visual nits invisible to HTML-string/geometry audits: cropped images, blank videos, hover white-wash, sliced exports, and hidden-on-mobile content. Requires headless chromium.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"compact": {"description": "Drop per-capture base64 screenshots; keep findings, counts, and summary. Default false. Use when screenshots would blow the tool-result budget.", "type": "boolean"}, "containerMaxWidth": {"description": "Your design system's canonical container width in px — makes the max-width check token-aware.", "type": "number"}, "includeScreenshots": {"description": "Include the base64 full-page PNG per capture in the result. Default: false (screenshots are large).", "type": "boolean"}, "interactions": {"description": "Fire each interaction before capture; the resulting state is diffed against baseline to catch hover/click white-wash and obscured content.", "items": {"additionalProperties": false, "properties": {"delay_ms": {"type": "number"}, "event": {"enum": ["hover", "click", "focus"], "type": "string"}, "selector": {"type": "string"}}, "required": ["selector", "event", "delay_ms"], "type": "object"}, "type": "array"}, "scroll_settle": {"description": "Step through the page with short pauses to fire reveal-on-scroll/IntersectionObserver content, play videos, then return to the top before capture. Default: true", "type": "boolean"}, "themes": {"description": "Themes to toggle (prefers-color-scheme + data-theme/class). Default: ['light','dark']", "items": {"enum": ["light", "dark"], "type": "string"}, "type": "array"}, "timeoutMs": {"description": "Per-navigation timeout in ms. Default: 30000", "type": "number"}, "url": {"description": "URL to render and audit (http/https or file://)", "type": "string"}, "viewports": {"description": "Viewports to render. Default: iphone 393×852, desktop 1440×900, wide 2160×1200", "items": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "label": {"type": "string"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}, "type": "array"}}, "required": ["url"], "type": "object"}, "name": "audit_url"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Content"}, "description": "Evaluate an array of content items (headings, prose, CTAs, labels, captions, metrics, outcomes) against UX-writing principles and deterministic heuristics. Returns a per-item verdict (pass/warn/fail) with matched principle ids, concrete issues grounded in principle text, a before→after rewrite suggestion, and an aggregate summary. Heuristics: metric items must carry a number+unit; cta/label must be action-led and ≤4 words; prose flags passive voice, jargon, and hedging; headings flag filler openers and buzzwords; captions flag duplication of any heading in the batch. Pure offline — no network or browser. Use this instead of evaluate_design when you need per-item content verdicts rather than the principle library.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"goals": {"description": "Optional content goals (e.g. ['clarity','conversion']); recorded for traceability.", "items": {"type": "string"}, "type": "array"}, "items": {"description": "Array of content items to audit.", "items": {"additionalProperties": false, "properties": {"id": {"description": "Optional stable id; auto-generated (item_N) if omitted.", "type": "string"}, "text": {"description": "The raw content string to evaluate.", "type": "string"}, "type": {"description": "Content type — selects which heuristics apply.", "enum": ["prose", "caption", "heading", "outcome", "metric", "cta", "label"], "type": "string"}}, "required": ["type", "text"], "type": "object"}, "type": "array"}, "system": {"description": "Optional content-system id (e.g. 'ux-writing'); recorded for traceability.", "type": "string"}}, "required": ["items"], "type": "object"}, "name": "audit_content"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Audit Typography"}, "description": "Audit the typographic SCALE of a rendered page (pass url) or a pre-collected snapshot of text nodes. Emits a focused report: (a) MODULAR SCALE — detects the dominant ratio (~1.2/1.25/1.333/1.5) across distinct font sizes and flags off-scale outliers; (b) LINE-HEIGHT CONSISTENCY — unitless lh/fs ratio per node, identifies the body rhythm and flags outliers; (c) WEIGHT LADDER — distinct weights, flags >4 weights or non-standard CSS values. Returns scale, line_height, weight_ladder, nodes_analyzed, and findings[{rule,severity,selector,message,fix}]. Goes beyond audit_page's pass/fail typography checks. url mode requires headless chromium.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"nodes": {"description": "Pre-collected text nodes to analyze without rendering.", "items": {"additionalProperties": false, "properties": {"fontPx": {"type": "number"}, "fontWeight": {"type": "number"}, "lineHeightPx": {"type": "number"}, "selector": {"type": "string"}, "tag": {"type": "string"}, "text": {"type": "string"}}, "required": ["selector", "fontPx"], "type": "object"}, "type": "array"}, "url": {"description": "URL to render and measure (http/https or file://). Requires headless chromium.", "type": "string"}}, "type": "object"}, "name": "audit_typography"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": true, "readOnlyHint": true, "title": "Audit Tap Targets"}, "description": "WCAG 2.5.5 / Apple 44pt tap-target audit for the web. Collects every interactive element (a, button, [role=button], input[type=submit/button/checkbox/radio], select, summary, label[for], [onclick], [tabindex>=0]) and emits a PER-ELEMENT fix table for any whose rendered width or height is below the minimum (default 44px): selector, role, visible text, measured w/h, pixel deficit per axis, and a concrete CSS fix. Sorted worst-first. Two modes: pass url (renders in headless chromium, measures real getBoundingClientRect) or pass elements[] snapshot (pure, no browser).", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"elements": {"description": "Pre-collected interactive elements to score without rendering.", "items": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "role": {"type": "string"}, "selector": {"type": "string"}, "text": {"type": "string"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["selector", "w", "h"], "type": "object"}, "type": "array"}, "minSize": {"description": "Minimum tap-target size in px on each axis. Default 44.", "type": "number"}, "url": {"description": "URL to render and measure. Requires headless chromium.", "type": "string"}}, "type": "object"}, "name": "audit_tap_targets"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Brand System"}, "description": "Get a complete design system for building an app with branding like a specific company. Say 'Make me an app with branding like Spotify' and get the full token set, style guide, and implementation instructions. Matches against 12 known design systems and provides closest match with ready-to-use CSS.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"company": {"description": "The company whose branding to use (e.g. 'Spotify', 'Stripe', 'Apple', 'Linear', 'Airbnb')", "type": "string"}, "format": {"description": "Output format: 'css' for CSS variables, 'dtcg' for W3C tokens, 'guide' for full implementation guide. Default: guide", "enum": ["css", "dtcg", "guide"], "type": "string"}, "mode": {"description": "Color mode preference. Default: based on the system's primary mode", "enum": ["light", "dark"], "type": "string"}}, "required": ["company"], "type": "object"}, "name": "get_brand_system"}, {"annotations": {"destructiveHint": true, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": false, "title": "Generate Design System"}, "description": "Generate a complete, custom design system with full token set. Provide a brand color to auto-generate a harmonious palette, pick a style preset, and export as visual HTML documentation, CSS variables, W3C DTCG JSON, Figma Variables, or SVG palette card. The HTML export is a beautiful, self-contained page suitable for sharing with stakeholders. Pass save:true to store the system for reuse by id — this is how a taste-engine session's design system becomes durable.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"base_system": {"description": "Start from an existing system as foundation (e.g. 'stripe', 'linear'). Colors will be replaced by brand_color if provided.", "type": "string"}, "brand_color": {"description": "Primary brand hex color (e.g. '#FF6B35'). Auto-generates a full harmonious palette using color theory.", "type": "string"}, "dark_mode": {"description": "Generate dark mode tokens alongside light. Default: true", "type": "boolean"}, "format": {"description": "Export format: html (visual doc page), css (custom properties), dtcg (W3C JSON), figma (Figma Variables JSON), svg (color palette card), all. Default: html", "enum": ["html", "css", "dtcg", "figma", "svg", "all"], "type": "string"}, "name": {"description": "Name for the design system (e.g. 'Acme Corp', 'NightOwl')", "type": "string"}, "save": {"description": "Persist the generated token set to ~/.raven/design-systems so its id works everywhere a bundled system's does: base_system here, get_design_system, list_design_systems, and init_design_md. Refused if the id (the slugified name) collides with a bundled system. Default: false", "type": "boolean"}, "style": {"description": "Aesthetic direction — influences spacing, radii, shadows, motion, and typography. Default: minimal", "enum": ["minimal", "bold", "warm", "corporate", "playful", "dark"], "type": "string"}}, "required": ["name"], "type": "object"}, "name": "generate_design_system"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Layout"}, "description": "Evaluate visual rhythm from a rendered page's geometry. Call with no arguments to get a DevTools snippet to paste into your page — it prints {elements, viewport} JSON. Call again with that JSON to get alignment, gap-rhythm, and optical-balance scores. This is the complement to audit_page for things only visible once rendered.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"elements": {"description": "Array of element rects captured from the rendered page via the DevTools snippet", "items": {"additionalProperties": false, "properties": {"computed": {"additionalProperties": false, "properties": {"background": {"type": "string"}, "color": {"type": "string"}, "fontSize": {"type": "string"}, "gap": {"type": "string"}, "margin": {"type": "string"}, "padding": {"type": "string"}}, "type": "object"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "selector": {"type": "string"}}, "required": ["selector", "rect"], "type": "object"}, "type": "array"}, "viewport": {"additionalProperties": false, "description": "Viewport dimensions {w,h} at capture time", "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "type": "object"}, "name": "audit_layout"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Swiftui"}, "description": "Audit SwiftUI source against Apple's Human Interface Guidelines. Flags hardcoded .font(.system(size:)) below ~13pt and tiny semantic fonts (.caption/.caption2), hardcoded Color(red:green:blue:)/hex instead of asset-catalog or semantic system colors, an empty/undefined AccentColor, interactive frames below 44×44pt, and ad-hoc spacing off the 4/8-pt grid. Rewards semantic Dynamic Type fonts, semantic system colors, SF Symbols, and flexible frames. iOS-native checks only — no web/CSS rules. Returns pass/fail per check with fix instructions.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"accent_color_contents": {"description": "Optional raw Contents.json of AccentColor.colorset. When provided, the tool verifies AccentColor actually defines color components (flags an empty/undefined accent color as an error).", "type": "string"}, "profile": {"description": "Taste profile owning the binding. Omit to search all stored profiles for one bound to the project.", "type": "string"}, "project": {"description": "Project identifier — resolves a saved taste surface binding (see bind_taste_surface). When the binding carries design_notes, each note is verified against the source (animation/material/haptic/font APIs) and returned in note_assessments; missing notes count toward the grade.", "type": "string"}, "source": {"anyOf": [{"type": "string"}, {"items": {"type": "string"}, "type": "array"}], "description": "SwiftUI source — a single file/view as a string, or an array of file contents. Concatenated before analysis."}, "strict": {"description": "Strict mode — also count warnings as failures for grading. Default: false", "type": "boolean"}}, "required": ["source"], "type": "object"}, "name": "audit_swiftui"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Screen"}, "description": "Audit a rendered mobile screen (iOS or Android) from a view-hierarchy/accessibility snapshot. Call with no arguments for the expected snapshot shape and how to capture it. Pass platform:\"android\" to score against the 48dp Material touch minimum and Material muted roles (onSurfaceVariant/outline = warn not fail); default platform:\"ios\" scores 44pt and treats secondaryLabel/tertiaryLabel as platform-standard. Both score touch targets, contrast, and visual rhythm (alignment, gap consistency, optical balance). Same return shape as audit_page.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"elements": {"description": "Elements captured from the rendered screen via an accessibility/view-hierarchy snapshot", "items": {"additionalProperties": false, "properties": {"bgColor": {"description": "Background color behind this element — hex, rgb(), or semantic name", "type": "string"}, "fgColor": {"description": "Foreground color — hex (#1c1c1e), rgb(), or a platform semantic name ('secondaryLabel' iOS / 'onSurfaceVariant' Android)", "type": "string"}, "fontPt": {"description": "Effective font point/dp size, if text", "type": "number"}, "label": {"type": "string"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "role": {"description": "Accessibility role/trait, e.g. button, link, cell, staticText, image, tab, textField", "type": "string"}}, "required": ["rect"], "type": "object"}, "type": "array"}, "platform": {"description": "Target platform — 'ios' (default, 44pt minimum, iOS semantic colors) or 'android' (48dp minimum, Material semantic roles)", "enum": ["ios", "android"], "type": "string"}, "profile": {"description": "Taste profile owning the binding. Omit to search all stored profiles for one bound to the project.", "type": "string"}, "project": {"description": "Project identifier — resolves a saved taste surface binding (see bind_taste_surface). When the binding carries design_notes and a screenshot is passed, the screenshot's pixels verify the color-scheme notes; results gain note_assessments.", "type": "string"}, "screenshot": {"description": "Optional base64 PNG of the screen, for the caller's reference. Geometry is scored from the snapshot, not decoded pixels.", "type": "string"}, "scroll_settle": {"type": "boolean"}, "viewport": {"additionalProperties": false, "description": "Screen size in pt (iOS) or dp (Android) at capture time, e.g. {w:393,h:852} iPhone 15, {w:412,h:915} Pixel", "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "type": "object"}, "name": "audit_screen"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit iOS Screen"}, "description": "Audit a rendered iOS screen from a view-hierarchy/accessibility snapshot (and optional screenshot). Alias of audit_screen with platform:\"ios\". Call with no arguments for the expected snapshot shape. Call with {elements:[{label,rect:{x,y,w,h},role,fontPt,fgColor,bgColor}],viewport:{w,h}} to score 44×44pt touch targets, contrast (with iOS secondaryLabel/tertiaryLabel treated as platform-standard — warn not fail), and visual rhythm (alignment, gap consistency, optical balance) in points. Same return shape as audit_page.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"elements": {"description": "Elements captured from the rendered screen via an accessibility/view-hierarchy snapshot", "items": {"additionalProperties": false, "properties": {"bgColor": {"description": "Background color behind this element — hex, rgb(), or semantic name", "type": "string"}, "fgColor": {"description": "Foreground color — hex (#1c1c1e), rgb(), or a platform semantic name ('secondaryLabel' iOS / 'onSurfaceVariant' Android)", "type": "string"}, "fontPt": {"description": "Effective font point/dp size, if text", "type": "number"}, "label": {"type": "string"}, "rect": {"additionalProperties": false, "properties": {"h": {"type": "number"}, "w": {"type": "number"}, "x": {"type": "number"}, "y": {"type": "number"}}, "required": ["x", "y", "w", "h"], "type": "object"}, "role": {"description": "Accessibility role/trait, e.g. button, link, cell, staticText, image, tab, textField", "type": "string"}}, "required": ["rect"], "type": "object"}, "type": "array"}, "profile": {"description": "Taste profile owning the binding. Omit to search all stored profiles for one bound to the project.", "type": "string"}, "project": {"description": "Project identifier — resolves a saved taste surface binding (see bind_taste_surface). When the binding carries design_notes and a screenshot is passed, the screenshot's pixels verify the color-scheme notes; results gain note_assessments.", "type": "string"}, "screenshot": {"description": "Optional base64 PNG of the screen, for the caller's reference. Geometry is scored from the snapshot, not decoded pixels.", "type": "string"}, "viewport": {"additionalProperties": false, "description": "Screen size in pt (iOS) or dp (Android) at capture time, e.g. {w:393,h:852} iPhone 15, {w:412,h:915} Pixel", "properties": {"h": {"type": "number"}, "w": {"type": "number"}}, "required": ["w", "h"], "type": "object"}}, "type": "object"}, "name": "audit_ios_screen"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit iOS Privacy"}, "description": "Audit an iOS or React Native/Expo app's privacy posture for App Review and user trust. Reads a native Info.plist XML OR an Expo app.json (managed Expo apps have no Info.plist) — plus optional PRIVACY.md, entitlements, and source. Flags: NS*UsageDescription strings that are vague/missing or contradict the code (e.g. a HealthKit write claim the code never fulfills), entitlements/permissions and Android permissions the app doesn't use, ATS cleartext exceptions and non-HTTPS endpoints, secrets/keys shipped in the bundle or app.json, and default data-egress paths not disclosed at the point of choice (a pre-selected 'Recommended' option that silently sends personal data to a server). Same return shape as audit_page.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"app_json": {"description": "Expo app.json / app.config JSON (managed RN). Its expo.ios.infoPlist, expo.android.permissions, plugins, and extra are audited.", "type": "string"}, "entitlements": {"description": "Optional .entitlements XML", "type": "string"}, "info_plist": {"description": "Raw Info.plist XML (native iOS / bare RN). Provide this OR app_json.", "type": "string"}, "privacy_md": {"description": "Optional PRIVACY.md / privacy policy text to cross-reference against declared permissions and default behavior", "type": "string"}, "source": {"description": "Optional concatenated source (Swift or JS/TS) — enables code-vs-declaration contradiction checks and default-egress detection", "type": "string"}}, "type": "object"}, "name": "audit_ios_privacy"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit React Native"}, "description": "Audit React Native / Expo source (JSX/TSX + StyleSheet) against the iOS HIG + Android Material conventions RN must satisfy. Flags touchables missing accessibilityLabel/accessibilityRole, touchables below 44pt without hitSlop, allowFontScaling={false}, fontSize below ~13, screens without SafeAreaView, and (for multi-mode apps) hardcoded colors with no useColorScheme/Appearance dark-mode handling. Rewards SafeAreaView, hitSlop, Platform-aware code, and a theme. RN-native checks only — no web/CSS or SwiftUI rules. Same return shape as audit_page. (RN renders to native widgets, so audit_ios_screen scores the rendered screen.)", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"color_scheme": {"description": "The app's declared appearance (Expo app.json userInterfaceStyle). 'light' or 'dark' means single-mode by design — the dark-mode adaptation check is then suppressed. Default: automatic.", "enum": ["light", "dark", "automatic"], "type": "string"}, "profile": {"description": "Taste profile owning the binding. Omit to search all stored profiles for one bound to the project.", "type": "string"}, "project": {"description": "Project identifier — resolves a saved taste surface binding (see bind_taste_surface). When the binding carries design_notes, each note is verified against the source (Animated/Reanimated, BlurView, haptics, fonts) and returned in note_assessments; missing notes count toward the grade.", "type": "string"}, "source": {"anyOf": [{"type": "string"}, {"items": {"type": "string"}, "type": "array"}], "description": "React Native source — a single screen/component as a string, or an array of file contents. Concatenated before analysis."}, "strict": {"description": "Strict mode — also count warnings as failures for grading. Default: false", "type": "boolean"}}, "required": ["source"], "type": "object"}, "name": "audit_rn"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Content Systems"}, "description": "Browse available content design systems — brand voice and tone guides (Conversational Product Voice, GOV.UK, Shopify Polaris, Atlassian). Filter by category or search by name.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"category": {"description": "Filter by category: commerce-saas, government, marketing-saas, productivity-saas", "type": "string"}, "search": {"description": "Search by name, description, or tag", "type": "string"}}, "type": "object"}, "name": "list_content_systems"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Content System"}, "description": "Get a brand's content design system — voice attributes, tone shifts by context, vocabulary (use/avoid/never), grammar rules, content patterns for errors/empty-states/buttons/etc., and inclusive language guidance.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"id": {"description": "Content system ID (e.g. 'conversational-product-voice', 'gov-uk', 'shopify-polaris', 'atlassian')", "type": "string"}, "section": {"description": "Return just one section. Default: all.", "enum": ["all", "voice", "tone_shifts", "vocabulary", "grammar", "content-patterns", "inclusive-language"], "type": "string"}}, "required": ["id"], "type": "object"}, "name": "get_content_system"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Content Principles"}, "description": "Get UX-writing principles — clarity over cleverness, active voice, error-message anatomy, inclusive language, voice vs tone, and more. Filter by the writing context (e.g. 'error messages', 'notifications', 'form labels').", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"context": {"description": "What you're writing for (e.g. 'error messages', 'onboarding copy', 'empty state', 'notification'). Omit to get all UX-writing principles.", "type": "string"}, "format": {"description": "Output format: full (all details), checklist (implications + violations), brief (just summary). Default: full", "enum": ["full", "checklist", "brief"], "type": "string"}}, "type": "object"}, "name": "get_content_principles"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Content Pattern"}, "description": "Get content design patterns — copy recipes for error messages, empty-state copy, notifications, and form validation. Returns do's, don'ts, good/bad examples, evidence, and a checklist.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"type": {"description": "Content pattern type", "enum": ["error-messages", "empty-state-copy", "notifications", "form-validation"], "type": "string"}}, "required": ["type"], "type": "object"}, "name": "get_content_pattern"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Research Method"}, "description": "Get research method details — qualitative (interviews, contextual inquiry, diary, field, intercept), quantitative (surveys, analytics, A/B tests, benchmarking, clickstream), or usability (moderated, unmoderated, 5-second, card sort, tree test, heuristic eval). Returns specific protocols, do/don't guidance, evidence, and a checklist. Use when the user is designing a study or asking how to measure something.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"category": {"description": "Which family of methods. Default: all.", "enum": ["qualitative", "quantitative", "usability", "all"], "type": "string"}, "search": {"description": "Search within methods by name or description.", "type": "string"}}, "type": "object"}, "name": "get_research_method"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Metrics Framework"}, "description": "Get a product-metrics framework — HEART (Google), AARRR/Pirate (Dave McClure), North Star Metric, Conversion Funnel, RICE Scoring, or OKRs. Returns structure, when-to-use, pitfalls, and examples. Use when the user asks 'how should we measure success?' or 'what metrics should we track?'", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"id": {"description": "Framework id (heart, aarrr, north-star-metric, conversion-funnel, rice-scoring, okrs). Omit to list all.", "type": "string"}, "search": {"description": "Search for a framework by name or summary.", "type": "string"}}, "type": "object"}, "name": "get_metrics_framework"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Service Pattern"}, "description": "Get a service design pattern — service blueprinting, human handoff, signup-as-service, omnichannel continuity, or moments of truth / recovery. Returns patterns, do/don't guidance, evidence, and a checklist. Use when the user is designing a service flow, escalation, cross-channel experience, or moment of truth.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"type": {"description": "Service design pattern type", "enum": ["service-blueprinting", "human-handoff", "signup-as-service", "omnichannel-continuity", "moments-of-truth"], "type": "string"}}, "required": ["type"], "type": "object"}, "name": "get_service_pattern"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Service Standard"}, "description": "Get the GOV.UK Service Standard — 14 points the UK government uses to assess whether a public service is ready to launch. Widely applicable as a rigorous service-quality checklist beyond government. Use when the user asks how to evaluate a whole service.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"properties": {}, "type": "object"}, "name": "get_service_standard"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Generate Service Blueprint"}, "description": "Render a service blueprint as a self-contained HTML page. Supports two modes: (1) classic Shostack single-actor blueprint — user action, frontstage, backstage, support, evidence, pain/delight; (2) two-actor HI-loop blueprint — when `actors` is supplied, renders two swim lanes with a line of interaction between them (e.g. customer ↔ lawyer, patient ↔ doctor, buyer ↔ agent). Each actor gets their own actions, frontstage (what they see), and evidence. Optionally accepts an ideal-state to render side-by-side with the current state.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"actors": {"additionalProperties": false, "description": "Omit for classic single-actor Shostack blueprint. Provide to render a two-swim-lane HI-loop blueprint with a line of interaction between the two sides.", "properties": {"a": {"additionalProperties": false, "description": "Actor A label (default: 'User'). Use when you want to name the first side (e.g. 'Customer', 'Patient').", "properties": {"label": {"type": "string"}}, "required": ["label"], "type": "object"}, "b": {"additionalProperties": false, "description": "Actor B label (e.g. 'Lawyer', 'Doctor', 'Agent'). Presence of this field switches to two-actor layout.", "properties": {"label": {"type": "string"}}, "required": ["label"], "type": "object"}}, "required": ["b"], "type": "object"}, "current": {"description": "The current-state blueprint as an array of steps", "items": {"additionalProperties": false, "properties": {"actor_b": {"additionalProperties": false, "description": "Only used when `actors.b` is provided. Captures the other side of the interaction.", "properties": {"action": {"description": "What actor B does in this step", "type": "string"}, "evidence": {"description": "Artifact actor B has — case file, notes, record", "type": "string"}, "frontstage": {"description": "What actor B sees — their own UI, tools, views", "type": "string"}}, "type": "object"}, "backstage": {"description": "What neither actor sees directly — shared systems, internal processes, back-office work", "type": "string"}, "delight": {"description": "Designed moment of delight at this step (shown as green callout)", "type": "string"}, "evidence": {"description": "In single-actor: artifact user receives. In two-actor: artifact actor A has.", "type": "string"}, "frontstage": {"description": "In single-actor: what the user SEES (UI, agent greeting). In two-actor: what actor A sees.", "type": "string"}, "label": {"description": "Step label (e.g. 'Discover', 'Sign up', 'First use')", "type": "string"}, "pain_point": {"description": "Known pain point at this step (shown as red callout)", "type": "string"}, "support": {"description": "Supporting processes, systems, third-party dependencies", "type": "string"}, "user_action": {"description": "In single-actor: what the user does. In two-actor: what actor A does.", "type": "string"}}, "required": ["label"], "type": "object"}, "type": "array"}, "ideal": {"description": "Optional ideal-state blueprint — if provided, output shows current AND ideal side-by-side", "items": {"additionalProperties": false, "properties": {"actor_b": {"additionalProperties": false, "properties": {"action": {"type": "string"}, "evidence": {"type": "string"}, "frontstage": {"type": "string"}}, "type": "object"}, "backstage": {"type": "string"}, "delight": {"type": "string"}, "evidence": {"type": "string"}, "frontstage": {"type": "string"}, "label": {"type": "string"}, "pain_point": {"type": "string"}, "support": {"type": "string"}, "user_action": {"type": "string"}}, "required": ["label"], "type": "object"}, "type": "array"}, "service_name": {"description": "Name of the service (e.g. 'Free trial signup', 'Client intake', 'Restaurant reservation')", "type": "string"}, "subtitle": {"description": "Short description or context line under the title", "type": "string"}}, "required": ["service_name", "current"], "type": "object"}, "name": "generate_service_blueprint"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Brand Principles"}, "description": "Get brand and visual-design principles — logo usage (clear space, min sizes, variants, placement, restraint), gradient usage (hierarchy, palette, contrast, trend vs signature), imagery (consistency, representation, purpose), visual hierarchy, and brand-as-system thinking. Use when the user asks about branding, logos, gradients, imagery, visual consistency, or how to treat a brand across surfaces.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"format": {"description": "Output format. Default: full.", "enum": ["full", "checklist", "brief"], "type": "string"}, "topic": {"description": "Filter by topic: 'logo', 'gradient', 'imagery', 'hierarchy', 'system', or a freeform search term. Omit to return all brand principles.", "type": "string"}}, "type": "object"}, "name": "get_brand_principles"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Brand Trends"}, "description": "Get current brand and visual-design trends — what's working in 2026 and where each trend fits or fails. Includes bento grids, monospace type, neon-on-dark-glass, generative patterns, brutalism rebound, AI-generated imagery, lowercase/mixed case. Each trend is time-stamped — treat as a calibration signal, not a prescription.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"properties": {}, "type": "object"}, "name": "get_brand_trends"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Creative Models"}, "description": "Browse Raven's provider-agnostic creative model catalog. These are capability slots for image, video, 3D, audio, character consistency, and creative analysis. Each entry lists typical inputs and best-for guidance.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"capability": {"description": "Filter by capability, e.g. product-photoshoot, text-to-video, brand-kit, ugc-ad.", "type": "string"}, "media_type": {"description": "Filter by media type.", "enum": ["image", "video", "audio", "3d", "campaign", "analysis"], "type": "string"}}, "type": "object"}, "name": "list_creative_models"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Creative Presets"}, "description": "Browse Raven creative presets for product photoshoots, marketplace cards, UGC ads, TV spots, cinematic reveals, social launch packs, storyboards, and infographics.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"media_type": {"description": "Filter presets by media type.", "enum": ["image", "video", "campaign"], "type": "string"}, "search": {"description": "Search preset name or description.", "type": "string"}}, "type": "object"}, "name": "list_creative_presets"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Create Brand Profile"}, "description": "Create or update a local brand profile used by Raven creative jobs. Stores colors, fonts, tone, audience, constraints, product notes, and asset references locally under ~/.raven/creative by default.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"asset_ids": {"description": "Existing Raven creative asset IDs tied to this brand.", "items": {"type": "string"}, "type": "array"}, "audience": {"description": "Primary audience/customer.", "type": "string"}, "colors": {"description": "Brand colors, preferably hex or token names.", "items": {"type": "string"}, "type": "array"}, "constraints": {"description": "Rules to honor: no claims, legal notes, visual constraints.", "items": {"type": "string"}, "type": "array"}, "description": {"description": "What the brand/product is.", "type": "string"}, "fonts": {"description": "Brand fonts or type guidance.", "items": {"type": "string"}, "type": "array"}, "id": {"description": "Optional stable ID. If omitted, Raven creates one from the name.", "type": "string"}, "name": {"description": "Brand or project name.", "type": "string"}, "product": {"description": "Product or offer notes.", "type": "string"}, "tone": {"description": "Voice and tone guidance.", "type": "string"}}, "required": ["name"], "type": "object"}, "name": "create_brand_profile"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Brand Profile"}, "description": "Read a local Raven creative brand profile by ID.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"id": {"description": "Brand profile ID.", "type": "string"}}, "required": ["id"], "type": "object"}, "name": "get_brand_profile"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Brand Profiles"}, "description": "List local Raven creative brand profiles.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"properties": {}, "type": "object"}, "name": "list_brand_profiles"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Register Creative Asset"}, "description": "Register a local or remote creative asset for Raven jobs. This is the local-first analog of upload: Raven stores metadata and a URI/path, not the file bytes.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"description": {"description": "What this asset should be used for.", "type": "string"}, "metadata": {"additionalProperties": {}, "description": "Optional non-secret metadata.", "type": "object"}, "name": {"description": "Human-readable name.", "type": "string"}, "tags": {"description": "Search tags.", "items": {"type": "string"}, "type": "array"}, "type": {"description": "Asset type.", "enum": ["image", "video", "audio", "document", "3d", "url", "other"], "type": "string"}, "uri": {"description": "Local path or URL to the asset.", "type": "string"}}, "required": ["uri", "type"], "type": "object"}, "name": "register_creative_asset"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Create Character Profile"}, "description": "Create a local character/identity reference profile for consistent image or video generation. Raven stores reference asset IDs and provider-training payloads; actual identity training happens only through a configured provider runner.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"consistency_notes": {"description": "What must stay consistent across generations.", "type": "string"}, "description": {"description": "Visual/personality description.", "type": "string"}, "id": {"description": "Optional stable ID.", "type": "string"}, "metadata": {"additionalProperties": {}, "description": "Optional non-secret metadata.", "type": "object"}, "name": {"description": "Character, spokesperson, founder, avatar, or product persona name.", "type": "string"}, "provider_training_id": {"description": "External provider training/character ID if already trained.", "type": "string"}, "reference_asset_ids": {"description": "Raven creative asset IDs for reference images/videos.", "items": {"type": "string"}, "minItems": 1, "type": "array"}}, "required": ["name", "reference_asset_ids"], "type": "object"}, "name": "create_character_profile"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Create Generation Job"}, "description": "Create a Raven creative generation job for image, video, 3D, audio, campaign, or analysis. Returns a brand-aware provider payload. If execute=true and RAVEN_CREATIVE_RUNNER is configured, Raven submits the job to that local runner.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"aspect_ratio": {"description": "Target aspect ratio, e.g. 1:1, 16:9, 9:16.", "type": "string"}, "brand_profile_id": {"description": "Local Raven brand profile ID.", "type": "string"}, "channel": {"description": "Target channel, e.g. TikTok, YouTube Shorts, blog, marketplace.", "type": "string"}, "character_profile_id": {"description": "Local Raven character profile ID.", "type": "string"}, "duration_seconds": {"description": "Video/audio duration.", "exclusiveMinimum": 0, "maximum": 600, "type": "number"}, "execute": {"description": "Submit through RAVEN_CREATIVE_RUNNER now. Default false.", "type": "boolean"}, "media_type": {"description": "Output type.", "enum": ["image", "video", "audio", "3d", "campaign", "analysis"], "type": "string"}, "model": {"description": "Raven model slot or external provider model ID.", "type": "string"}, "objective": {"description": "Business or audience goal.", "type": "string"}, "output_count": {"description": "Number of variants to request.", "maximum": 100, "minimum": 1, "type": "integer"}, "preset": {"description": "Preset ID from list_creative_presets.", "type": "string"}, "prompt": {"description": "Creative request.", "type": "string"}, "provider": {"description": "Provider label for the downstream runner.", "type": "string"}, "quality": {"description": "Requested quality tier.", "enum": ["draft", "standard", "high", "4k"], "type": "string"}, "reference_asset_ids": {"description": "Local Raven creative asset IDs.", "items": {"type": "string"}, "type": "array"}}, "required": ["media_type", "prompt"], "type": "object"}, "name": "create_generation_job"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Get Generation Job"}, "description": "Read a Raven creative generation job by ID.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"id": {"description": "Generation job ID.", "type": "string"}}, "required": ["id"], "type": "object"}, "name": "get_generation_job"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "List Generation Jobs"}, "description": "List local Raven creative generation jobs.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"limit": {"description": "Max jobs to return. Default 25.", "maximum": 100, "minimum": 1, "type": "integer"}, "media_type": {"description": "Filter by media type.", "enum": ["image", "video", "audio", "3d", "campaign", "analysis"], "type": "string"}, "status": {"description": "Filter by status: draft, needs_runner, submitted, completed, failed.", "type": "string"}}, "type": "object"}, "name": "list_generation_jobs"}, {"annotations": {"destructiveHint": true, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false, "title": "Plan Creative Campaign"}, "description": "Plan a multi-asset creative campaign and optionally create draft generation jobs. Covers Higgsfield-like workflows: product photos, UGC/video ads, marketplace cards, launch/social packs, storyboards, and channel cutdowns.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"audience": {"description": "Target audience.", "type": "string"}, "brand_profile_id": {"description": "Local Raven brand profile ID.", "type": "string"}, "campaign_name": {"description": "Campaign name.", "type": "string"}, "channels": {"description": "Target channels: TikTok, Reels, YouTube Shorts, web, marketplace, LinkedIn, etc.", "items": {"type": "string"}, "minItems": 1, "type": "array"}, "create_jobs": {"description": "Create draft generation jobs. Default true.", "type": "boolean"}, "formats": {"description": "Preset IDs to force. Defaults inferred from channels.", "items": {"type": "string"}, "type": "array"}, "goal": {"description": "Primary campaign goal.", "enum": ["awareness", "conversion", "retention", "launch", "research", "sales"], "type": "string"}, "product_or_offer": {"description": "Product, service, feature, or offer.", "type": "string"}, "source_asset_ids": {"description": "Raven creative asset IDs to use as source/reference.", "items": {"type": "string"}, "type": "array"}, "variants_per_format": {"description": "How many draft job variants per format. Default 2.", "maximum": 5, "minimum": 1, "type": "integer"}}, "required": ["campaign_name", "product_or_offer", "audience", "goal", "channels"], "type": "object"}, "name": "plan_creative_campaign"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Score Creative"}, "description": "Score a creative prompt, script, or ad concept for hook strength, benefit clarity, product signal, call-to-action, channel fit, audience fit, and brand fit. This is a transparent heuristic, not a proprietary prediction model.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"audience": {"description": "Target audience if not in a brand profile.", "type": "string"}, "brand_profile_id": {"description": "Local Raven brand profile ID.", "type": "string"}, "channel": {"description": "Target channel.", "type": "string"}, "creative_text": {"description": "Prompt, script, ad copy, or creative concept to score.", "type": "string"}}, "required": ["creative_text"], "type": "object"}, "name": "score_creative"}, {"annotations": {"destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true, "title": "Audit Consistency"}, "description": "Audit multiple pages for cross-page consistency of content-container width and hero heading tier. Pass ≥2 pages ({name, html}) collected from different routes on the same site. Infers the canonical (modal) value from the corpus when no token is supplied, so you need not know the project's design token in advance. Flags the issue #9 single-blob blind spot: pages that each pass audit_page but silently disagree with each other on container width or hero size class. Returns per-page extraction (container_px, container_classes, hero_classes, signatures), consistency dimensions with reference values, outlier page names, issues[], score (100/50/0 → A/C/D), and a plain-text summary. Pure offline — no browser, no network.", "execution": {"taskSupport": "forbidden"}, "inputSchema": {"$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {"container_token": {"description": "Project's canonical container width in px (e.g. 1152). When supplied, container divergence is measured against this token rather than the corpus modal.", "type": "number"}, "hero_token": {"description": "Canonical hero heading class signature (e.g. \"text-display-xl\" or \"64\"). When supplied, hero divergence is measured against this token rather than the corpus modal.", "type": "string"}, "pages": {"description": "At least 2 pages to compare. Each entry is {name, html}.", "items": {"additionalProperties": false, "properties": {"html": {"description": "Full HTML source for the page, including any