recipebooq
Server Details
Design a React Native app in a browser and emit it as a real Expo project you own, iOS and Android.
- Status
- Healthy
- Uptime
- 100.0% over 55 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 11 tools
Each tool has a distinct role in the workflow: component discovery/details, installation, app setup, design proposal, screen addition, emission, update, and verification. Parallel tools like propose_app/propose_screen and emit_app/add_screen are clearly separated by whole-app versus single-screen and proposal versus emission scope.
All 11 tools use snake_case and a consistent verb-first pattern: add_screen, check_snippet, emit_app, find_component, get_app_setup, get_component, install_component, propose_app, propose_screen, update_components, verify_app. There are no mixed naming conventions.
Eleven tools is well within a reasonable range for this design-to-Expo-app workflow. Each tool maps to a meaningful step in the lifecycle, with no obvious filler tools.
The surface covers discovery, component details, installation, design proposal, app emission, updates, static checks, and verification. Minor gaps remain around explicit removal/uninstall operations and broader project introspection, but the core workflow has no major dead ends.
Available Tools
11 toolsadd_screenAdd a screen to an appARead-onlyIdempotentInspect
Needs a subscription. Adds one screen designed in the Architect to a project. With the project's .opointo/files.json it returns the screen file, the route that mounts it and the one line to register it, and never rewrites existing files. Without it, a self-contained screen file for any Expo app.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | nest it in this tab's stack; omit to place it where the design does | |
| appId | Yes | the share code from "Send app to agent" | |
| screen | No | the new screen's name in that design | |
| manifest | No | the parsed .opointo/files.json | |
| componentName | No | only to add a second copy of a screen; omit for the export's name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: subscription gating, the guarantee that existing files are never rewritten, and mode-dependent outputs (screen file + mounting route + registration line vs. a standalone file). These details clarify that 'add' produces artifacts rather than mutating state, consistent with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded with the subscription prerequisite first. The telegraphic, clause-fragmented style ('With the project's... Without it...') is efficient but slightly disjointed to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does explain the two possible outputs and the no-rewrite guarantee. It stops short of spelling out the route/registration payload structure, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains appId, screen, manifest, tab, and componentName. The description adds mode context around 'manifest' but no per-parameter syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: adds one Architect-designed screen to a project, and distinguishes the two output modes (manifest-aware vs. self-contained Expo file). However, it never differentiates from sibling tools like propose_screen or emit_app, which could plausibly be confused with this operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a prerequisite ('Needs a subscription') and describes the two execution contexts (with vs. without the project's .opointo/files.json), but never says when to choose this over propose_screen or emit_app. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_snippetCheck code for blank-render bugsARead-onlyIdempotentInspect
Scans TSX that uses these components for the mistakes that render nothing with no error: animated opacity on glass, the flex: 1 collapse, a clipped lens, a conditionally mounted surface. A read-only text scan, not a guarantee; verify_app checks a whole emitted project.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | the TSX to check |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world. The description adds genuine value beyond them by clarifying it is a 'read-only text scan, not a guarantee' and therefore best-effort rather than exhaustive — a limitation an agent would otherwise not know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the bug classes and closed with the scope caveat and sibling routing. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly conveys expected findings (blank renders with no error) and sets expectations that results are heuristic, not guaranteed. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter ('code', 'the TSX to check'), so the schema already carries the semantics. The description adds nothing about the input format or size limits, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Scans') and resource ('TSX that uses these components') and enumerates the exact bug classes it detects. It is clearly distinguishable from verify_app, which it explicitly names as the project-wide alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames this as a narrow per-snippet check and routes whole-project validation to verify_app. It stops short of stating explicit exclusions or prerequisites (e.g. what happens if the snippet lacks these components), so it is strong but not fully prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emit_appBuild an app from a designARead-onlyIdempotentInspect
Needs a subscription. Turns a design from the Architect into a working Expo app: navigation, providers, tab bar, screens and the components they use. Returns a recipe for the current project: every file with its target path, one install line and ordered steps with a check each. Pass step for one step in full, which does not count against the daily allowance.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | for step write or review; each page names the next | |
| step | No | a step id from the recipe, or "review" for the screen list | |
| appId | Yes | the Architect's "Send app to agent" share code, e.g. "34ca4babb2" | |
| override | No | emit even with screens flagged not ready; ask the customer first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: an entitlement requirement, a daily allowance quota, and the notable fact that single-step fetches don't count against that quota. It also discloses the return shape (files with target paths, one install line, ordered steps with a check each), which is exactly what an agent needs given no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the prerequisite and the core action, then the return format, then the parameter tip. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so precisely, and it covers the quota and prerequisite behavior an agent needs before calling. Nothing material is missing for a read-only recipe generator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains that `step` fetches one step in full and is quota-exempt, which the schema does not say. `page` and `override` semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turns an Architect design into a working Expo app (navigation, providers, tab bar, screens, components) and returns a per-project recipe. This clearly separates it from siblings like propose_app, add_screen and verify_app, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a prerequisite ('Needs a subscription') and one concrete usage mode ('Pass `step` for one step in full'), but never says when to choose this over propose_app/verify_app or when emission is inappropriate. Usage is implied by the flow rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_componentFind a componentARead-onlyIdempotentInspect
Finds the component for a UI need described in plain words, ranked, and says when this catalog ships nothing on purpose because the phone's own control is the right choice. Omit need to list every component with its purpose and whether it renders the real system control.
| Name | Required | Description | Default |
|---|---|---|---|
| need | No | e.g. "a progress bar for an upload" | |
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral value the annotations cannot: results are ranked, and the catalog may intentionally return nothing when the platform's native control is preferable — a non-obvious negative-result contract.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences with no filler, leading with what the tool does and the ranking behavior before the omit-need shortcut. Slightly dense phrasing ('ships nothing on purpose') but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches what comes back (ranked components, purpose text, whether a real system control renders). The only notable gap is the unexplained `category` enum, which the schema also fails to document.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, and the description only compensates for `need` (omit it to list all). The `category` enum (controls/chrome/surfaces) is left entirely undefined in both schema and description, so the agent must guess what those buckets mean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Finds the component') scoped to a plain-language UI need, and adds the distinctive behavior of ranked results plus deliberate-absence signaling. It implicitly separates itself from the id-lookup sibling (get_component) but never names it, so differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one concrete usage rule: omitting `need` lists every component with purpose and system-control status. Beyond that it offers no when-to-use versus alternatives guidance or prerequisites for the ranked search path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_setupGet the app setupBRead-onlyIdempotentInspect
How an app is set up so these components work and follow its theme, one topic at a time: the app-root providers in the order that works, the theme hooks and token scales, or the rules that hold across the whole catalog. An app built by emit_app already has all three wired.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| platform | No | rules only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so the safety profile is fully covered and the description need not repeat it. It adds only that results are scoped per topic and are conceptual guidance rather than live state. No error, pagination, or freshness behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence opens with the fragment 'How an app is set up so these components work and follow its theme, one topic at a time:', which is not a clause and delays the actionable content. The enumerated topics arrive only after a heavy preamble, so the definition is not front-loaded and reads awkwardly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return content, and it does so for all three topics. The emit_app note gives useful context about when the setup is already wired. Only the platform-scoping behavior for 'rules' is undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description must compensate — and it does for the required 'topic' parameter by explaining what each of the three enum values yields (providers/theme/rules). The optional 'platform' parameter's 'rules only' constraint is left entirely to the schema, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (app setup guidance) and enumerates the three concrete outputs — app-root providers in working order, theme hooks and token scales, or catalog-wide rules — so an agent knows what each topic returns. The verb is buried ('How an app is set up...'), but the content is specific enough to separate it from siblings like get_component or find_component. It stops short of explicitly contrasting with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'one topic at a time' and the enum values tell the agent how to call it, and 'An app built by emit_app already has all three wired' hints that the tool may be redundant after emit_app. There is no explicit when-to-use/when-not rule or named alternative for looking up component details, so guidance stays inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_componentGet a componentARead-onlyIdempotentInspect
Everything needed to write a correct call site for one component: props with types, defaults and allowed values, what draws on iOS and on Android, the providers it needs at the app root, its dependencies, and the runtime rules that stop it rendering blank.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | e.g. "button" | |
| platform | No | only the rules that hold there |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses the shape of the response, per-platform rendering differences, required root providers, and 'runtime rules that stop it rendering blank' — useful for an agent deciding whether the call is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense, front-loaded sentence that lists exactly what comes back with no filler. Slightly list-like and could be scannable as bullets, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing the return payload and does so thoroughly — props, defaults, allowed values, platform rendering, providers, dependencies and runtime rules. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds no information about slug or platform beyond the schema (the enum and 'only the rules that hold there' note live in the schema itself). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear resource and scope: it returns everything needed to write a call site for one component, enumerating props/types/defaults, platform rendering, providers, dependencies and runtime rules. An agent can distinguish it from find_component (discovery) and install_component (mutation/installation), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The framing 'everything needed to write a correct call site' implies pre-use before installing or emitting a component, but there is no explicit when-to-use, when-not-to-use, or named alternative such as find_component. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_componentInstall a componentARead-onlyIdempotentInspect
Needs a subscription, except for the free foundation components. Adds one component to an existing project: the files it and its dependencies need in install order with exact target paths, the single expo install line, the providers it needs and its runtime rules. A backend recipe's id, such as "supabase", adds that integration: its files and the per-app wiring an export writes.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | e.g. "button", or a recipe id such as "supabase" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already richly declare the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds a genuine auth-type precondition (subscription requirement) and describes the deliverables, but the 'Adds one component to an existing project' framing sits in mild tension with readOnlyHint=true, creating some ambiguity rather than fully clarifying behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with essentially no filler; every clause carries information. The only structural nit is that it front-loads the subscription precondition rather than the core purpose, and the deliverable list is tightly packed, but it remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema tool with rich annotations, the description is complete: it covers the precondition, the mutation-free generative output (files, install order, target paths, install line, providers, runtime rules), and the recipe-id branch. The only missing piece, sibling routing, is already penalized under usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single slug parameter is already documented with both examples ('button' and a recipe id such as 'supabase'). The description's note that a backend recipe id 'adds that integration' with its own files and per-app wiring adds modest meaning beyond the schema, but largely echoes the schema's own example, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — it 'adds one component to an existing project' — and details exactly what that yields (files in install order with target paths, the install line, providers, runtime rules), plus the recipe-id variant. It is clear on its own but never explicitly distinguishes itself from siblings like get_component, find_component, or add_screen, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only eligibility guidance is the precondition 'Needs a subscription, except for the free foundation components,' which acts as a partial when-not gate. There is no explicit routing guidance telling the agent when to pick install_component over get_component/find_component or add_screen, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_appPropose an app designBInspect
Your agent can design an app with you: send an app in opointo's design format (the AppSpec emit_app builds from) and get back a link that opens it in the Architect as a new, unsaved design. The person sees every screen, changes what they like, and hands it back for emit_app. into: the code in the person's line; it lands in their open design. dryRun checks without making a link; format: true returns the format and every block, "photos" the sample photos, or with app: { version: 1 } a short plan's.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | The design: { name, tabs: [{ screenId, label }], screens: [{ id, name, composition: { screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } } }], onboardingScreenIds: [], pushed: [{ screenId, fromScreenId, presentation }], theme? }. A node is { id, slug, props }: slug is "wireframe:<block>" such as "wireframe:list-row" (a list whose rows open one screen is one row block with repeats: "true" and its sample rows in rows: [{ title, ... }]) or a component from find_component, and a content node opens a screen with navigate: { to, presentation } beside its props. A top bar is header: { id, slug: "header", props: {} }, titled by the screen's name; a sheet has none. entryScreenId is only for a splash screen before the tabs. Titles and composition metadata are set by the builder. | |
| into | No | ||
| dryRun | No | check the design and report, without making a link | |
| format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, idempotent=false, destructive=false, openWorld=false. The description adds genuinely useful context beyond that: a link is returned, it opens as a NEW UNSAVED design, the person edits every screen, and dryRun avoids creating a link. It stops short of explaining what happens to prior proposals or how 'into' merges into an existing design, but it does substantially more than the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core meaning is buried in one long run-on sentence followed by fragments such as 'into: the code in the person's line' and a dangling 'or with app: { version: 1 } a short plan's.' The propose-then-hand-back flow is not front-loaded, and stray quotation marks around 'photos' make the format options harder to parse than the schema alone.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool: a deeply nested AppSpec object, four parameters, no output schema, and write semantics. The description covers the return value (a link), the dryRun escape hatch, and the propose/emit_app lifecycle, which is the critical part. It leaves into's merge behavior and the exact format string values murky, so it is adequate but not complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: app and dryRun are documented in the schema, while into and format are bare. The description attempts to cover both gaps, saying into lands the design 'in their open design' and format: true returns the format and every block or 'photos' for sample photos. The into explanation is garbled ('the code in the person's line') and the format variants are only partly legible, so it compensates but not cleanly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource: send an AppSpec and get back a link that opens it in the Architect as a new, unsaved design. It also distinguishes itself from emit_app by noting the person 'hands it back for emit_app', which clarifies the propose-vs-commit split. Verbose framing aside, an agent can tell what it does and how it differs from the sibling that commits the design.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The propose-then-emit_app flow is described, which implies when to use this tool, and dryRun is explained as a way to check without making a link. However, there is no explicit 'use this when X, use emit_app when Y' statement, and the guidance is embedded inside a run-on sentence rather than stated as a rule an agent can act on directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_screenPropose a screen designAInspect
Your agent can design a single screen with you: send one screen in opointo's design format (the Composition add_screen builds from) and get back a link that opens it in the Architect as a new, unsaved design the person can change. into: as propose_app's. dryRun checks without making a link; format: true returns the format. For a whole app, use propose_app.
| Name | Required | Description | Default |
|---|---|---|---|
| into | No | ||
| dryRun | No | check the screen and report, without making a link | |
| format | No | ||
| composition | No | One screen: { name, screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } }. A node is { id, slug, props }: slug is "wireframe:<block>" or a component from find_component. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: the result is a new, unsaved design the person can edit, which tells the agent nothing is persisted or destroyed (consistent with destructiveHint=false). It also discloses the dryRun non-effect, though it says nothing about permissions or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the propose_app alternative are front-loaded, but sentences are long run-ons and the 'into: as propose_app's.' fragment adds noise rather than information. Short overall, but not every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four params, nested composition objects, and no output schema, the description covers the essentials: what to send, what comes back (a link), and how to preview without a link. It leaves gaps on 'into', the exact shape of the dryRun report, and error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so the description must compensate for undocumented params. It does add meaning for 'format' ('true returns the format') and echoes dryRun, but 'into' is reduced to the unusable fragment 'as propose_app's,' leaving one of four params effectively unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('design a single screen'), explains the input format and the return value (a link opening a new, unsaved design in the Architect). It explicitly distinguishes itself from propose_app for whole apps, so an agent can route correctly despite the garbled 'into: as propose_app's' fragment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For a whole app, use propose_app' is an explicit alternative with the selecting condition. The dryRun and format flags are also framed as usage choices ('checks without making a link', 'returns the format'), though 'into' gets no usable guidance at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_componentsUpdate supplied componentsARead-onlyIdempotentInspect
Needs a subscription. Reads the project's .opointo/files.json and returns only the opointo-supplied files that changed since export, so it works months later with no share code. Never touches the customer's own screens, and flags the rare change that needs a code edit rather than a copy.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | only when the answer's page.next asks for it | |
| current | No | only when a split-unverified blocker asks: each named file's hash, from its command | |
| manifest | Yes | the parsed .opointo/files.json (the object or its files array) | |
| acceptSplit | No | only once the customer agreed: the paths split-customer-edited blockers name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine context beyond that: it names the file it reads, scopes the output to changed opointo-supplied files, guarantees it never touches the customer's own screens, and discloses the flagging behavior for changes needing a code edit rather than a copy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with the subscription prerequisite front-loaded before the core behavior. Information is well ordered and each sentence carries a distinct point (precondition, mechanism/benefit, scope guarantee).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains what is returned (only changed opointo-supplied files) and the flagging outcome. Given 100% schema coverage and explicit annotations, the remaining gap is only the absence of named sibling alternatives, which is minor for a four-parameter tool with nested objects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, including their conditional triggers. The description adds no syntax or format detail beyond the schema (it only restates the manifest concept as .opointo/files.json), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource: it reads the project's .opointo/files.json and returns the opointo-supplied files that changed since export. That is clear and disambiguates the misleadingly named 'update' tool (which is actually a read), but it never names a sibling (install_component, get_component, verify_app) to differentiate itself explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a precondition ('Needs a subscription') and a benefit context ('works months later with no share code'), and the schema params carry conditional triggers ('only when the answer's page.next asks for it'). However, there is no explicit statement of when to choose this over the sibling tools, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_appVerify an emitted appARead-onlyIdempotentInspect
Needs a subscription. Checks an emitted app before it is built: missing files, altered verbatim files, absent packages, the expo-router config merge, whether the installed Xcode can build it, and whether a change needs a new native build.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | emit_app's share code; `appId` in .opointo/files.json | |
| files | Yes | each file written, hidden .opointo/files.json included: { path, bytes }, from the project root | |
| config | No | ||
| toolchain | No | ||
| dependencies | No | package.json keys |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds a genuine non-annotation fact, the subscription requirement, plus the fact that it inspects the locally installed Xcode/fingerprints. It does not say whether the tool returns a report or fails on mismatch, which for a verification tool is a meaningful behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A prerequisite clause plus one dense sentence listing the checks, with no filler. The enumeration is long but every item is informative; the leading 'Needs a subscription' is slightly awkward as an opener but is useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with nested objects and no output schema, the description explains the scope of checks but not what the agent gets back (pass/fail list, diagnostics, error behavior) or how files/appId must be assembled. The missing return-shape information is the main gap, since no output schema exists to cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 60% schema coverage the schema carries most of the burden, documenting appId, files[].path/bytes/sha, and several nested config/toolchain fields. The description never mentions a parameter by name, though its list of checks maps loosely onto the groups (files, dependencies, toolchain.xcode). No additional format or usage meaning is supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('checks') and resource ('an emitted app before it is built'), then enumerates exactly what is validated: missing files, altered verbatim files, absent packages, expo-router config merge, Xcode buildability, and native-build need. That enumeration distinguishes it clearly from siblings like emit_app, propose_app, or get_app_setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before it is built' pins the point in the workflow when this tool applies, and 'Needs a subscription' flags a prerequisite up front. It stops short of naming an explicit alternative (e.g. 'use get_app_setup for runtime config inspection') or stating when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
emit_app1 field changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code from the Designer's \"Send app to agent\", e.g. \"34ca4babb2\""New value: +"the Architect's \"Send app to agent\" share code, e.g. \"34ca4babb2\""
- Changed
verify_app9 fields changed- added
Input schema / properties / config / properties / androidMinSdkVersionAdded value: +{ + "type": "number" +} - added
Input schema / properties / config / properties / iosDeploymentTargetAdded value: +{ + "type": "string" +} - changed
Input schema / properties / config / properties / nativeModulesDir / descriptionPrevious value: -"package.json expo.autolinking; omit if unset"New value: +"package.json expo.autolinking" - added
Input schema / properties / config / properties / permissionsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / dependencies / descriptionPrevious value: -"package.json dependencies' keys"New value: +"package.json keys" - removed
Input schema / properties / toolchain / properties / enableSceneSupport / descriptionRemoved value: -"app.json expo-build-properties ios.enableSceneSupport" - changed
Input schema / properties / toolchain / properties / expoBuildProperties / descriptionPrevious value: -"INSTALLED expo-build-properties version; omit if absent"New value: +"INSTALLED expo-build-properties version" - changed
Input schema / properties / toolchain / properties / expoSdk / descriptionPrevious value: -"the INSTALLED expo version, e.g. \"56.0.15\" (`npm ls expo`)"New value: +"INSTALLED expo version, e.g. \"58.0.19\"" - changed
Input schema / properties / toolchain / properties / xcode / descriptionPrevious value: -"`xcodebuild -version`, e.g. \"26.2\"; omit without Xcode"New value: +"`xcodebuild -version`; omit without Xcode"
1 tool update
- Changed
verify_app7 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code given to emit_app; `appId` in .opointo/files.json"New value: +"emit_app's share code; `appId` in .opointo/files.json" - added
Input schema / properties / config / properties / privacyPolicyUrlAdded value: +{ + "type": "string" +} - added
Input schema / properties / config / properties / releaseAdded value: +{ + "type": "string" +} - changed
Input schema / properties / files / descriptionPrevious value: -"each file written, the hidden .opointo/files.json included: { path, bytes }, path from the project root"New value: +"each file written, hidden .opointo/files.json included: { path, bytes }, from the project root" - changed
Input schema / properties / files / items / properties / bytes / descriptionPrevious value: -"size in bytes on disk as `wc -c` reports, not the character count"New value: +"bytes on disk as `wc -c` reports, not characters" - changed
Input schema / properties / files / items / properties / sha / descriptionPrevious value: -"optional; when sent, the byte check is skipped"New value: +"optional; replaces the byte check" - changed
Input schema / properties / toolchain / properties / expoBuildProperties / descriptionPrevious value: -"the INSTALLED expo-build-properties version; omit if absent"New value: +"INSTALLED expo-build-properties version; omit if absent"
1 tool update
- Changed
emit_app1 field changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code from the App Designer's \"Send app to agent\", e.g. \"34ca4babb2\""New value: +"the share code from the Designer's \"Send app to agent\", e.g. \"34ca4babb2\""
1 tool update
- Changed
propose_app2 fields changed- changed
Input schema / properties / app / descriptionPrevious value: -"The design: { name, tabs: [{ screenId, label }], screens: [{ id, name, composition: { screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } } }], onboardingScreenIds: [], pushed: [{ screenId, fromScreenId, presentation }], theme? }. A node is { id, slug, props }: slug is \"wireframe:<block>\" such as \"wireframe:list-row\" (a list whose rows open one screen is one row block with repeats: \"true\" and its sample rows in rows: [{ title, ... }]) or a component from find_component, and a content node opens a screen with navigate: { to, presentation } beside its props. A top bar is header: { id, slug: \"header\", props: {} }, titled by the screen's name; a sheet has none. entryScreenId is only for a splash screen before the tabs. Tab icons, titles and composition metadata are set by the builder."New value: +"The design: { name, tabs: [{ screenId, label }], screens: [{ id, name, composition: { screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } } }], onboardingScreenIds: [], pushed: [{ screenId, fromScreenId, presentation }], theme? }. A node is { id, slug, props }: slug is \"wireframe:<block>\" such as \"wireframe:list-row\" (a list whose rows open one screen is one row block with repeats: \"true\" and its sample rows in rows: [{ title, ... }]) or a component from find_component, and a content node opens a screen with navigate: { to, presentation } beside its props. A top bar is header: { id, slug: \"header\", props: {} }, titled by the screen's name; a sheet has none. entryScreenId is only for a splash screen before the tabs. Titles and composition metadata are set by the builder." - changed
Input schema / properties / format / typePrevious value: -"boolean"New value: +[ + "boolean", + "string" +]
3 tool updates
- Changed
propose_app1 field changed- added
Input schema / properties / intoAdded value: +{ + "type": "string" +}
- Changed
propose_screen1 field changed- added
Input schema / properties / intoAdded value: +{ + "type": "string" +}
- Changed
verify_app1 field changed- added
Input schema / properties / config / properties / sourcesAdded value: +{ + "type": "string" +}
1 tool update
- Changed
verify_app2 fields changed- added
Input schema / properties / toolchain / properties / lastBuildFingerprintAdded value: +{ + "type": "string" +} - added
Input schema / properties / toolchain / properties / nativeFingerprintAdded value: +{ + "type": "string" +}
1 tool update
- Changed
emit_app1 field changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code from the App Builder's \"Send app to agent\", e.g. \"34ca4babb2\""New value: +"the share code from the App Designer's \"Send app to agent\", e.g. \"34ca4babb2\""
2 tool updates
- Changed
install_component1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"e.g. \"button\" or \"bottom-sheet\""New value: +"e.g. \"button\", or a recipe id such as \"supabase\""
- Changed
verify_app3 fields changed- added
Input schema / properties / config / properties / iconAdded value: +{ + "description": "app.json", + "type": "string" +} - added
Input schema / properties / config / properties / monochromeImageAdded value: +{ + "description": "app.json android.adaptiveIcon", + "type": "string" +} - added
Input schema / properties / config / properties / supportsTabletAdded value: +{ + "description": "app.json ios", + "type": "boolean" +}
1 tool update
- Changed
update_components1 field changed- added
Input schema / properties / pageAdded value: +{ + "description": "only when the answer's page.next asks for it", + "type": "number" +}
4 tool updates
- Changed
add_screen2 fields changed- changed
Input schema / properties / componentName / descriptionPrevious value: -"e.g. \"InvoiceScreen\""New value: +"only to add a second copy of a screen; omit for the export's name" - changed
Input schema / properties / tab / descriptionPrevious value: -"nest it in this tab's stack; omit for the root, which covers the tab bar"New value: +"nest it in this tab's stack; omit to place it where the design does"
- Changed
propose_app3 fields changed- changed
Input schema / properties / app / descriptionPrevious value: -"The design: { name, tabs: [{ screenId, label }], screens: [{ id, name, composition: { screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } } }], onboardingScreenIds: [], pushed: [{ screenId, fromScreenId, presentation }], theme? }. A node is { id, slug, props }: slug is a component from list_components or \"wireframe:<block>\" such as \"wireframe:list-row\" (a list whose rows open one screen is one row with repeats: \"true\"), and a content node opens a screen with navigate: { to, presentation }. A top bar is header: { id, slug: \"header\", props: {} }, titled by the screen's name. entryScreenId is only for a splash screen before the tabs. Tab icons, titles and composition metadata are set by the builder."New value: +"The design: { name, tabs: [{ screenId, label }], screens: [{ id, name, composition: { screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } } }], onboardingScreenIds: [], pushed: [{ screenId, fromScreenId, presentation }], theme? }. A node is { id, slug, props }: slug is \"wireframe:<block>\" such as \"wireframe:list-row\" (a list whose rows open one screen is one row block with repeats: \"true\" and its sample rows in rows: [{ title, ... }]) or a component from find_component, and a content node opens a screen with navigate: { to, presentation } beside its props. A top bar is header: { id, slug: \"header\", props: {} }, titled by the screen's name; a sheet has none. entryScreenId is only for a splash screen before the tabs. Tab icons, titles and composition metadata are set by the builder." - added
Input schema / properties / formatAdded value: +{ + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "app" -]
- Changed
propose_screen3 fields changed- changed
Input schema / properties / composition / descriptionPrevious value: -"One screen: { name, screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } }. A node is { id, slug, props }: slug is a component from list_components or \"wireframe:<block>\"."New value: +"One screen: { name, screen: { content: { children: [node] }, chrome: { header?, headerItems?, floating: [] }, overlays: [] } }. A node is { id, slug, props }: slug is \"wireframe:<block>\" or a component from find_component." - added
Input schema / properties / formatAdded value: +{ + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "composition" -]
- Changed
verify_app3 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code given to emit_app"New value: +"the share code given to emit_app; `appId` in .opointo/files.json" - changed
Input schema / properties / files / descriptionPrevious value: -"each file written: { path, bytes }, path from the project root"New value: +"each file written, the hidden .opointo/files.json included: { path, bytes }, path from the project root" - changed
Input schema / requiredPrevious value: -[ - "appId", - "files" -]New value: +[ + "files" +]
15 tool updates
- Changed
add_screen7 fields changed- added
Input schema / properties / appIdAdded value: +{ + "description": "the share code from \"Send app to agent\"", + "type": "string" +} - changed
Input schema / properties / componentName / descriptionPrevious value: -"React component name, e.g. \"InvoiceDetail\". Defaults to GeneratedScreen."New value: +"e.g. \"InvoiceScreen\"" - removed
Input schema / properties / compositionIdRemoved value: -{ - "description": "share code for the new screen, from the App Builder", - "type": "string" -} - changed
Input schema / properties / manifest / descriptionPrevious value: -"the parsed .opointo/files.json from the project root"New value: +"the parsed .opointo/files.json" - added
Input schema / properties / screenAdded value: +{ + "description": "the new screen's name in that design", + "type": "string" +} - changed
Input schema / properties / tab / descriptionPrevious value: -"nest it in this tab's stack so the tab bar stays visible. Omit to put it at the root, where it covers the tab bar (right for a modal)."New value: +"nest it in this tab's stack; omit for the root, which covers the tab bar" - changed
Input schema / requiredPrevious value: -[ - "compositionId", - "manifest" -]New value: +[ + "appId" +]
- Changed
check_snippet1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"the TSX snippet to check"New value: +"the TSX to check"
- Changed
emit_app4 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code, e.g. \"34ca4babb2\""New value: +"the share code from the App Builder's \"Send app to agent\", e.g. \"34ca4babb2\"" - changed
Input schema / properties / override / descriptionPrevious value: -"emit even when screens are flagged as not ready. Ask the customer first; the flags exist for a reason."New value: +"emit even with screens flagged not ready; ask the customer first" - added
Input schema / properties / pageAdded value: +{ + "description": "for step write or review; each page names the next", + "type": "number" +} - added
Input schema / properties / stepAdded value: +{ + "description": "a step id from the recipe, or \"review\" for the screen list", + "type": "string" +}
- Removed
emit_screen - Changed
find_component2 fields changed- added
Input schema / properties / categoryAdded value: +{ + "enum": [ + "controls", + "chrome", + "surfaces" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "need" -]
- Added
get_app_setup - Changed
get_component1 field changed- added
Input schema / properties / platformAdded value: +{ + "description": "only the rules that hold there", + "enum": [ + "ios", + "android" + ], + "type": "string" +}
- Removed
get_provider_tree - Removed
get_rules - Removed
get_step - Removed
get_theme_tokens - Changed
install_component1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"the component slug, e.g. \"button\" or \"bottom-sheet\""New value: +"e.g. \"button\" or \"bottom-sheet\""
- Removed
list_components - Changed
update_components3 fields changed- changed
Input schema / properties / acceptSplit / descriptionPrevious value: -"only after the customer agreed to replace a file they edited: the paths named by `split-customer-edited` blockers"New value: +"only once the customer agreed: the paths split-customer-edited blockers name" - changed
Input schema / properties / current / descriptionPrevious value: -"only when a `split-unverified` blocker asks for it: the hash of each named file on disk, from the command the blocker gives"New value: +"only when a split-unverified blocker asks: each named file's hash, from its command" - changed
Input schema / properties / manifest / descriptionPrevious value: -"the parsed contents of .opointo/files.json from the project root (the whole object, or just its `files` array)"New value: +"the parsed .opointo/files.json (the object or its files array)"
- Changed
verify_app14 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"the share code you passed to emit_app"New value: +"the share code given to emit_app" - changed
Input schema / properties / config / properties / moduleSuffixes / descriptionPrevious value: -"tsconfig compilerOptions.moduleSuffixes"New value: +"tsconfig compilerOptions" - changed
Input schema / properties / config / properties / nativeModulesDir / descriptionPrevious value: -"package.json expo.autolinking.nativeModulesDir; omit if unset. Checked when the recipe ships a native module in src/modules. Unset, that module is never linked and the app crashes on Android at first render"New value: +"package.json expo.autolinking; omit if unset" - changed
Input schema / properties / config / properties / plugins / descriptionPrevious value: -"app.json plugins"New value: +"app.json" - changed
Input schema / properties / config / properties / scheme / descriptionPrevious value: -"app.json scheme"New value: +"app.json" - changed
Input schema / properties / config / properties / userInterfaceStyle / descriptionPrevious value: -"app.json userInterfaceStyle"New value: +"app.json" - changed
Input schema / properties / dependencies / descriptionPrevious value: -"the keys of package.json's dependencies"New value: +"package.json dependencies' keys" - changed
Input schema / properties / files / descriptionPrevious value: -"what you actually wrote: { path, bytes } per file, path relative to the project root. `bytes` must be the file's size in BYTES on disk (what `wc -c` reports), not its character count — the two differ for any file containing a non-ASCII character."New value: +"each file written: { path, bytes }, path from the project root" - changed
Input schema / properties / files / items / properties / bytes / descriptionPrevious value: -"size in bytes on disk, as `wc -c` reports"New value: +"size in bytes on disk as `wc -c` reports, not the character count" - changed
Input schema / properties / files / items / properties / sha / descriptionPrevious value: -"optional; when present it is authoritative and the byte check is skipped for that file"New value: +"optional; when sent, the byte check is skipped" - changed
Input schema / properties / toolchain / properties / enableSceneSupport / descriptionPrevious value: -"app.json → expo-build-properties → ios.enableSceneSupport"New value: +"app.json expo-build-properties ios.enableSceneSupport" - changed
Input schema / properties / toolchain / properties / expoBuildProperties / descriptionPrevious value: -"the INSTALLED `expo-build-properties` version, e.g. \"57.0.21\"; omit if it is not installed"New value: +"the INSTALLED expo-build-properties version; omit if absent" - changed
Input schema / properties / toolchain / properties / expoSdk / descriptionPrevious value: -"the INSTALLED `expo` package version, e.g. \"56.0.15\" (`npm ls expo`)"New value: +"the INSTALLED expo version, e.g. \"56.0.15\" (`npm ls expo`)" - changed
Input schema / properties / toolchain / properties / xcode / descriptionPrevious value: -"the version from `xcodebuild -version`, e.g. \"26.2\". iOS only; omit on a machine without Xcode"New value: +"`xcodebuild -version`, e.g. \"26.2\"; omit without Xcode"
2 tool updates
- Added
propose_app - Added
propose_screen
1 tool update
- Changed
get_step2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which page of the file list (write) or the screen list (review); omit for the first. Each page names the next.", + "type": "number" +} - changed
Input schema / properties / stepId / descriptionPrevious value: -"the step id, e.g. \"configure\" or \"write\""New value: +"the step id, e.g. \"configure\" or \"write\", or \"review\" for the screen list"
1 tool update
- Changed
verify_app1 field changed- added
Input schema / properties / config / properties / nativeModulesDirAdded value: +{ + "description": "package.json expo.autolinking.nativeModulesDir; omit if unset. Checked when the recipe ships a native module in src/modules. Unset, that module is never linked and the app crashes on Android at first render", + "type": "string" +}
2 tool updates
- Changed
add_screen1 field changed- changed
Input schema / properties / manifest / descriptionPrevious value: -"the parsed .recipebooq/files.json from the project root"New value: +"the parsed .opointo/files.json from the project root"
- Changed
update_components1 field changed- changed
Input schema / properties / manifest / descriptionPrevious value: -"the parsed contents of .recipebooq/files.json from the project root (the whole object, or just its `files` array)"New value: +"the parsed contents of .opointo/files.json from the project root (the whole object, or just its `files` array)"
3 tool updates
- Changed
get_rules1 field changed- added
Input schema / properties / platformAdded value: +{ + "description": "optional — omit for the rules on both platforms", + "enum": [ + "ios", + "android" + ], + "type": "string" +}
- Changed
update_components2 fields changed- added
Input schema / properties / acceptSplitAdded value: +{ + "description": "only after the customer agreed to replace a file they edited: the paths named by `split-customer-edited` blockers", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / currentAdded value: +{ + "description": "only when a `split-unverified` blocker asks for it: the hash of each named file on disk, from the command the blocker gives", + "items": { + "properties": { + "missing": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "type": "array" +}
- Changed
verify_app2 fields changed- added
Input schema / properties / toolchain / properties / expoBuildPropertiesAdded value: +{ + "description": "the INSTALLED `expo-build-properties` version, e.g. \"57.0.21\"; omit if it is not installed", + "type": "string" +} - changed
Input schema / properties / toolchain / properties / expoSdk / descriptionPrevious value: -"the `expo` version in package.json, e.g. \"56.0.15\""New value: +"the INSTALLED `expo` package version, e.g. \"56.0.15\" (`npm ls expo`)"
Related MCP Connectors
Design a React Native app in a browser and emit it as a real Expo project you own, iOS and Android.
Design mobile app screens with AI — describe your app, get linked screens instantly.
Design your mobile app UI with AI, then have your coding agent build the real app from it.
Scope a mobile app to a first version, start from a free Expo template, and pass store review.
Related MCP Servers
- FlicenseAqualityDmaintenanceCreates new Expo React Native apps from a Feature-Sliced Design template and configures store deployment settings.3-

Sleek MCP serverofficial
AlicenseNot gradedqualityBmaintenanceEnables MCP clients to turn plain-language mobile app descriptions into rendered, editable screens and project links for exporting to Figma, HTML, or React.MIT- AlicenseAqualityDmaintenanceConverts a Figma file into a React project using Ant Design, AG Grid, ApexCharts, and Tailwind CSS, with optional export of mobile screens as a React Native (Expo) app.721 npmMIT
- AlicenseNot gradedqualityAmaintenanceLets MCP-capable AI agents control an Expo / React Native app running live in Expo Go on a real phone, reading a compact token-cheap outline of the visible screen and performing taps, text entry, scrolling, toggles and navigation. Also exposes screenshots, layout, console logs, network requests and hardware keys, and attaches new JS errors and failed requests to the action that caused them.208 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.