Fine Structure

Build and host full-stack apps from a prompt, with agents that reach you on WhatsApp and email.

사용해야 할까요

품질 및 안전성

B
설명 품질
100%
스키마 완전성
98%
이름 품질
96%
오염 위험
0%
권한 일치
90%
프로토콜 준수
100%

발견 사항 (9)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainread_app_file에서
  • MEDIUMTool description contains URL to non-standard domainread_app_files에서
  • MEDIUMTool description contains URL to non-standard domainwrite_app_file에서
  • MEDIUMTool description contains URL to non-standard domainpatch_app_file에서
  • MEDIUMTool description contains URL to non-standard domainadd_file_change에서
  • MEDIUMTool description contains URL to non-standard domainrestore_file_from_version에서
  • LOWTool 'confirm_owner_phone_verification' name length outside 3-30 rangeconfirm_owner_phone_verification에서
  • LOWTool 'get_preview_url' suggests web access but openWorldHint=falseget_preview_url에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~12,576토큰 (도구 정의)
~964 B일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 9.83%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "fine-structure": {
      "url": "https://finestructure.ai/api/mcp"
    }
  }
}

원격 엔드포인트

https://finestructure.ai/api/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (84)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟡create_app(name, prompt, 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.

입력 스키마

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name for the app (1-100 chars)"
    },
    "prompt": {
      "type": "string",
      "description": "Detailed description of the app to build"
    },
    "description": {
      "type": "string",
      "description": "Optional short description",
      "default": ""
    }
  },
  "required": [
    "name",
    "prompt"
  ]
}
🟡agency_create_client(client_email, client_full_name, note)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "client_email": {
      "type": "string",
      "description": "Client email that will be allowed to claim projects"
    },
    "client_full_name": {
      "type": "string",
      "description": "Optional client display name",
      "default": ""
    },
    "note": {
      "type": "string",
      "description": "Optional internal note for the agency",
      "default": ""
    }
  },
  "required": [
    "client_email"
  ]
}
🟢agency_list_clients(include_handoffs)

Agency mode only. List client records and app handoff status for the authenticated agent.

입력 스키마

{
  "type": "object",
  "properties": {
    "include_handoffs": {
      "type": "boolean",
      "description": "Include claim links status without raw tokens",
      "default": true
    }
  }
}
🟡agency_create_client_app(client_email, client_full_name, name, prompt, 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.

입력 스키마

{
  "type": "object",
  "properties": {
    "client_email": {
      "type": "string",
      "description": "Client email allowed to claim ownership"
    },
    "client_full_name": {
      "type": "string",
      "description": "Optional client display name",
      "default": ""
    },
    "name": {
      "type": "string",
      "description": "Name for the app (1-100 chars)"
    },
    "prompt": {
      "type": "string",
      "description": "Detailed description of the app to build"
    },
    "description": {
      "type": "string",
      "description": "Optional short app description",
      "default": ""
    },
    "note": {
      "type": "string",
      "description": "Optional internal client/project note",
      "default": ""
    },
    "keep_agent_collaborator": {
      "type": "boolean",
      "description": "After claim, invite the agent back as an editor collaborator",
      "default": true
    },
    "claim_expires_in_days": {
      "type": "integer",
      "description": "Claim link lifetime, 1-90 days",
      "default": 14
    }
  },
  "required": [
    "client_email",
    "name",
    "prompt"
  ]
}
🟡agency_create_claim_link(app_id, client_email, client_full_name, note, keep_agent_collaborator, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "Existing app ID owned by the agent"
    },
    "client_email": {
      "type": "string",
      "description": "Client email allowed to claim ownership"
    },
    "client_full_name": {
      "type": "string",
      "description": "Optional client display name",
      "default": ""
    },
    "note": {
      "type": "string",
      "description": "Optional internal note",
      "default": ""
    },
    "keep_agent_collaborator": {
      "type": "boolean",
      "description": "Invite agent as editor after claim",
      "default": true
    },
    "claim_expires_in_days": {
      "type": "integer",
      "description": "Claim link lifetime, 1-90 days",
      "default": 14
    }
  },
  "required": [
    "app_id",
    "client_email"
  ]
}
🟢agency_get_claim_status(handoff_id)

