Skip to main content
Glama

Server Details

Design a React Native app in a browser and emit it as a real Expo project you own, iOS and Android.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
opointoHQ/opointo-mcp
GitHub Stars
0

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target clearly distinct resource+action pairs (find_component vs get_component, check_snippet vs verify_app, install_component vs update_components). The parallel design/add families (propose_app vs emit_app, propose_screen vs add_screen) are the only spots where an agent might pause, but the descriptions explicitly draw the boundaries (link vs build, design vs install).

Naming Consistency5/5

Every tool follows a consistent snake_case verb_noun pattern: add_screen, check_snippet, emit_app, find_component, get_component, get_app_setup, install_component, propose_app, propose_screen, update_components, verify_app. No mixing of conventions or vague standalone verbs.

Tool Count5/5

11 tools is well-scoped for a design-to-Expo-app pipeline. Each tool earns its place across the design, emit, install, inspect, verify, and update stages with no redundant entries.

Completeness4/5

The surface covers the full lifecycle: design (propose_app/propose_screen), build (emit_app/add_screen/install_component), inspect (find/get component, app setup), verify (check_snippet/verify_app), and update (update_components). Minor gaps exist around removing/detaching previously installed components or screens, but core workflows are covered.

Available Tools

11 tools
add_screenAdd a screen to an app
Read-onlyIdempotent
Inspect

Needs a subscription. Adds one screen designed in the Designer 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNonest it in this tab's stack; omit to place it where the design does
appIdYesthe share code from "Send app to agent"
screenNothe new screen's name in that design
manifestNothe parsed .opointo/files.json
componentNameNoonly to add a second copy of a screen; omit for the export's name
check_snippetCheck code for blank-render bugsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesthe TSX to check

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 design
Read-onlyIdempotent
Inspect

Needs a subscription. Turns a design from the Designer 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNofor step write or review; each page names the next
stepNoa step id from the recipe, or "review" for the screen list
appIdYesthe share code from the Designer's "Send app to agent", e.g. "34ca4babb2"
overrideNoemit even with screens flagged not ready; ask the customer first
find_componentFind a componentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
needNoe.g. "a progress bar for an upload"
categoryNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 setupB
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes
platformNorules only

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 componentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYese.g. "button"
platformNoonly the rules that hold there

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 componentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYese.g. "button", or a recipe id such as "supabase"

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoThe 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.
intoNo
dryRunNocheck the design and report, without making a link
formatNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false and non-idempotency, so the safety bar is lower. The description usefully adds that the result is an unsaved design and that dryRun avoids producing a link, but the 'into' behavior ('it lands in their open design') is murky and suggests an in-place mutation that is never clearly explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is a reasonable front-loaded opener, but the remainder degenerates into run-on, grammatically broken fragments ('into: the code in the person's line;', 'a short plan's.'). The content is short but its structure impedes parsing rather than serving conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-object, mutation-ish tool with no output schema and 4 params, the description does cover the key return (a Designer link), the unsaved state, and dryRun semantics. It leaves the 'into' write path and error/failure behavior unexplained, so it is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, so the description must compensate. The 'format' explanation adds genuine value by naming the 'photos' and 'app: {version: 1}' plan variants not in the schema, but the 'into' gloss ('the code in the person's line; it lands in their open design') is too fragmented to clarify the parameter's type or meaning. Net compensation is weak.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific action and resource: send an app spec in opointo's format and receive a link that opens it in the Designer as a new, unsaved design. It also implicitly differentiates from emit_app by framing this as the proposal step that hands back for emit_app. The clarity is undercut by garbled later sentences, but the core purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It sketches the workflow ('the person sees every screen, changes what they like, and hands it back for emit_app') and mentions dryRun as a check-only mode, which implies when to use it. However, there is no explicit when-not guidance and the sibling relationship to emit_app and propose_screen is only obliquely implied.

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 designBInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
intoNo
dryRunNocheck the screen and report, without making a link
formatNo
compositionNoOne 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

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (not read-only, not destructive, not idempotent), so the bar is lower, and the description does add real value: the result is a new *unsaved* design a person can change, plus a dryRun check mode. However, the 'into' behavior is left as a cryptic cross-reference rather than a disclosed trait, and there is no note on whether anything persists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The size is reasonable, but structure is poor: 'into: as propose_app's.' is a dangling fragment with no verb, and the run-on first sentence buries the return-value behavior (a link) mid-clause. Front-loading the purpose helps, but the shorthand-style gaps make it read as under-specified rather than concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a nested composition object, no output schema, and one badly described parameter (into), the description covers the essentials of what happens (unsaved design + link, dryRun) but leaves the 'into' semantics and any auth/permission expectations unaddressed. It is workable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%. The description supplies meaning for dryRun ('checks without making a link') and format ('true returns the format'), and the composition format is documented in the schema itself. The 'into' parameter is effectively undocumented beyond a pointer to propose_app's behavior, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: send one screen and get back a link that opens an unsaved design in the Designer. It also explicitly distinguishes itself from the sibling propose_app ('For a whole app, use propose_app'). The clarity is slightly eroded by the broken fragment 'into: as propose_app's.', which reads as leftover notes rather than a complete sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear alternative and selection rule ('For a whole app, use propose_app') and explains that dryRun checks without producing a link, which is genuine when-to-use guidance. It stops short of contrasting against add_screen, even though it name-drops the relation indirectly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_componentsUpdate supplied componentsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoonly when the answer's page.next asks for it
currentNoonly when a split-unverified blocker asks: each named file's hash, from its command
manifestYesthe parsed .opointo/files.json (the object or its files array)
acceptSplitNoonly once the customer agreed: the paths split-customer-edited blockers name

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 app
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdNothe share code given to emit_app; `appId` in .opointo/files.json
filesYeseach file written, the hidden .opointo/files.json included: { path, bytes }, path from the project root
configNo
toolchainNo
dependenciesNopackage.json dependencies' keys

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedemit_app1 field changed
      • changedInput schema / properties / appId / description
        Previous 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\""
  2. 1 tool update
    • Changedpropose_app2 fields changed
      • changedInput schema / properties / app / description
        Previous 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."
      • changedInput schema / properties / format / type
        Previous value: -"boolean"New value: +[
        +  "boolean",
        +  "string"
        +]
  3. 3 tool updates
    • Changedpropose_app1 field changed
      • addedInput schema / properties / into
        Added value: +{
        +  "type": "string"
        +}
    • Changedpropose_screen1 field changed
      • addedInput schema / properties / into
        Added value: +{
        +  "type": "string"
        +}
    • Changedverify_app1 field changed
      • addedInput schema / properties / config / properties / sources
        Added value: +{
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedverify_app2 fields changed
      • addedInput schema / properties / toolchain / properties / lastBuildFingerprint
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / toolchain / properties / nativeFingerprint
        Added value: +{
        +  "type": "string"
        +}
  5. 1 tool update
    • Changedemit_app1 field changed
      • changedInput schema / properties / appId / description
        Previous 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\""
  6. 2 tool updates
    • Changedinstall_component1 field changed
      • changedInput schema / properties / slug / description
        Previous value: -"e.g. \"button\" or \"bottom-sheet\""New value: +"e.g. \"button\", or a recipe id such as \"supabase\""
    • Changedverify_app3 fields changed
      • addedInput schema / properties / config / properties / icon
        Added value: +{
        +  "description": "app.json",
        +  "type": "string"
        +}
      • addedInput schema / properties / config / properties / monochromeImage
        Added value: +{
        +  "description": "app.json android.adaptiveIcon",
        +  "type": "string"
        +}
      • addedInput schema / properties / config / properties / supportsTablet
        Added value: +{
        +  "description": "app.json ios",
        +  "type": "boolean"
        +}
  7. 1 tool update
    • Changedupdate_components1 field changed
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "only when the answer's page.next asks for it",
        +  "type": "number"
        +}
  8. 4 tool updates
    • Changedadd_screen2 fields changed
      • changedInput schema / properties / componentName / description
        Previous value: -"e.g. \"InvoiceScreen\""New value: +"only to add a second copy of a screen; omit for the export's name"
      • changedInput schema / properties / tab / description
        Previous 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"
    • Changedpropose_app3 fields changed
      • changedInput schema / properties / app / description
        Previous 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."
      • addedInput schema / properties / format
        Added value: +{
        +  "type": "boolean"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "app"
        -]
    • Changedpropose_screen3 fields changed
      • changedInput schema / properties / composition / description
        Previous 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."
      • addedInput schema / properties / format
        Added value: +{
        +  "type": "boolean"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "composition"
        -]
    • Changedverify_app3 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"the share code given to emit_app"New value: +"the share code given to emit_app; `appId` in .opointo/files.json"
      • changedInput schema / properties / files / description
        Previous 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"
      • changedInput schema / required
        Previous value: -[
        -  "appId",
        -  "files"
        -]New value: +[
        +  "files"
        +]
  9. 15 tool updates
    • Changedadd_screen7 fields changed
      • addedInput schema / properties / appId
        Added value: +{
        +  "description": "the share code from \"Send app to agent\"",
        +  "type": "string"
        +}
      • changedInput schema / properties / componentName / description
        Previous value: -"React component name, e.g. \"InvoiceDetail\". Defaults to GeneratedScreen."New value: +"e.g. \"InvoiceScreen\""
      • removedInput schema / properties / compositionId
        Removed value: -{
        -  "description": "share code for the new screen, from the App Builder",
        -  "type": "string"
        -}
      • changedInput schema / properties / manifest / description
        Previous value: -"the parsed .opointo/files.json from the project root"New value: +"the parsed .opointo/files.json"
      • addedInput schema / properties / screen
        Added value: +{
        +  "description": "the new screen's name in that design",
        +  "type": "string"
        +}
      • changedInput schema / properties / tab / description
        Previous 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"
      • changedInput schema / required
        Previous value: -[
        -  "compositionId",
        -  "manifest"
        -]New value: +[
        +  "appId"
        +]
    • Changedcheck_snippet1 field changed
      • changedInput schema / properties / code / description
        Previous value: -"the TSX snippet to check"New value: +"the TSX to check"
    • Changedemit_app4 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"the share code, e.g. \"34ca4babb2\""New value: +"the share code from the App Builder's \"Send app to agent\", e.g. \"34ca4babb2\""
      • changedInput schema / properties / override / description
        Previous 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"
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "for step write or review; each page names the next",
        +  "type": "number"
        +}
      • addedInput schema / properties / step
        Added value: +{
        +  "description": "a step id from the recipe, or \"review\" for the screen list",
        +  "type": "string"
        +}
    • Removedemit_screen
    • Changedfind_component2 fields changed
      • addedInput schema / properties / category
        Added value: +{
        +  "enum": [
        +    "controls",
        +    "chrome",
        +    "surfaces"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "need"
        -]
    • Addedget_app_setup
    • Changedget_component1 field changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "description": "only the rules that hold there",
        +  "enum": [
        +    "ios",
        +    "android"
        +  ],
        +  "type": "string"
        +}
    • Removedget_provider_tree
    • Removedget_rules
    • Removedget_step
    • Removedget_theme_tokens
    • Changedinstall_component1 field changed
      • changedInput schema / properties / slug / description
        Previous value: -"the component slug, e.g. \"button\" or \"bottom-sheet\""New value: +"e.g. \"button\" or \"bottom-sheet\""
    • Removedlist_components
    • Changedupdate_components3 fields changed
      • changedInput schema / properties / acceptSplit / description
        Previous 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"
      • changedInput schema / properties / current / description
        Previous 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"
      • changedInput schema / properties / manifest / description
        Previous 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)"
    • Changedverify_app14 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"the share code you passed to emit_app"New value: +"the share code given to emit_app"
      • changedInput schema / properties / config / properties / moduleSuffixes / description
        Previous value: -"tsconfig compilerOptions.moduleSuffixes"New value: +"tsconfig compilerOptions"
      • changedInput schema / properties / config / properties / nativeModulesDir / description
        Previous 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"
      • changedInput schema / properties / config / properties / plugins / description
        Previous value: -"app.json plugins"New value: +"app.json"
      • changedInput schema / properties / config / properties / scheme / description
        Previous value: -"app.json scheme"New value: +"app.json"
      • changedInput schema / properties / config / properties / userInterfaceStyle / description
        Previous value: -"app.json userInterfaceStyle"New value: +"app.json"
      • changedInput schema / properties / dependencies / description
        Previous value: -"the keys of package.json's dependencies"New value: +"package.json dependencies' keys"
      • changedInput schema / properties / files / description
        Previous 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"
      • changedInput schema / properties / files / items / properties / bytes / description
        Previous 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"
      • changedInput schema / properties / files / items / properties / sha / description
        Previous 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"
      • changedInput schema / properties / toolchain / properties / enableSceneSupport / description
        Previous value: -"app.json → expo-build-properties → ios.enableSceneSupport"New value: +"app.json expo-build-properties ios.enableSceneSupport"
      • changedInput schema / properties / toolchain / properties / expoBuildProperties / description
        Previous 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"
      • changedInput schema / properties / toolchain / properties / expoSdk / description
        Previous 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`)"
      • changedInput schema / properties / toolchain / properties / xcode / description
        Previous 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"
  10. 2 tool updates
    • Addedpropose_app
    • Addedpropose_screen
  11. 1 tool update
    • Changedget_step2 fields changed
      • addedInput schema / properties / page
        Added 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"
        +}
      • changedInput schema / properties / stepId / description
        Previous 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"
  12. 1 tool update
    • Changedverify_app1 field changed
      • addedInput schema / properties / config / properties / nativeModulesDir
        Added 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"
        +}
  13. 14 tool updates
    • First observedadd_screen
    • First observedcheck_snippet
    • First observedemit_app
    • First observedemit_screen
    • First observedfind_component
    • First observedget_component
    • First observedget_provider_tree
    • First observedget_rules
    • First observedget_step
    • First observedget_theme_tokens
    • First observedinstall_component
    • First observedlist_components
    • First observedupdate_components
    • First observedverify_app

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.