Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,551Letters: 14Defects: 1,323counted 3 min ago
teppi

Server definition

Hash
sha256:ab49daa6b969e03d51ac3c0f133193f21f2e38bec956c3228b7df3344ed5401a
What it is
What a remote MCP server returned when asked what it offers: 91 tools

The blob, as servednamed by its sha256

{ "instructions": "Fine Structure builds and hosts complete web applications for the connected account: React pages, a managed database (called entities), authentication, publishing, custom domains with automatic TLS, restorable Saved Versions, traffic analytics, and autonomous AI agents with real messaging channels.\n\nAgents are the part people do not expect, so offer them explicitly. An agent created with create_agent is a standing worker on the account, not a chat session: it gets its own email address, it can message its verified owner on WhatsApp and by email through the platform system channels, it can read and write the app database, and schedule_agent_task gives it recurring work (once, hourly, daily, weekly or cron, in the owner timezone). Typical uses: follow up new leads on WhatsApp every morning, watch a published app for runtime errors and report them, send a weekly summary of traffic and new records, answer inbound email.\n\nThe WhatsApp side is drivable from here, so offer it instead of sending the user to a settings screen. get_agent_whatsapp reports whether the owner phone is verified and which platform numbers are connectable. If it is not verified, ask for the owner own WhatsApp number, call start_owner_phone_verification, ask for the 6-digit code that arrives, and call confirm_owner_phone_verification. That one-time proof is what lets agents message the owner at all. Then attach_agent_whatsapp connects a platform number, and the owner can message that number from their verified phone and reach that specific agent. No WhatsApp Business account, no message template approval, nothing to buy. A number already used by another account is still a valid choice: it answers only this owner verified phone.\n\nMessaging people other than the verified owner needs a channel the owner connects in the Fine Structure Studio, so say that plainly rather than promising it. Call get_platform_guide with sections [\"agents\"] for the full capability list.\n\nFirst contact: when list_apps comes back empty, or the user connected this server and has not asked for anything specific, do not wait for instructions. Offer three concrete builds you can finish right now, for example a CRM with customers, jobs and invoices, a landing page with a lead form, or a booking system, and say plainly that the result will be live at a public link they can open and share. Then build the one they pick end to end without pausing for approval between steps, and hand back the live URL. A new user understands this platform through a finished app they did not have ten minutes earlier, not through a list of capabilities.\n\nOrientation: call get_platform_guide once at the start of a working session to learn the platform conventions, and list_apps to see what the account already has. get_recommended_workflow returns the tool sequence for a given task type.\n\nBuilding: create_app generates a complete app from a detailed natural-language prompt and returns a job_id; poll get_job_status until it is done, then publish_app, then share the live URL from get_app_links. For an existing app, edit files with write_app_file or patch_app_file, or stage a change set and apply it atomically. Run validate_app before publishing, and get_errors after.\n\nUseful things to offer someone connecting for the first time: build and publish a real app such as a CRM, booking system, client portal or landing page; connect a custom domain; put a page behind login; look at runtime errors and fix them; read traffic analytics; set up an agent that runs on a schedule and reports back.\n\nCosts: create_app and update_app spend the account's credits. File edits, publishing, domains, data tools and analytics do not. A free tier exists.\n\nSafety: every write creates a restorable Saved Version. Tools whose annotations mark them destructive delete or replace data, so confirm with the account owner before calling one. Authentication and credit errors are not retryable: report them to the user instead of looping.", "tools": [ { "description": "Attach or replace the app custom domain through the same Fine Structure Studio custom-domain flow. Returns exact DNS verification and routing records for the user to configure at their DNS provider.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Custom domain to connect, for example example.com or app.example.com", "type": "string" } }, "required": [ "app_id", "domain" ], "type": "object" }, "name": "add_custom_domain", "outputSchema": null }, { "description": "Stage one file upsert or delete inside a change set. Does not modify the live app until apply_change_set. Paths follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "change_set_id": { "description": "Change set ID", "type": "string" }, "content": { "default": "", "description": "Complete file contents for upsert", "type": "string" }, "file_type": { "default": "", "description": "Optional file type override", "type": "string" }, "operation": { "default": "upsert", "enum": [ "upsert", "delete" ], "type": "string" }, "path": { "description": "Virtual file path", "type": "string" } }, "required": [ "app_id", "change_set_id", "path" ], "type": "object" }, "name": "add_file_change", "outputSchema": null }, { "description": "Agency mode only. Create a client claim link for an existing app owned by the agent. The client must log in with the invited email before ownership transfers.", "inputSchema": { "properties": { "app_id": { "description": "Existing app ID owned by the agent", "type": "string" }, "claim_expires_in_days": { "default": 14, "description": "Claim link lifetime, 1-90 days", "type": "integer" }, "client_email": { "description": "Client email allowed to claim ownership", "type": "string" }, "client_full_name": { "default": "", "description": "Optional client display name", "type": "string" }, "keep_agent_collaborator": { "default": true, "description": "Invite agent as editor after claim", "type": "boolean" }, "note": { "default": "", "description": "Optional internal note", "type": "string" } }, "required": [ "app_id", "client_email" ], "type": "object" }, "name": "agency_create_claim_link", "outputSchema": null }, { "description": "Agency mode only. Create or update a client record for an account-level agent. This does not create a verified Fine Structure user account and does not transfer ownership.", "inputSchema": { "properties": { "client_email": { "description": "Client email that will be allowed to claim projects", "type": "string" }, "client_full_name": { "default": "", "description": "Optional client display name", "type": "string" }, "note": { "default": "", "description": "Optional internal note for the agency", "type": "string" } }, "required": [ "client_email" ], "type": "object" }, "name": "agency_create_client", "outputSchema": null }, { "description": "Agency mode only. Create a new app owned by the agent, start generation, and create a claim link for the client. Ownership transfers only when the invited client logs in with the same email and accepts the claim link.", "inputSchema": { "properties": { "claim_expires_in_days": { "default": 14, "description": "Claim link lifetime, 1-90 days", "type": "integer" }, "client_email": { "description": "Client email allowed to claim ownership", "type": "string" }, "client_full_name": { "default": "", "description": "Optional client display name", "type": "string" }, "description": { "default": "", "description": "Optional short app description", "type": "string" }, "keep_agent_collaborator": { "default": true, "description": "After claim, invite the agent back as an editor collaborator", "type": "boolean" }, "name": { "description": "Name for the app (1-100 chars)", "type": "string" }, "note": { "default": "", "description": "Optional internal client/project note", "type": "string" }, "prompt": { "description": "Detailed description of the app to build", "type": "string" } }, "required": [ "client_email", "name", "prompt" ], "type": "object" }, "name": "agency_create_client_app", "outputSchema": null }, { "description": "Agency mode only. Inspect one handoff status without exposing the raw claim token.", "inputSchema": { "properties": { "handoff_id": { "description": "Handoff ID returned by agency_create_claim_link or agency_create_client_app", "type": "string" } }, "required": [ "handoff_id" ], "type": "object" }, "name": "agency_get_claim_status", "outputSchema": null }, { "description": "Agency mode only. List client records and app handoff status for the authenticated agent.", "inputSchema": { "properties": { "include_handoffs": { "default": true, "description": "Include claim links status without raw tokens", "type": "boolean" } }, "type": "object" }, "name": "agency_list_clients", "outputSchema": null }, { "description": "Apply a staged change set to the app. Creates a Saved Version before applying. Blocks on validation errors unless force=true.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "change_set_id": { "description": "Change set ID", "type": "string" }, "force": { "default": false, "description": "Apply even if validation has errors", "type": "boolean" } }, "required": [ "app_id", "change_set_id" ], "type": "object" }, "name": "apply_change_set", "outputSchema": null }, { "description": "Connect a platform WhatsApp number to one of the account's agents, so the owner can message that number and reach that agent. Requires the owner to be verified first. Take phone_number_id from get_agent_whatsapp. A number already used by another account is still valid to connect: it answers only this owner's verified phone.", "inputSchema": { "properties": { "agent_id": { "description": "The agent that should answer on this number.", "type": "string" }, "phone_number_id": { "description": "phone_number_id from get_agent_whatsapp claimable_numbers.", "type": "string" } }, "required": [ "agent_id", "phone_number_id" ], "type": "object" }, "name": "attach_agent_whatsapp", "outputSchema": null }, { "description": "Check Fine Structure custom-domain verification and SSL status for the configured custom domain, then save the latest status.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Optional configured custom domain. If omitted, uses the app's current custom domain.", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "check_domain_verification", "outputSchema": null }, { "description": "Check whether a platform subdomain can be claimed before calling set_app_subdomain. Returns available plus a status of available, invalid, reserved, taken, current, or empty, with the exact reason. Pass app_id (an app you own) to have that app's own current subdomain reported as 'current' instead of 'taken'.", "inputSchema": { "properties": { "app_id": { "description": "Optional ID of an app you own. When supplied, this app's own subdomain reports as 'current' instead of 'taken'.", "type": "string" }, "subdomain": { "description": "Subdomain label to check", "type": "string" } }, "required": [ "subdomain" ], "type": "object" }, "name": "check_subdomain_available", "outputSchema": null }, { "description": "Compare the current app files to a Saved Version and return compact per-file diffs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "max_diff_chars": { "default": 12000, "type": "integer" }, "snapshot_id": { "description": "Saved Version snapshot ID", "type": "string" } }, "required": [ "app_id", "snapshot_id" ], "type": "object" }, "name": "compare_current_to_version", "outputSchema": null }, { "description": "Compare two Saved Versions and return per-file additions, removals, modifications, and compact diffs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "base_snapshot_id": { "description": "Older/base snapshot ID", "type": "string" }, "max_diff_chars": { "default": 12000, "type": "integer" }, "target_snapshot_id": { "description": "Newer/target snapshot ID", "type": "string" } }, "required": [ "app_id", "base_snapshot_id", "target_snapshot_id" ], "type": "object" }, "name": "compare_saved_versions", "outputSchema": null }, { "description": "Configure custom-domain redirect policy: primary domain, optional www/root redirect, and HTTPS enforcement.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "force_https": { "default": true, "description": "Redirect HTTP custom-domain requests to HTTPS", "type": "boolean" }, "primary_domain": { "description": "Canonical primary domain, for example example.com", "type": "string" }, "redirect_www": { "default": true, "description": "Redirect the www/root counterpart to primary_domain", "type": "boolean" } }, "required": [ "app_id", "primary_domain" ], "type": "object" }, "name": "configure_domain_redirects", "outputSchema": null }, { "description": "Store safe non-secret integration metadata for an app. Use set_secret for API keys/tokens.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "config": { "description": "Safe metadata only, such as workspace/team/name/email", "type": "object" }, "is_active": { "default": true, "description": "Set false to disconnect this integration metadata", "type": "boolean" }, "provider": { "description": "Integration provider ID", "type": "string" } }, "required": [ "app_id", "provider", "config" ], "type": "object" }, "name": "configure_integration", "outputSchema": null }, { "description": "Confirm the 6-digit code the owner received on WhatsApp from start_owner_phone_verification. On success the owner is verified: agents can message them, and platform numbers become connectable.", "inputSchema": { "properties": { "code": { "description": "The 6-digit code from the WhatsApp message.", "type": "string" }, "phone": { "description": "The same phone number the code was sent to.", "type": "string" }, "region": { "description": "Optional ISO region hint, matching the one used when sending.", "type": "string" } }, "required": [ "phone", "code" ], "type": "object" }, "name": "confirm_owner_phone_verification", "outputSchema": null }, { "description": "Create a native Fine Structure A/B test between existing app pages. Use update_app first if a variant page still needs to be generated. Creates a Saved Version before the change.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "goal_event_filter": { "description": "Optional goal filter, for example {'entity_name': 'Lead'}", "type": "object" }, "goal_event_type": { "description": "Optional conversion goal type: entity_create, any, form_submit", "type": "string" }, "is_active": { "default": true, "description": "Whether to activate the test immediately", "type": "boolean" }, "name": { "description": "Experiment name", "type": "string" }, "page_name": { "description": "Base route page that triggers the experiment", "type": "string" }, "variants": { "description": "At least two variants. Traffic must total 100.", "items": { "properties": { "page_name": { "description": "Existing app page name or path", "type": "string" }, "traffic_percent": { "description": "Traffic percentage for this variant", "type": "integer" } }, "required": [ "page_name", "traffic_percent" ], "type": "object" }, "type": "array" } }, "required": [ "app_id", "name", "page_name", "variants" ], "type": "object" }, "name": "create_ab_test", "outputSchema": null }, { "description": "Create an autonomous AI agent on the user's Fine Structure account: a standing worker, not a chat session. It gets the platform's default safe tool policy and its own email address, it can read and write the app database, and once the owner phone is verified (see get_agent_whatsapp) it can message its owner on WhatsApp and by email through the platform system channels. Pair it with schedule_agent_task for recurring work such as following up new leads on WhatsApp each morning, watching an app for runtime errors, or sending a weekly summary. Messaging anyone other than the verified owner requires a channel the owner connects in the Fine Structure Studio.", "inputSchema": { "properties": { "app_id": { "description": "Optional app to attach the agent to; account-level when omitted", "type": "string" }, "description": { "description": "What this agent is responsible for, one or two sentences", "type": "string" }, "name": { "description": "Agent display name (e.g. 'Lead Follow-up'). Auto-derived from role when omitted.", "type": "string" }, "persona": { "description": "Optional working style and tone instructions for the agent", "type": "string" }, "role": { "description": "Short role label (e.g. 'sales assistant')", "type": "string" } }, "required": [ "role", "description" ], "type": "object" }, "name": "create_agent", "outputSchema": null }, { "description": "Create a new application from a natural language prompt. The AI generates a complete web app with pages, components, styling, and data models. Returns a job_id - poll get_job_status to track progress. When the job is done, the app is ready.", "inputSchema": { "properties": { "description": { "default": "", "description": "Optional short description", "type": "string" }, "name": { "description": "Name for the app (1-100 chars)", "type": "string" }, "prompt": { "description": "Detailed description of the app to build", "type": "string" } }, "required": [ "name", "prompt" ], "type": "object" }, "name": "create_app", "outputSchema": null }, { "description": "Create a staged file change set. Add multiple file changes, validate them as one app state, then apply atomically.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "label": { "description": "Optional short label", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "create_change_set", "outputSchema": null }, { "description": "Create/insert records in one app entity. Executes directly for the authenticated app owner and returns the created record ids.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "expected_count": { "description": "Optional safety check; the write aborts if the record count differs", "type": "integer" }, "reason": { "default": "", "description": "Why these records should be created", "type": "string" }, "records": { "description": "Records to create", "items": { "type": "object" }, "type": "array" } }, "required": [ "app_id", "entity", "records" ], "type": "object" }, "name": "create_entity_records", "outputSchema": null }, { "description": "Create an entity schema file in entities/<Entity>.json. Creates a Saved Version before writing.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "indexes": { "default": [], "items": { "type": "object" }, "type": "array" }, "metadata": { "default": {}, "type": "object" }, "overwrite": { "default": false, "type": "boolean" }, "relationships": { "default": [], "items": { "type": "object" }, "type": "array" }, "schema": { "description": "JSON schema object", "type": "object" } }, "required": [ "app_id", "entity", "schema" ], "type": "object" }, "name": "create_entity_schema", "outputSchema": null }, { "description": "Open a request to the Fine Structure platform team: a bug, a feature request or a question about the platform itself (not about the user's app). Use it when something in the platform blocks you instead of working around it. Give a reproduction the team can run (invoke_function / curl / the exact tool call and result), what you expected, and how the team will know it is closed. Credential-looking values are redacted. Returns request_id and a Studio URL; the team's replies, status changes and deployments come back through get_platform_request / list_platform_requests. Limits: 20 per account per day, 32 KB.", "inputSchema": { "properties": { "acceptance": { "description": "How the team will know it is closed", "type": "string" }, "app_id": { "description": "Optional: the app where it showed up", "type": "string" }, "attachments": { "default": [], "description": "Optional app file paths or log ids", "items": { "type": "string" }, "type": "array" }, "body": { "description": "Free text, markdown allowed: context, impact, what you tried", "type": "string" }, "expected": { "description": "What should have happened", "type": "string" }, "reproduction": { "description": "Steps, invoke_function calls or curl commands that reproduce it", "type": "string" }, "severity": { "default": "normal", "enum": [ "blocker", "high", "normal", "low" ], "type": "string" }, "title": { "description": "One line, what is wrong or missing", "type": "string" }, "type": { "enum": [ "bug", "feature", "question" ], "type": "string" } }, "required": [ "type", "title", "body" ], "type": "object" }, "name": "create_platform_request", "outputSchema": null }, { "description": "Delete a native A/B test from an app. Creates a Saved Version before the change.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "test_id": { "description": "A/B test ID", "type": "string" } }, "required": [ "app_id", "test_id" ], "type": "object" }, "name": "delete_ab_test", "outputSchema": null }, { "description": "Delete exact records by ID or exact-match filters. Executes directly for the authenticated app owner; pass expected_count as a safety check to abort on a mismatch.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "expected_count": { "description": "Required match count safety check, when known", "type": "integer" }, "filters": { "description": "One exact-match selector or a list of exact-match selectors", "oneOf": [ { "type": "object" }, { "items": { "type": "object" }, "type": "array" } ] }, "reason": { "default": "", "description": "Why these records should be deleted", "type": "string" }, "record_ids": { "description": "Exact record IDs to delete", "items": { "type": "string" }, "type": "array" } }, "required": [ "app_id", "entity" ], "type": "object" }, "name": "delete_entity_records", "outputSchema": null }, { "description": "Delete one app secret by key.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "key": { "description": "Secret key name", "type": "string" } }, "required": [ "app_id", "key" ], "type": "object" }, "name": "delete_secret", "outputSchema": null }, { "description": "Disconnect the owner's WhatsApp route from a platform number. Removes only this account's route; other accounts sharing the number keep theirs.", "inputSchema": { "properties": { "phone_number_id": { "description": "The number to disconnect, from get_agent_whatsapp.", "type": "string" } }, "required": [ "phone_number_id" ], "type": "object" }, "name": "detach_agent_whatsapp", "outputSchema": null }, { "description": "Discard a pending staged change set without changing app files.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "change_set_id": { "description": "Change set ID", "type": "string" } }, "required": [ "app_id", "change_set_id" ], "type": "object" }, "name": "discard_change_set", "outputSchema": null }, { "description": "Get views, unique visitors, conversions, and conversion rates for an A/B test.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "test_id": { "description": "A/B test ID", "type": "string" } }, "required": [ "app_id", "test_id" ], "type": "object" }, "name": "get_ab_test_stats", "outputSchema": null }, { "description": "Read the WhatsApp state of the connected account: whether the owner's phone is verified, which platform numbers they can connect, and which conversations already route to which agent. Call this first whenever the user asks to talk to an agent on WhatsApp, and repeat its next_step to them.", "inputSchema": { "properties": { "agent_id": { "description": "Optional: report only this agent's WhatsApp state.", "type": "string" } }, "type": "object" }, "name": "get_agent_whatsapp", "outputSchema": null }, { "description": "Traffic analytics for an app's published site over a chosen window: total views, unique visitors, daily series, top pages, top referrer domains and device split.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "days": { "default": 7, "description": "Window in days (1-90, default 7)", "type": "integer" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_analytics", "outputSchema": null }, { "description": "Deep introspection of an app: entities, pages, settings, integrations, environment variables, and file structure. Use this to understand what an app contains before updating it.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_detail", "outputSchema": null }, { "description": "Get the file tree for an app with paths and byte sizes.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_files", "outputSchema": null }, { "description": "Return editor, preview, published path, subdomain, and custom-domain links plus whether each works for anonymous visitors, app users, or Studio users based on publish and auth settings.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_links", "outputSchema": null }, { "description": "Read recent server-side security audit events for an app.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "limit": { "default": 100, "type": "integer" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_security_audit", "outputSchema": null }, { "description": "Return safe security context for one owned app: owner id/email, Studio collaborators, generated-app members, route policies, entity policies, function policies, and recent security audit entries. Does not return secrets and does not grant access to other apps.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "audit_limit": { "default": 50, "type": "integer" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_security_context", "outputSchema": null }, { "description": "Get app overview: files, published state, URL, active jobs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_app_status", "outputSchema": null }, { "description": "Return SSL/certificate status and pending certificate validation DNS records for the app custom domain.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Optional configured custom domain. If omitted, uses the app's current custom domain.", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_domain_ssl_status", "outputSchema": null }, { "description": "Return the exact DNS records and instructions required to verify and route the app custom domain.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Optional configured custom domain. If omitted, uses the app's current custom domain.", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_domain_verification", "outputSchema": null }, { "description": "Get all entity (data model) schemas for an app, with record counts. Each entity has fields, types, and relationships.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_entities", "outputSchema": null }, { "description": "Get recent runtime errors for an app (last 20). Useful for diagnosing issues before updating.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "limit": { "default": 20, "description": "Max errors to return (default 20)", "type": "integer" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_errors", "outputSchema": null }, { "description": "Poll the status of an async generation job. Use this after create_app or update_app to know when the job is done. Returns status ('running' or 'done'), progress events, and result summary when complete.", "inputSchema": { "properties": { "job_id": { "description": "The job_id returned by create_app or update_app", "type": "string" } }, "required": [ "job_id" ], "type": "object" }, "name": "get_job_status", "outputSchema": null }, { "description": "Get all pages in an app with their file paths and sizes.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_pages", "outputSchema": null }, { "description": "Return a machine-readable Fine Structure / FSe2 guide for AI agents. Call this at the start of an MCP session to learn app files, entities, safe edit workflows, validation, publishing, A/B testing, secrets, and platform rules.", "inputSchema": { "properties": { "app_id": { "description": "Optional app ID. If provided, the guide includes a safe app context summary.", "type": "string" }, "sections": { "description": "Optional subset of guide sections to return.", "items": { "enum": [ "ab_testing", "agency", "agents", "app_code", "checklists", "data_model", "direct_file_edit", "domains", "file_model", "functions", "generation", "media", "overview", "platform_requests", "publishing", "saas", "safety", "sdk", "secrets_integrations", "security", "validation" ], "type": "string" }, "type": "array" }, "task_type": { "description": "Optional task hint, for example edit_app, direct_file_edit, seed_data, or publish_app.", "type": "string" } }, "type": "object" }, "name": "get_platform_guide", "outputSchema": null }, { "description": "One platform request with its full history: team replies, status changes (open | triaged | in_progress | needs_info | deployed | wont_fix) and what was deployed (commit, time). Pass since=<ISO timestamp> to get only the events after it.", "inputSchema": { "properties": { "request_id": { "type": "string" }, "since": { "description": "Optional ISO timestamp: only events after it", "type": "string" } }, "required": [ "request_id" ], "type": "object" }, "name": "get_platform_request", "outputSchema": null }, { "description": "Return editor preview and published/public URLs for an app.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "get_preview_url", "outputSchema": null }, { "description": "Return the recommended MCP tool sequence for a task type. Use this before creating apps, editing files, seeding data, publishing, setting up A/B tests, restoring versions, or configuring secrets/integrations.", "inputSchema": { "properties": { "app_id": { "description": "Optional app ID. If provided, the workflow includes a safe app context summary.", "type": "string" }, "goal": { "default": "", "description": "Optional short description of the user's goal.", "type": "string" }, "task_type": { "default": "unknown", "description": "The task type to plan.", "enum": [ "ab_test", "agency_client_app", "backend_function", "create_app", "direct_file_edit", "domain_setup", "edit_app", "fix_runtime_error", "generate_media", "inspect_preview", "publish_app", "saas_setup", "schema_change", "secrets_integration", "security_setup", "seed_data", "unknown", "version_restore" ], "type": "string" } }, "type": "object" }, "name": "get_recommended_workflow", "outputSchema": null }, { "description": "Return server-side preview context: URLs, persisted runtime/network errors, static clickable candidates, pages, and explicit live-browser availability.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "auth_as": { "default": "", "description": "Optional auth simulation: anonymous", "type": "string" }, "auth_as_role": { "default": "", "description": "Optional app role simulation, e.g. staff/admin/customer", "type": "string" }, "route": { "default": "", "description": "Optional route to inspect", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "inspect_preview", "outputSchema": null }, { "description": "Provision a generated-app runtime member with a role. This does not create a Studio collaborator, and the owner role cannot be assigned. password is required: ask the account owner which password the member should get. This tool never generates one, because a generated password would come back in the result and that is a live credential in the conversation transcript.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "email": { "description": "Member email", "type": "string" }, "full_name": { "default": "", "type": "string" }, "password": { "description": "The password this member signs in with, chosen by the account owner. Required, and never echoed back in the result.", "type": "string" }, "role": { "description": "App role, e.g. admin/staff/customer", "type": "string" } }, "required": [ "app_id", "email", "role", "password" ], "type": "object" }, "name": "invite_app_member", "outputSchema": null }, { "description": "Run a backend function of an owned app exactly like the HTTP route and return its status and JSON. caller='owner' runs as the app owner; caller='anonymous' first evaluates the function policy as a public visitor and returns the 401/403 decision without running when access would be denied. Use it to verify a function (secrets, outbound calls, policy) before wiring it into the app.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "caller": { "default": "owner", "enum": [ "owner", "anonymous" ], "type": "string" }, "function": { "description": "Function name, e.g. probe", "type": "string" }, "headers": { "default": {}, "description": "Optional extra request headers to simulate, e.g. a webhook secret header", "type": "object" }, "params": { "default": {}, "description": "JSON body passed to the function", "type": "object" } }, "required": [ "app_id", "function" ], "type": "object" }, "name": "invoke_function", "outputSchema": null }, { "description": "List the platform A/B tests configured for an app.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_ab_tests", "outputSchema": null }, { "description": "List scheduled tasks for one agent (or the whole account), including schedule, status and next_run_at.", "inputSchema": { "properties": { "agent_id": { "description": "Optional agent id filter", "type": "string" }, "limit": { "default": 50, "description": "Max tasks to return (1-100)", "type": "integer" }, "status": { "description": "Optional status filter: draft, active, paused, archived", "type": "string" } }, "type": "object" }, "name": "list_agent_tasks", "outputSchema": null }, { "description": "List the AI agents on the user's account with id, name, role, status and FineMail address.", "inputSchema": { "properties": { "app_id": { "description": "Optional filter by attached app", "type": "string" } }, "type": "object" }, "name": "list_agents", "outputSchema": null }, { "description": "List an app's platform path, subdomain, and configured custom domain with verification, SSL, primary-domain, redirect, publish, and login-gating status.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_app_domains", "outputSchema": null }, { "description": "List generated-app runtime users/members for an app. This is separate from Studio project collaborators.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_app_members", "outputSchema": null }, { "description": "List applications owned by the authenticated user, newest activity first. Returns up to `limit` apps per call plus the total count; page with `offset` when the account has more.", "inputSchema": { "properties": { "limit": { "default": 50, "description": "Max apps to return (1-200)", "type": "integer" }, "offset": { "default": 0, "description": "Apps to skip, for paging", "type": "integer" } }, "type": "object" }, "name": "list_apps", "outputSchema": null }, { "description": "List supported integrations and safe connected integration metadata for an app. Tokens/secrets are never returned.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_integrations", "outputSchema": null }, { "description": "Your account's platform requests, newest activity first. Call it at the start of a session with since=<the updated_date you last saw> to learn what changed: replies, needs_info questions to answer, deployments with their commit. Filters: app_id, status.", "inputSchema": { "properties": { "app_id": { "description": "Optional app filter", "type": "string" }, "limit": { "default": 100, "type": "integer" }, "scope": { "default": "mine", "description": "'all' = every account (platform team only)", "enum": [ "mine", "all" ], "type": "string" }, "since": { "description": "Optional ISO timestamp: only requests touched after it, each with changes_since", "type": "string" }, "status": { "enum": [ "open", "triaged", "in_progress", "needs_info", "deployed", "wont_fix" ], "type": "string" } }, "type": "object" }, "name": "list_platform_requests", "outputSchema": null }, { "description": "List restorable Saved Versions for an app, including versions created by MCP writes.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_saved_versions", "outputSchema": null }, { "description": "List secret key names for an app. Secret values are never returned.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "list_secret_keys", "outputSchema": null }, { "description": "Patch one file by replacing exact text. Safer than full overwrite for targeted edits. Creates a Saved Version before changing content. Paths follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "new_text": { "description": "Replacement text", "type": "string" }, "old_text": { "description": "Exact existing text to replace", "type": "string" }, "path": { "description": "Virtual file path", "type": "string" }, "replace_all": { "default": false, "description": "Replace all matches instead of the first match", "type": "boolean" } }, "required": [ "app_id", "path", "old_text", "new_text" ], "type": "object" }, "name": "patch_app_file", "outputSchema": null }, { "description": "Publish an app - freeze current state and make it live at a URL. Also configures whether the public URL is open, app-login gated, private, or inferred from the app.", "inputSchema": { "properties": { "access_mode": { "default": "infer", "description": "Live access policy. public_open = anyone can view. public_auth = public URL opens but app login is required. private = published snapshot remains owner/collaborator-only. keep = preserve current visibility/auth settings. infer = choose from existing settings and obvious app structure.", "enum": [ "infer", "public_open", "public_auth", "private", "keep" ], "type": "string" }, "app_id": { "description": "The app ID to publish", "type": "string" }, "auth_required": { "description": "Optional explicit override for generated-app login requirement. Prefer access_mode when possible.", "type": "boolean" }, "make_public": { "description": "Optional explicit override for whether published URLs are publicly reachable. Prefer access_mode when possible.", "type": "boolean" } }, "required": [ "app_id" ], "type": "object" }, "name": "publish_app", "outputSchema": null }, { "description": "Query app data records for one entity with optional exact-match filters.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name, for example Patient", "type": "string" }, "filters": { "default": {}, "description": "Exact-match field filters", "type": "object" }, "limit": { "default": 100, "description": "Max records to return", "type": "integer" }, "offset": { "default": 0, "description": "Pagination offset", "type": "integer" }, "sort": { "default": "-created_date", "description": "Sort field, prefix with - for descending", "type": "string" } }, "required": [ "app_id", "entity" ], "type": "object" }, "name": "query_entity", "outputSchema": null }, { "description": "Read one source file from an app's virtual filesystem. Paths follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "max_chars": { "default": 200000, "description": "Maximum content characters to return", "type": "integer" }, "path": { "description": "Virtual file path, for example pages/Home.jsx", "type": "string" } }, "required": [ "app_id", "path" ], "type": "object" }, "name": "read_app_file", "outputSchema": null }, { "description": "Read several source files from an app's virtual filesystem. Paths follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "max_chars_per_file": { "default": 100000, "description": "Maximum characters per file", "type": "integer" }, "paths": { "description": "Virtual file paths to read", "items": { "type": "string" }, "type": "array" } }, "required": [ "app_id", "paths" ], "type": "object" }, "name": "read_app_files", "outputSchema": null }, { "description": "Remove a generated-app runtime member.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "user_id": { "description": "Generated app user id", "type": "string" } }, "required": [ "app_id", "user_id" ], "type": "object" }, "name": "remove_app_member", "outputSchema": null }, { "description": "Remove the configured custom domain from the app and clean up the platform-side hostname registration when possible.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Optional configured custom domain. If omitted, removes the current custom domain.", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "remove_custom_domain", "outputSchema": null }, { "description": "Rename or move one app source file atomically. Internally stages an upsert at new_path and a delete at old_path, validates the resulting app state, and creates a Saved Version before applying.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "force": { "default": false, "description": "Apply even if validation reports blocking errors", "type": "boolean" }, "new_path": { "description": "New virtual file path", "type": "string" }, "old_path": { "description": "Existing virtual file path to rename", "type": "string" }, "overwrite": { "default": false, "description": "Allow replacing an existing file at new_path", "type": "boolean" } }, "required": [ "app_id", "old_path", "new_path" ], "type": "object" }, "name": "rename_app_file", "outputSchema": null }, { "description": "Add a reply or a finding to one of your platform requests without opening a new one, e.g. to answer a needs_info question (that reopens it).", "inputSchema": { "properties": { "as_team": { "default": false, "description": "Platform team only: reply as the team (mails the requester)", "type": "boolean" }, "body": { "description": "The answer or finding (markdown allowed, credentials are redacted)", "type": "string" }, "request_id": { "type": "string" } }, "required": [ "request_id", "body" ], "type": "object" }, "name": "reply_platform_request", "outputSchema": null }, { "description": "Restore one file from a Saved Version instead of restoring the entire app. Creates a Saved Version before changing the file. Paths follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "confirm": { "default": false, "type": "boolean" }, "path": { "description": "Virtual file path to restore", "type": "string" }, "snapshot_id": { "description": "Saved Version snapshot ID", "type": "string" } }, "required": [ "app_id", "snapshot_id", "path", "confirm" ], "type": "object" }, "name": "restore_file_from_version", "outputSchema": null }, { "description": "Create a scheduled task for one of the user's agents. Supported schedule types: once (run_at ISO local time + timezone), interval (interval_minutes 5-1440), hourly, daily (time HH:MM + timezone), weekly (time + timezone + days_of_week 0=Sunday..6), cron (5-field expression + timezone), manual (only runs on demand). Returns the normalized schedule and the computed next_run_at so you can read the fire time back to the user in their timezone.", "inputSchema": { "properties": { "activate": { "default": true, "description": "Start the schedule immediately (true) or save as draft (false)", "type": "boolean" }, "agent_id": { "description": "The agent id (from create_agent or list_agents)", "type": "string" }, "instructions": { "description": "What the agent should do on each run, written as instructions to the agent", "type": "string" }, "max_runs": { "default": 0, "description": "Optional cap on total runs (0 = unlimited)", "type": "integer" }, "schedule": { "description": "Schedule object, e.g. {\"type\":\"daily\",\"time\":\"08:30\",\"timezone\":\"Asia/Jerusalem\"} or {\"type\":\"weekly\",\"time\":\"09:00\",\"timezone\":\"Asia/Jerusalem\",\"days_of_week\":[0]} or {\"type\":\"once\",\"run_at\":\"2026-08-20T09:00\",\"timezone\":\"Asia/Jerusalem\"}", "type": "object" }, "title": { "description": "Short task title", "type": "string" } }, "required": [ "agent_id", "title", "instructions", "schedule" ], "type": "object" }, "name": "schedule_agent_task", "outputSchema": null }, { "description": "Compatibility tool for starter-record creation. Inserts directly for the authenticated app owner; by default it only seeds an empty entity (skip_if_not_empty).", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "mode": { "default": "skip_if_not_empty", "description": "append always inserts; skip_if_not_empty inserts only when the entity is empty", "enum": [ "append", "skip_if_not_empty" ], "type": "string" }, "reason": { "default": "", "description": "Why these records should be created", "type": "string" }, "records": { "description": "Records to insert", "items": { "type": "object" }, "type": "array" } }, "required": [ "app_id", "entity", "records" ], "type": "object" }, "name": "seed_entity", "outputSchema": null }, { "description": "Set or clear the app platform subdomain - the '<subdomain>.<base domain>' host Fine Structure already serves the app on. Runs the same ownership, format, reserved-name and uniqueness checks as the Studio subdomain field because it calls the same model function. Replacing a subdomain takes effect immediately and creates NO redirect: the previous name stops resolving to this app and is released for anyone to claim. Pass an empty subdomain to clear it. For a domain the user owns, use add_custom_domain instead.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "subdomain": { "description": "Subdomain label: 3-32 characters, lowercase letters, digits and hyphens, no leading or trailing hyphen, not a reserved platform name. Empty string clears the subdomain.", "type": "string" } }, "required": [ "app_id", "subdomain" ], "type": "object" }, "name": "set_app_subdomain", "outputSchema": null }, { "description": "Replace server-side entity access policy. Optional action rules override read/write roles and can allow public create without public read, update, or delete. Omitting rules replaces any existing action rules with read/write role behavior.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name, e.g. Booking", "type": "string" }, "read": { "description": "Roles allowed to read when rules are omitted", "items": { "type": "string" }, "type": "array" }, "rules": { "additionalProperties": false, "description": "Nonempty unconditional action/role rules. No matching rule denies access. Include owner/admin actions explicitly. Record conditions are not supported by this MCP input.", "properties": { "rules": { "items": { "additionalProperties": false, "properties": { "actions": { "items": { "enum": [ "create", "read", "update", "delete", "write" ], "type": "string" }, "minItems": 1, "type": "array" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "subject": { "additionalProperties": false, "properties": { "roles": { "items": { "type": "string" }, "minItems": 1, "type": "array" } }, "required": [ "roles" ], "type": "object" } }, "required": [ "actions", "subject" ], "type": "object" }, "minItems": 1, "type": "array" }, "version": { "enum": [ 1 ], "type": "integer" } }, "required": [ "rules" ], "type": "object" }, "write": { "description": "Roles allowed to write when rules are omitted", "items": { "type": "string" }, "type": "array" } }, "required": [ "app_id", "entity", "read", "write" ], "type": "object" }, "name": "set_entity_policy", "outputSchema": null }, { "description": "Create or update the server-owned access policy of a backend function (functions/<name>.js). Without a policy a function answers only to the app owner's Studio token (401 for app visitors and webhooks). Recipes: anonymous checkout step or inbound webhook/IPN -> require_auth=false; signed-in members -> require_auth=true + allowed_roles (e.g. ['authenticated'] or ['admin','staff']); webhook with a shared secret -> require_secret=true + secret_name (an app secret) that the caller sends in secret_header. allowed_hosts fences the function's outbound network to those hosts plus the platform backend; omit it for open egress.", "inputSchema": { "properties": { "allowed_hosts": { "description": "Outbound egress allow-list of host[:port] entries, e.g. ['api.takbull.co.il']. Omit to keep the stored list; pass [] to open egress again", "items": { "type": "string" }, "type": "array" }, "allowed_roles": { "default": [], "description": "App roles allowed when require_auth is true; 'authenticated' = any signed-in app member", "items": { "type": "string" }, "type": "array" }, "app_id": { "description": "The app ID", "type": "string" }, "function": { "description": "Function name, e.g. takbull_create (file functions/takbull_create.js)", "type": "string" }, "require_auth": { "default": true, "description": "false = anonymous visitors and external callers may invoke", "type": "boolean" }, "require_secret": { "default": false, "description": "Caller must send a shared secret header (webhooks)", "type": "boolean" }, "sdk_identity": { "description": "Whose identity the SDK inside the function uses. 'caller' (default): the function reads data as whoever called it, so an anonymous call sees only what anonymous may read. 'app': the SDK acts as the app owner on THIS app's entities (a checkout or payment IPN that must load/update orders whose read policy is owner/admin/staff); the caller still counts as anonymous for rate limits, audit and X-FSe2-Caller-Type. Owner-only. Omit to keep the stored value", "enum": [ "caller", "app" ], "type": "string" }, "secret_header": { "default": "x-fse2-secret", "description": "Header the caller sends the shared secret in", "type": "string" }, "secret_name": { "default": "", "description": "Name of the app secret holding the shared value (set_secret)", "type": "string" } }, "required": [ "app_id", "function", "require_auth" ], "type": "object" }, "name": "set_function_policy", "outputSchema": null }, { "description": "Set which app host should be treated as primary for generated links and custom-domain redirects.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "domain": { "description": "Primary host, for example example.com, www.example.com, or the app subdomain host.", "type": "string" } }, "required": [ "app_id", "domain" ], "type": "object" }, "name": "set_primary_domain", "outputSchema": null }, { "description": "Create or update a server-owned route policy for a generated app route.", "inputSchema": { "properties": { "allowed_roles": { "description": "Allowed app roles", "items": { "type": "string" }, "type": "array" }, "app_id": { "description": "The app ID", "type": "string" }, "redirect_to": { "default": "/Login", "type": "string" }, "require_auth": { "default": true, "type": "boolean" }, "route": { "description": "Route or wildcard route, e.g. /admin/*", "type": "string" } }, "required": [ "app_id", "route", "require_auth", "allowed_roles" ], "type": "object" }, "name": "set_route_policy", "outputSchema": null }, { "description": "Create or update one encrypted app secret. The secret value is never returned.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "key": { "description": "Secret key name", "type": "string" }, "value": { "description": "Secret value to encrypt and store", "type": "string" } }, "required": [ "app_id", "key", "value" ], "type": "object" }, "name": "set_secret", "outputSchema": null }, { "description": "Send a 6-digit code over WhatsApp to the ACCOUNT OWNER's own phone. This is the one-time ownership proof required before a platform number can be connected, and it also unlocks agents messaging the owner. Ask the user for their own WhatsApp number first and send only to that. No WhatsApp Business account is involved.", "inputSchema": { "properties": { "phone": { "description": "The owner's own WhatsApp number, ideally in E.164 form such as +972501234567.", "type": "string" }, "region": { "description": "Optional ISO region hint (for example IL, US) used when the number has no country code.", "type": "string" } }, "required": [ "phone" ], "type": "object" }, "name": "start_owner_phone_verification", "outputSchema": null }, { "description": "Update a native A/B test, including active state, variants, traffic, and conversion goal. Creates a Saved Version before the change.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "goal_event_filter": { "description": "Optional conversion goal filter", "type": "object" }, "goal_event_type": { "description": "Optional conversion goal type", "type": "string" }, "is_active": { "description": "Optional active state", "type": "boolean" }, "name": { "description": "Optional new name", "type": "string" }, "page_name": { "description": "Optional new base route page", "type": "string" }, "test_id": { "description": "A/B test ID", "type": "string" }, "variants": { "description": "Optional replacement variants. Traffic must total 100.", "items": { "type": "object" }, "type": "array" } }, "required": [ "app_id", "test_id" ], "type": "object" }, "name": "update_ab_test", "outputSchema": null }, { "description": "Update an existing application with a new prompt. The AI modifies the app based on your instructions. Creates a Saved Version before the update. Returns a job_id - poll get_job_status to track progress.", "inputSchema": { "properties": { "app_id": { "description": "The app ID to update", "type": "string" }, "prompt": { "description": "What to change in the app", "type": "string" } }, "required": [ "app_id", "prompt" ], "type": "object" }, "name": "update_app", "outputSchema": null }, { "description": "Update a generated-app runtime member role. This cannot assign owner and cannot change the Fine Structure account owner.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "role": { "description": "New role", "type": "string" }, "user_id": { "description": "Generated app user id", "type": "string" } }, "required": [ "app_id", "user_id", "role" ], "type": "object" }, "name": "update_app_member_role", "outputSchema": null }, { "description": "Set relationship/index metadata on an entity schema. This stores metadata in the schema file; DB index creation is automatic where supported by the platform.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "indexes": { "default": [], "items": { "type": "object" }, "type": "array" }, "metadata": { "default": {}, "type": "object" }, "relationships": { "default": [], "items": { "type": "object" }, "type": "array" } }, "required": [ "app_id", "entity" ], "type": "object" }, "name": "update_entity_metadata", "outputSchema": null }, { "description": "Compatibility tool that updates one record by ID. Executes directly for the authenticated app owner.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "data": { "description": "Fields to merge into the record", "type": "object" }, "entity": { "description": "Entity name", "type": "string" }, "reason": { "default": "", "description": "Why this record should be updated", "type": "string" }, "record_id": { "description": "Record ID", "type": "string" } }, "required": [ "app_id", "entity", "record_id", "data" ], "type": "object" }, "name": "update_entity_record", "outputSchema": null }, { "description": "Update exact records. Select explicit record_ids or exact-match filters and provide shared changes, or provide per-record updates. Executes directly for the authenticated app owner; expected_count aborts the write on a mismatch.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "changes": { "description": "Shared fields to merge into every selected record", "type": "object" }, "entity": { "description": "Entity name", "type": "string" }, "expected_count": { "description": "Required match count safety check, when known", "type": "integer" }, "filters": { "description": "One exact-match selector or a list of exact-match selectors", "oneOf": [ { "type": "object" }, { "items": { "type": "object" }, "type": "array" } ] }, "reason": { "default": "", "description": "Why these records should be updated", "type": "string" }, "record_ids": { "description": "Exact record IDs to update", "items": { "type": "string" }, "type": "array" }, "updates": { "description": "Per-record changes; use instead of shared changes", "items": { "properties": { "changes": { "type": "object" }, "record_id": { "type": "string" } }, "required": [ "record_id", "changes" ], "type": "object" }, "type": "array" } }, "required": [ "app_id", "entity" ], "type": "object" }, "name": "update_entity_records", "outputSchema": null }, { "description": "Replace or shallow-merge an existing entity schema file. Creates a Saved Version before writing.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "entity": { "description": "Entity name", "type": "string" }, "indexes": { "default": [], "items": { "type": "object" }, "type": "array" }, "merge": { "default": true, "type": "boolean" }, "metadata": { "default": {}, "type": "object" }, "relationships": { "default": [], "items": { "type": "object" }, "type": "array" }, "schema": { "description": "Schema fields to set or merge", "type": "object" } }, "required": [ "app_id", "entity", "schema" ], "type": "object" }, "name": "update_entity_schema", "outputSchema": null }, { "description": "Platform team only: set the status of a request (open | triaged | in_progress | needs_info | deployed | wont_fix), attach the deployed commit and/or reply. deployed and needs_info mail the requester.", "inputSchema": { "properties": { "deployed_commit": { "description": "Commit hash or tag that shipped it", "type": "string" }, "reply": { "type": "string" }, "request_id": { "type": "string" }, "status": { "enum": [ "open", "triaged", "in_progress", "needs_info", "deployed", "wont_fix" ], "type": "string" } }, "required": [ "request_id" ], "type": "object" }, "name": "update_platform_request", "outputSchema": null }, { "description": "Run deterministic app checks: syntax, imports, routes/pages, entity schemas, missing entities, and recorded runtime errors.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "include_runtime_errors": { "default": true, "type": "boolean" } }, "required": [ "app_id" ], "type": "object" }, "name": "validate_app", "outputSchema": null }, { "description": "Validate current app files plus staged change set files before applying.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "change_set_id": { "description": "Change set ID", "type": "string" }, "include_runtime_errors": { "default": true, "type": "boolean" } }, "required": [ "app_id", "change_set_id" ], "type": "object" }, "name": "validate_change_set", "outputSchema": null }, { "description": "Validate entity relationship metadata and *_id references against existing entity schemas.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" } }, "required": [ "app_id" ], "type": "object" }, "name": "validate_entity_relationships", "outputSchema": null }, { "description": "Create or replace one file in an app's virtual filesystem. Creates a Saved Version before changing content. Paths and file model follow the Fine Structure app file API, documented at https://finestructure.ai/api/mcp/docs.", "inputSchema": { "properties": { "app_id": { "description": "The app ID", "type": "string" }, "content": { "description": "Complete file contents", "type": "string" }, "file_type": { "description": "Optional file type override", "type": "string" }, "path": { "description": "Virtual file path", "type": "string" } }, "required": [ "app_id", "path", "content" ], "type": "object" }, "name": "write_app_file", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:ab49daa6b969e03d51ac3c0f133193f21f2e38bec956c3228b7df3344ed5401a | sha256sum