Agency mode only. Inspect one handoff status without exposing the raw claim token.

입력 스키마

{
  "type": "object",
  "properties": {
    "handoff_id": {
      "type": "string",
      "description": "Handoff ID returned by agency_create_claim_link or agency_create_client_app"
    }
  },
  "required": [
    "handoff_id"
  ]
}
🟡update_app(app_id, prompt)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID to update"
    },
    "prompt": {
      "type": "string",
      "description": "What to change in the app"
    }
  },
  "required": [
    "app_id",
    "prompt"
  ]
}
🟡publish_app(app_id, access_mode, auth_required, make_public)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID to publish"
    },
    "access_mode": {
      "type": "string",
      "enum": [
        "infer",
        "public_open",
        "public_auth",
        "private",
        "keep"
      ],
      "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."
    },
    "auth_required": {
      "type": "boolean",
      "description": "Optional explicit override for generated-app login requirement. Prefer access_mode when possible."
    },
    "make_public": {
      "type": "boolean",
      "description": "Optional explicit override for whether published URLs are publicly reachable. Prefer access_mode when possible."
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_platform_guide(app_id, sections, task_type)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "Optional app ID. If provided, the guide includes a safe app context summary."
    },
    "sections": {
      "type": "array",
      "description": "Optional subset of guide sections to return.",
      "items": {
        "type": "string",
        "enum": [
          "ab_testing",
          "agency",
          "agents",
          "app_code",
          "checklists",
          "data_model",
          "direct_file_edit",
          "domains",
          "file_model",
          "generation",
          "media",
          "overview",
          "publishing",
          "saas",
          "safety",
          "sdk",
          "secrets_integrations",
          "security",
          "validation"
        ]
      }
    },
    "task_type": {
      "type": "string",
      "description": "Optional task hint, for example edit_app, direct_file_edit, seed_data, or publish_app."
    }
  }
}
🟢get_recommended_workflow(task_type, goal, app_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "task_type": {
      "type": "string",
      "description": "The task type to plan.",
      "enum": [
        "ab_test",
        "agency_client_app",
        "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"
      ],
      "default": "unknown"
    },
    "goal": {
      "type": "string",
      "description": "Optional short description of the user's goal.",
      "default": ""
    },
    "app_id": {
      "type": "string",
      "description": "Optional app ID. If provided, the workflow includes a safe app context summary."
    }
  }
}
🟢get_job_status(job_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The job_id returned by create_app or update_app"
    }
  },
  "required": [
    "job_id"
  ]
}
🟢get_app_status(app_id)

Get app overview: files, published state, URL, active jobs.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_app_links(app_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢list_app_domains(app_id)

List an app's platform path, subdomain, and configured custom domain with verification, SSL, primary-domain, redirect, publish, and login-gating status.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🔴set_app_subdomain(app_id, subdomain)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "subdomain": {
      "type": "string",
      "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."
    }
  },
  "required": [
    "app_id",
    "subdomain"
  ]
}
🟢check_subdomain_available(subdomain, app_id)

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

입력 스키마

{
  "type": "object",
  "properties": {
    "subdomain": {
      "type": "string",
      "description": "Subdomain label to check"
    },
    "app_id": {
      "type": "string",
      "description": "Optional ID of an app you own. When supplied, this app's own subdomain reports as 'current' instead of 'taken'."
    }
  },
  "required": [
    "subdomain"
  ]
}
🔴add_custom_domain(app_id, domain)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Custom domain to connect, for example example.com or app.example.com"
    }
  },
  "required": [
    "app_id",
    "domain"
  ]
}
🟢get_domain_verification(app_id, domain)

Return the exact DNS records and instructions required to verify and route the app custom domain.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Optional configured custom domain. If omitted, uses the app's current custom domain."
    }
  },
  "required": [
    "app_id"
  ]
}
🟡check_domain_verification(app_id, domain)

Check Fine Structure custom-domain verification and SSL status for the configured custom domain, then save the latest status.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Optional configured custom domain. If omitted, uses the app's current custom domain."
    }
  },
  "required": [
    "app_id"
  ]
}
🟡set_primary_domain(app_id, domain)

Set which app host should be treated as primary for generated links and custom-domain redirects.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Primary host, for example example.com, www.example.com, or the app subdomain host."
    }
  },
  "required": [
    "app_id",
    "domain"
  ]
}
🔴remove_custom_domain(app_id, domain)

Remove the configured custom domain from the app and clean up the platform-side hostname registration when possible.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Optional configured custom domain. If omitted, removes the current custom domain."
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_domain_ssl_status(app_id, domain)

Return SSL/certificate status and pending certificate validation DNS records for the app custom domain.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "domain": {
      "type": "string",
      "description": "Optional configured custom domain. If omitted, uses the app's current custom domain."
    }
  },
  "required": [
    "app_id"
  ]
}
⚪configure_domain_redirects(app_id, primary_domain, redirect_www, force_https)

Configure custom-domain redirect policy: primary domain, optional www/root redirect, and HTTPS enforcement.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "primary_domain": {
      "type": "string",
      "description": "Canonical primary domain, for example example.com"
    },
    "redirect_www": {
      "type": "boolean",
      "description": "Redirect the www/root counterpart to primary_domain",
      "default": true
    },
    "force_https": {
      "type": "boolean",
      "description": "Redirect HTTP custom-domain requests to HTTPS",
      "default": true
    }
  },
  "required": [
    "app_id",
    "primary_domain"
  ]
}
🟢list_apps(limit, offset)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "description": "Max apps to return (1-200)",
      "default": 50
    },
    "offset": {
      "type": "integer",
      "description": "Apps to skip, for paging",
      "default": 0
    }
  }
}
🟢get_app_files(app_id)

Get the file tree for an app with paths and byte sizes.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢read_app_file(app_id, path, max_chars)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "path": {
      "type": "string",
      "description": "Virtual file path, for example pages/Home.jsx"
    },
    "max_chars": {
      "type": "integer",
      "description": "Maximum content characters to return",
      "default": 200000
    }
  },
  "required": [
    "app_id",
    "path"
  ]
}
🟢read_app_files(app_id, paths, max_chars_per_file)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "paths": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Virtual file paths to read"
    },
    "max_chars_per_file": {
      "type": "integer",
      "description": "Maximum characters per file",
      "default": 100000
    }
  },
  "required": [
    "app_id",
    "paths"
  ]
}
🟡write_app_file(app_id, path, content, file_type)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "path": {
      "type": "string",
      "description": "Virtual file path"
    },
    "content": {
      "type": "string",
      "description": "Complete file contents"
    },
    "file_type": {
      "type": "string",
      "description": "Optional file type override"
    }
  },
  "required": [
    "app_id",
    "path",
    "content"
  ]
}
🟡patch_app_file(app_id, path, old_text, new_text, replace_all)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "path": {
      "type": "string",
      "description": "Virtual file path"
    },
    "old_text": {
      "type": "string",
      "description": "Exact existing text to replace"
    },
    "new_text": {
      "type": "string",
      "description": "Replacement text"
    },
    "replace_all": {
      "type": "boolean",
      "description": "Replace all matches instead of the first match",
      "default": false
    }
  },
  "required": [
    "app_id",
    "path",
    "old_text",
    "new_text"
  ]
}
🔴rename_app_file(app_id, old_path, new_path, overwrite, force)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "old_path": {
      "type": "string",
      "description": "Existing virtual file path to rename"
    },
    "new_path": {
      "type": "string",
      "description": "New virtual file path"
    },
    "overwrite": {
      "type": "boolean",
      "description": "Allow replacing an existing file at new_path",
      "default": false
    },
    "force": {
      "type": "boolean",
      "description": "Apply even if validation reports blocking errors",
      "default": false
    }
  },
  "required": [
    "app_id",
    "old_path",
    "new_path"
  ]
}
🟢get_app_detail(app_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_entities(app_id)

Get all entity (data model) schemas for an app, with record counts. Each entity has fields, types, and relationships.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢query_entity(app_id, entity, filters, sort, limit, ...)

Query app data records for one entity with optional exact-match filters.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name, for example Patient"
    },
    "filters": {
      "type": "object",
      "description": "Exact-match field filters",
      "default": {}
    },
    "sort": {
      "type": "string",
      "description": "Sort field, prefix with - for descending",
      "default": "-created_date"
    },
    "limit": {
      "type": "integer",
      "description": "Max records to return",
      "default": 100
    },
    "offset": {
      "type": "integer",
      "description": "Pagination offset",
      "default": 0
    }
  },
  "required": [
    "app_id",
    "entity"
  ]
}
⚪seed_entity(app_id, entity, records, mode, reason)

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

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Records to insert"
    },
    "mode": {
      "type": "string",
      "enum": [
        "append",
        "skip_if_not_empty"
      ],
      "description": "append always inserts; skip_if_not_empty inserts only when the entity is empty",
      "default": "skip_if_not_empty"
    },
    "reason": {
      "type": "string",
      "description": "Why these records should be created",
      "default": ""
    }
  },
  "required": [
    "app_id",
    "entity",
    "records"
  ]
}
🟡create_entity_records(app_id, entity, records, reason, expected_count)

Create/insert records in one app entity. Executes directly for the authenticated app owner and returns the created record ids.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Records to create"
    },
    "reason": {
      "type": "string",
      "description": "Why these records should be created",
      "default": ""
    },
    "expected_count": {
      "type": "integer",
      "description": "Optional safety check; the write aborts if the record count differs"
    }
  },
  "required": [
    "app_id",
    "entity",
    "records"
  ]
}
🔴update_entity_record(app_id, entity, record_id, data, reason)

Compatibility tool that updates one record by ID. Executes directly for the authenticated app owner.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "record_id": {
      "type": "string",
      "description": "Record ID"
    },
    "data": {
      "type": "object",
      "description": "Fields to merge into the record"
    },
    "reason": {
      "type": "string",
      "description": "Why this record should be updated",
      "default": ""
    }
  },
  "required": [
    "app_id",
    "entity",
    "record_id",
    "data"
  ]
}
🔴update_entity_records(app_id, entity, record_ids, filters, changes, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "record_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Exact record IDs to update"
    },
    "filters": {
      "oneOf": [
        {
          "type": "object"
        },
        {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      ],
      "description": "One exact-match selector or a list of exact-match selectors"
    },
    "changes": {
      "type": "object",
      "description": "Shared fields to merge into every selected record"
    },
    "updates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "record_id": {
            "type": "string"
          },
          "changes": {
            "type": "object"
          }
        },
        "required": [
          "record_id",
          "changes"
        ]
      },
      "description": "Per-record changes; use instead of shared changes"
    },
    "reason": {
      "type": "string",
      "description": "Why these records should be updated",
      "default": ""
    },
    "expected_count": {
      "type": "integer",
      "description": "Required match count safety check, when known"
    }
  },
  "required": [
    "app_id",
    "entity"
  ]
}
🔴delete_entity_records(app_id, entity, record_ids, filters, reason, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "record_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Exact record IDs to delete"
    },
    "filters": {
      "oneOf": [
        {
          "type": "object"
        },
        {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      ],
      "description": "One exact-match selector or a list of exact-match selectors"
    },
    "reason": {
      "type": "string",
      "description": "Why these records should be deleted",
      "default": ""
    },
    "expected_count": {
      "type": "integer",
      "description": "Required match count safety check, when known"
    }
  },
  "required": [
    "app_id",
    "entity"
  ]
}
🟢get_pages(app_id)

Get all pages in an app with their file paths and sizes.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_errors(app_id, limit)

Get recent runtime errors for an app (last 20). Useful for diagnosing issues before updating.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "limit": {
      "type": "integer",
      "description": "Max errors to return (default 20)",
      "default": 20
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_app_analytics(app_id, days)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "days": {
      "type": "integer",
      "description": "Window in days (1-90, default 7)",
      "default": 7
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_preview_url(app_id)

Return editor preview and published/public URLs for an app.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟢list_saved_versions(app_id)

List restorable Saved Versions for an app, including versions created by MCP writes.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟡create_change_set(app_id, label)

Create a staged file change set. Add multiple file changes, validate them as one app state, then apply atomically.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "label": {
      "type": "string",
      "description": "Optional short label"
    }
  },
  "required": [
    "app_id"
  ]
}
🔴add_file_change(app_id, change_set_id, path, content, file_type, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "change_set_id": {
      "type": "string",
      "description": "Change set ID"
    },
    "path": {
      "type": "string",
      "description": "Virtual file path"
    },
    "content": {
      "type": "string",
      "description": "Complete file contents for upsert",
      "default": ""
    },
    "file_type": {
      "type": "string",
      "description": "Optional file type override",
      "default": ""
    },
    "operation": {
      "type": "string",
      "enum": [
        "upsert",
        "delete"
      ],
      "default": "upsert"
    }
  },
  "required": [
    "app_id",
    "change_set_id",
    "path"
  ]
}
🟢validate_change_set(app_id, change_set_id, include_runtime_errors)

Validate current app files plus staged change set files before applying.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "change_set_id": {
      "type": "string",
      "description": "Change set ID"
    },
    "include_runtime_errors": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "app_id",
    "change_set_id"
  ]
}
🟡apply_change_set(app_id, change_set_id, force)

Apply a staged change set to the app. Creates a Saved Version before applying. Blocks on validation errors unless force=true.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "change_set_id": {
      "type": "string",
      "description": "Change set ID"
    },
    "force": {
      "type": "boolean",
      "description": "Apply even if validation has errors",
      "default": false
    }
  },
  "required": [
    "app_id",
    "change_set_id"
  ]
}
🔴discard_change_set(app_id, change_set_id)

Discard a pending staged change set without changing app files.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "change_set_id": {
      "type": "string",
      "description": "Change set ID"
    }
  },
  "required": [
    "app_id",
    "change_set_id"
  ]
}
🟢validate_app(app_id, include_runtime_errors)

Run deterministic app checks: syntax, imports, routes/pages, entity schemas, missing entities, and recorded runtime errors.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "include_runtime_errors": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "app_id"
  ]
}
🟢inspect_preview(app_id, route, auth_as, auth_as_role)

Return server-side preview context: URLs, persisted runtime/network errors, static clickable candidates, pages, and explicit live-browser availability.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "route": {
      "type": "string",
      "description": "Optional route to inspect",
      "default": ""
    },
    "auth_as": {
      "type": "string",
      "description": "Optional auth simulation: anonymous",
      "default": ""
    },
    "auth_as_role": {
      "type": "string",
      "description": "Optional app role simulation, e.g. staff/admin/customer",
      "default": ""
    }
  },
  "required": [
    "app_id"
  ]
}
🟢get_app_security_context(app_id, audit_limit)

Return safe security context for one owned app: owner id/email, Studio collaborators, generated-app members, route policies, entity policies, and recent security audit entries. Does not return secrets and does not grant access to other apps.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "audit_limit": {
      "type": "integer",
      "default": 50
    }
  },
  "required": [
    "app_id"
  ]
}
🔴set_route_policy(app_id, route, require_auth, allowed_roles, redirect_to)

Create or update a server-owned route policy for a generated app route.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "route": {
      "type": "string",
      "description": "Route or wildcard route, e.g. /admin/*"
    },
    "require_auth": {
      "type": "boolean",
      "default": true
    },
    "allowed_roles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Allowed app roles"
    },
    "redirect_to": {
      "type": "string",
      "default": "/Login"
    }
  },
  "required": [
    "app_id",
    "route",
    "require_auth",
    "allowed_roles"
  ]
}
🔴set_entity_policy(app_id, entity, read, write)

Create or update server-side read/write role policy for an app entity.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name, e.g. Booking"
    },
    "read": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Roles allowed to read"
    },
    "write": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Roles allowed to write"
    }
  },
  "required": [
    "app_id",
    "entity",
    "read",
    "write"
  ]
}
🟢list_app_members(app_id)

List generated-app runtime users/members for an app. This is separate from Studio project collaborators.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟡invite_app_member(app_id, email, role, full_name, password)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "email": {
      "type": "string",
      "description": "Member email"
    },
    "role": {
      "type": "string",
      "description": "App role, e.g. admin/staff/customer"
    },
    "full_name": {
      "type": "string",
      "default": ""
    },
    "password": {
      "type": "string",
      "description": "The password this member signs in with, chosen by the account owner. Required, and never echoed back in the result."
    }
  },
  "required": [
    "app_id",
    "email",
    "role",
    "password"
  ]
}
🔴update_app_member_role(app_id, user_id, role)

Update a generated-app runtime member role. This cannot assign owner and cannot change the Fine Structure account owner.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "user_id": {
      "type": "string",
      "description": "Generated app user id"
    },
    "role": {
      "type": "string",
      "description": "New role"
    }
  },
  "required": [
    "app_id",
    "user_id",
    "role"
  ]
}
🔴remove_app_member(app_id, user_id)

Remove a generated-app runtime member.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "user_id": {
      "type": "string",
      "description": "Generated app user id"
    }
  },
  "required": [
    "app_id",
    "user_id"
  ]
}
🟢get_app_security_audit(app_id, limit)

Read recent server-side security audit events for an app.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "limit": {
      "type": "integer",
      "default": 100
    }
  },
  "required": [
    "app_id"
  ]
}
🟢compare_saved_versions(app_id, base_snapshot_id, target_snapshot_id, max_diff_chars)

Compare two Saved Versions and return per-file additions, removals, modifications, and compact diffs.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "base_snapshot_id": {
      "type": "string",
      "description": "Older/base snapshot ID"
    },
    "target_snapshot_id": {
      "type": "string",
      "description": "Newer/target snapshot ID"
    },
    "max_diff_chars": {
      "type": "integer",
      "default": 12000
    }
  },
  "required": [
    "app_id",
    "base_snapshot_id",
    "target_snapshot_id"
  ]
}
🟢compare_current_to_version(app_id, snapshot_id, max_diff_chars)

Compare the current app files to a Saved Version and return compact per-file diffs.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "snapshot_id": {
      "type": "string",
      "description": "Saved Version snapshot ID"
    },
    "max_diff_chars": {
      "type": "integer",
      "default": 12000
    }
  },
  "required": [
    "app_id",
    "snapshot_id"
  ]
}
🔴restore_file_from_version(app_id, snapshot_id, path, confirm)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "snapshot_id": {
      "type": "string",
      "description": "Saved Version snapshot ID"
    },
    "path": {
      "type": "string",
      "description": "Virtual file path to restore"
    },
    "confirm": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "app_id",
    "snapshot_id",
    "path",
    "confirm"
  ]
}
🟡create_entity_schema(app_id, entity, schema, relationships, indexes, ...)

Create an entity schema file in entities/<Entity>.json. Creates a Saved Version before writing.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "schema": {
      "type": "object",
      "description": "JSON schema object"
    },
    "relationships": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "indexes": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "metadata": {
      "type": "object",
      "default": {}
    },
    "overwrite": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "app_id",
    "entity",
    "schema"
  ]
}
🟡update_entity_schema(app_id, entity, schema, relationships, indexes, ...)

Replace or shallow-merge an existing entity schema file. Creates a Saved Version before writing.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "schema": {
      "type": "object",
      "description": "Schema fields to set or merge"
    },
    "relationships": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "indexes": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "metadata": {
      "type": "object",
      "default": {}
    },
    "merge": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "app_id",
    "entity",
    "schema"
  ]
}
🟢validate_entity_relationships(app_id)

Validate entity relationship metadata and *_id references against existing entity schemas.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟡update_entity_metadata(app_id, entity, relationships, indexes, metadata)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "entity": {
      "type": "string",
      "description": "Entity name"
    },
    "relationships": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "indexes": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "default": []
    },
    "metadata": {
      "type": "object",
      "default": {}
    }
  },
  "required": [
    "app_id",
    "entity"
  ]
}
🟢list_secret_keys(app_id)

List secret key names for an app. Secret values are never returned.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🔴set_secret(app_id, key, value)

Create or update one encrypted app secret. The secret value is never returned.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "key": {
      "type": "string",
      "description": "Secret key name"
    },
    "value": {
      "type": "string",
      "description": "Secret value to encrypt and store"
    }
  },
  "required": [
    "app_id",
    "key",
    "value"
  ]
}
🔴delete_secret(app_id, key)

Delete one app secret by key.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "key": {
      "type": "string",
      "description": "Secret key name"
    }
  },
  "required": [
    "app_id",
    "key"
  ]
}
🟢list_integrations(app_id)

List supported integrations and safe connected integration metadata for an app. Tokens/secrets are never returned.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟡configure_integration(app_id, provider, config, is_active)

Store safe non-secret integration metadata for an app. Use set_secret for API keys/tokens.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "provider": {
      "type": "string",
      "description": "Integration provider ID"
    },
    "config": {
      "type": "object",
      "description": "Safe metadata only, such as workspace/team/name/email"
    },
    "is_active": {
      "type": "boolean",
      "description": "Set false to disconnect this integration metadata",
      "default": true
    }
  },
  "required": [
    "app_id",
    "provider",
    "config"
  ]
}
🟢list_ab_tests(app_id)

List the platform A/B tests configured for an app.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    }
  },
  "required": [
    "app_id"
  ]
}
🟡create_ab_test(app_id, name, page_name, variants, goal_event_type, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "name": {
      "type": "string",
      "description": "Experiment name"
    },
    "page_name": {
      "type": "string",
      "description": "Base route page that triggers the experiment"
    },
    "variants": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "page_name": {
            "type": "string",
            "description": "Existing app page name or path"
          },
          "traffic_percent": {
            "type": "integer",
            "description": "Traffic percentage for this variant"
          }
        },
        "required": [
          "page_name",
          "traffic_percent"
        ]
      },
      "description": "At least two variants. Traffic must total 100."
    },
    "goal_event_type": {
      "type": "string",
      "description": "Optional conversion goal type: entity_create, any, form_submit"
    },
    "goal_event_filter": {
      "type": "object",
      "description": "Optional goal filter, for example {'entity_name': 'Lead'}"
    },
    "is_active": {
      "type": "boolean",
      "description": "Whether to activate the test immediately",
      "default": true
    }
  },
  "required": [
    "app_id",
    "name",
    "page_name",
    "variants"
  ]
}
🟡update_ab_test(app_id, test_id, name, page_name, variants, ...)

Update a native A/B test, including active state, variants, traffic, and conversion goal. Creates a Saved Version before the change.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "test_id": {
      "type": "string",
      "description": "A/B test ID"
    },
    "name": {
      "type": "string",
      "description": "Optional new name"
    },
    "page_name": {
      "type": "string",
      "description": "Optional new base route page"
    },
    "variants": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Optional replacement variants. Traffic must total 100."
    },
    "is_active": {
      "type": "boolean",
      "description": "Optional active state"
    },
    "goal_event_type": {
      "type": "string",
      "description": "Optional conversion goal type"
    },
    "goal_event_filter": {
      "type": "object",
      "description": "Optional conversion goal filter"
    }
  },
  "required": [
    "app_id",
    "test_id"
  ]
}
🔴delete_ab_test(app_id, test_id)

Delete a native A/B test from an app. Creates a Saved Version before the change.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "test_id": {
      "type": "string",
      "description": "A/B test ID"
    }
  },
  "required": [
    "app_id",
    "test_id"
  ]
}
🟢get_ab_test_stats(app_id, test_id)

Get views, unique visitors, conversions, and conversion rates for an A/B test.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "The app ID"
    },
    "test_id": {
      "type": "string",
      "description": "A/B test ID"
    }
  },
  "required": [
    "app_id",
    "test_id"
  ]
}
🟡create_agent(name, role, description, persona, app_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Agent display name (e.g. 'Lead Follow-up'). Auto-derived from role when omitted."
    },
    "role": {
      "type": "string",
      "description": "Short role label (e.g. 'sales assistant')"
    },
    "description": {
      "type": "string",
      "description": "What this agent is responsible for, one or two sentences"
    },
    "persona": {
      "type": "string",
      "description": "Optional working style and tone instructions for the agent"
    },
    "app_id": {
      "type": "string",
      "description": "Optional app to attach the agent to; account-level when omitted"
    }
  },
  "required": [
    "role",
    "description"
  ]
}
🟢list_agents(app_id)

List the AI agents on the user's account with id, name, role, status and FineMail address.

입력 스키마

{
  "type": "object",
  "properties": {
    "app_id": {
      "type": "string",
      "description": "Optional filter by attached app"
    }
  }
}
🟡schedule_agent_task(agent_id, title, instructions, schedule, max_runs, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "The agent id (from create_agent or list_agents)"
    },
    "title": {
      "type": "string",
      "description": "Short task title"
    },
    "instructions": {
      "type": "string",
      "description": "What the agent should do on each run, written as instructions to the agent"
    },
    "schedule": {
      "type": "object",
      "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\"}"
    },
    "max_runs": {
      "type": "integer",
      "description": "Optional cap on total runs (0 = unlimited)",
      "default": 0
    },
    "activate": {
      "type": "boolean",
      "description": "Start the schedule immediately (true) or save as draft (false)",
      "default": true
    }
  },
  "required": [
    "agent_id",
    "title",
    "instructions",
    "schedule"
  ]
}
🟢list_agent_tasks(agent_id, status, limit)

List scheduled tasks for one agent (or the whole account), including schedule, status and next_run_at.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "Optional agent id filter"
    },
    "status": {
      "type": "string",
      "description": "Optional status filter: draft, active, paused, archived"
    },
    "limit": {
      "type": "integer",
      "description": "Max tasks to return (1-100)",
      "default": 50
    }
  }
}
🟢get_agent_whatsapp(agent_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "Optional: report only this agent's WhatsApp state."
    }
  }
}
🔴start_owner_phone_verification(phone, region)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string",
      "description": "The owner's own WhatsApp number, ideally in E.164 form such as +972501234567."
    },
    "region": {
      "type": "string",
      "description": "Optional ISO region hint (for example IL, US) used when the number has no country code."
    }
  },
  "required": [
    "phone"
  ]
}
⚪confirm_owner_phone_verification(phone, code, region)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string",
      "description": "The same phone number the code was sent to."
    },
    "code": {
      "type": "string",
      "description": "The 6-digit code from the WhatsApp message."
    },
    "region": {
      "type": "string",
      "description": "Optional ISO region hint, matching the one used when sending."
    }
  },
  "required": [
    "phone",
    "code"
  ]
}
🟢attach_agent_whatsapp(agent_id, phone_number_id)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "The agent that should answer on this number."
    },
    "phone_number_id": {
      "type": "string",
      "description": "phone_number_id from get_agent_whatsapp claimable_numbers."
    }
  },
  "required": [
    "agent_id",
    "phone_number_id"
  ]
}
🔴detach_agent_whatsapp(phone_number_id)

Disconnect the owner's WhatsApp route from a platform number. Removes only this account's route; other accounts sharing the number keep theirs.

입력 스키마

{
  "type": "object",
  "properties": {
    "phone_number_id": {
      "type": "string",
      "description": "The number to disconnect, from get_agent_whatsapp."
    }
  },
  "required": [
    "phone_number_id"
  ]
}

권장 프롬프트

search_research
Search for information about [topic] using Fine Structure
예상 도구: query_entity
find_specific
Find [specific item] using Fine Structure
예상 도구: query_entity
retrieve_data
Get details about [item] from Fine Structure
예상 도구: agency_get_claim_status
fetch_info
Fetch [information type] using Fine Structure
예상 도구: agency_get_claim_status
list_items
List all [items] available in Fine Structure
예상 도구: agency_list_clients

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 84개