addrbookFor publishers
← The evidence ledger

Evidence row 291871

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint d3e230ff-6bb6-457d-887e-9610ad0c64d2
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
4fead5e2a80ceca82f8afcf1920daf0f5d202d4cccdda4a966dcbdc3045d88ad
Leaf
0x2c05baa3ddc8e3b6845c4e1dce145c2b0b63b87254fa41722bed505d76f4909b

What was observed

{
  "count": 65,
  "tools": [
    {
      "description": "Get the scope and permissions of the current API key.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "apikey_get_scope"
    },
    {
      "description": "SECURITY + CORRECTNESS AUDIT of a bundle BEFORE go-live (static; your code is never executed). Finds what build_validate/build_doctor do not: MONEY-01 client-chosen checkout amounts, AUTHZ-01 end-users able to write server-owned fields (paid/issued/status/amount/payment refs) or create tickets/payments, FLOW-01 fulfilment done in the browser or on payment_status alone, INV-01 capacity/stock with no server-side enforcement, PUB-01 draft/hidden rows in PUBLIC_SCHEMAS, LAUNCH-01 terms/privacy/password-reset/meta gaps. Each finding has severity (blocker|critical|high|warning), file:line or policy, evidence, the exact fix pattern and a fingerprint. Fix every blocker and critical, then re-run until clean; build_go_live reports (or, when enforced, refuses on) outstanding blocker/critical findings. Pass files/files_ref, or only project_uuid to audit the latest published version.",
      "inputSchema": {
        "properties": {
          "files": {
            "description": "Map of {relative_path: file_content} to audit before publishing.",
            "type": "object"
          },
          "files_b64gz": {
            "description": "Alt to files: base64(gzip(JSON {path:content})).",
            "type": "string"
          },
          "files_ref": {
            "description": "For a LARGE bundle: a file_id from build_stage_bundle (gzip(json {path:content}) uploaded out-of-band).",
            "type": "string"
          },
          "min_severity": {
            "description": "Lowest severity to list (default 'warning' = everything).",
            "enum": [
              "blocker",
              "critical",
              "high",
              "warning"
            ],
            "type": "string"
          },
          "project_uuid": {
            "description": "Project to audit; without files, its latest (or version_uuid) PUBLISHED bundle is audited.",
            "type": "string"
          },
          "version_uuid": {
            "description": "Published version to audit (default: latest). Ignored when files are given.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "build_audit"
    },
    {
      "description": "Bind source streams to the app's schemas. mode='live_read' (default: read-only BYODB / warehouse), 'live_readwrite' (BYODB read+write — DOMAIN-ADMIN only), or 'sync' (copy into SuperoDB). For live modes, discovery must have run and each binding's `source` must match a discovered stream; the bind VERIFIES the live mapping materialized. Bound live schemas are read/written via ORDINARY app CRUD — nothing goes in the bundle.",
      "inputSchema": {
        "properties": {
          "bindings": {
            "description": "One entry per app schema to back with a source stream.",
            "items": {
              "properties": {
                "mode": {
                  "description": "live_read (default, read-only), live_readwrite (domain-admin key only), or sync (copy into SuperoDB).",
                  "enum": [
                    "live_read",
                    "live_readwrite",
                    "sync"
                  ],
                  "type": "string"
                },
                "schema": {
                  "description": "App schema name to back.",
                  "type": "string"
                },
                "source": {
                  "description": "Source stream/table (must match a discovered stream for live modes).",
                  "type": "string"
                },
                "stream_class": {
                  "description": "'entity' = mutable business records (current-state rows, e.g. customers/products); 'event' = append-only time-series/log rows (e.g. clicks, sensor readings). OMIT it to let the platform classify safely from the stream's shape — only set it to override.",
                  "enum": [
                    "entity",
                    "event"
                  ],
                  "type": "string"
                },
                "tenant_binding": {
                  "description": "How live rows map to Supero tenants. OMIT for the default {mode:'fixed', tenant:'default-tenant'} (all rows visible to the default tenant/admin — required, else live reads 403 tenant_binding_missing). For per-tenant isolation pass {mode:'column', tenant_field:'<col>', tenant_value_map:{<supero_tenant>:<source_value>}}.",
                  "type": "object"
                }
              },
              "required": [
                "schema",
                "source"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "connector_id": {
            "description": "The connector to bind (from build_connect_data_source).",
            "type": "string"
          }
        },
        "required": [
          "connector_id",
          "bindings"
        ],
        "type": "object"
      },
      "name": "build_bind_data_source"
    },
    {
      "description": "Configure a service's keys for the project so an integration works at deploy (e.g. wire SendGrid for email, a Stripe TEST key for checkout). TEST/SANDBOX keys ONLY. Keys with a clear live marker (Stripe sk_live_… / Razorpay rzp_live_…) are auto-refused, but most providers give NO test-vs-live signal — so for EVERY provider send test/sandbox keys only and use the admin panel for production secrets (a deep link is returned). Never put a real secret through this tool/chat. Reacts to the live permission result; secret values are never echoed.",
      "inputSchema": {
        "properties": {
          "config": {
            "description": "Test/sandbox config key→value (e.g. {\"sendgrid_api_key\":\"SG.test…\"}). Live-marked keys refused; send test keys only.",
            "type": "object"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "service_id": {
            "description": "Catalog id (e.g. 'stripe_checkout', 'email').",
            "type": "string"
          }
        },
        "required": [
          "project_uuid",
          "service_id",
          "config"
        ],
        "type": "object"
      },
      "name": "build_configure_services"
    },
    {
      "description": "Create a data connector to an EXTERNAL source the app owner controls (their own database, a REST API, or a warehouse). Returns a connector_id. Does NOT bind schemas yet. Flow: build_connect_data_source → build_discover_source (lists the tables/streams; needs this connector_id) → build_bind_data_source (bind streams to app schemas) → build_run_data_source (mode='sync' bindings only; live reads need no run). For a database you do NOT need to know the tables upfront: omit `table_names` and let discovery + bind pick them (the connector is a manual-trigger shell until bound, and a run before a sync bind is refused). Pass `table_names` only when you already know exactly which tables to sync. Credentials are sent to the platform and NEVER echoed back; prefer read-only DB creds / the Key Store for production. Requires a domain- or project-admin API key.",
      "inputSchema": {
        "properties": {
          "auth": {
            "description": "api kind: {type: none|api_key|bearer|basic|oauth2, ...}.",
            "type": "object"
          },
          "base_url": {
            "description": "api kind: API base URL.",
            "type": "string"
          },
          "config": {
            "description": "Extra source config (e.g. warehouse account).",
            "type": "object"
          },
          "database": {
            "description": "database/warehouse: database name.",
            "type": "string"
          },
          "db_type": {
            "description": "database/warehouse: postgresql|mysql|mssql|oracle|mongodb|snowflake|bigquery|redshift|databricks|clickhouse|fabric.",
            "type": "string"
          },
          "endpoint": {
            "description": "api kind: endpoint path.",
            "type": "string"
          },
          "host": {
            "description": "Server hostname (database kinds, Fabric, ClickHouse, Snowflake, Databricks). BigQuery/Redshift take their connection settings in `config`.",
            "type": "string"
          },
          "kind": {
            "description": "Source kind.",
            "enum": [
              "database",
              "api",
              "warehouse"
            ],
            "type": "string"
          },
          "name": {
            "description": "Connector name (unique within the project).",
            "type": "string"
          },
          "password": {
            "description": "DB password — sent to the platform, never echoed.",
            "type": "string"
          },
          "port": {
            "description": "Server port; omit for the dialect default (5432 PostgreSQL, 3306 MySQL, 1433 MSSQL/Fabric, 1521 Oracle, 27017 MongoDB).",
            "type": "integer"
          },
          "project_uuid": {
            "description": "Project the connector belongs to (from build_list_projects); your key must be allowed to build into it. API-key callers pass it to scope the connector to that project.",
            "type": "string"
          },
          "schema_namespace": {
            "description": "Namespace for schemas from this source.",
            "type": "string"
          },
          "ssl_mode": {
            "description": "database kind: TLS mode, one of disable|allow|prefer|require|verify-ca|verify-full (or the MySQL spellings disabled|preferred|required|verify_ca|verify_identity); other values are rejected. Default 'require'. Used by PostgreSQL/MySQL/MSSQL/Fabric/MongoDB; Oracle and the HTTP warehouses (Snowflake/Databricks/ClickHouse/BigQuery/Redshift) ignore it.",
            "type": "string"
          },
          "table_names": {
            "description": "database/warehouse, OPTIONAL: the source tables to sync, e.g. [\"customers\", \"orders\"]. Omit when you don't know them yet — run build_discover_source next and bind the streams it returns.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "test_first": {
            "description": "Probe connectivity before creating (default true).",
            "type": "boolean"
          },
          "username": {
            "description": "database/warehouse: login user (prefer a read-only one).",
            "type": "string"
          }
        },
        "required": [
          "name",
          "kind"
        ],
        "type": "object"
      },
      "name": "build_connect_data_source"
    },
    {
      "description": "Create a NEW project (domain-admin keys only; plan-gated). Mints the project's schema_namespace + an API key (returned ONCE). Use for a fresh app.",
      "inputSchema": {
        "properties": {
          "description": {
            "description": "Optional: what the app is for — persisted on the project so future sessions build to it.",
            "type": "string"
          },
          "display_name": {
            "description": "Optional human-readable name shown in the dashboard.",
            "type": "string"
          },
          "name": {
            "description": "Project name/slug.",
            "type": "string"
          },
          "requirements": {
            "description": "Optional: the confirmed requirements/plan bullets — persisted on the project record (future sessions read them via build_get_project).",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "schema_namespace": {
            "description": "Optional; server normalizes/derives if omitted.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "build_create_project"
    },
    {
      "description": "Deploy a published version. target='cloud_ephemeral' (managed Cloud Run, ~30m throwaway preview; requires platform enablement; the default when cloud deploy is enabled) or 'local' (hand the user the bundle to run with the project's own key). For a PERMANENT public URL, use build_go_live instead.",
      "inputSchema": {
        "properties": {
          "app_type": {
            "description": "Default 'web'.",
            "enum": [
              "web",
              "all"
            ],
            "type": "string"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "target": {
            "description": "Default 'cloud_ephemeral' when cloud deploy is enabled (else 'local').",
            "enum": [
              "local",
              "cloud_ephemeral"
            ],
            "type": "string"
          },
          "version_uuid": {
            "description": "Default: latest published version.",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_deploy"
    },
    {
      "description": "Poll a cloud deploy started by build_deploy or build_go_live. Pass the poll_url it returned. Reports elapsed_s since launch. 'launching' for 5-6.5 minutes is normal (Cloud Run IAM propagation): keep polling every ~30s and probe the url once it appears. Only a persistent unreachable past ~10 minutes is a real failure (see the anti-loop rules).",
      "inputSchema": {
        "properties": {
          "permanent": {
            "description": "Set true when polling a build_go_live (permanent) deploy so the expiry guidance is correct. Default: auto-detected.",
            "type": "boolean"
          },
          "poll_url": {
            "description": "The poll_url returned by build_deploy or build_go_live.",
            "type": "string"
          }
        },
        "required": [
          "poll_url"
        ],
        "type": "object"
      },
      "name": "build_deploy_status"
    },
    {
      "description": "Discover a connector's schema: trigger discovery, wait, and return the source streams (names, columns, primary keys), AI-inferred Supero schemas, field mappings, and a suggested namespace. Run AFTER build_connect_data_source and BEFORE build_bind_data_source (a live bind's `source` MUST equal a discovered stream name).",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "The connector to discover (from build_connect_data_source).",
            "type": "string"
          },
          "execution_id": {
            "description": "RESUME polling an in-flight discovery (from a previous timeout error) instead of starting a new job.",
            "type": "string"
          },
          "timeout": {
            "description": "Max seconds to wait IN THIS CALL (default 60, cap 90 — an MCP call must finish under the ~100s edge limit). On timeout, resume with the returned execution_id; the job keeps running server-side.",
            "type": "integer"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "build_discover_source"
    },
    {
      "description": "PREFLIGHT a bundle BEFORE publish/deploy — catches the silent deploy-killers build_validate does NOT: missing #supero-preloader removal (app stuck on a spinner forever), heavy startup seed (Cloud Run port-bind timeout → 'container failed to start'), reserved field names like status/state (silently dropped), namespace collisions (ambiguous reads), and services needing elevated import permission. Run it after build_validate and before build_publish.",
      "inputSchema": {
        "properties": {
          "files": {
            "description": "Map of {relative_path: file_content}.",
            "type": "object"
          },
          "files_b64gz": {
            "description": "Alt to files: base64(gzip(JSON {path:content})).",
            "type": "string"
          },
          "files_ref": {
            "description": "For a LARGE bundle that exceeds the model output-token cap: a file_id from build_stage_bundle (upload the gzip(json {path:content}) blob out-of-band, then pass its file_id here). Preferred over files/files_b64gz when the bundle will not fit inline.",
            "type": "string"
          },
          "project_uuid": {
            "description": "Target project (enables namespace + collision checks).",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "build_doctor"
    },
    {
      "description": "Fetch the CURRENT (or a given) PUBLISHED bundle: the file list + a signed download_url, or ONE file's content inline via file=. For ANY change request on an existing app, START from this bundle and modify it — re-authoring from scratch silently drops the hand-authored ui/app.js and every prior fix.",
      "inputSchema": {
        "properties": {
          "file": {
            "description": "Optional app-root-relative path (e.g. 'ui/app.js') to return that single file's content inline (~120KB cap, truncated with a note).",
            "type": "string"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "version_uuid": {
            "description": "Default: latest published version.",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_get_bundle"
    },
    {
      "description": "Fetch a COMPLETE, production-quality reference app (schemas.py + config.py + setup.py + ui/app.js) to copy patterns from — the single biggest lever for app quality. archetype='index' (default) lists the available archetypes with per-file byte sizes; pick the one closest to your app ('commerce-marketplace' | 'service-booking' | 'ops-dashboard' | 'multitenant-portal' | 'saas-billing') and fetch it BEFORE authoring your UI. These are real 'stunning' apps; mirror how they compose the SDK components, art-direct the landing page, and structure schemas. Optional file= to fetch just one file ('schemas.py' | 'config.py' | 'setup.py' | 'ui/app.js'). Responses are PAGED (~32KB/section): when the header says more:true, fetch the next section with offset=<next_offset> — never re-fetch from 0.",
      "inputSchema": {
        "properties": {
          "archetype": {
            "description": "Which reference app (default 'index' to list them).",
            "enum": [
              "index",
              "commerce-marketplace",
              "service-booking",
              "ops-dashboard",
              "multitenant-portal",
              "saas-billing"
            ],
            "type": "string"
          },
          "file": {
            "description": "Optional: return only this one file instead of the whole bundle.",
            "enum": [
              "schemas.py",
              "config.py",
              "setup.py",
              "ui/app.js"
            ],
            "type": "string"
          },
          "max_bytes": {
            "description": "Max bytes to return per section (default ~32000).",
            "type": "integer"
          },
          "offset": {
            "description": "Byte offset to start from (for paging; default 0).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "build_get_examples"
    },
    {
      "description": "Get one project's details: schema_namespace (use this EXACT value as the `namespace` literal on every schema dict), last published version, AND the captured `project_intent` — the brief (project_description/summary), the discovered data model (entities/central_entity/relationships/status_workflows), and the landing intent (public_landing_view). BUILD TO THIS — it's the authoritative app spec the user already gave; don't re-ask or ignore it.",
      "inputSchema": {
        "properties": {
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_get_project"
    },
    {
      "description": "Fetch the AUTHORITATIVE contract for a transactional/stateful platform service (cart, order, payment, booking, appointment, membership, approval, document_signature, recurring_plan, inventory, task, ticket, loyalty_points, rental, comment, attachment, feedback, notification, product, service, customer, workflows). Returns the service's state machine (initial_state + transitions), its operations (op ids + input fields + resulting state), the base schemas + mandatory fields you must supply, AND the platform's DEFAULT UI SCHEMAS for that service — the bulletproof reference for building a correct, sophisticated transactional UI. ALWAYS call this for any service your app `extends` BEFORE authoring its UI — do not guess op names, states, or mandatory fields from prose. service_id='index' (default) lists all services.",
      "inputSchema": {
        "properties": {
          "parts": {
            "description": "What to return (default 'both'): 'contract' = state machine/ops/schemas; 'ui_schemas' = default UI only.",
            "enum": [
              "both",
              "contract",
              "ui_schemas"
            ],
            "type": "string"
          },
          "service_id": {
            "description": "The service id (e.g. 'cart', 'booking', 'payment'); 'index' (default) lists all.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "build_get_service_contract"
    },
    {
      "description": "Fetch a Supero build reference. doc='skills' (default, the spec you MUST follow) | 'components' (the real pre-built SDK component/global catalog — read so you don't reinvent UI) | 'rubric' (the rich-app quality checklist — what 'stunning' means) | 'landing' (compact landing-page derivation + quality bar — MANDATORY read for public-facing apps) | 'integrations' (the EXACT services.* wrapper→service_id→args map for email/sms/stripe/ai/etc.) | 'web' / 'transactional' / 'workflows' / 'mobile' / 'services' (deep companion docs) | 'e2e_testing'. Returns the doc + a content version + the SDK floor to pin. Read 'skills' FIRST, then 'components' + a matching build_get_examples before you author UI. Docs are PAGED (~32KB/section): when the header says more:true, fetch the next section with offset=<next_offset> — never re-fetch from 0.",
      "inputSchema": {
        "properties": {
          "doc": {
            "description": "Which doc (default 'skills').",
            "enum": [
              "skills",
              "components",
              "rubric",
              "landing",
              "integrations",
              "web",
              "transactional",
              "workflows",
              "mobile",
              "services",
              "e2e_testing",
              "connectors"
            ],
            "type": "string"
          },
          "max_bytes": {
            "description": "Max bytes to return per section (default ~32000).",
            "type": "integer"
          },
          "offset": {
            "description": "Byte offset to start from (for paging large docs; default 0).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "build_get_skills"
    },
    {
      "description": "PERMANENT deploy: promote a published version to a PERMANENT public URL at <service>.supero.live (managed Cloud Run) — unlike build_deploy(target='cloud_ephemeral'), which is a ~30-min throwaway. If version_uuid/file_id are omitted, the latest published version for the project is used. Returns public_url + poll_url; poll with build_deploy_status until live, then build_smoke_test the public_url. build_teardown removes it. Requires a domain- or project-admin API key + platform cloud-deploy enablement.",
      "inputSchema": {
        "properties": {
          "acknowledge_findings": {
            "description": "Explicitly accept outstanding build_audit CRITICAL findings so go-live may proceed when the audit gate is enforced: [{fingerprint, reason}] (reason >= 15 characters; recorded with the version in the response). BLOCKER findings cannot be acknowledged — fix them. Fix findings instead whenever possible.",
            "items": {
              "properties": {
                "fingerprint": {
                  "description": "The finding's fingerprint from build_audit.",
                  "type": "string"
                },
                "reason": {
                  "description": "Why it is acceptable to go live with it.",
                  "type": "string"
                }
              },
              "required": [
                "fingerprint",
                "reason"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "file_id": {
            "description": "Default: the resolved version's web artifact file_id.",
            "type": "string"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "version_uuid": {
            "description": "Default: latest published version.",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_go_live"
    },
    {
      "description": "IMPORT platform services into a project (e.g. 'workflows', 'email', 'stripe_checkout', 'cart', 'order', 'payment') so the app can call them and its event-bound workflows can run. Uses the platform's service import with YOUR connection's credential. Reports each service's exact outcome: imported, already imported, or FAILED with the platform's reason (schema_drift, schemas_failed, error_code, HTTP status) — a failed import is never reported as success, and you must not ship an app whose required service failed to import. After importing, set keys with build_configure_services. MCP-IMPORT-SERVICES-V1.",
      "inputSchema": {
        "properties": {
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "service_ids": {
            "description": "Catalog service ids to import, e.g. ['workflows','email','stripe_checkout'] (exact ids from build_list_capabilities).",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "project_uuid",
          "service_ids"
        ],
        "type": "object"
      },
      "name": "build_import_services"
    },
    {
      "description": "Classify this project's schemas: which are connector-backed vs app-authored, and each one's access mode (sync | live-ro | live-rw | warehouse). Use it so you DON'T render create/edit UI for read-only live sources (live-ro/warehouse) or regenerate/overwrite connector-discovered schemas.",
      "inputSchema": {
        "properties": {
          "project_uuid": {
            "description": "Defaults to the key's project.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "build_list_bound_schemas"
    },
    {
      "description": "List the platform's available services/integrations from the LIVE catalog (email, sms, slack, ai, stripe_checkout, google_oauth, push_notification, …) — so the intake's 'which connections/integrations?' question is accurate and you never guess a service id. Returns each service's exact catalog `service_id` (use it verbatim in config.py `services` — e.g. 'stripe_checkout', NOT 'stripe'), category, whether it needs a key, and YOUR connection's service permissions (can_import / can_configure). Descriptive — what EXISTS, never what to use. Pass service_id for one service's config fields.",
      "inputSchema": {
        "properties": {
          "category": {
            "description": "Optional filter ('integration' or 'service').",
            "type": "string"
          },
          "service_id": {
            "description": "Optional: one service's detail incl. config fields.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "build_list_capabilities"
    },
    {
      "description": "List the external DATA SOURCE types an app can connect to — its own Postgres/MySQL/MSSQL/Oracle/MongoDB, any REST API, or a Snowflake/BigQuery/Redshift/Databricks/ClickHouse/Fabric warehouse — plus the curated public-API catalog. Read this to offer a 'connect your own data' option. Flow: build_connect_data_source → build_discover_source → build_bind_data_source. See build_get_skills(doc='connectors').",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "build_list_data_sources"
    },
    {
      "description": "List projects you can build into (uuid, name, schema_namespace, live_url).",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "Max results (default 50).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "build_list_projects"
    },
    {
      "description": "Fetch recent Cloud Run logs for a project's deployed app — THE tool for diagnosing a failed/stalled cloud deploy or a crashing app (startup-probe timeouts, tracebacks, 'container failed to start on PORT'). Read-only; rate-limited per domain.",
      "inputSchema": {
        "properties": {
          "lines": {
            "description": "Max log lines to return (default 200).",
            "type": "integer"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "since": {
            "description": "How many minutes back to fetch (default 60).",
            "type": "integer"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_logs"
    },
    {
      "description": "PLAN FIRST — turn a one-line app idea into an explicit BUILD CHECKLIST before you author anything, so a thin prompt doesn't silently skip what expert builders add (this is exactly why first-draft apps miss detail pages, tenant pickers, seed data). Deterministic, no LLM: it detects the app's VERTICAL and returns the authentic page structure + terminology for that domain, which entities need a full DETAIL PAGE, the multi-tenant login pattern (picker + tenant=''), seed guidance, and which build_get_examples to copy. Call it right after build_get_skills and BEFORE authoring.",
      "inputSchema": {
        "properties": {
          "description": {
            "description": "The app idea in a sentence or two (e.g. 'portal for Karnataka polytechnic colleges with admin + student portals').",
            "type": "string"
          },
          "entities": {
            "description": "Optional: the main entity/noun names (e.g. ['college','course','student']). Sharpens the per-entity detail-page + seed guidance.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "is_multi_tenant": {
            "description": "Optional: true if each customer/org (college/clinic/branch) is a separate tenant. Inferred from the description if omitted.",
            "type": "boolean"
          },
          "public_facing": {
            "description": "Optional: true if end-users/the public browse it (vs an internal-only tool). Inferred if omitted.",
            "type": "boolean"
          }
        },
        "required": [
          "description"
        ],
        "type": "object"
      },
      "name": "build_plan"
    },
    {
      "description": "Package + upload your authored bundle and record a version under the project. Returns version_uuid + file_id + download_url. Runs build_validate first; force=true overrides soft errors only. Provide files as {relative_path: content}.",
      "inputSchema": {
        "properties": {
          "app_type": {
            "description": "Default 'web'.",
            "enum": [
              "web",
              "all"
            ],
            "type": "string"
          },
          "files": {
            "description": "Map of {relative_path: file_content}.",
            "type": "object"
          },
          "files_b64gz": {
            "description": "Alt to files: base64(gzip(JSON {path:content})). Use if a CDN/WAF blocks raw code in the body.",
            "type": "string"
          },
          "files_ref": {
            "description": "For a LARGE bundle that exceeds the model output-token cap: a file_id from build_stage_bundle (upload the gzip(json {path:content}) blob out-of-band, then pass its file_id here). Preferred over files/files_b64gz when the bundle will not fit inline.",
            "type": "string"
          },
          "force": {
            "description": "Publish despite SOFT validation errors (default false). Validation still runs; a wrong/absent schema namespace, a JavaScript syntax error or schemas the platform refuses always block.",
            "type": "boolean"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          },
          "validate": {
            "description": "Validate before publish (default true).",
            "type": "boolean"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_publish"
    },
    {
      "description": "RECOMMEND which concrete provider integrations this app needs, and WHY — the deterministic Step-2 intelligence the web wizard uses, now over MCP. Pass the app `description` + the platform `service_ids` it will use (e.g. ['cart','order']); returns GROUPED, TIERED suggestions (required/recommended/optional) with the default option flagged — e.g. cart/checkout → a payment gateway (REQUIRED; stripe_checkout default, paypal/razorpay offered), customer-facing apps → transactional email, appointments+reminders → sms. Options are drawn ONLY from the LIVE installed manifests, so it can't suggest a provider you don't have. PRESCRIPTIVE complement to build_list_capabilities (which is descriptive): call this so you don't OMIT a needed integration; use build_list_capabilities for a service's exact id + config fields.",
      "inputSchema": {
        "properties": {
          "description": {
            "description": "The app description / intent (drives email/sms/oauth/ai/payment triggers).",
            "type": "string"
          },
          "project_uuid": {
            "description": "Optional project UUID; its region is used when `region` is not given.",
            "type": "string"
          },
          "region": {
            "description": "Optional project region (ISO alpha-2, e.g. 'IN'). Decides the default payment gateway.",
            "type": "string"
          },
          "service_ids": {
            "description": "Platform service ids the app will use (e.g. ['cart','order','appointment']). Drives most recommendations.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "name": "build_recommend_integrations"
    },
    {
      "description": "DESTRUCTIVE (DOMAIN-admin keys only): completely replace a DEV-mode project's app — wipes its data (retains credentials, API keys, namespace, tenant). Refused if mode='live'. Requires confirm_project_name to match. If you pass files, they are VALIDATED before any wipe (a bad bundle is a no-op) and published after; otherwise wipe-only, then call build_publish.",
      "inputSchema": {
        "properties": {
          "app_type": {
            "description": "Default 'web'.",
            "enum": [
              "web",
              "all"
            ],
            "type": "string"
          },
          "confirm_project_name": {
            "description": "Must equal the project's name — a safety confirmation.",
            "type": "string"
          },
          "files": {
            "description": "Optional new bundle {path: content} to publish after the wipe.",
            "type": "object"
          },
          "files_b64gz": {
            "description": "Alt to files: base64(gzip(JSON {path:content})). Use if a CDN/WAF blocks raw code in the body.",
            "type": "string"
          },
          "files_ref": {
            "description": "For a LARGE bundle that exceeds the model output-token cap: a file_id from build_stage_bundle (upload the gzip(json {path:content}) blob out-of-band, then pass its file_id here). Preferred over files/files_b64gz when the bundle will not fit inline.",
            "type": "string"
          },
          "force": {
            "description": "Wipe and publish despite SOFT validation errors (default false). Never overrides a wrong/absent schema namespace, a JavaScript syntax error or schemas the platform refuses: those are refused before anything is wiped.",
            "type": "boolean"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid",
          "confirm_project_name"
        ],
        "type": "object"
      },
      "name": "build_replace_project"
    },
    {
      "description": "Trigger a SYNC RUN on a data connector and return the run id. MCP-created connectors are trigger:manual, so a mode='sync' binding copies NO rows until a run executes — call this after build_bind_data_source (and again whenever the source data changes). Live-read/warehouse bindings don't need runs (they read the source directly).",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "The connector to run (from build_connect_data_source).",
            "type": "string"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "build_run_data_source"
    },
    {
      "description": "Set a project's build mode. 'dev' (default) allows COMPLETE REPLACE (wipe data, keep credentials); 'live' protects it. Switch to dev before replacing, to live when it's in production.",
      "inputSchema": {
        "properties": {
          "mode": {
            "description": "'dev' permits build_replace_project (which still needs a domain-admin key and confirm_project_name); 'live' makes it refuse, protecting production data.",
            "enum": [
              "dev",
              "live"
            ],
            "type": "string"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid",
          "mode"
        ],
        "type": "object"
      },
      "name": "build_set_project_mode"
    },
    {
      "description": "VERIFY a DEPLOYED app actually works (not just 'running'). HTTP-checks the live URL: root loads with a title, app.js is your bundle (not a stub) and dismisses the boot splash, config.js namespace matches the project; optionally logs in and reads an entity to confirm data + no namespace ambiguity. Pass url= (from build_deploy_status) or poll_url=. THE post-deploy gate — run it after every deploy.",
      "inputSchema": {
        "properties": {
          "email": {
            "description": "Optional — a user to log in and verify data reads.",
            "type": "string"
          },
          "entity": {
            "description": "Optional bare schema slug (e.g. 'participant') to read for the authed data check.",
            "type": "string"
          },
          "expected_app_js_sha1": {
            "description": "Optional — the first 12 lowercase hex chars of `sha1sum ui/app.js` (sha1 of your local bundle FILE). If given, smoke_test reports whether the DEPLOYED app.js matches, so you can confirm the deploy actually rolled (vs a stuck roll / stale cache serving the old bundle). Case-insensitive; a malformed value is reported as a warning, never a false mismatch.",
            "type": "string"
          },
          "password": {
            "description": "Optional — password for that user.",
            "type": "string"
          },
          "poll_url": {
            "description": "Alt to url: the build_deploy poll_url; the URL is resolved from it.",
            "type": "string"
          },
          "project_uuid": {
            "description": "The deployed project (for namespace + live_url).",
            "type": "string"
          },
          "tenant": {
            "description": "Optional tenant for the login. Default '' so the server resolves the user's OWN tenant (required for a multi-tenant app whose test user lives in a named tenant).",
            "type": "string"
          },
          "url": {
            "description": "The deployed app URL (from build_deploy_status).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_smoke_test"
    },
    {
      "description": "PUB-1a: get the out-of-band UPLOAD endpoint for a LARGE app bundle that won't fit inline (the model's max OUTPUT tokens cap `files`/`files_b64gz`, so big apps otherwise have to be truncated/minified). Upload a gzip(json {path:content}) blob to the returned URL with your OWN key, then pass the returned file_id as `files_ref` to build_validate / build_publish / build_doctor. Bundle size then no longer depends on any token cap.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "build_stage_bundle"
    },
    {
      "description": "Tear down a project's live deployment — BOTH the permanent (build_go_live) app and the ephemeral preview — DELETEing the managed Cloud Run services and freeing their URLs. Idempotent: a project with nothing deployed returns stopped=true. ONLY manages Supero-hosted apps — a project deployed to your own AWS/GCP is refused, not silently reported stopped. Check `stopped`: false means the teardown was INCOMPLETE and the app may still be serving (and billing) — re-run it, do not report success. Requires a domain- or project-admin API key.",
      "inputSchema": {
        "properties": {
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_teardown"
    },
    {
      "description": "Update a project's metadata (display_name, description, show_public, live_url).",
      "inputSchema": {
        "properties": {
          "patch": {
            "description": "Fields to update.",
            "type": "object"
          },
          "project_uuid": {
            "description": "Project UUID (from build_list_projects or build_create_project).",
            "type": "string"
          }
        },
        "required": [
          "project_uuid",
          "patch"
        ],
        "type": "object"
      },
      "name": "build_update_project"
    },
    {
      "description": "Validate a locally-authored bundle against the live platform BEFORE publishing. AST-only (your code is never executed). Checks manifest, syntax, import-safety, config exports, schema validity, and namespace==project schema_namespace.",
      "inputSchema": {
        "properties": {
          "files": {
            "description": "Map of {relative_path: file_content} for the bundle.",
            "type": "object"
          },
          "files_b64gz": {
            "description": "Alt to files: base64(gzip(JSON {path:content})). Use if a CDN/WAF blocks raw code in the body.",
            "type": "string"
          },
          "files_ref": {
            "description": "For a LARGE bundle that exceeds the model output-token cap: a file_id from build_stage_bundle (upload the gzip(json {path:content}) blob out-of-band, then pass its file_id here). Preferred over files/files_b64gz when the bundle will not fit inline.",
            "type": "string"
          },
          "project_uuid": {
            "description": "Target project (for namespace/schema checks).",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "build_validate"
    },
    {
      "description": "ACCEPTANCE TEST of your app's running PREVIEW (after build_deploy, before build_go_live). Where build_audit reads the code, build_verify USES the deployed preview like a buyer would, with throwaway test accounts (verify-<rand>@example.com, deleted afterwards): health (serves, app.js = the published version, boots, API reachable); accounts (sign-up, login right after sign-up, login, forgot-password reachable); the role permission matrix (per end-user role x schema: the declared policy holds, server-owned fields such as status/totals/payment state cannot be written by the user, fulfilment records cannot be minted, another user's records cannot be read); commerce (the server prices checkout even when the client price/amount is tampered; a success-URL visit without payment changes nothing; Stripe TEST mode only, otherwise refused); event-bound workflows reach COMPLETED with the verified recipient (no real email is ever sent); capacity is enforced; draft/hidden rows stay out of public reads; launch basics (terms/privacy, meta, viewport, gzip, headers). Returns a score and pass/fail/skip per check with evidence and the exact fix. Only the caller's own project PREVIEW, never the live app or other projects. ~1-3 min, rate-limited; dry_run=true lists the planned checks. Flow: build_audit -> build_publish -> build_deploy -> build_verify -> fix -> build_go_live (which reports the latest build_verify result).",
      "inputSchema": {
        "properties": {
          "budget_s": {
            "description": "Total time budget in seconds (30-180, default 180). Partial results are returned when it runs out.",
            "type": "integer"
          },
          "dry_run": {
            "description": "true: list the planned checks for the published bundle without touching the preview.",
            "type": "boolean"
          },
          "project_uuid": {
            "description": "Your project (its running preview is tested).",
            "type": "string"
          },
          "target": {
            "description": "Always 'preview' (default). The live app is never tested.",
            "enum": [
              "preview"
            ],
            "type": "string"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "build_verify"
    },
    {
      "description": "Resolve your API key's scope: role (domain_admin/project_admin), domain, whether you can create projects, and your plan. Call this to decide the flow.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "build_whoami"
    },
    {
      "description": "Cancel a running connector execution.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          },
          "execution_id": {
            "description": "UUID of the execution to cancel.",
            "type": "string"
          }
        },
        "required": [
          "connector_id",
          "execution_id"
        ],
        "type": "object"
      },
      "name": "connector_cancel"
    },
    {
      "description": "Disable a connector.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_disable"
    },
    {
      "description": "Trigger schema/metadata discovery for a connector.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          },
          "params": {
            "description": "Optional discovery parameters.",
            "type": "object"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_discover"
    },
    {
      "description": "Get discovery results.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          },
          "execution_id": {
            "description": "UUID of the discovery execution.",
            "type": "string"
          }
        },
        "required": [
          "connector_id",
          "execution_id"
        ],
        "type": "object"
      },
      "name": "connector_discover_results"
    },
    {
      "description": "Get discovery execution status.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          },
          "execution_id": {
            "description": "UUID of the discovery execution.",
            "type": "string"
          }
        },
        "required": [
          "connector_id",
          "execution_id"
        ],
        "type": "object"
      },
      "name": "connector_discover_status"
    },
    {
      "description": "Enable a connector for scheduling.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_enable"
    },
    {
      "description": "List available connector plugins.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "connector_plugins"
    },
    {
      "description": "Trigger a manual connector sync execution.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          },
          "params": {
            "description": "Optional execution parameters.",
            "type": "object"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_run"
    },
    {
      "description": "Get connector status and recent executions.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_status"
    },
    {
      "description": "Test an existing connector's connectivity.",
      "inputSchema": {
        "properties": {
          "connector_id": {
            "description": "UUID of the connector.",
            "type": "string"
          }
        },
        "required": [
          "connector_id"
        ],
        "type": "object"
      },
      "name": "connector_test"
    },
    {
      "description": "Test a connector configuration.",
      "inputSchema": {
        "properties": {
          "config": {
            "description": "Connector config to test.",
            "type": "object"
          }
        },
        "required": [
          "config"
        ],
        "type": "object"
      },
      "name": "connector_test_config"
    },
    {
      "description": "Create a new object in the current domain. Use schema_list to see available types and their fields.",
      "inputSchema": {
        "properties": {
          "data": {
            "description": "Object fields as key-value pairs",
            "type": "object"
          },
          "name": {
            "description": "Object name (required for most types)",
            "type": "string"
          },
          "object_type": {
            "description": "The object type to create (e.g. 'customer', 'appointment', 'project')",
            "type": "string"
          },
          "parent_fq_name": {
            "description": "Parent FQ name path (e.g. ['cine-corp', 'car-service'])",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "parent_type": {
            "description": "Parent type if applicable (e.g. 'project' for tenant, 'domain' for project)",
            "type": "string"
          },
          "tenant": {
            "description": "Optional tenant name to create the object under (multi-tenant apps: seed a specific named tenant's data). Omit for single-tenant apps — the session/API-key tenant is used.",
            "type": "string"
          }
        },
        "required": [
          "object_type",
          "name"
        ],
        "type": "object"
      },
      "name": "crud_create"
    },
    {
      "description": "Delete an object from the current domain.",
      "inputSchema": {
        "properties": {
          "object_type": {
            "description": "The object type",
            "type": "string"
          },
          "tenant": {
            "description": "Optional tenant name context for this delete (multi-tenant apps). Omit for single-tenant apps — the session/API-key tenant is used. Deletes address the record by UUID.",
            "type": "string"
          },
          "uuid": {
            "description": "Object UUID to delete",
            "type": "string"
          }
        },
        "required": [
          "object_type",
          "uuid"
        ],
        "type": "object"
      },
      "name": "crud_delete"
    },
    {
      "description": "Get a specific object by UUID from the current domain.",
      "inputSchema": {
        "properties": {
          "object_type": {
            "description": "The object type (e.g. 'customer', 'project', 'tenant')",
            "type": "string"
          },
          "uuid": {
            "description": "Object UUID",
            "type": "string"
          }
        },
        "required": [
          "object_type",
          "uuid"
        ],
        "type": "object"
      },
      "name": "crud_get"
    },
    {
      "description": "Search/list objects of any type in the current domain. Use schema_list first to discover available object types. System types: project, tenant, user_account, api_key, connector, audit_log, schema_registry, client_sdk, connector_execution, connector_plugin. Domain types vary per domain (e.g. customer, invoice, appointment, vehicle).",
      "inputSchema": {
        "properties": {
          "filter": {
            "description": "Optional boolean filter tree for and/or/not logic, e.g. {\"op\": \"or\", \"conditions\": [{\"status\": \"open\"}, {\"amount\": {\"gt\": 500}}]}. Use `filters` for simple AND-ed conditions.",
            "type": "object"
          },
          "filters": {
            "description": "Filter criteria keyed by field. A plain value is equality (e.g. {\"status\": \"active\"}); an object of operators compares (e.g. {\"amount\": {\"gte\": 10, \"lt\": 100}}). Operators: eq, ne, gt, gte, lt, lte, in, not_in, between, contains, starts_with, ends_with, regex, exists.",
            "type": "object"
          },
          "limit": {
            "description": "Max results (default: 100, max 1000)",
            "type": "integer"
          },
          "object_type": {
            "description": "The object type to search (e.g. 'customer', 'project', 'tenant', 'connector')",
            "type": "string"
          },
          "offset": {
            "description": "Skip N results for pagination",
            "type": "integer"
          },
          "sort": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object"
              },
              {
                "items": {
                  "type": "object"
                },
                "type": "array"
              }
            ],
            "description": "Optional sort: a field name ('amount', or '-amount' for descending), {\"field\": \"amount\", \"order\": \"desc\"}, or a list of those."
          },
          "tenant": {
            "description": "Optional tenant name to scope the search to (multi-tenant apps: verify a specific named tenant's data). Omit for single-tenant apps — the session/API-key tenant is used.",
            "type": "string"
          }
        },
        "required": [
          "object_type"
        ],
        "type": "object"
      },
      "name": "crud_search"
    },
    {
      "description": "Update an existing object in the current domain.",
      "inputSchema": {
        "properties": {
          "data": {
            "description": "Fields to update",
            "type": "object"
          },
          "object_type": {
            "description": "The object type",
            "type": "string"
          },
          "tenant": {
            "description": "Optional tenant name context for this update (multi-tenant apps). Omit for single-tenant apps — the session/API-key tenant is used. Updates address the record by UUID.",
            "type": "string"
          },
          "uuid": {
            "description": "Object UUID to update",
            "type": "string"
          }
        },
        "required": [
          "object_type",
          "uuid",
          "data"
        ],
        "type": "object"
      },
      "name": "crud_update"
    },
    {
      "description": "Link schemas to a project. Accepts schema UUIDs or names.",
      "inputSchema": {
        "properties": {
          "project_uuid": {
            "description": "UUID of the project to link schemas to.",
            "type": "string"
          },
          "schema_names": {
            "description": "List of schema names to link (resolved to UUIDs). Use 'namespace:name' when a name exists in several namespaces.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "schema_uuids": {
            "description": "List of schema registry UUIDs to link.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "project_uuid"
        ],
        "type": "object"
      },
      "name": "project_link_schemas"
    },
    {
      "description": "Check if the current user has a specific permission.",
      "inputSchema": {
        "properties": {
          "permission": {
            "description": "Permission to check (e.g. 'schema:manage', 'data:write').",
            "type": "string"
          }
        },
        "required": [
          "permission"
        ],
        "type": "object"
      },
      "name": "rbac_check_permission"
    },
    {
      "description": "Get current user's role, permissions, and scope.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "rbac_get_my_access"
    },
    {
      "description": "Delete a schema from the domain. Use with caution.",
      "inputSchema": {
        "properties": {
          "force_delete": {
            "description": "Force delete even with dependencies (default: false).",
            "type": "boolean"
          },
          "schema_uuid": {
            "description": "UUID of the schema to delete.",
            "type": "string"
          }
        },
        "required": [
          "schema_uuid"
        ],
        "type": "object"
      },
      "name": "schema_delete"
    },
    {
      "description": "Get full details of a specific schema by UUID. Returns the complete schema definition including all attributes and metadata.",
      "inputSchema": {
        "properties": {
          "include_content": {
            "description": "Include full schema content (default: true).",
            "type": "boolean"
          },
          "schema_uuid": {
            "description": "UUID of the schema to retrieve.",
            "type": "string"
          }
        },
        "required": [
          "schema_uuid"
        ],
        "type": "object"
      },
      "name": "schema_get"
    },
    {
      "description": "List all existing schemas in the current domain.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "schema_list"
    },
    {
      "description": "List schemas linked to the current project.",
      "inputSchema": {
        "properties": {
          "include_content": {
            "description": "Include full schema content (default: true).",
            "type": "boolean"
          },
          "project_uuid": {
            "description": "Project to list schemas for. Optional; defaults to the key's project when resolvable (pass the project_uuid from build_whoami/build_list_projects under an API key).",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "schema_list_project"
    },
    {
      "description": "Save/upload schemas into a project. Schemas are validated before saving and linked to the project. Returns the saved schemas with their UUIDs; skipped schemas carry the platform's reason. \n\nIMPORTANT: Pass FLAT schema objects directly — do NOT wrap in schema_content. The tool handles schema_type detection and wrapping automatically. \n\nRequired fields: name, namespace, parent_type, attributes. Set namespace to your app's namespace (e.g. 'shop'); the schema is stored as namespace:name. Mark required attributes with \"mandatory\": true. \n\nSupported attribute types: 'string' for text, 'float' for decimal numbers (NOT 'number'), 'integer' for whole numbers, 'boolean' for true/false. \n\nproject_uuid defaults to your key's project; a project-scoped key can only save into its own project. A schema skipped for compatibility warnings is applied with force_upload=true. \n\nExample:\n{\n  \"schemas\": [{\n    \"name\": \"product\",\n    \"namespace\": \"shop\",\n    \"description\": \"Product catalog entry\",\n    \"parent_type\": \"tenant\",\n    \"attributes\": [\n      {\"name\": \"title\", \"type\": \"string\", \"mandatory\": true},\n      {\"name\": \"price\", \"type\": \"float\"},\n      {\"name\": \"stock\", \"type\": \"integer\"}\n    ]\n  }]\n}",
      "inputSchema": {
        "properties": {
          "force_upload": {
            "description": "Apply changes that only have compatibility WARNINGS (default: false). Breaking changes are still refused.",
            "type": "boolean"
          },
          "project_uuid": {
            "description": "Project to save into (defaults to your key's project; required for a domain-admin key).",
            "type": "string"
          },
          "schemas": {
            "description": "Array of schema definitions to save.",
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "skip_existing": {
            "description": "Skip schemas that already exist (default: true).",
            "type": "boolean"
          }
        },
        "required": [
          "schemas"
        ],
        "type": "object"
      },
      "name": "schema_save"
    },
    {
      "description": "Update an existing schema definition.",
      "inputSchema": {
        "properties": {
          "check_compatibility": {
            "description": "Check compatibility with existing data (default: true).",
            "type": "boolean"
          },
          "new_version": {
            "description": "Optional new version string.",
            "type": "string"
          },
          "schema_content": {
            "description": "New schema content (full schema definition).",
            "type": "object"
          },
          "schema_uuid": {
            "description": "UUID of the schema to update.",
            "type": "string"
          }
        },
        "required": [
          "schema_uuid",
          "schema_content"
        ],
        "type": "object"
      },
      "name": "schema_update"
    },
    {
      "description": "Validate schemas before saving. Checks for conflicts with existing schemas, circular dependencies, reserved names, and parent_type correctness. Always validate before saving!",
      "inputSchema": {
        "properties": {
          "schemas": {
            "description": "Array of schema definitions to validate.",
            "items": {
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "schemas"
        ],
        "type": "object"
      },
      "name": "schema_validate"
    },
    {
      "description": "Get download URL for an SDK.",
      "inputSchema": {
        "properties": {
          "artifact": {
            "description": "Artifact type (default: 'wheel').",
            "enum": [
              "wheel",
              "source",
              "docs"
            ],
            "type": "string"
          },
          "sdk_uuid": {
            "description": "UUID of the SDK.",
            "type": "string"
          }
        },
        "required": [
          "sdk_uuid"
        ],
        "type": "object"
      },
      "name": "sdk_download"
    },
    {
      "description": "Generate client SDKs for the domain's schemas.",
      "inputSchema": {
        "properties": {
          "force_rebuild": {
            "description": "Force rebuild (default: false).",
            "type": "boolean"
          },
          "include_docs": {
            "description": "Include docs (default: true).",
            "type": "boolean"
          },
          "languages": {
            "description": "Languages to generate (default: ['python', 'javascript']).",
            "items": {
              "enum": [
                "python",
                "javascript",
                "java",
                "go",
                "cpp"
              ],
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "name": "sdk_generate"
    },
    {
      "description": "List available SDKs for the current domain.",
      "inputSchema": {
        "properties": {
          "language": {
            "description": "Filter by language.",
            "type": "string"
          },
          "limit": {
            "description": "Max results (default: 50).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "sdk_list"
    },
    {
      "description": "Check SDK generation request status.",
      "inputSchema": {
        "properties": {
          "request_id": {
            "description": "Request ID from sdk_generate.",
            "type": "string"
          }
        },
        "required": [
          "request_id"
        ],
        "type": "object"
      },
      "name": "sdk_status"
    }
  ]
}

What the leaf hashes

{"body":"4fead5e2a80ceca82f8afcf1920daf0f5d202d4cccdda4a966dcbdc3045d88ad","id":291871,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793048382222028,"prev":null,"subject":"d3e230ff-6bb6-457d-887e-9610ad0c64d2","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).

  1. 0x2c05e3dc17edcd31da1f8ef7fe8423a75a0ad82e3680043a95b09a148aea52c6
  2. 0xb1cfc85401a86bdb7ebf0c0e529bdc02b8c0d92f8137235f0939e9310004beda
  3. 0x8567e35864953e00e8d439a435ae982898e775235b40a3dc8d0d915710430f1f
  4. 0x5a2e5fb16c355a4cec4f03211fec289d729b547769a1ac7d75ba9ce7a03bb499
  5. 0x153c558b8357756bbfec1c5e18a29602f95d7a9c518b5f12c7af8cd42d0f4ee1
  6. 0x8eee1ad9427a0efc64fcade88af15d633f4a7d2f2b32e29a170092a7b84ebe92
  7. 0xf7f63bf5f201530004b02b89bbcda2939334260db563b343b9db2c2444ad4b96
  8. 0x19ab4e1084bc6055df776425da4f56dfce1f2ff9eb61a17703208f5c46ae39d9
  9. 0xa4b2de40956fea0a92b1be83fa0c2ec43f94d3ee8c54553e66424ccb342f576e
  10. 0x1cbbfc8b9cf02cd051da363127613742aba31dcc72efb74809b31eb1e8378d51
  11. 0x9c1d7a3e2abd583b1dff8bd25a4baee5982930fe95a180a1a8b26c3f7e8c93f2
  12. 0xe8bf822fd6c66b233e3e13e08596e8fb41c1ed9b85be0e4d50cfc9b740c0e206
  13. 0xb87e8b32cda179c9e632e227bbd8a6d1f6f61d9d81bb92dbd4dd835d2b3b5caa
  14. 0x683955a5b2250ad50568d022a6580d8739b6aff1356779d72a773b088e7c289c
  15. 0x610738e0c43687aded83c613c73de8b5226c73c375858a167436461c522ea213
  16. 0x06d71bfa7d8b41d62c8836efc2c601e1cc3772d9453596b2ae4950887f3310ca
  17. 0x8c756542e482157df0c36464d75c937b845e4423dbbcfad08f0cf8d5a16b9a13
  18. 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON