Skip to main content
Glama

AppFactory

Let your coding agent ship an iOS subscription app, from idea to TestFlight.

An open-source MCP server for Claude Code, Codex CLI, Gemini CLI and Cursor. It validates the idea with real App Store data, builds the SwiftUI app, sets up the backend and the store, and stops at every step that matters so you stay in control.

PyPI CI License: MIT Python 3.12+ MCP

claude mcp add appfactory -s user -- uvx appfactory@latest

A real session, sped up. That first step needs no accounts. From there, the same agent can take the idea all the way to a TestFlight build.

What it does

flowchart LR
    A[💡 Idea<br/>real App Store data] --> B[🎨 Design<br/>competitor research]
    B --> C[📱 SwiftUI app<br/>from a tested template]
    C --> D[☁️ Backend<br/>Supabase]
    D --> E[💳 Store<br/>IAPs + RevenueCat]
    E --> F[🌍 Localize<br/>+ ASO + screenshots]
    F --> G[🚀 TestFlight]
    G -.you submit.-> H[App Store]

Stage

What the agent does with AppFactory

Idea

Harvests rising and chart-proven apps, scores niches by search demand, competition and staleness, estimates competitor revenue, checks the name is free

Design

Downloads category leaders' screenshots and icons, writes a differentiated design brief, designs every screen

App

Scaffolds a SwiftUI app (iOS 17.5+, iPhone) with onboarding, paywalls, settings, analytics hooks and tests

Backend

Supabase project, auth, edge functions, server-side usage limits, optional AI proxy (keys never ship in the app)

Store

App Store Connect app, subscriptions with trials and local prices, RevenueCat offerings, StoreKit config kept in sync

Launch assets

Localized metadata, ASO keywords, legal pages, branded screenshots, preview videos, custom product pages

Ship

Signing, archive, TestFlight upload. You press "Submit for Review".

Every stage has a gate: the agent can't mark it done until checks pass (the build compiles, the store matches the spec, screenshots follow the rules...). When something needs you, the run stops with a clear NEEDS_HUMAN.md.

Related MCP server: App Store Connect MCP

Quickstart

Requirements: a Mac and uv (brew install uv). Xcode and the other tools are only needed for the services you turn on.

1. Add it to your agent

Agent

Command

Claude Code

claude mcp add appfactory -s user -- uvx appfactory@latest

Codex CLI

codex mcp add appfactory -- uvx appfactory@latest

Gemini CLI

gemini mcp add appfactory uvx appfactory@latest

Cursor

~/.cursor/mcp.json: {"mcpServers": {"appfactory": {"command": "uvx", "args": ["appfactory@latest"]}}}

2. Say "Set up AppFactory"

The agent asks which services you want, one by one, and tells you exactly which keys are missing. Keys are environment variables on the MCP entry, like any other MCP server. They never go through the chat:

claude mcp add appfactory -s user \
  -e APPFACTORY_ASC_KEY_ID=ABC123DEFG \
  -e APPFACTORY_ASC_ISSUER_ID=00000000-0000-0000-0000-000000000000 \
  -e APPFACTORY_ASC_KEY_FILEPATH=~/keys/AuthKey_ABC123DEFG.p8 \
  -e APPFACTORY_TEAM_ID=TEAMID1234 \
  -- uvx appfactory@latest

Every variable is listed in docs/SETUP.md.

3. Run it

Run AppFactory

Before any work the agent asks you about every optional part of the app: free trial or not, hard paywall, discounted offer, onboarding quiz, mascot, languages, screenshots, preview video, analytics, ratings, Sign in with Apple... Anything you turn off is skipped, in the app code too.

Choose what you use

Everything except research is optional. A disabled service's tools do nothing and its stages are skipped, and the generated app doesn't include its SDK.

Service

What it enables

Needs

research

Idea harvesting and validation, ASO research

nothing

apple

App Store Connect: apps, subscriptions, metadata, TestFlight

ASC API key, asc CLI

xcode

Local builds, simulator, archives

Xcode, xcodegen

supabase

Backend: database, auth, edge functions, usage limits

access token, supabase, deno

revenuecat

Subscriptions and entitlements (without it: StoreKit 2 only)

RevenueCat secret key

ai

AI features through a server-side proxy (needs supabase)

provider keys, optional

firebase

Firebase Analytics

firebase CLI

github

A private repo and issue workflow per app

gh

design

Screen design through the claude-design MCP (without it: design locally)

claude-design MCP

maestro

End-to-end UI tests on the simulator (needs xcode)

Maestro, Java 17+

lottie

Lottie animations

node

Safety

Agents make mistakes and read untrusted web content, so AppFactory assumes they will.

  • Human approval for anything irreversible. Store writes, backend deploys, database changes, GitHub pushes, uploads and signing don't run when the agent calls them. They wait until you run appfactory approve <id> in your own terminal. The agent can't approve on your behalf.

  • You submit. App Store review submission is always done by you.

  • Dry run by default for deploys, repo creation and uploads. Destructive SQL always needs approval.

  • Secrets stay on your machine and are masked in every tool result.

  • Third-party text is data. App Store listings and reviews are labelled so the agent doesn't follow instructions hidden in them.

Threat model and limits: SECURITY.md.

FAQ

Does it need Claude? No. It is a standard MCP server. The run playbook is served by the server itself (tool playbook(), prompt run, resource appfactory://playbook), so any MCP-capable agent can follow it.

Why a Mac? The app is built and tested with Xcode on your machine. Research works anywhere.

Is my data sent anywhere? Only to the services you turn on, with your own keys. There is no AppFactory server and no telemetry.

Can I change the rules? Yes. The defaults (subscription with a free trial, hard paywall plus a discounted offer, a quiz onboarding, 6 app and 8 store languages) are recommendations. You answer each one before a run.

How do I update? @latest in the MCP command picks up new releases when your agent restarts.

Docs

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md. If AppFactory saves you time, a ⭐ helps other people find it.

License

MIT

Available Tools

125 tools
ai_configureAI ConfigureA
Read-onlyIdempotent

Report the AI provider/model selection (currently fal.ai Flux schnell); does not change anything.

Use when: checking which image model the backend will use. Keys are set with ai_deploy_proxy or backend_deploy. Returns: {ok, providers, models, note}.

NameRequiredDescriptionDefault
providersNoAI provider ids; default ['fal.ai'].

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so "does not change anything" largely restates structured data. The genuinely additive content is the current configured value and the note about which tools set keys; the returned keys are duplicated from the existing 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.

Conciseness4/5

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

Three compact lines, front-loaded with the read-only nature of the call and the usage trigger. Slight waste in restating the annotation ("does not change anything") and repeating the output shape already covered by the output schema, but nothing bloats the definition.

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?

For a no-required-param, read-only inspection tool with an output schema and full annotation coverage, the description supplies what is missing: the current model value and where configuration changes belong. Nothing essential for correct invocation is absent.

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?

There is a single optional parameter with 100% schema description coverage ("AI provider ids; default ['fal.ai']"), so the schema fully documents it. The description adds no syntax, format, or defaulting semantics beyond that, making 3 the appropriate baseline.

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 and resource (report the AI provider/model selection) and pins the current value (fal.ai Flux schnell). It also differentiates itself from the mutating alternatives by naming ai_deploy_proxy and backend_deploy, so an agent can tell why this is a read of state rather than a write.

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?

"Use when: checking which image model the backend will use" gives an explicit trigger condition, and the pointer to ai_deploy_proxy/backend_deploy for setting keys routes the agent away from this tool for writes. It stops short of naming read-side alternatives such as config_doctor or setup_status, but the when-to-use guidance is clear.

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

ai_deploy_proxyAI Deploy ProxyA
DestructiveIdempotent

Deploy the AI backend: the full spec-driven backend in subscription mode, or the legacy ai-proxy in credits mode (live, needs human approval).

Use when: the app has an AI feature. AI keys go only to server-side secrets. For explicit dry-run planning use backend_deploy. Returns: {ok, deployed: [...]} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
daily_limitNoPer-user daily request cap for the legacy ai-proxy (default 20).
project_refYesSupabase project ref to deploy to.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (destructive, idempotent, open-world), but the description adds genuinely new behavior: credits mode is 'live, needs human approval', keys go only to server-side secrets, and the call can return an approval_required refusal. It does not explain what idempotency means here or the effect of re-deploying over an existing backend.

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?

Front-loaded with the action, then 'Use when', then 'Returns' – three tight segments with no filler. Every sentence 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?

Output schema exists and the return shape is restated, and the approval workflow is covered. Remaining gap: nothing explains how the subscription vs. legacy mode is chosen or how daily_limit relates to mode, which is the key ambiguity for this tool.

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%, including the detailed approval_id round-trip and the daily_limit default, so the schema carries the parameter burden. The description adds no per-parameter meaning beyond that, so a baseline 3 is appropriate.

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+resource ('Deploy the AI backend') and explicitly splits it into two modes (spec-driven subscription mode vs. legacy ai-proxy in credits mode), which lets an agent tell it apart from backend_render and backend_deploy without opening a schema.

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?

Gives a clear positive trigger ('Use when: the app has an AI feature') and routes dry-run planning to backend_deploy explicitly. It stops short of stating when NOT to use it (e.g. when a deployment already exists) or how the two modes are selected.

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

animation_fetch_recolorAnimation Fetch RecolorA
Idempotent

Fetch a cute Lottie animation from the free LottieFiles library and recolor it to the app palette into Resources/Animations/.json.

Use when: once per slot (loading, success, empty, onboarding_hero) for every app; rendered by lottie-spm with .named(slot). Colors are mapped at build time (dominant to primary, others to accent). Returns: {ok, path, source, colors}.

NameRequiredDescriptionDefault
slotYesAnimation slot: 'loading', 'success', 'empty' or 'onboarding_hero'.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
keywordNoApp-themed search keyword override, e.g. 'happy dog celebration'.
accent_hexYesAccent palette color as hex, '#' optional, e.g. 'FFB300'.
primary_hexYesPrimary palette color as hex, '#' optional, e.g. '006A63'.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotent, non-destructive, open-world behavior, so the bar is lower. The description adds real value beyond that: it discloses the external network fetch from LottieFiles, the build-time color mapping rule (dominant to primary, others to accent), and the write target. It doesn't explicitly state overwrite behavior for an existing slot file, which is the one gap.

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?

Front-loaded purpose sentence, then clearly labeled 'Use when:' and 'Returns:' blocks. No filler, every sentence 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 an output schema present, the description needn't explain return values, yet it does. Combined with the usage and color-mapping context, an agent has nearly everything needed; only explicit overwrite/collision behavior for an existing slot file 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%, so the baseline is 3. The description restates the slot values already enumerated in the schema and does not clarify the keyword override or the hex format handling, so it adds little meaning beyond structured data.

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 specific verbs (fetch, recolor) and the resource (Lottie animation from LottieFiles), plus the exact output destination (Resources/Animations/<slot>.json). This is clearly distinguishable from the many sibling setup/build/deliver tools.

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?

The 'Use when:' clause gives concrete context — once per slot (loading, success, empty, onboarding_hero) for every app — and explains downstream rendering via lottie-spm. It stops short of naming an alternative tool or stating when not to use it, so it is clear but not fully routing-aware.

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

app_inject_configApp Inject ConfigA
Idempotent

Fill in the scaffolded app's AppConfig and StoreKit tokens (Supabase, proxy, PostHog, product ids, credits, paywall strategy).

Use when: after backend and RevenueCat values exist. Credit fields default to 15/10/10/30/60 and pack amounts must match the server-side PACK_MAP. Not for: spec-driven changes (edit app.spec.json, then app_sync_spec). Returns: {ok, changed: [files]}.

NameRequiredDescriptionDefault
posthog_keyNoPostHog project API key.
privacy_urlNoPublic privacy policy URL.
project_dirYesPath to the scaffolded app project directory.
ai_proxy_urlNoURL of the deployed AI proxy/edge function.
supabase_urlNoSupabase project URL, e.g. https://abcd.supabase.co.
support_emailNoPublic support email address.
product_weeklyNoWeekly subscription product id.
product_yearlyNoYearly subscription product id.
revenuecat_keyNoRevenueCat public SDK key (appl_...).
weekly_creditsNoCredits granted per week on the weekly plan (default 10).
yearly_creditsNoCredits granted per month on the yearly plan (default 15).
paywall_strategyNo'hard_only' (hard paywall only) or 'hard_and_offer' (default: plus a discounted offer paywall on dismiss).
credit_pack_largeNoCredits in the large top-up pack (default 60).
credit_pack_smallNoCredits in the small top-up pack (default 10).
supabase_anon_keyNoSupabase anon (public) key.
credit_pack_mediumNoCredits in the medium top-up pack (default 30).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, idempotent, non-destructive, closed-world). The description adds genuinely new constraints: credit-field defaults and the requirement that pack amounts match the server-side PACK_MAP. Missing auth/permission context, but the added constraint is meaningful.

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?

Front-loaded purpose sentence followed by clearly labeled 'Use when', 'Not for', and 'Returns' segments. No filler; every clause carries actionable information.

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 16-parameter write tool with full schema coverage and an output schema, the description covers purpose, preconditions, alternatives, key defaults, and the PACK_MAP constraint. Nothing material is missing.

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 100%, so per-field semantics are already documented (baseline 3). The description adds value by summarizing the credit defaults and flagging the cross-parameter PACK_MAP consistency requirement, which the schema cannot express.

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?

Uses a specific verb ('Fill in') against a named resource ('scaffolded app's AppConfig and StoreKit tokens') and enumerates the exact token categories covered. An agent can distinguish it from siblings like app_sync_spec without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: after backend and RevenueCat values exist' gives the precondition, and 'Not for: spec-driven changes (edit app.spec.json, then app_sync_spec)' names both the exclusion and the correct alternative. This is the gold standard for routing.

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

app_scaffoldApp ScaffoldA

Scaffold a new SwiftUI app from app.spec.json (xcodegen), init the pipeline manifest and a local git repo.

Use when: starting a new app after idea validation. The spec drives products, StoreKit file, locales, onboarding length, monetization mode and backend mode. Not for: editing an existing app (use app_sync_spec after changing the spec). Returns: {ok, dir, name, bundle_id, manifest}.

NameRequiredDescriptionDefault
nameNoApp name, e.g. 'PetPortrait'; used for the folder and target.
specNoFull app.spec.json as a dict, a dict of overrides on the defaults, or a path to an app.spec.json file.
dest_dirNoDirectory to create the app folder in; omit for the default apps directory.
bundle_idNoApp bundle identifier in reverse-DNS form, e.g. com.example.app.
display_nameNoName shown under the app icon; defaults to name.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine side-effect context beyond the annotations: it initializes a pipeline manifest and a local git repo, and notes the spec drives StoreKit, locales, onboarding and monetization/backend modes. It does not state failure behavior on re-run or auth prerequisites, so not a full 5.

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?

Three front-loaded blocks (action, use-when/not-for, returns) with no filler. The returns line is brief and, although an output schema exists, it costs little and improves scanability.

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 an output schema present, return values need not be explained, and the description still summarizes them. Purpose, trigger, alternative and side effects are all covered, leaving only minor gaps such as behavior when the destination already exists.

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 description coverage is 100%, so the baseline is 3. The description goes further by enumerating what the 'spec' parameter drives (products, StoreKit file, locales, onboarding length, monetization and backend mode), which the schema does not explain, adding real meaning to the most important parameter.

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 and resource ('Scaffold a new SwiftUI app from app.spec.json') plus the concrete mechanisms involved (xcodegen, pipeline manifest, local git repo). It also names the sibling it is not (app_sync_spec), so an agent can distinguish it from adjacent tools without opening a schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: starting a new app after idea validation' gives the trigger, and 'Not for: editing an existing app (use app_sync_spec after changing the spec)' names both the exclusion and the correct alternative. This is exactly the when/when-not/alternative structure.

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

app_sync_specApp Sync SpecA
Idempotent

Regenerate AppSpec.swift, PaywallSource.swift and Configuration.storekit and prune String Catalogs to locales.app.

Use when: after editing app.spec.json. Local writes only. Returns: {ok, files}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false. The description adds real value on top: it discloses that String Catalogs are destructively pruned to locales.app, and that writes are local-only — details the annotations do not express.

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 tight lines with the action front-loaded and the usage condition immediately after. 'Returns: {ok, files}' is mildly redundant given an output schema exists, which is the only thing keeping it from a 5.

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?

For a single-parameter, idempotent local-write tool with an output schema and full annotation coverage, the description supplies the trigger, the scope, and the destructive pruning caveat. Nothing essential for correct invocation is missing; naming an alternative sibling would make it 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?

There is a single required parameter with 100% schema description coverage, including a format example (/Users/me/Apps/MyApp), so the schema carries the full burden. The description adds no path or format guidance beyond it, making the baseline 3 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 names a specific verb (Regenerate) plus the exact artifacts produced (AppSpec.swift, PaywallSource.swift, Configuration.storekit) and an additional pruning action, so the agent knows precisely what the tool does. It does not, however, distinguish itself from nearby siblings such as storekit_generate, which an agent might reasonably confuse with the Configuration.storekit output.

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?

'Use when: after editing app.spec.json' gives an explicit trigger condition, and 'Local writes only' scopes the operation. It stops short of naming when NOT to use it or pointing at a sibling (e.g. storekit_generate) as the alternative, so it is clear context without exclusions.

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

asc_add_subscription_group_localizationASC Add Subscription Group LocalizationA
DestructiveIdempotent

Add one display-name localization to a subscription group (required to clear MISSING_METADATA; live write, needs human approval).

Use when: a single locale is needed. For many languages use asc_localize_group. Returns: {ok, data} or an approval_required refusal.

NameRequiredDescriptionDefault
nameYesSubscription group display name shown to users.
localeNoLocale code, e.g. 'en-US', 'de-DE'.en-US
group_idYesApp Store Connect subscription group id.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely new context beyond that: it is a 'live write' requiring human approval, the MISSING_METADATA prerequisite, and the return/refusal shape. It does not, however, explain the destructive nature flagged by annotations or how the idempotency interacts with approval retries.

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?

Three short labeled lines (purpose, when, returns), front-loaded with the scope and the sibling routing before the return shape. No filler sentences.

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?

Covers the approval-required flow, the MISSING_METADATA motivation, and the return/refusal contract, and an output schema exists so return values need no expansion. The only gap is the destructive behavior implied by annotations, which the description never addresses.

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 all four parameters including the approval_id workflow are already documented in the schema. The description adds only an implicit hint that locale granularity is per-call, not new syntax or format detail, so 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 and resource ('Add one display-name localization to a subscription group') and explicitly distinguishes itself from the plural sibling ('For many languages use asc_localize_group'). An agent can route between the two without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit use condition ('when: a single locale is needed') and names the alternative plus the condition that selects it ('For many languages use asc_localize_group'). Nothing is left to inference.

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

asc_append_subscription_disclosureASC Append Subscription DisclosureA
DestructiveIdempotent

Append the subscription disclosure, Terms/EULA and Privacy links to the app description in every language (Apple 3.1.2; live write, needs human approval).

Use when: preparing a subscription app for review. Idempotent (skips when the marker is present) and truncated to 4000 characters. Not for: uploading other metadata (use deliver_metadata). Returns: {ok, per-locale results} or an approval_required refusal.

NameRequiredDescriptionDefault
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
terms_urlNoTerms of Use/EULA URL; omit to use Apple's standard EULA.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
privacy_urlYesPublic privacy policy URL, e.g. https://example.com/privacy.
disclosure_by_localeNoOptional {locale: disclosure text} overriding the default subscription disclosure per language.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover safety flags (destructiveHint, idempotentHint, openWorldHint), but the description adds context beyond them: it is a live write requiring human approval, idempotency works by skipping when the marker is present, output is truncated to 4000 characters, and it can return an approval_required refusal. That approval workflow and truncation constraint are genuinely new information for the caller.

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?

Front-loads the action, then uses compact labeled clauses ('Use when:', 'Not for:', 'Returns:') that each carry distinct information. No sentence is redundant or padding.

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 an output schema present, return values need no expansion, yet the description still summarizes them. Combined with annotations and full schema coverage, an agent has everything needed: trigger, exclusion, write/approval behavior, idempotency, and truncation limit.

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 bundle_id, terms_url, approval_id, privacy_url and disclosure_by_locale are already fully documented in the schema. The description alludes to the approval_id round-trip via the 'approval_required refusal' mention but adds no syntax or format detail beyond the schema, so the baseline of 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 (append) and resource (subscription disclosure, Terms/EULA and Privacy links to the app description, in every language) with the Apple 3.1.2 rationale. It also explicitly names the sibling it is not (deliver_metadata), so an agent can separate it from other metadata tools without opening a schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when: preparing a subscription app for review' trigger and a 'Not for: uploading other metadata (use deliver_metadata)' exclusion with a named alternative. Nothing about when to select this versus siblings is left to inference.

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

asc_create_appASC Create AppA
Destructive

Create an app shell in App Store Connect via fastlane produce (live write, needs human approval).

Use when: after aso_check_name confirms a free name; pass candidate_names and the first available is used. Not for: bundle ids (asc_create_bundle_id) or metadata (deliver_metadata). Returns: {ok, app_id, name, ...} or an approval_required refusal.

NameRequiredDescriptionDefault
skuNoUnique SKU string for the app record; omit to derive from the bundle id.
app_nameNoSingle app name; prefer candidate_names. Converted to a one-element candidate list.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
candidate_namesNoOrdered candidate App Store names; the first one not already taken is used.
primary_languageNoPrimary App Store language, e.g. 'en-US'.en-US

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, but the description adds critical behavior they cannot: this is a live write gated by human approval, the first call may return an approval_required refusal, and a re-call with approval_id is needed. That two-phase approval protocol is genuinely new information.

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?

Front-loaded with the action, then explicit Use when / Not for / Returns sections. Dense and skimmable with no filler sentences; every clause carries routing or behavioral information.

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?

Covers the destructive-write risk, the approval prerequisite, and the refusal outcome well, and an output schema exists so return values need not be detailed further. Minor gap: it doesn't state that the bundle_id must already exist (create_bundle_id ordering), though the 'Not for' clause implies the relationship.

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 every parameter is already documented in the schema, including candidate_names first-available semantics and approval_id's retry role. The description adds only a restatement ('pass candidate_names and the first available is used'), so the 3 baseline 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+resource ('Create an app shell in App Store Connect') and names the underlying mechanism (fastlane produce). The 'Not for' clause explicitly distinguishes it from asc_create_bundle_id and deliver_metadata, so an agent can route without opening another schema.

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

Usage Guidelines5/5

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

Gives an explicit precondition ('after aso_check_name confirms a free name'), the key argument to pass (candidate_names, with first-available semantics), and explicit exclusions naming the sibling tools that cover bundle ids and metadata. Full when/when-not/alternative coverage.

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

asc_create_bundle_idASC Create Bundle IDA
Destructive

Register a bundle id in App Store Connect and check or apply its App ID capabilities (live write, needs human approval).

Use when: first ASC step for a new app; capabilities (IN_APP_PURCHASE, Sign in with Apple, HEALTHKIT if enabled) must exist before signing. Not for: creating the app record (use asc_create_app). Returns: {bundle_id: , capabilities: <store_setup report>} or an approval_required refusal.

NameRequiredDescriptionDefault
nameYesHuman-readable name of the bundle id in the developer portal, e.g. 'My App'.
app_dirNoAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
identifierYesBundle identifier to register, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
apply_capabilitiesNoIf true, also enable the spec's App ID capabilities (needs app_dir); false only checks them.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructive=true, openWorld=true, and idempotent=false, so the mutation/risk profile is covered. The description adds genuinely new behavioral context beyond that: the live-write-needs-human-approval requirement and the approval_required refusal path. It stops short of disclosing what a partial capability failure does or how retries interact with the created bundle id, so it falls just under full marks.

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?

Three tightly structured blocks (purpose, Use when / Not for, Returns) with zero filler. The action and its routing constraint are front-loaded ahead of the return-shape detail.

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 destructive, approval-gated mutation this covers everything the agent needs: prerequisites (capabilities before signing), the sibling to use instead, the approval loop, and a return shape. An output schema exists, so the brief 'Returns' line is appropriately terse rather than duplicative.

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 100%, so the baseline is 3 and the schema already documents all five parameters including approval_id and apply_capabilities. The description adds value by naming the concrete capabilities acted on (IN_APP_PURCHASE, Sign in with Apple, HEALTHKIT if enabled), which the boolean apply_capabilities does not convey.

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 and resource ('Register a bundle id in App Store Connect') plus the secondary action (check or apply App ID capabilities). It explicitly distinguishes itself from the sibling asc_create_app, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Has an explicit 'Use when' (first ASC step for a new app; capabilities must exist before signing) and an explicit 'Not for' that names the alternative tool (asc_create_app). Both the positive and negative selection conditions are given.

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

asc_create_subscriptionASC Create SubscriptionA
Destructive

Create a subscription product inside a subscription group (live write, needs human approval).

Use when: hand-building a single product. Prefer store_setup for the whole spec. Returns: {ok, data: {data: {id, ...}}} or an approval_required refusal.

NameRequiredDescriptionDefault
nameYesInternal reference name of the subscription product.
periodNoSubscription period enum: ONE_WEEK, ONE_MONTH, TWO_MONTHS, THREE_MONTHS, SIX_MONTHS or ONE_YEAR.ONE_YEAR
group_idYesApp Store Connect subscription group id.
product_idYesProduct identifier of the subscription, e.g. com.example.app.yearly.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
family_shareableNoWhether the subscription can be shared with family members; default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already disclose destructive=true, idempotent=false, openWorld=true, so the safety profile is covered. The description adds real value beyond them: 'live write, needs human approval' and the 'approval_required refusal' outcome, which explain the human-in-the-loop gate the agent must expect. It stops short of detailing reversibility or timing, hence a 4 rather than 5.

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?

Three short lines, each earning its place: purpose, routing rule, return contract, all front-loaded with no 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?

An output schema exists, so the return-value line is a helpful bonus rather than a necessity, and it flags the non-obvious approval_required refusal path. Combined with the approval flow documented in the schema, an agent has everything needed to call this correctly.

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 every parameter (including the approval_id retry flow) is fully documented in the schema. The description adds no parameter-level meaning, 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 and resource ('Create a subscription product inside a subscription group'), which cleanly distinguishes it from siblings like asc_create_subscription_group and asc_finalize_subscription. The parenthetical scope '(live write, needs human approval)' sharpens it further.

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

Usage Guidelines5/5

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

Explicitly names the use condition ('Use when: hand-building a single product') and the preferred alternative ('Prefer store_setup for the whole spec'), routing the agent without inference.

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

asc_create_subscription_groupASC Create Subscription GroupA
Destructive

Create a subscription group for an app (live write, needs human approval).

Use when: hand-building the subscription tree. Prefer store_setup, which does groups, products, prices and offers idempotently from app.spec.json. Returns: {ok, data: {data: {id, ...}}} or an approval_required refusal.

NameRequiredDescriptionDefault
app_idYesApp Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
reference_nameYesInternal reference name of the subscription group (not shown to users).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare write/destructive/non-idempotent, and the description corroborates plus adds the crucial out-of-band approval requirement and the refusal shape ('or an approval_required refusal'). It stops short of detailing what the live write mutates downstream, so a 4.

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?

Three tight sentences with 'Use when' and 'Returns' labels; the approval caveat is front-loaded in the first line. No filler.

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 an output schema present and full schema coverage, the description covers what an agent needs: purpose, alternative, approval workflow, and refusal case. Minor gap is the absence of success/error nuance beyond the refusal, but nothing essential 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%, so the schema already documents app_id, reference_name, and the approval_id flow in detail. The description adds no parameter-level syntax or constraints beyond it, so 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 and resource ('Create a subscription group for an app') and immediately scopes it as a live write requiring approval. It is clearly distinguishable from siblings like asc_create_subscription and store_setup.

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

Usage Guidelines5/5

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

Explicitly gives the when ('hand-building the subscription tree') and names the preferred alternative with the reason ('store_setup, which does groups, products, prices and offers idempotently from app.spec.json'). This is textbook routing guidance.

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

asc_ensure_subscription_pricesASC Ensure Subscription PricesA
DestructiveIdempotent

Set a price on every subscription of the app that has none, clearing MISSING_METADATA (live write, needs human approval).

Use when: subscriptions are stuck in MISSING_METADATA for price. Idempotent: priced subscriptions are skipped. Returns: {ok, priced: [...], skipped: [...]} or an approval_required refusal.

NameRequiredDescriptionDefault
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
default_usdNoUSD price string applied to subscriptions not listed in usd_price_by_product.
usd_price_by_productNoMap of subscription productId to USD price string, e.g. {'com.example.app.yearly': '49.99'}.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: a live write requiring human approval, an out-of-band approval flow via approval_required refusal, and skip semantics ('Idempotent: priced subscriptions are skipped'). Annotations already declare destructiveHint and idempotentHint, but the description supplies the approval workflow and exact return shape that an agent needs.

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?

Three tight sentences, front-loaded with the action, followed by the trigger condition and return shape. Every sentence carries unique information and there is no redundancy.

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?

Covers purpose, when-to-use, idempotency, approval requirement, and return/refusal outcomes. With an output schema present and annotations covering safety, the description is complete enough for an agent to invoke correctly.

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 all four parameters including the approval_id workflow are already documented in the schema. The description adds no parameter-level syntax or format detail beyond what the schema provides, making the baseline 3 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?

States a specific verb and resource: 'Set a price on every subscription of the app that has none'. The MISSING_METADATA condition makes the scope distinctive, but no sibling tool is named as an alternative, so it stops short of full sibling differentiation.

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?

Gives an explicit trigger: 'Use when: subscriptions are stuck in MISSING_METADATA for price.' This is clear context for invocation, though it does not state when not to use the tool or name an alternative for other pricing scenarios.

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

asc_finalize_submission_requirementsASC Finalize Submission RequirementsA
DestructiveIdempotent

Fill the submit-blocking app-level fields in one call: content rights, copyright, age rating (4+), free price, App Review contact and notes (live write, needs human approval).

Use when: once per app before asc_submit_for_review. App Privacy is not in Apple's API and must be set in the ASC web UI. Missing copyright falls back to config; missing contact_email to support_email. Returns: {ok, steps...} or an approval_required refusal.

NameRequiredDescriptionDefault
freeNoIf true (default) the app price is set to Free.
app_nameNoApp name used to fill the generic App Review notes template.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
copyrightNoCopyright line for the store listing, e.g. '2026 Example Ltd'; falls back to the config 'copyright' key.
ai_servicesNoShort description of the AI services the app uses, inserted into the review notes.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
contact_lastNoApp Review contact last name.
review_notesNoCustom App Review notes; omit to fill the generic 7-item test-flow template.
contact_emailNoApp Review contact email; defaults to the config support_email.
contact_firstNoApp Review contact first name.
contact_phoneNoApp Review contact phone in international format, e.g. '+14155550100'.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Adds real value beyond annotations: it discloses that this is a 'live write, needs human approval', describes the approval_required refusal path, and states fallback behavior for missing copyright and contact_email. However, annotations flag destructiveHint=true and the description never explains what existing listing values this overwrite or what 'destructive' means here, leaving one meaningful gap.

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?

Front-loads the core purpose, then uses tight 'Use when:' and 'Returns:' labeled clauses. Zero filler and every sentence carries operational information.

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?

An output schema exists, so the brief Returns summary is sufficient, and the description covers the approval refusal mode and the App Privacy caveat. It is largely complete, with only the unexplained destructive semantics of the write left out.

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 every parameter including the copyright/support_email fallbacks that the description repeats. The description adds no format or constraint detail beyond what the schema provides, 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 and resource ('Fill the submit-blocking app-level fields in one call') and enumerates the concrete fields it writes (content rights, copyright, age rating, price, review contact/notes). It distinguishes itself from the sibling asc_submit_for_review by positioning as the prerequisite step.

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

Usage Guidelines5/5

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

'Use when: once per app before asc_submit_for_review' gives explicit timing and routing. It also states an exclusion condition (App Privacy must be set in the ASC web UI because it is not in Apple's API) and describes the approval-gated retry flow.

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

asc_finalize_subscriptionASC Finalize SubscriptionA
DestructiveIdempotent

Finalize one subscription in order: localization, availability (all but CHN), price, intro offer (live write, needs human approval).

Use when: fixing a single product by hand. Prefer store_setup, which does every product idempotently. Pass the spec product's intro (e.g. {"type": "free", "duration": "P3D"}); offer products get no intro. Returns: {ok, steps...} per step, or an approval_required refusal.

NameRequiredDescriptionDefault
nameYesSubscription display name shown to users (en-US).
introNoIntro offer from the spec product, e.g. {"type": "free", "duration": "P3D"}; omit for offer products (no intro).
periodNoIgnored; kept for backward compatibility.
sub_idYesApp Store Connect subscription id.
usd_priceYesUSD base price as a decimal string, e.g. '49.99'.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
descriptionYesSubscription description shown to users (en-US).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive/idempotent/openWorld hints, but the description adds material context beyond them: 'live write, needs human approval', the approval_required refusal, availability excluding CHN, and the per-step return shape. It stops short of detailing exactly what the live write mutates, but the approval workflow is a meaningful disclosure.

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?

Front-loads the operation and its ordered steps, then 'Use when' guidance, then the return contract. Every sentence carries distinct information with no padding.

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?

Given an output schema exists, return values need not be explained, yet the description still gives the shape and the approval refusal path. Combined with rich annotations and full schema coverage, an agent has everything needed to call it correctly.

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 all 7 parameters including approval_id and intro are already documented in the schema. The description only restates the intro example ('P3D') and offer-product rule, adding marginal value over the schema.

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+resource ('Finalize one subscription') and even enumerates the ordered sub-steps (localization, availability, price, intro offer). It distinguishes itself from sibling store_setup by scoping to a single product.

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

Usage Guidelines5/5

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

Explicit 'Use when: fixing a single product by hand' and names the preferred alternative store_setup with the reason (does every product idempotently). Clear when-to-use and routing to the better tool is fully specified.

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

asc_get_appASC Get AppA
Read-onlyIdempotent

Find one App Store Connect app by bundle id (live, read-only).

Use when: you need the numeric app id for a known bundle id. Not for: listing all apps (use asc_list_apps). Returns: {ok, data: {data: [app resources]}} from the ASC API.

NameRequiredDescriptionDefault
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds 'live, read-only' and a return shape, but these are largely redundant with the annotations or output schema. It does not disclose auth requirements or error/rate-limit behavior, so it adds only modest behavioral context.

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?

The description is short, front-loaded, and structured as purpose, usage, exclusion, and return shape. Every sentence earns its place with no filler or repetition.

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 simple one-parameter, read-only lookup tool with full schema coverage, annotations, and an output schema, the definition is complete. It covers what the tool does, when to use it, when not to use it, and the alternative, so an agent has everything needed to call it correctly.

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 required parameter bundle_id is fully documented in the schema with reverse-DNS format guidance. The description mentions bundle id as the lookup key but adds no syntax or format meaning beyond the schema, so the baseline 3 is appropriate.

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 and resource: find one App Store Connect app by bundle id. It explicitly distinguishes itself from the sibling listing tool asc_list_apps, so an agent can select it correctly without opening the schema.

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

Usage Guidelines5/5

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

Includes explicit when-to-use guidance ('you need the numeric app id for a known bundle id') and a clear when-not-to-use exclusion ('Not for: listing all apps (use asc_list_apps)'). The alternative is named directly.

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

asc_list_appsASC List AppsA
Read-onlyIdempotent

List the apps in App Store Connect (live, read-only).

Use when: you need app ids or want to see what exists. To find one app by bundle id use asc_get_app. Returns: {ok, count, apps: [{id, bundleId, name, sku}]}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.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, so the safety profile is covered. The description adds that results are 'live' (not cached), which is genuinely beyond the annotations, though it does not discuss pagination or rate limits.

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?

Three short, front-loaded lines: purpose, usage, returns. No filler; the scoping and routing information comes before any detail.

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?

Despite the output schema already existing, the description stays complete for a zero-parameter list tool: purpose, when to use, alternative, and return shape are all present. 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.

Parameters4/5

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

The tool takes no parameters, so there is nothing to disambiguate; baseline 4 applies. No parameter-level guidance is possible or needed.

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 ('List') and resource ('apps in App Store Connect') and immediately scopes it as live and read-only. It is clearly distinguishable from asc_get_app, which retrieves a single app.

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

Usage Guidelines5/5

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

Explicit 'Use when: you need app ids or want to see what exists' plus direct routing to the alternative 'To find one app by bundle id use asc_get_app'. Both the when and the when-not are stated.

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

asc_localize_groupASC Localize GroupA
DestructiveIdempotent

Localize a subscription group's display name in many languages at once (live write, needs human approval).

Use when: several locales are needed; for one locale use asc_add_subscription_group_localization. Returns: {ok, done: [locales], skipped: [locales]} or an approval_required refusal.

NameRequiredDescriptionDefault
group_idYesApp Store Connect subscription group id.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
name_by_localeYesMap {locale: group display name}.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (which already declare destructive, idempotent, open-world, and non-read-only), the description adds the critical behavioral trait that this is a live write requiring human approval, and it describes the approval-refusal outcome. This goes well beyond what the structured annotations provide.

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?

The description is three tight sentences: purpose first, usage condition and alternative second, return shape third. Every sentence earns its place and the most important information is front-loaded.

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?

Given the output schema already exists, the description need not explain return values in detail, yet it still does briefly. Together with the rich annotations and the explicit alternative for single-locale use, an agent has everything needed to call this tool correctly.

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 fully documents group_id, approval_id, and name_by_locale. The description adds no additional syntax or format details for the parameters, so the baseline of 3 applies 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.

Purpose5/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 ('Localize a subscription group's display name') and scope ('in many languages at once'). It also distinguishes itself from the sibling asc_add_subscription_group_localization for the single-locale case, so an agent can select it correctly without opening schemas.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('Use when: several locales are needed') and an explicit alternative ('for one locale use asc_add_subscription_group_localization'). The condition that selects the alternative is clear, leaving no inference needed.

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

asc_localize_subscriptionASC Localize SubscriptionA
DestructiveIdempotent

Localize a subscription's name and description in many languages at once (live write, needs human approval).

Use when: filling per-locale product copy. Languages the IAP API does not support are skipped. Returns: {ok, done: [locales], skipped: [locales]} or an approval_required refusal.

NameRequiredDescriptionDefault
itemsYesMap {locale: {name, description}} of subscription display copy per locale.
sub_idYesApp Store Connect subscription id.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the safety profile is covered structurally. The description adds genuinely non-redundant context: it is a live write requiring human approval, unsupported locales are silently skipped, and the result/refusal shapes are named.

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?

Three front-loaded lines: action, when-to-use, and return contract. No filler, and the approval caveat is placed where an agent will read it before invoking.

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?

An output schema exists, so return values need not be re-explained at length, and annotations cover safety. The description still supplies the approval_required refusal path and locale-skipping behavior, leaving little an agent needs 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%, including the approval_id round-trip protocol, so the schema carries parameter meaning. The description adds little beyond reinforcing the batch-locale semantics, which is baseline-3 territory 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 specific verb and resource ('Localize a subscription's name and description in many languages at once'), which cleanly separates it from the group-level localization siblings such as asc_localize_group. It never names an alternative explicitly, but the resource qualifier does the differentiation work.

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?

'Use when: filling per-locale product copy' gives clear context for invocation. It does not name alternative tools (e.g., asc_localize_group vs asc_add_subscription_group_localization) or state exclusions, so it stops short of the 5 bar.

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

asc_sbp_checkASC SBP CheckA
Read-onlyIdempotent

Prove Small Business Program status from the latest subscription sales report (US proceeds/price ratio, about 0.85 SBP vs 0.70 standard; live, read-only).

Use when: confirming the 15% commission. Needs a Finance-role key (asc_finance_key_id, asc_finance_key_filepath, asc_vendor_number); a 403 gives a clear error. Returns: {ok, ratio, program, report_date}.

NameRequiredDescriptionDefault
days_backNoHow many days back to search for the latest report (default 7).
report_dateNoSales report date YYYY-MM-DD; omit to use the latest available.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety bar is lower. The description adds real value beyond them: required Finance-role credentials (asc_finance_key_id, asc_finance_key_filepath, asc_vendor_number) and the 403 error behavior, which an agent needs to pre-flight the call.

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?

Front-loaded with the purpose, then clearly delimited 'Use when' and 'Returns' sections. Every sentence carries information: the ratio heuristic, the auth requirement, the failure behavior, and the return shape.

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?

An output schema exists and the description still summarizes the shape ({ok, ratio, program, report_date}). With auth prerequisites, error behavior, and usage trigger all present, nothing an agent needs to invoke this 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%, so days_back and report_date are fully documented in the schema. The description only implies 'latest report' semantics and adds no syntax or format detail beyond that, which matches the baseline 3 for schema-covered parameters.

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 and resource ('Prove Small Business Program status from the latest subscription sales report') plus the discriminating detail (0.85 SBP vs 0.70 standard ratio). An agent can distinguish it from the other asc_* siblings such as asc_token_check or asc_list_apps at a glance.

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?

'Use when: confirming the 15% commission' gives an explicit trigger condition, and the description states the Finance-role key prerequisites and the 403 failure mode. It does not name an alternative tool, but no obvious sibling competes for this purpose, so the guidance is clear without exclusions.

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

asc_submit_for_reviewASC Submit For ReviewA
Destructive

Submit the app to App Store review (live write, ALWAYS needs out-of-band human approval, even with approvals off).

Use when: everything else is ready and the human has approved. Without a valid approval_id nothing is submitted. Not for: uploading a TestFlight build (use testflight_ship). Returns: {ok, review_submission_id, detail} or {ok: false, blockers, next}, or an approval_required refusal.

NameRequiredDescriptionDefault
app_idYesApp Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already flag destructive/non-idempotent/openWorld, but the description adds non-obvious behavior: it ALWAYS requires out-of-band human approval even with approvals disabled, and it discloses the failure modes (approval_required refusal, {ok:false, blockers, next}). This is exactly the kind of gating and refusal semantics an agent cannot infer from structured fields.

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?

Three short labeled blocks (purpose, Use when/Not for, Returns) with the critical write/approval warning front-loaded. Every sentence carries routing or behavioral information; no 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?

The tool is a high-stakes irreversible write with only two params and an output schema; the description covers the approval gate, the alternative tool, and a return-shape summary. Nothing an agent needs to call it safely is missing.

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 100%, so the baseline is 3; the description nudges higher by stating the consequence of a missing/invalid approval_id ('nothing is submitted') and reinforcing the re-call flow. It does not add much beyond the already-detailed schema text for approval_id.

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+resource ('Submit the app to App Store review') and immediately qualifies it as a live write. It explicitly contrasts with the nearest sibling ('Not for: uploading a TestFlight build (use testflight_ship)'), so the agent can route correctly without opening the schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' precondition (everything ready + human approved) and an explicit 'Not for' exclusion naming the alternative tool. Nothing about when to select this tool is left to inference.

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

asc_token_checkASC Token CheckA
Read-onlyIdempotent

Verify App Store Connect authentication through the asc CLI with one live read-only call.

Use when: before any asc_* tool, to confirm key id, issuer and .p8 work. Not for: listing apps (use asc_list_apps). Returns: {ok, asc: {path, version}, auth_source, key_id, p8, keychain_profiles, note, error?}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/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 safety is covered. The description adds genuinely new context: the call is live, it validates key id/issuer/.p8, and it returns auth_source/keychain_profiles diagnostics, which annotations alone would not convey.

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?

Front-loaded with the action, then when/not-for and returns on their own lines. The returns block enumerates fields that the output schema already covers, so a small amount of it is redundant, but the structure remains tight.

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 parameterless diagnostic with a full output schema, the description supplies trigger, exclusion, and mechanism. An agent has everything needed to decide when to run it before the asc_* family.

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?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate beyond the no-arg nature that the empty schema already implies.

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+resource ('Verify App Store Connect authentication through the asc CLI') with the mechanism (one live read-only call). It explicitly names the sibling it is not: listing apps (asc_list_apps).

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

Usage Guidelines5/5

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

Gives an explicit 'Use when' trigger (before any asc_* tool, to confirm key id, issuer and .p8 work) and an explicit 'Not for' exclusion routing to asc_list_apps. Nothing is left to inference.

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

aso_check_nameASO Check NameA
Read-onlyIdempotent

Check whether an App Store app name is free, by exact-name collision in iTunes Search.

Use when: testing one name before asc_create_app. For several names use aso_find_available_name. Returns: {ok, name, available, conflicts: [...]}.

NameRequiredDescriptionDefault
nameYesCandidate App Store app name to check.
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, open-world), so the bar is lower; the description still adds real signal by disclosing the exact-match-only methodology, which tells the agent this will not surface near-collisions or fuzzy matches. It also names the response keys, though those live in the 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.

Conciseness5/5

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

Three short, front-loaded lines: purpose first, then a labelled 'Use when:' routing clause, then returns. Zero 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?

For a two-parameter read-only lookup with an output schema, the description supplies purpose, the one sibling fallback, and the matching method — 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%, so both parameters are already documented in the schema. The description adds nothing about the 'country' storefront scoping or default 'us', 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 ('Check whether ... is free'), the exact resource (App Store app name), and even the mechanism ('exact-name collision in iTunes Search'). It is immediately distinguishable from the sibling aso_find_available_name, which it names.

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

Usage Guidelines5/5

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

The 'Use when:' clause gives a concrete trigger ('testing one name before asc_create_app') and an explicit alternative with its selecting condition ('For several names use aso_find_available_name'). No inference required.

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

aso_competitor_iapASO Competitor IAPA
Read-onlyIdempotent

Fetch a competitor's subscription/IAP price ladder from its App Store product page.

Use when: setting our pricing. app_id is the iTunes trackId from aso_fetch_competitors. Fragile, undocumented source: on failure ok:false and prices null mean unknown, not free. Returns: {ok, prices: [{name, price}] | null} (untrusted_content).

NameRequiredDescriptionDefault
app_idYesApp Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId.
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), but the description adds high-value context beyond them: the source is flagged 'fragile, undocumented', failure semantics are spelled out (ok:false and prices null mean unknown, not free), and the return payload is tagged untrusted_content. These are exactly the behavioral facts an agent needs and cannot get from structured fields.

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?

Three short, front-loaded sentences with zero filler: purpose first, then when-to-use plus the id source, then the failure/return contract. Every sentence carries distinct information.

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 2-param read tool with a declared output schema and rich annotations, the description covers the remaining gaps: the unreliability of the upstream source, the meaning of a null prices result, and the untrusted nature of the data. 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%, so both app_id and country are already documented in the input schema, including the note that app_id is the iTunes trackId for this tool. The description restates that same fact, adding little beyond the schema – 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 and resource ('Fetch a competitor's subscription/IAP price ladder from its App Store product page') with clear scope limited to competitors, which cleanly separates it from the account-side pricing tools (asc_ensure_subscription_prices, pricing_unit_economics). An agent can identify the operation without opening the schema.

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?

'Use when: setting our pricing' gives explicit context, and it names aso_fetch_competitors as the upstream source of the required app_id. It stops short of stating when NOT to use it or naming any alternative competitor-pricing tool, so it is clear but not fully exhaustive.

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

aso_completeASO CompleteA
Idempotent

Validate the ASO output and mark the 'aso' stage done, opening the metadata/deliver gate.

Use when: ASO files are written. Not for: other stages (use pipeline_mark). Returns: {ok, problems?} or a refusal listing what is missing.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover idempotency and non-destructiveness, so the bar is lower; the description adds genuinely new behavioral context by disclosing the gate-opening side effect and the refusal-with-missing-items outcome on failure. It does not clarify whether validation failure leaves any partial state, which is the one remaining ambiguity for a mutating tool.

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?

Three short, front-loaded clauses: action, usage routing, and return shape. Every sentence carries information and nothing is repeated from the annotations or schema.

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 mutation tool with an output schema, the description covers the action, the routing rule, and the side effect on the pipeline gate. Return values are already captured by the output schema, so 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 there is only one parameter, so the schema already documents app_dir fully. The description adds no format or path semantics beyond what the schema provides, which matches the baseline 3 for a fully-covered single parameter.

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?

The description names a specific verb+resource pair ('Validate the ASO output') and goes further by stating the state transition it performs ('mark the 'aso' stage done, opening the metadata/deliver gate'). It explicitly contrasts itself with the sibling pipeline_mark, so an agent can distinguish them without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('Use when: ASO files are written') and an explicit exclusion with an alternative ('Not for: other stages (use pipeline_mark)'). This is the full when/when-not/alternative pattern.

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

aso_fetch_competitorsASO Fetch CompetitorsA
Read-onlyIdempotent

Fetch competitor apps for a search term through iTunes Search (live, read-only).

Use when: sizing up a niche or getting trackIds for aso_competitor_iap. For a scored go/no-go use aso_niche_score. Returns: {ok, count, apps: [{trackId, name, ratings, price, ...}]} (untrusted_content).

NameRequiredDescriptionDefault
termYesSearch term or seed keyword, e.g. 'habit tracker'.
limitNoNumber of competitor apps to return (default 10).
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/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 openWorld, so the safety profile is covered. The description adds genuinely new context: it is a live call to iTunes Search, and the response is tagged untrusted_content, which is security-relevant and not visible in annotations.

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?

Three short, front-loaded sentences — purpose, usage/alternatives, then return shape. No filler and the key routing information is not buried.

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 read-only fetch with an output schema (so return values need not be spelled out), the description still summarizes the payload and flags untrusted_content. Nothing needed 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%, so term, limit and country are fully documented in the schema. The description adds no syntax or format details beyond that, making the baseline 3 appropriate.

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?

The description states a specific verb and resource ('Fetch competitor apps for a search term') and names the underlying source ('through iTunes Search'), which lets an agent distinguish it from aso_niche_score and aso_competitor_iap.

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

Usage Guidelines5/5

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

It gives an explicit 'Use when' clause (sizing up a niche, gathering trackIds for aso_competitor_iap) and routes the agent to a named alternative ('For a scored go/no-go use aso_niche_score'), covering both when and when-not.

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

aso_find_available_nameASO Find Available NameA
Read-onlyIdempotent

Pick the first available App Store name from a candidate list.

Use when: you have ordered name options; a taken name gets a submission rejected. For one name use aso_check_name. Returns: {ok, name, checked: [...]} or {ok: false} if none is free.

NameRequiredDescriptionDefault
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us
candidatesYesOrdered candidate app names.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive. The description adds genuinely useful behavior beyond them: it selects the FIRST available name (ordering semantics) and discloses the failure mode ({ok: false} if none is free). It does not restate the return shape much beyond the output schema, so it stops short of a 5.

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?

Three tight lines with the action front-loaded, followed by usage and return. Every sentence earns its place with zero 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 an output schema present and full schema coverage, the description covers purpose, usage, alternative, and the none-free fallback. 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%, so both the country and candidates parameters are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, 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 and resource ('Pick the first available App Store name from a candidate list') and names the sibling it differs from ('For one name use aso_check_name'). An agent can distinguish it from aso_check_name without opening either schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' clause gives the triggering condition (ordered name options, avoiding rejection of taken names) and routes the single-name case to the alternative aso_check_name. Nothing is left to inference.

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

aso_niche_scoreASO Niche ScoreA
Read-onlyIdempotent

Score an idea 0-100 from demand, competitor weakness, saturation and monetization, with a go/no-go verdict.

Use when: ranking one idea quickly. For the full evidence bundle use idea_evaluate. verdict: GO (>=60), MAYBE (>=40), WEAK, REJECT (median competitor >50k ratings or no demand). Returns: {ok, score, verdict, demand, competitors, ...} (untrusted_content).

NameRequiredDescriptionDefault
termYesSearch term or seed keyword, e.g. 'habit tracker'.
genreNoApp Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred.
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), but the description adds real behavioral value the annotations cannot: the verdict thresholds (GO >=60, MAYBE >=40, WEAK, REJECT conditions) and the untrusted_content flag on output. It omits any latency/cost or source-of-data context, so it is strong rather than complete.

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?

Three short, front-loaded chunks: what it does, when to use it vs the sibling, and the verdict logic. Every sentence earns its place with no filler.

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?

An output schema exists, yet the description still restates the return shape, which is mildly redundant but harmless. The verdict thresholds and untrusted-content warning are useful additions that make the definition callable with confidence; only minor gaps (e.g., what 'demand'/'competitors' contain) remain.

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 fully documents term, genre, and country. The description only implicitly echoes the 'idea' input and adds no syntax, format, or default guidance 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.

Purpose5/5

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

States a specific verb and resource ('Score an idea 0-100') plus the exact scoring dimensions (demand, competitor weakness, saturation, monetization) and a verdict output. It explicitly differentiates itself from the sibling idea_evaluate, so an agent can pick it without opening either schema.

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

Usage Guidelines5/5

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

'Use when: ranking one idea quickly. For the full evidence bundle use idea_evaluate' gives both the condition for use and the named alternative with its selecting condition. Nothing is left to inference.

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

aso_runASO RunA
Idempotent

Start the mandatory ASO stage: create the outputs skeleton and return the skill instructions.

Use when: the pipeline reaches ASO. Finish with aso_complete. Returns: {ok, outputs_dir, instructions}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the mutation/safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description only needs to add context. It usefully notes the side effect of creating an outputs skeleton and that skill instructions are returned, but it does not say what happens to pre-existing outputs on a re-run, despite claiming idempotency.

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 short, front-loaded sentences with the action, trigger, and follow-up in priority order. The trailing 'Returns: {ok, outputs_dir, instructions}' is mild redundancy given a declared output schema, but it is compact.

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 annotations, a 100%-covered schema, and an output schema, the description only needs to supply purpose and sequencing, which it does. The main missing piece is disambiguation from aso_scaffold_outputs and behavior on repeat invocation.

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 app_dir parameter is fully documented in the schema, so the description adds nothing beyond it. Baseline 3 is appropriate when the schema carries all parameter meaning.

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: 'Start the mandatory ASO stage: create the outputs skeleton and return the skill instructions.' An agent can tell this is the ASO stage entry point rather than a completion or validation step. It does not, however, distinguish itself from the closely named sibling aso_scaffold_outputs, which the phrase 'create the outputs skeleton' would otherwise suggest.

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?

Gives explicit activation context ('Use when: the pipeline reaches ASO') and names the terminating counterpart ('Finish with aso_complete'), which is genuine routing information. It stops short of exclusions, e.g. when to prefer aso_scaffold_outputs over this tool or what to do if the stage was already started.

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

aso_scaffold_outputsASO Scaffold OutputsA
Idempotent

Create the outputs// ASO skeleton including apple-metadata.md in 32 languages.

Use when: standalone ASO work. Inside the pipeline use aso_run, which also returns the skill instructions. Returns: {ok, dir, files}.

NameRequiredDescriptionDefault
localesNoLocale codes for the metadata skeleton; omit for the 32 default languages.
app_nameYesApp name; creates outputs/<app_name>/.
base_dirYesDirectory that contains (or will contain) the outputs/<App>/ folder.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, covering the safety/mutation profile. The description adds the default 32-language scope, but says nothing about what happens to pre-existing files on a repeat call (idempotency semantics) and its 'Returns' line merely restates the 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.

Conciseness4/5

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

Three short, front-loaded sentences with clear 'Use when' and 'Returns' labels and no filler. The Returns sentence is redundant given the output schema, which is the only wasted line.

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 annotations, a 100%-covered schema, and an output schema present, the description covers purpose, routing, and return shape adequately. Only the idempotent-overwrite behavior on existing files is left unstated, a minor gap for this scaffolding tool.

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%, so app_name, base_dir, and locales are fully documented in the schema. The description's '32 languages' note loosely reinforces the locales default but adds no syntax or format detail beyond what the schema already provides; 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?

Specific verb (Create) plus concrete resource (outputs/<App>/ ASO skeleton with apple-metadata.md in 32 languages). It explicitly distinguishes itself from the sibling aso_run, so an agent can choose between them without opening schemas.

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

Usage Guidelines5/5

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

Explicit 'Use when: standalone ASO work' paired with 'Inside the pipeline use aso_run' gives both the positive condition and the named alternative, which is exactly the routing guidance an agent needs.

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

aso_search_hintsASO Search HintsA
Read-onlyIdempotent

Query App Store autocomplete for real search demand; the idea-stage hard gate (0 suggestions for a real term = no demand, reject).

Use when: validating an idea or expanding keywords (expand=true appends a-z). An endpoint error returns ok:false, never an empty list. Returns: {ok, term, suggestions: [...], count} (untrusted_content).

NameRequiredDescriptionDefault
termYesSearch term or seed keyword, e.g. 'habit tracker'.
expandNoIf true, append a-z to the seed to collect the full keyword universe; default false.
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Adds important behavior beyond the annotations: 0 suggestions for a real term is treated as no demand, and endpoint errors return ok:false rather than an empty list. It also notes the response contains untrusted_content, which is valuable safety context for an open-world read tool.

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?

Front-loads the core purpose, follows with usage guidance, then error/return behavior in three compact sentences. Every sentence carries useful information.

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?

Given the rich annotations, full schema coverage, and an output schema, the description is complete enough. It adds the interpretive hard-gate rule and error behavior without unnecessarily restating return fields.

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 term, expand, and country. The description repeats that expand=true appends a-z but adds no further parameter syntax or default semantics beyond the schema.

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: query App Store autocomplete for real search demand. The 'idea-stage hard gate' framing makes the function clear, but it does not explicitly differentiate itself from sibling ASO/idea-validation tools such as aso_niche_score or idea_evaluate.

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?

Provides clear usage context: use when validating an idea or expanding keywords, with expand=true for a-z expansion. It does not name alternatives or state when-not to use it, so it falls short of explicit sibling routing.

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

aso_top_grossingASO Top GrossingA
Read-onlyIdempotent

List the top-grossing apps of a storefront and optional category as a revenue proxy.

Use when: hunting proven ideas in one category. To sweep all categories and storefronts use idea_harvest. An unknown genre returns ok:false, never the overall chart. Returns: {ok, apps: [...]} (untrusted_content).

NameRequiredDescriptionDefault
genreNoApp Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred.
limitNoNumber of chart entries to return (default 25).
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description goes beyond that by disclosing failure semantics ('an unknown genre returns ok:false, never the overall chart') and the return envelope, which are real behavioral traits not encoded in the structured fields.

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?

Three short lines, purpose first, then routing guidance, then return/error behavior. Every sentence carries information and none is redundant.

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?

An output schema exists, so the description need not explain return values in depth, yet it still summarizes the envelope and the error path. Combined with the annotations and full schema coverage, an agent has enough to call this correctly; only minor depth (e.g. ranking or pagination semantics) is absent.

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 genre, limit, and country are fully documented in the schema itself. The description adds a little framing ('optional category', 'storefront') but no syntax or format detail beyond what is already there, so the baseline of 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 and resource ('List the top-grossing apps') and pins down the scope ('of a storefront and optional category'), plus the purpose ('as a revenue proxy'). The sibling it is not (idea_harvest) is named, so an agent can route without opening the schema.

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

Usage Guidelines5/5

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

'Use when: hunting proven ideas in one category' gives an explicit triggering context, and the next sentence names the alternative (idea_harvest) with the condition that selects it ('sweep all categories and storefronts'). Nothing is left to inference.

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

aso_unit_economicsASO Unit EconomicsA
Read-onlyIdempotent

Compute margin, break-even and warnings from prices, credits and AI cost (pure calculation, no network).

Use when: idea/scaffold stage pricing decisions. Not for: measured-cost economics for a built app (use pricing_unit_economics). apple_cut is 0.15 for Small Business, else 0.30. Returns: {ok, weekly, yearly, margins, break_even, warnings}.

NameRequiredDescriptionDefault
apple_cutNoApple's commission as a fraction: 0.15 (Small Business Program, default) or 0.30.
weekly_priceNoWeekly subscription price in USD (default 7.99).
yearly_priceNoYearly subscription price in USD (default 49.99).
weekly_creditsNoCredits per week on the weekly plan (default 10).
ai_cost_per_creditNoAI provider cost per credit in USD (default 0.003).
yearly_monthly_creditsNoCredits per month on the yearly plan (default 15).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered; the description reinforces this with 'pure calculation, no network'. It also surfaces the domain rule that apple_cut is 0.15 for Small Business else 0.30, which is genuine behavioral context beyond 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.

Conciseness5/5

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

Front-loaded with the core purpose, then compact 'Use when / Not for / Returns' segments; every sentence carries information and there is no filler despite covering purpose, routing and output shape.

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 no-required-param, pure-calculation tool with full schema coverage and an output schema, the description supplies the missing routing context and the domain-specific apple_cut rule. An agent has everything needed to select and invoke it correctly.

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 every parameter (including defaults and the Small Business cut) is already documented in the schema. The description only summarizes the input domain as 'prices, credits and AI cost' and largely repeats the apple_cut rule, adding little beyond the structured field text.

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 (Compute) plus the exact outputs (margin, break-even, warnings) and inputs (prices, credits, AI cost), and adds a scoping qualifier ('pure calculation, no network'). It explicitly names the sibling it is not (pricing_unit_economics), so an agent can discriminate it from the large tool list.

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

Usage Guidelines5/5

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

Contains explicit 'Use when: idea/scaffold stage pricing decisions' and 'Not for: measured-cost economics for a built app (use pricing_unit_economics)', giving both the trigger condition and the named alternative. Nothing is left to inference.

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

aso_validate_metadataASO Validate MetadataA
Read-onlyIdempotent

Validate outputs//02-metadata/apple-metadata.md (fields and character limits).

Use when: checking ASO output by app name and base dir. For an arbitrary file use metadata_check; to mark the stage done use aso_complete. Returns: {ok, problems: [...]}.

NameRequiredDescriptionDefault
app_nameYesApp name whose outputs/<app_name>/02-metadata/apple-metadata.md is validated.
base_dirYesDirectory that contains (or will contain) the outputs/<App>/ folder.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds real value beyond that by specifying the validation scope (fields and character limits) and the failure payload shape {ok, problems: [...]}, which tells the agent this can return a non-fatal negative result rather than throwing.

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?

Three compact labeled blocks (action, Use when, Returns) with the artifact path front-loaded. Every sentence carries routing or contract information; there is no 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?

For a two-parameter read-only validator with a full output schema, the agent has the target file, the required inputs, the sibling alternatives, and the result contract. Nothing needed to invoke or interpret the call 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%, so both parameters are already fully documented in the schema. The description only restates them at a high level ('by app name and base dir') without adding format, path-resolution, or default semantics, 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 (validate) plus the exact artifact it operates on (outputs/<App>/02-metadata/apple-metadata.md) and the validation dimension (fields and character limits). This is distinguishable from metadata_check and aso_complete without opening any schema.

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

Usage Guidelines5/5

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

Explicitly names the 'when' condition ('checking ASO output by app name and base dir') and routes to two alternatives with their selecting conditions: metadata_check for an arbitrary file, aso_complete to mark the stage done. Nothing is left to inference.

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

backend_deployBackend DeployA
DestructiveIdempotent

Deploy the spec's Supabase backend: migrations, secrets, auth, legal build and edge functions (live unless dry_run; needs human approval).

Use when: after backend_render. dry_run=true (default) returns the plan without any call. Not for: single SQL (supabase_run_sql) or one secret (supabase_set_secret). Returns: {ok, plan/steps, dry_run} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
dry_runNoIf true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
project_refYesSupabase project ref to deploy to.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is partly covered. The description goes further by disclosing the human-approval gate and the approval_required refusal path and the two-call choreography, which are not in the annotations. It stops short of stating what a live run irreversibly changes (e.g. migration/data impact), so not a full 5.

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?

Front-loaded verb+resource, then structured "Use when / Not for / Returns" segments that are scannable. Slightly dense with parentheticals, but every sentence carries actionable information and nothing is padding.

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 destructive, open-world deploy tool with an output schema present, the description covers purpose, sequencing, exclusions, dry-run default, approval flow and refusal shape. Since the return schema exists, the brief "Returns" line is sufficient rather than duplicative.

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 100%, so the baseline is 3. The description adds meaning the schema does not fully convey: that dry_run=true performs "no call" and that approval_id is threaded from a prior approval_required refusal on a repeat call. That approval round-trip semantics is genuinely beyond the property descriptions.

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 (Deploy) and resource (the spec's Supabase backend) and enumerates the components involved (migrations, secrets, auth, legal build, edge functions). It explicitly distinguishes itself from the SQL and secret siblings by name, so an agent can select it without opening another schema.

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

Usage Guidelines5/5

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

Provides explicit sequencing ("Use when: after backend_render"), an explicit exclusion list with named alternatives (supabase_run_sql, supabase_set_secret), and clarifies the dry_run default path. Nothing about when to pick this tool is left to inference.

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

backend_renderBackend RenderA
Idempotent

Render the scaffolded backend from app.spec.json (offline, idempotent): prune supabase/ to the monetization mode, generate shared config, legal sources and listing locales.

Use when: after editing the spec, before backend_deploy. Nothing is deployed. Returns: {ok, mode, render, legal, listing?}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds genuinely useful context beyond them: it is offline, it mutates the workspace by pruning supabase/ to the monetization mode, and nothing is deployed. It stops short of saying what pruning destroys or how failures are surfaced.

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?

Three tight lines: purpose with parenthetical qualifiers first, then when-to-use, then return shape. Every sentence carries information and the most important scoping fact (offline, nothing deployed) is front-loaded.

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?

For a single-parameter, annotated mutation tool with an output schema, the description covers purpose, timing, side-effect scope, and return fields. The returns line is largely redundant with the existing output schema, and error behavior (ok=false cases) is not touched.

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?

Only one parameter exists and schema description coverage is 100%, so the schema already documents app_dir fully. The description's reference to app.spec.json adds modest context (the spec file drives the render) but no syntax or format detail beyond the schema.

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?

The description names a specific verb and resource ('Render the scaffolded backend from app.spec.json') and enumerates the concrete operations performed (prune supabase/, generate shared config, legal sources, listing locales). This is clearly distinguishable from siblings like backend_deploy or legal_render.

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

Usage Guidelines5/5

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

It gives explicit sequencing ('after editing the spec, before backend_deploy') and names the sibling it precedes, plus the key negative constraint 'Nothing is deployed'. The agent knows exactly when this tool is the right choice versus the deploy tool.

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

build_archiveBuild ArchiveA

Run xcodebuild archive (generic iOS device) to produce a .xcarchive.

Use when: manual signing pipeline steps. For the whole signed TestFlight flow use testflight_ship. Returns: {ok, exit_code, stdout, stderr} from xcodebuild.

NameRequiredDescriptionDefault
schemeYesXcode scheme name to build, e.g. 'MyApp'.
projectYesPath to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj.
archive_pathYesPath to the .xcarchive, e.g. build/App.xcarchive.
configurationNoXcode build configuration, default 'Release'.Release

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false). The description adds that it invokes xcodebuild against a generic iOS device, which is useful behavioral context, but says nothing about side effects like archive_path overwrite behavior or signing requirements. Adequate but not rich.

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?

Three short, front-loaded lines: purpose, when-to-use/alternative, and return shape. No filler and everything 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?

An output schema exists, and the description even summarizes the return shape, so an agent knows what to expect. Combined with annotations covering safety, the only mild gap is that mutation side effects on archive_path are unstated.

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 all four parameters (scheme, project, archive_path, configuration) are already documented with examples and a default. The description adds no parameter-level meaning beyond the schema, which is the expected baseline 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.

Purpose5/5

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

States a specific command (xcodebuild archive), its scope (generic iOS device) and its concrete output artifact (.xcarchive). An agent can immediately distinguish it from sibling build tools like build_for_sim or build_export_ipa.

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 names the context ('manual signing pipeline steps') and the alternative for the full flow (testflight_ship). The condition for choosing this tool is stated, though the boundary of 'manual signing pipeline steps' is a touch loose rather than crisply defined.

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

build_boot_simBuild Boot SimulatorA
Idempotent

Boot an iOS simulator and open Simulator.app.

Use when: before capturing screenshots or running maestro_test. Idempotent if already booted. Returns: {ok, exit_code, stdout, stderr}, or {ok, note: 'already booted'}.

NameRequiredDescriptionDefault
udidYesSimulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, and the description reinforces idempotency with the concrete '{ok, note: already booted}' outcome, which is useful behavioral context. The return-value detail is partially redundant given an output schema exists, so it stops short of a 5.

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?

Three tight lines: action, when-to-use, and return shape, each front-loaded with no 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?

For a single-parameter, non-destructive boot tool with an output schema, the description covers purpose, prerequisites, and idempotency; 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 description coverage is 100% and the sole udid parameter is already documented with its source tool and format, so the description adds nothing beyond the schema. 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 and resource ('Boot an iOS simulator and open Simulator.app'), which cleanly separates it from siblings such as build_list_simulators, build_for_sim, and build_test.

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

Usage Guidelines5/5

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

Explicitly names the triggering conditions ('before capturing screenshots or running maestro_test'), routing the agent to the downstream tools that depend on a booted simulator, and adds the idempotency caveat so repeat calls are understood.

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

build_export_ipaBuild Export IPAA

Run xcodebuild -exportArchive to turn a .xcarchive into an .ipa.

Use when: after build_archive with an ExportOptions.plist. For the whole flow use testflight_ship. Returns: {ok, exit_code, stdout, stderr} from xcodebuild.

NameRequiredDescriptionDefault
export_dirYesDirectory to write the exported .ipa into.
archive_pathYesPath to the .xcarchive, e.g. build/App.xcarchive.
export_options_plistYesPath to the ExportOptions.plist for xcodebuild -exportArchive.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and idempotentHint=false. The description adds useful behavioral context beyond annotations by identifying the underlying command (xcodebuild -exportArchive) and the raw return shape ({ok, exit_code, stdout, stderr}). It does not mention file overwrite behavior or whether an existing .ipa would be replaced, but the annotation set covers the main safety and mutability profile.

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?

Three short sentences, front-loaded with the core action, then usage guidance, then return shape. Every sentence earns its place and there is no 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?

For a narrowly scoped build step, the description covers purpose, when to use it, prerequisite, broader alternative, and return format. An output schema exists, so it is not required to explain return values exhaustively, and the annotations already communicate the safety profile.

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 all three required parameters have clear schema descriptions. The description does not add syntax, path formats, or constraints beyond what the schema already provides, so the baseline of 3 is appropriate.

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?

The description states a specific verb and resource: 'Run xcodebuild -exportArchive to turn a .xcarchive into an .ipa.' It also names sibling tools build_archive (prerequisite) and testflight_ship (full flow alternative), so an agent can distinguish this tool without opening the schema.

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

Usage Guidelines5/5

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

It gives an explicit when-to-use condition: 'after build_archive with an ExportOptions.plist', and an explicit alternative for the broader workflow: 'For the whole flow use testflight_ship.' This is exactly the routing guidance an agent needs.

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

build_for_simBuild For SimulatorA

Build the Xcode project for the simulator to verify it compiles.

Use when: verifying code changes. Not for: signed/release builds (use build_archive or testflight_ship). Returns: {ok, exit_code, stdout, stderr} from xcodebuild.

NameRequiredDescriptionDefault
schemeYesXcode scheme name to build, e.g. 'MyApp'.
projectYesPath to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj.
device_nameNoSimulator device name, e.g. 'iPhone 16'.iPhone 16

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/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 idempotentHint=false, so the safety profile is covered. The description adds the compile-verification intent and a return shape, but says nothing about prerequisites (e.g. a booted simulator) or build artifact side effects; with annotations doing the heavy lifting, a 3 is appropriate.

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?

Three tight lines, front-loaded with the core action, followed by routing and return info. No filler sentences.

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?

An output schema exists and annotations cover the safety profile, so the description need not explain return values; combined with the usage routing it gives the agent everything required to invoke this correctly.

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 each parameter (scheme, project, device_name) is documented in the schema itself. The description adds no parameter-level detail, 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 and resource ('Build the Xcode project for the simulator') plus the intent ('to verify it compiles'). It also names the sibling tools it is not (build_archive, testflight_ship), so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit 'Use when: verifying code changes' and 'Not for: signed/release builds (use build_archive or testflight_ship)'. This is exactly the when/when-not/alternative structure that removes routing ambiguity.

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

build_list_simulatorsBuild List SimulatorsA
Read-onlyIdempotent

List the available iOS simulators, iPhones first.

Use when: you need a udid for build_boot_sim, build_screenshot or screenshot_capture. Returns: {ok, count, simulators: [{name, udid, state, runtime}]}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/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 safety is covered. The description adds genuinely new behavioral context with the 'iPhones first' ordering guarantee. It does restate the return shape, which is redundant given the output schema, keeping it below a 5.

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?

Three tight lines: what it does, when to use it, what it returns. No filler, and the scoping and routing information is front-loaded.

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 no-arg, read-only listing tool with an output schema present, everything an agent needs to select and call it is covered. Downstream tool references make the workflow complete.

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?

Zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond confirming the tool takes no input, which it implicitly does.

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?

Specific verb ('List') plus resource ('available iOS simulators') with an added ordering qualifier ('iPhones first'). Clearly distinguishable from mutation siblings like build_boot_sim or build_for_sim.

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

Usage Guidelines5/5

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

Explicit 'Use when' clause names the exact prerequisite: needing a udid for build_boot_sim, build_screenshot, or screenshot_capture. Routes the agent to the correct downstream tools without inference.

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

build_screenshotBuild ScreenshotA
Idempotent

Capture a PNG screenshot of the booted simulator to out_path.

Use when: an ad-hoc check. For localized store screenshots use screenshot_capture / screenshot_build_all. Returns: {ok, exit_code, stdout, stderr, path}.

NameRequiredDescriptionDefault
udidYesSimulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'.
out_pathYesOutput file path (PNG).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=false), so the burden is lighter. The description still adds real context: it requires an already-booted simulator and documents the return payload shape, which annotations do not convey. It stops short of noting failure modes or overwrite behavior on out_path, so not a full 5.

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?

Three short labeled fragments — action, use-when, returns — with zero filler and the core action front-loaded in the first sentence. Every sentence 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?

For a two-parameter read-and-write-artifact tool, the description covers the action, the selection condition against siblings, the precondition (booted simulator), and the return shape. With an output schema present, further return-value detail is unnecessary, so nothing an agent needs 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%, with both udid (tied to build_list_simulators and an example format) and out_path documented in the schema itself. The description only restates out_path and adds no syntax or format meaning beyond it, so the baseline 3 is correct.

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 and resource ('Capture a PNG screenshot of the booted simulator') plus the output destination, so the agent knows exactly what this produces. It is clearly distinguishable from screenshot_capture and screenshot_build_all, which are named as the localized-store alternatives.

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

Usage Guidelines5/5

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

Explicitly scopes usage to 'an ad-hoc check' and routes localized store screenshots to screenshot_capture / screenshot_build_all. When-to-use and when-to-use-something-else are both stated, leaving nothing to inference.

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

build_testBuild TestA

Run xcodebuild test for the scheme on a simulator.

Use when: running unit/UI tests. For end-to-end Maestro flows use maestro_test. Returns: {ok, exit_code, stdout, stderr} from xcodebuild.

NameRequiredDescriptionDefault
schemeYesXcode scheme name to build, e.g. 'MyApp'.
projectYesPath to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj.
device_nameNoSimulator device name, e.g. 'iPhone 16'.iPhone 16

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false, idempotentHint=false), so the agent knows this is a non-destructive local execution. The description adds the return shape, but since an output schema exists that is largely redundant. It does not mention side effects (build artifacts written, simulator state changes) or any precondition such as a booted simulator.

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?

Three short sentences, zero filler, and the core action is front-loaded ahead of the routing guidance. Every sentence carries distinct information (action, when, alternative, return shape).

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 an output schema present and annotations covering the safety profile, the description need not explain return values, and it correctly covers routing. The one omission is preconditions — siblings like build_boot_sim suggest a booted simulator may be required, and that dependency is unstated.

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 'scheme', 'project', and 'device_name' are all fully documented in the schema with examples. The description only alludes to 'the scheme' and 'a simulator', adding no format or constraint detail beyond the schema, 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 and mechanism ('Run xcodebuild test'), names the resource ('the scheme on a simulator'), and explicitly distinguishes itself from the sibling maestro_test. An agent can differentiate it from build_for_sim and maestro_test without opening any schema.

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

Usage Guidelines5/5

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

'Use when: running unit/UI tests' gives the trigger condition, and 'For end-to-end Maestro flows use maestro_test' names the alternative and the condition that routes there. Both when-to-use and when-not-to-use are explicit.

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

build_xcode_versionBuild Xcode VersionA
Read-onlyIdempotent

Return the installed Xcode version.

Use when: a quick check that xcodebuild works before build_* tools. Returns: {ok, exit_code, stdout, stderr} (stdout holds the version lines).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds value by disclosing the return envelope {ok, exit_code, stdout, stderr} and noting that stdout carries the version lines, which annotations cannot express.

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?

Three short, front-loaded lines: purpose, when, returns. No sentence is filler and the most decision-relevant information (what it does, when to call it) comes first.

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 no-argument read-only probe, the description covers purpose, trigger condition, and the shape of the result. An output schema exists, but the extra note about stdout holding the version lines is a useful pointer, and nothing needed 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.

Parameters4/5

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

Zero parameters, so there is nothing to document and the baseline is 4. The description correctly spends no words on argument semantics.

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 and resource ('Return the installed Xcode version') with no ambiguity, and the context of use ('before build_* tools') cleanly separates it from the build_* siblings. An agent can pick this out without opening the schema.

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 names the when ('a quick check that xcodebuild works before build_* tools'), which is genuinely actionable routing guidance. It does not name a when-not or an alternative diagnostic tool (e.g., env_doctor, config_doctor) that an agent might otherwise consider.

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

config_doctorConfig DoctorA
Read-onlyIdempotent

Report which config keys in ~/.appfactory/config.toml are present or missing (secrets masked).

Use when: diagnosing ASC/Finance key paths, session state or CLI availability. Not for: overall setup guidance (use setup_status) or toolchain checks (use env_doctor). Returns: {ok, config_path, present, missing, locales, asc_p8_resolved, session, asc_cli, maestro, notes}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/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 a genuinely useful behavioral detail the annotations do not carry: secrets are masked in the output, plus the exact return field set. It stops short of full depth (no notes on partial-config handling), so a 4 rather than a 5.

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 labeled, front-loaded segments with no filler; the purpose sentence leads. The 'Returns' enumeration is somewhat redundant given an output schema exists, which slightly dilutes conciseness.

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 zero-parameter, read-only diagnostic with an output schema already present, the description covers purpose, routing, privacy behavior, and expected output. Nothing an agent needs 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.

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly does not invent parameter details.

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?

The description states a specific verb (Report) and resource (config keys in ~/.appfactory/config.toml) with precise scope (present/missing, secrets masked). An agent can distinguish it from the many sibling setup_*, env_doctor, and pipeline tools without opening a schema.

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

Usage Guidelines5/5

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

It gives explicit 'Use when' conditions (ASC/Finance key paths, session state, CLI availability) and explicit 'Not for' exclusions that route to named alternatives (setup_status, env_doctor). This is exactly the when/when-not/alternatives structure a strong definition needs.

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

config_setConfig SetA
Idempotent

Write several NON-secret settings (ASC key id/issuer/path, team id, copyright, support email, ...) to ~/.appfactory/config.toml.

Use when: setting multiple ASC/identity fields together; fields left empty are unchanged. Not for: secrets (use setup_credentials) or one key (use setup_set). Returns: the config_doctor result after the update, or {ok: false, error} if a secret key was passed.

NameRequiredDescriptionDefault
team_idNoApple Developer Team id (10 characters).
apple_idNoApple ID email of the developer account (used by fastlane produce only).
copyrightNoCopyright line for the store listing, e.g. '2026 Example Ltd'; falls back to the config 'copyright' key.
asc_key_idNoApp Store Connect API key id (10 characters).
asc_issuer_idNoApp Store Connect API issuer id (UUID).
support_emailNoPublic support email address.
asc_key_filepathNoPath to the App Store Connect .p8 private key file.
legal_controllerNoLegal entity name shown as data controller in the privacy policy.
asc_vendor_numberNoApp Store Connect vendor number (sales reports).
asc_finance_key_idNoKey id of a Finance-role App Store Connect API key (for sales reports).
asc_finance_key_filepathNoPath to the Finance-role .p8 key file.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds real context on top: empty fields are left unchanged, and a secret key passed yields {ok:false, error}. It does not mention whether the file is created if missing or permissions required, but the key mutation semantics are disclosed.

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?

Three short lines: what it writes, when/when-not, and return behavior. Front-loaded with the action and target path, zero 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?

For a multi-field config mutation with an output schema present, the description supplies usage routing, partial-update semantics, and the error case. Nothing an agent needs 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.

Parameters4/5

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

Schema coverage is 100%, so parameter meaning is already carried by the schema; the description still adds the non-obvious patch semantics that null/empty fields are unchanged rather than cleared, which the schema's default:null does not make explicit. It names a few representative fields but does not enumerate all 11, which is acceptable given the schema does.

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 and resource (write settings to ~/.appfactory/config.toml), scopes it to NON-secret fields, and names the two sibling tools it is not (setup_credentials, setup_set). An agent can place it correctly without reading any schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' (setting multiple ASC/identity fields together) and 'Not for' clauses route to the alternatives setup_credentials and setup_set by name. The empty-field behavior is also stated, leaving nothing to inference.

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

cpp_build_allCPP Build AllA
Destructive

Create one Custom Product Page per Search Ads theme (page, version, localization) and return the deep-link URLs (live write, needs human approval).

Use when: after ASO produced theme clusters; the URLs feed Ad Ops. Returns: {ok, pages: [{theme, ok, id, version_id, localization_id, url}]} or an approval_required refusal.

NameRequiredDescriptionDefault
themesYesList of {name, locale} Search Ads themes, one Custom Product Page each.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag a destructive, non-idempotent, open-world write, but the description adds crucial workflow context beyond them: it is a live write requiring human approval, and a call may return an approval_required refusal that must be resolved out-of-band before retrying.

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?

Three tight lines: what it does, when to use it, what it returns. The write/approval caveat is front-loaded in the first sentence, and nothing is padded.

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 destructive multi-page write with a two-step approval handshake, the description covers the trigger condition, the human-approval requirement, the refusal path, and the returned shape. With an output schema present, no further return-value detail is required.

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% – bundle_id, themes and the approval_id retry flow are all documented in the schema itself. The description adds little parameter-level detail beyond restating the one-page-per-theme mapping, so the baseline 3 is appropriate.

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?

Specific verb (Create one Custom Product Page per theme), precise scope (page, version, localization) and the concrete artifact produced (deep-link URLs). Clearly distinguishable from sibling build_all tools such as screenshot_build_all or growth_build_slideshows.

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?

Explicit when-to-use: 'after ASO produced theme clusters; the URLs feed Ad Ops', which pins it to a pipeline stage. It does not name when-not to use it or a direct alternative, so it falls short of a 5.

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

deliver_metadataDeliver MetadataA
DestructiveIdempotent

Upload metadata to the App Store Connect draft version through the API (live write, needs human approval, ASO-gated).

Use when: metadata files are exported (metadata_export). Not for: screenshots (deliver_screenshots) or the submit step (asc_submit_for_review). Returns: {ok, uploaded: [...]} or a gate / approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true and openWorldHint=true. The description adds genuinely non-obvious context beyond that: it is a live write, it requires human approval, and it is ASO-gated, plus it names the refusal outcome ('gate / approval_required'). It does not reconcile the destructive-vs-idempotent tension explicitly, keeping it just short of a 5.

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?

Front-loads the operation and its gating in the first sentence, then uses tight labelled clauses ('Use when:', 'Not for:', 'Returns:'). No filler sentences; every element carries routing or behavioral information.

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 gated write tool with an output schema, full param coverage, and rich annotations, the description supplies the missing pieces: the approval gate workflow, the ASO prerequisite, the sibling boundaries, and the refusal shape. Nothing an agent needs to invoke it correctly is absent.

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 schema itself documents app_dir, bundle_id and the approval_id approval-loop semantics in detail. The description mentions the approval requirement but adds no parameter syntax beyond what the schema already provides, 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 and resource (upload metadata to the App Store Connect draft version) and explicitly names the two sibling tools it is not (deliver_screenshots, asc_submit_for_review). An agent can distinguish it from the ~100 siblings without opening any schema.

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

Usage Guidelines5/5

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

Uses explicit 'Use when' (metadata files are exported via metadata_export) and 'Not for' clauses naming the alternatives and the boundary conditions. The routing decision is fully determined.

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

deliver_screenshotsDeliver ScreenshotsA
DestructiveIdempotent

Upload screenshots to the App Store Connect draft with checksum-based incremental sync (live write, needs human approval).

Use when: screenshot_build_all is done; unchanged files (MD5 match) are skipped. To verify afterwards use deliver_screenshots_audit. Returns: {ok, uploaded, skipped} or a gate / approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Discloses live write requiring human approval, describes the gate/approval_required refusal pattern, and notes checksum-based skipping. This adds context beyond annotations (destructiveHint=true, idempotentHint=true). Could mention what gets destroyed or permissions needed, but the approval gate is well-explained.

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?

Three sentences with zero waste, front-loaded with the action and key mechanism, then conditions, then return. Every sentence 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?

Covers purpose, usage, behavior, and return values well. With output schema present, the return description is supplementary. The approval flow is clearly explained, though minor details like error handling beyond gate refusals could be added.

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%, so all parameters are documented in the schema. The description mentions approval_id implicitly via the refusal pattern but doesn't add syntax or format details beyond what's in the schema descriptions. Baseline 3 is appropriate.

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 (upload) and resource (screenshots) with precise destination (App Store Connect draft) and mechanism (checksum-based incremental sync). Differentiates from siblings by naming the precondition screenshot_build_all and the audit tool deliver_screenshots_audit.

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

Usage Guidelines5/5

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

Explicitly states when to use (after screenshot_build_all is done), the skip behavior (unchanged files with MD5 match are skipped), and names the verification alternative (deliver_screenshots_audit). Provides clear routing.

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

deliver_screenshots_auditDeliver Screenshots AuditA
Read-onlyIdempotent

Read-only audit that App Store Connect screenshot sets exactly match the local fastlane/screenshots files (order, COMPLETE state, MD5).

Use when: after deliver_screenshots and before submission. No writes. Returns: {ok, locales: {locale: {display_type: status}}, previews, problems}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description still adds value beyond them: the precise invariant being verified (order, COMPLETE state, MD5) and the read-only guarantee reinforced as "No writes." It does not discuss failure modes or what happens on a mismatch.

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?

Three compact lines with the core comparison front-loaded, followed by a Use-when clause and a Returns line. Every sentence earns its place and none repeats the name or title.

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?

An output schema exists, so the Returns summary is supplementary rather than required, and it is included anyway. For a low-complexity two-parameter read-only audit with full schema and annotation coverage, this is complete; only a note on what to do with a failing audit 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 both parameters (app_dir, bundle_id) carry clear examples in the schema. The description adds no parameter-level meaning, so the baseline of 3 is correct.

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 (audit), the resource (App Store Connect screenshot sets vs. local fastlane/screenshots files), and the exact comparison criteria (order, COMPLETE state, MD5). This clearly distinguishes it from deliver_screenshots (the writer) and screenshot_sync, so an agent can select it without opening a schema.

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?

"Use when: after deliver_screenshots and before submission" gives an explicit lifecycle position and names the prerequisite sibling, plus "No writes" bounds it. It stops short of naming a fallback alternative if the audit fails, but the trigger context is unambiguous.

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

deliver_subscription_review_screenshotsDeliver Subscription Review ScreenshotsA
DestructiveIdempotent

Upload the App Review screenshot of every subscription from store/review-screenshots/.png (live write, needs human approval).

Use when: subscriptions sit in MISSING_METADATA for the review screenshot. Idempotent by MD5. Returns: {ok, uploaded, skipped} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark it as a destructive, idempotent, open-world write; the description adds critical context beyond annotations: it requires human approval, is idempotent by MD5, and returns either a result object or an approval_required refusal. This fully informs the agent about the write and approval flow.

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?

Three short statements covering action, when, and returns. Front-loaded, waste-free, and easy to parse.

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?

Given an output schema exists and annotations cover safety, the description supplies the remaining essentials: the MISSING_METADATA trigger, the approval workflow, MD5 idempotency, and the return shape. Nothing material is missing for an agent to call it correctly.

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 app_dir, bundle_id, and approval_id are already fully documented in the schema. The description adds the screenshot path pattern but no parameter-specific detail, 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 (Upload), resource (App Review screenshot of every subscription), and source path, making it clearly distinct from general screenshot or metadata delivery tools. An agent can identify the exact action without opening the schema.

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 states 'Use when: subscriptions sit in MISSING_METADATA for the review screenshot', giving a precise and actionable trigger condition. It does not name alternative tools or say when not to use it, so it falls short of a full 5.

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

design_export_pngDesign Export PNGA
Idempotent

Rasterize a Claude Design board to PNG with local headless Chrome.

Use when: icon (B01-AppIcon 1024x1024 to design/icon.png) or store layout boards (440x956, scale 3). serve_url comes from claude-design render_preview and is used once. Returns: {ok, path, width, height}.

NameRequiredDescriptionDefault
scaleNoDevice scale factor (default 1; use 3 for store boards).
widthYesViewport width in CSS pixels, e.g. 1024 for the icon board or 440 for a store board.
heightYesViewport height in CSS pixels, e.g. 1024 for the icon board or 956 for a store board.
out_pathYesOutput file path (PNG).
serve_urlYesTemporary serve_url from claude-design render_preview; used once, never stored.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, idempotent, non-destructive, closed-world). The description adds meaningful context beyond them: it runs Chrome locally, serve_url is consumed exactly once and never stored, and it reports the output path and dimensions. It doesn't mention failure modes or overwrite behavior for an existing out_path.

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 short, front-loaded blocks with no filler; purpose first, then usage, then the return shape. The 'Returns: {ok, path, width, height}' line is somewhat redundant given an output schema exists, but it costs little.

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?

For a 5-param rendering tool with full schema coverage, annotations, and an output schema, the description supplies the trigger scenarios and side-effect notes an agent needs. The only gap is that it does not say what happens if out_path already exists or when a render fails.

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 every parameter is already documented (including serve_url provenance and the scale=3 hint). The description mostly restates that same guidance rather than adding syntax, constraints, or edge cases, 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 and resource ('Rasterize a Claude Design board to PNG') plus the mechanism ('local headless Chrome'), which distinguishes it from screenshot_* and preview_* siblings. An agent can tell what it produces without opening the schema.

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?

The 'Use when' line gives concrete triggering cases with dimensions (icon B01-AppIcon 1024x1024, store boards 440x956 at scale 3), which is clear context. However, it never names an alternative tool or an exclusion condition, so routing versus other export/screenshot tools is left to inference.

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

design_generateDesign GenerateA
Idempotent

Prepare the app's Claude Design project from the brief, spec and screens.json: scaffolds, mascot boards, canvas, store layout and upload plan.

Use when: after design_research_check passes. Never uploads; it returns the claude-design MCP calls to make. Then record with design_record_upload. Returns: {ok, plan, mcp_calls}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false but destructiveHint=false and idempotent=true, which alone is ambiguous. The description resolves this by stating "Never uploads; it returns the claude-design MCP calls to make" – an important disclosure that the tool plans rather than performs side effects, plus the return shape. It does not cover permissions or failure behavior, so 4 rather than 5.

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?

Three short, front-loaded blocks: what it produces, when to use it, and what it returns. No filler; every sentence carries routing or behavioral information.

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?

Despite having an output schema, the description still summarizes the return contract, and it supplies the pipeline precondition, the non-execution guarantee, and the next sibling to call. For a single-parameter planning tool in a long tool list, nothing an agent needs 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?

Only one parameter (app_dir) and schema description coverage is 100%, including an example path, so the schema already carries the semantics. The description adds nothing about app_dir beyond what the schema states, which is the baseline 3 case.

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 (prepare) plus the concrete resource (the app's Claude Design project) and enumerates the artifacts produced: scaffolds, mascot boards, canvas, store layout, upload plan. An agent can distinguish it from siblings like design_screens_skeleton or design_research_check without opening a schema.

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?

Gives an explicit precondition ("Use when: after design_research_check passes") and a follow-up routing ("Then record with design_record_upload"), which is strong positioning within the design_* pipeline. It stops short of an explicit when-not-to-use statement, so it is clear context rather than a full routing rule.

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

design_record_uploadDesign Record UploadA
Idempotent

Record a finished Claude Design upload: the SHA-256 of every file in upload_plan.json into design/project/claude_design.json.

Use when: after uploading through the claude-design MCP; the design, icon and screenshot gates fail until this receipt matches. Returns: {ok, receipt path, files}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
open_urlYesThe claude.ai/design link returned by render_preview (not the serve_url).
project_idYesClaude Design project id from create_project.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the mutation/is-safety profile is covered. The description adds genuine value beyond that: it names the exact file written, states the receipt is derived from upload_plan.json, and discloses the downstream gating effect. It does not state permission/auth requirements, so a 4 rather than 5.

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?

Three compact labeled blocks (purpose / Use when / Returns) with zero filler and the purpose front-loaded. Every sentence carries information an agent needs.

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?

Purpose, trigger condition and a summary of the return shape are all present, and a full output schema exists so return values need not be elaborated. Nothing required to invoke this 3-parameter tool 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%, so app_dir, project_id and open_url are already fully documented in the schema, including the note that open_url is the render_preview link not the serve_url. The description adds no parameter-level detail beyond that, 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 (record), the exact resource (SHA-256 of every file in upload_plan.json) and the destination artifact (design/project/claude_design.json). This is clearly distinguishable from the sibling design_upload_status, which checks state rather than writing the receipt.

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?

"Use when: after uploading through the claude-design MCP" gives an explicit trigger condition, and the note that the design/icon/screenshot gates fail until the receipt matches adds a strong reason to call it. It stops short of naming an alternative tool or a when-not condition, so it is not quite a 5.

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

design_research_brief_templateDesign Research Brief TemplateA
Read-onlyIdempotent

Return the design/research/brief.json shape pre-filled with the reference ids.

Use when: authoring the design brief after design_research_collect. Read-only. Returns: {ok, template, write_to: [paths]}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description repeats 'Read-only' and summarizes the return shape, which is also covered by the output schema, but it does add the useful behavioral detail that the template is pre-filled with reference ids. That added context is modest, so a 3 is appropriate.

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?

The description is three short, front-loaded statements: purpose, usage condition, and return shape. Every sentence earns its place with no filler or repetition.

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 simple read-only template generator with a fully described schema, rich annotations, and an output schema, the description covers what it does, when to use it, and what it returns. Nothing essential for correct invocation 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 single app_dir parameter is fully documented in the schema. The description does not add any parameter-specific meaning beyond what the schema provides, so the baseline of 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 specific verb and resource: it returns the design/research/brief.json shape pre-filled with reference ids. It also positions itself relative to design_research_collect, which helps distinguish it from one sibling. However, it does not differentiate from other design_* siblings such as design_generate or design_research_check.

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 an explicit usage trigger: 'Use when: authoring the design brief after design_research_collect.' This clearly tells the agent when to invoke it and names the preceding step. It lacks explicit when-not guidance or alternatives, so it stops short of a 5.

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

design_research_checkDesign Research CheckA
Read-onlyIdempotent

Run the design_research gate: at least 6 reference apps on disk and a valid, cited brief.

Use when: before design_generate. Read-only. Returns: {ok, problems: [...]}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/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 'Read-only' line is largely redundant. The description earns credit by disclosing the actual validation logic (6 apps on disk, valid cited brief) and the shape of the failure signal (problems list), which the annotations do not convey.

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?

Three tight lines with the core action front-loaded, followed by a labeled 'Use when' and 'Returns' section. Every sentence carries information and nothing is padded.

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?

For a single-parameter gate with an output schema, the description covers purpose, trigger, and pass criteria adequately; the brief 'Returns' hint is a bonus rather than a necessity. Slightly more detail on what 'problems' entries look like or remediation would make it fully 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 description coverage is 100% and there is only one parameter, so the schema fully documents app_dir. The description adds no further detail about the parameter (e.g., path format or what disk contents are inspected), so 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+resource ('Run the design_research gate') and immediately defines the pass conditions (>=6 reference apps on disk plus a valid, cited brief), which tells an agent exactly what this validator checks versus the sibling collectors/template tools.

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?

'Use when: before design_generate' gives an explicit, concrete trigger tied to a named sibling, so the agent knows when to invoke it. It stops short of stating when this tool is NOT appropriate or naming alternative checks, so it is clear context rather than a full when/when-not/alternative specification.

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

design_research_collectDesign Research CollectA
Idempotent

Download category-leader App Store screenshots and icons into design/research/apps/ with references.json (study material only).

Use when: first design step. Then write the brief (design_research_brief_template) and run design_research_check. Returns: {ok, apps: [{id, name, files}], references} (untrusted_content).

NameRequiredDescriptionDefault
termsYesSearch terms describing the app category, e.g. ['meditation', 'sleep sounds'].
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
max_appsNoMaximum reference apps to download (default 16).
countriesNoList of two-letter storefront codes, e.g. ['us', 'gb', 'de']; omit for the default set.
screenshots_per_appNoScreenshots to download per reference app (default 6).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, idempotent, open-world operation, and the description usefully confirms the file-writing behavior and output location while flagging the returned references as untrusted_content. That untrusted-content warning and the "study material only" scope note add real value beyond the annotations; permissions or failure behavior are not covered.

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?

Front-loaded with the core action, then structured Use-when and Returns blocks; every line carries information. It is dense but not padded, with no redundant restatement of the name.

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?

An output schema exists, so the return-value coverage in the description is supplementary rather than required. Combined with 100% parameter coverage and annotations that convey the safety profile, the description provides enough for an agent to invoke this correctly; only edge-case behavior (rate limits, failure handling) is absent.

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 all five parameters (terms, app_dir, max_apps, countries, screenshots_per_app) are already documented in the schema. The description only implies the category-driven search via "category-leader" and adds no format or constraint detail beyond that, so the baseline of 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 concrete verb and resource — downloading category-leader App Store screenshots and icons — plus the destination path (design/research/apps/) and the artifact produced (references.json). This is clearly distinguishable from siblings like design_research_brief_template and design_research_check.

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?

"Use when: first design step" gives explicit triggering context, and it names the two downstream steps with their tool names (design_research_brief_template, design_research_check), giving the agent a workflow position. It lacks an explicit when-not clause or an alternative tool to avoid, so it falls just short of the top mark.

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

design_screens_skeletonDesign Screens SkeletonA
Idempotent

Produce the structural skeleton for design/screens.json, following the design brief's onboarding flow when one exists.

Use when: starting design. Adapt every screen to the app; the look is authored in Claude Design. write=true saves it (refuses to replace an existing file unless overwrite). Returns: {ok, screens|path, onboarding, main}.

NameRequiredDescriptionDefault
writeNoIf true, save the skeleton to design/screens.json; default false only returns it.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
overwriteNoIf true, replace files that already exist; default false refuses to overwrite.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare non-read-only, idempotent, non-destructive, and closed-world. The description adds the meaningful write-mode fact (write=true saves; default only returns) and the guard that an existing file is not replaced without overwrite, which is useful operational context beyond the hints.

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?

Front-loaded with the purpose, then Use when, then behavior, then Returns. Every line is short and scannable; the Returns line is partly redundant with the existing output schema but is not wasteful enough to hurt.

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?

For a single-output generation tool with a documented output schema and full parameter coverage, the description supplies purpose, trigger, write semantics, and the overwrite guard. It omits where the design brief is located and any prerequisite on app.spec.json, but those live in the schema and sibling flows.

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%, so write, app_dir, and overwrite are already documented in the schema, including the overwrite-refusal behavior. The description adds only the onboarding-flow condition and does not deepen parameter semantics; baseline 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?

States a specific verb and artifact: produce the structural skeleton for design/screens.json, conditioned on the design brief's onboarding flow. It implicitly separates itself from visual authoring by noting 'the look is authored in Claude Design', though it never names a sibling such as design_generate, so differentiation is inferred 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 Guidelines4/5

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

'Use when: starting design' gives a clear trigger and implies sequencing (this happens before look/visual work). It offers no explicit when-not or named alternative tools, so it falls short of a full routing rule but still gives usable context.

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

design_upload_statusDesign Upload StatusA
Read-onlyIdempotent

Check whether the local Claude Design project is uploaded and unchanged since (read-only).

Use when: diagnosing a design gate failure. Returns: {ok, uploaded, changed_files}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is fully covered and the description's 'read-only' is largely redundant. It adds the useful notion of comparing against a prior upload ('unchanged since'), but discloses nothing about how the comparison is made or what counts as a changed file.

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?

Three short sentences, front-loaded with the action, then structured 'Use when:' and 'Returns:' lines. Every sentence earns its place with no filler.

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 annotations covering safety and an output schema present, the description does not need to explain return values, yet it lists the keys anyway. It is complete for a one-parameter diagnostic tool; only the absence of sibling routing keeps it from a 5.

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 the single app_dir parameter is fully documented in the schema, so the baseline is 3. The description's phrase 'local Claude Design project' mildly contextualizes app_dir but adds no syntax or format detail.

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 ('check') and resource ('local Claude Design project'), plus the precise condition validated ('uploaded and unchanged since'). It does not name a sibling tool to differentiate itself from design_record_upload or similar, so it falls 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 Guidelines4/5

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

The 'Use when: diagnosing a design gate failure' line gives an explicit triggering scenario. It stops short of a 5 because it names no alternatives or when-not-to-use conditions (e.g., vs. design_record_upload).

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

env_doctorEnvironment DoctorA
Read-onlyIdempotent

Check the local toolchain: xcode, swift, node, ruby, git, uv, asc, fastlane, maestro, Java 17+ and maestro- live.

Use when: something fails to run locally. Not for: credentials/config (use config_doctor or setup_status). Returns: {ok, available: {tool: bool}, versions: {tool: str}, notes?}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds the inspection scope plus the existence of a 'notes' field for anomalies, which is useful behavioral context beyond the annotations, though it stops short of describing failure or partial-availability behavior.

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?

Three labeled fragments (scope, when, exclusions, returns) with no filler and the trigger condition front-loaded after the scope. Every line carries selection-relevant information.

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 parameterless, read-only diagnostic with a rich annotation set and an output schema, the description supplies everything needed: what is checked, when to reach for it, which siblings to prefer instead, and a sketch of the response shape.

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?

The tool takes zero parameters, so there is no argument semantics to explain – baseline 4 applies. The description correctly does not invent parameter guidance where none is needed.

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 and resource ('Check the local toolchain') and enumerates exactly which tools are inspected (xcode, swift, node, ruby, git, uv, asc, fastlane, maestro, Java 17+, maestro-live). An agent can distinguish this from sibling diagnostics like config_doctor or pipeline_status without opening the schema.

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

Usage Guidelines5/5

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

Uses explicit 'Use when' / 'Not for' framing, names the triggering condition ('something fails to run locally'), and routes the agent to the correct alternatives by name (config_doctor, setup_status) for the excluded credential/config case.

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

firebase_setupFirebase SetupA
Destructive

Set up Firebase Analytics: GCP project, iOS app and GoogleService-Info.plist into Resources/ (live write, needs human approval).

Use when: once per app (mandatory for every app). Requires gcloud auth and firebase-tools. Returns: {ok, project_id, app_id, google_analytics, console, plist} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
app_nameYesApp name as shown on the App Store (globally unique, max 30 characters).
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial context beyond annotations: 'live write, needs human approval', an approval_required refusal path, and the approval_id round-trip flow. The annotations flag destructive/openWorld, and the description confirms a human-approval gate that isn't derivable from the annotations alone.

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?

Front-loaded purpose line, then Use when, prerequisites, and return shape in tight labeled blocks. Slightly line-broken but every clause earns its place; no wasted prose.

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?

Covers precondition (auth/tools), approval semantics, and refusal shape. An output schema exists so return-value detail is unnecessary, and the description names the key fields anyway. Complete enough to invoke correctly among many setup siblings.

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%, so the schema already documents all four params including the approval_id flow. The description mentions no per-parameter detail beyond the Resources/ plist destination. 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.

Purpose5/5

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

States a specific verb (Set up) and named resource (Firebase Analytics: GCP project, iOS app, GoogleService-Info.plist into Resources/), plus the write target. Distinguishes from siblings like setup_credentials and setup_services by naming exactly what it provisions.

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?

Explicit 'Use when: once per app (mandatory for every app)' plus stated prerequisites (gcloud auth and firebase-tools). Clear context and frequency, though it doesn't name specific alternatives among the many sibling setup tools.

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

github_create_repoGitHub Create RepoA
Destructive

Create a PRIVATE GitHub repo under the configured account and push the app (needs human approval unless dry_run).

Use when: the app should be tracked on GitHub. dry_run=true (default) only returns the command. For later commits use github_push. Returns: {ok, command/url, dry_run} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
dry_runNoIf true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action.
repo_nameYesName of the new private repository, e.g. 'my-app'.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true, and non-idempotent, but the description adds the critical approval gate ('needs human approval unless dry_run') and the approval_required refusal path, which the annotations do not convey. It stops short of describing reversibility or rate limits, but the approval flow is the key trait and it 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.

Conciseness5/5

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

Front-loads the action and its approval constraint, then compresses when-to-use, the dry_run default, the alternative tool, and the return shape into two tight sentences. No 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?

For a destructive, human-gated mutation with an output schema present, the description covers the approval workflow, the dry_run default, the sibling alternative, and the refusal outcome. Nothing an agent needs to call it correctly and handle the response 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%, so app_dir, repo_name, dry_run, and approval_id are all documented in the schema; the description only restates the dry_run default. This is the baseline-3 case where the schema does the heavy lifting.

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 and resource ('Create a PRIVATE GitHub repo'), plus the side effect of pushing the app, and explicitly contrasts with the sibling github_push ('For later commits use github_push'). An agent can distinguish this from the other ~100 tools without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use when: the app should be tracked on GitHub'), the default no-op behavior of dry_run, and routes later commits to github_push. When-to-use and the alternative are both stated, not implied.

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

github_issue_createGitHub Issue CreateA
Destructive

Open a GitHub issue for postponed work (needs human approval unless dry_run).

Use when: parking work with a role label plus next or later. dry_run=true (default) returns the exact command. No-op (n/a) when the github_issues run option is off. Returns: {ok, url/command, dry_run} or an approval_required refusal.

NameRequiredDescriptionDefault
bodyYesIssue body with what / why / done-when sections.
repoYesGitHub repository as 'owner/name', e.g. 'octocat/my-app'.
titleYesIssue title in imperative form, e.g. 'Add offer paywall analytics'.
labelsYesIssue labels: one role label (ios, backend, store, lead, founder) plus next or later.
app_dirNoApp directory; when given, the github_issues run option is read from its spec.
dry_runNoIf true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructive/openWorld annotations, it discloses the human-approval gate, the dry_run default behavior (returns the exact command, changes nothing), the no-op condition, and the possible approval_required refusal. That is rich operational context an agent cannot get from annotations alone.

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?

Three short labeled lines (what, when, returns) with the mutation/approval caveat front-loaded in the first clause. No sentence is wasted.

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 an output schema present and rich annotations, the description covers the remaining gaps an agent needs: the approval workflow, dry_run default, no-op condition, and refusal outcome. Nothing essential for correct invocation 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%, so the schema already documents all seven parameters including dry_run and approval_id. The description reinforces the label convention ('role label plus next or later') but adds no new syntax or format detail, 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 and resource ('Open a GitHub issue') plus the intended scope ('for postponed work'), which cleanly separates it from github_create_repo and github_push in the sibling list. An agent can identify the tool without opening the schema.

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?

Provides explicit when-to-use ('parking work with a role label plus next or later') and a when-not/no-op condition ('when the github_issues run option is off'). It stops short of naming alternative siblings to route to, but the activation conditions are unambiguous.

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

github_issues_bootstrapGitHub Issues BootstrapA
DestructiveIdempotent

Create or refresh the GitHub label set (ios, backend, store, lead, founder, next, later, other-project) on a repo (needs human approval unless dry_run).

Use when: before github_issue_create. dry_run=true (default) returns the commands. No-op (n/a) when the github_issues run option is off. Returns: {ok, commands/created, dry_run} or an approval_required refusal.

NameRequiredDescriptionDefault
repoYesGitHub repository as 'owner/name', e.g. 'octocat/my-app'.
app_dirNoApp directory; when given, the github_issues run option is read from its spec.
dry_runNoIf true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations cover idempotency, destructiveness and open-world scope, but the description adds genuinely new behavioral context: the human-approval gate, the approval_required refusal path, and that dry_run returns commands rather than executing. It doesn't explain the out-of-band approve flow (which lives in the param schema), so a 4 rather than 5.

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?

Front-loaded purpose sentence followed by tight 'Use when / dry_run / no-op / Returns' clauses. No filler; every line carries a distinct fact.

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?

An output schema exists, so return-value details are covered elsewhere, yet the description still summarizes {ok, commands/created, dry_run} and the approval_required refusal. Combined with the approval and no-op guidance, an agent has what it needs to call this correctly.

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 100%, so baseline is 3. The description adds that dry_run defaults to true and returns commands, and that a no-op occurs under certain run-option states, which gives meaning beyond the field-level docs.

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 (create/refresh) and resource (the GitHub label set), lists the exact labels, and names the sibling github_issue_create as the downstream consumer. An agent can distinguish this from github_issue_create without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: before github_issue_create', notes the dry_run default behavior, and states the no-op condition when the github_issues run option is off. This is textbook when/when-not/alternative guidance.

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

github_pushGitHub PushA
Destructive

Commit all changes in the app repo and push (live write, needs human approval).

Use when: regular tracking after milestones. For the first push of a new repo use github_create_repo. Returns: {ok, commit, push} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
messageYesGit commit message.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: it is a 'live write' requiring human approval and can return an approval_required refusal. It does not elaborate on what is destroyed (e.g. force-push vs append) or rate limits, so it falls short of a 5.

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?

Three short, front-loaded sentences: the action first, then the when/alternative, then the return contract. No filler; the 'Returns' line is mildly redundant with the output schema but cheap and useful.

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 mutation tool with an output schema, the description covers the action, the routing decision against a sibling, the approval requirement, and the refusal outcome. An agent has everything needed to call it and to interpret a failure.

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 approval_id parameter is fully documented in the schema, including the approve-then-retry flow. The description adds no parameter-level meaning beyond the schema, 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?

The description states a specific verb and resource ('Commit all changes in the app repo and push') and explicitly distinguishes itself from the sibling github_create_repo for first pushes. An agent can route between the two without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit when ('regular tracking after milestones') and an explicit when-not with the alternative named ('For the first push of a new repo use github_create_repo'). The approval path is also called out, so the agent knows a refusal is possible.

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

growth_build_slideshowsGrowth Build SlideshowsA
Idempotent

Render viral TikTok/Reels slideshows (1080x1920 PNGs) to marketing/growth//NN.png.

Use when: post-launch content only, after the app is submitted. You write the hooks and slide text; images come from the app's AI (fal). No scheduling. Returns: {ok, sets: [{name, slides, ok, dir}]}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
slideshowsYesList of {name, slides: [{text, image_prompt or image, cta}]} to render at 1080x1920.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare write (readOnlyHint=false), idempotentHint=true, destructiveHint=false, openWorldHint=true. The description adds value beyond that: it discloses the exact write path, that image generation is delegated to the app's external AI (fal) with the hook/slide text supplied by the caller, and that no scheduling occurs.

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?

Front-loaded with the action and artifact, then use conditions, then the return shape. No filler sentences; every clause carries information an agent needs.

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 an output schema present, the return value need not be spelled out, and annotations cover the safety profile. The description covers when, what, where, and the external image dependency. Minor gaps remain around failure behavior for individual slideshow sets and whether output directories are overwritten.

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 description coverage is 100%, so the baseline is 3. The description goes further by clarifying the division of labor in `slideshows` (caller writes hooks/text, `image_prompt` is rendered by fal) and by documenting the output resolution for the nested slide objects.

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 (Render) plus the resource (viral TikTok/Reels slideshows at 1080x1920 PNGs) and the exact output location convention (marketing/growth/<name>/NN.png). No sibling does slideshow rendering, so the agent can identify it immediately.

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?

Gives explicit use conditions: 'post-launch content only, after the app is submitted' and an exclusion, 'No scheduling.' It does not name an alternative tool for adjacent needs (e.g. design_export_png or screenshot_build_all), so it stops short of full when-vs-alternative routing.

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

icon_generateIcon GenerateA

Generate a fal.ai raster icon DRAFT into design/icon_drafts/ as reference for the Claude Design icon board (paid, opt-in only).

Use when: the user explicitly allows an external generator. Never installs an icon; the shipped icon comes from Claude Design (icon_install). Returns: {ok, draft, prompt, next} or a refusal unless allow_external_generator is true.

NameRequiredDescriptionDefault
extraNoExtra prompt text appended to the concept.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
conceptYesShort concept description of the app used to write the image prompt, e.g. 'AI pet portrait maker'.
allow_external_generatorNoMust be true to allow the paid fal.ai image generator; default false refuses.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare openWorldHint=true, readOnlyHint=false, destructiveHint=false. The description adds real value beyond that: the operation is paid, opt-in only, gated by a refusal unless allow_external_generator is true, and writes to a draft directory rather than installing. It stops short of noting rate limits or cost magnitude, keeping it at 4 rather than 5.

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?

Dense and front-loaded: purpose first, then the routing rule, then the return/refusal contract. Three compact sentences with no filler, though the parenthetical '(paid, opt-in only)' mildly duplicates the later refusal clause.

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?

An output schema exists, yet the description still summarizes the return contract ({ok, draft, prompt, next} or refusal) and covers the gating, destination, and relationship to icon_install. Nothing an agent needs to call this paid external generator 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%, so app_dir, concept, extra, and allow_external_generator are already documented, including the default-false refusal semantics. The description restates the refusal gate but adds no new syntax or format detail. Baseline 3 is correct 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.

Purpose5/5

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

States a specific verb+resource+engine: generate a fal.ai raster icon DRAFT into design/icon_drafts/. It explicitly distinguishes itself from the sibling icon_install by noting it never installs an icon. An agent can tell these two apart without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit 'Use when' condition (the user explicitly allows an external generator), states the alternative (icon_install for the shipped icon), and names the gate (allow_external_generator=true). When-to-use, when-not, and the alternative are all present.

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

icon_installIcon InstallA
Idempotent

Install the Claude Design app icon (1024x1024 master) into AppIcon.appiconset and write .appfactory/verify/icon.json.

Use when: after design_export_png produced design/icon.png and design_record_upload recorded the upload; the icon gate requires it. Alpha is flattened. Returns: {ok, icon, marker} or an error naming the missing/invalid master.

NameRequiredDescriptionDefault
sourceNoPath to the 1024x1024 icon master, relative to the app dir (default 'design/icon.png').design/icon.png
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety profile (idempotentHint=true, destructiveHint=false, non-open-world), and the description adds real behavioral detail beyond them: alpha is flattened, a marker file is written, and failures name the missing/invalid master. It stops short of describing overwrite semantics for an existing appiconset, which is the one mutation detail left unstated.

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?

Three labeled segments ('Use when:' / 'Returns:') keep preconditions, effects, and outputs front-loaded and scannable, with no filler sentences.

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 two-parameter install step, the description plus annotations plus existing output schema cover everything needed to invoke correctly: preconditions, side effects, and failure mode are all present.

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 both parameters (source and app_dir) are already fully documented with defaults and formats; the baseline of 3 applies. The description only indirectly hints at the source path via the design_export_png reference and adds no syntax beyond the schema.

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+resource pair ('Install the Claude Design app icon ... into AppIcon.appiconset') plus a secondary artifact it writes (verify/icon.json). It is clearly distinguishable from icon_generate (produces) and design_export_png (exports the PNG consumed here).

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

Usage Guidelines5/5

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

The 'Use when:' clause names the exact upstream preconditions (design_export_png produced design/icon.png, design_record_upload recorded the upload) and the gating rule ('the icon gate requires it'), so the agent knows precisely when to reach for this tool.

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

idea_evaluateIdea EvaluateA
Read-onlyIdempotent

Build the evidence bundle to rank one idea in any category.

Use when: comparing shortlisted ideas after idea_harvest. Not for: a quick score only (use aso_niche_score). Includes ai_needed and build_complexity heuristics for Claude to judge. Returns: {ok, autocomplete, niche, newcomers, leaders, ai_needed, build_complexity, review_risk, available_name} (untrusted_content).

NameRequiredDescriptionDefault
termYesSearch term or seed keyword, e.g. 'habit tracker'.
genreNoApp Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred.
countryNoTwo-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'.us
leadersNoNumber of category leaders to profile with price ladders (default 3).
name_candidatesNoCandidate app names; the first available one is reported.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description still adds real value: it discloses that ai_needed and build_complexity are heuristics passed to Claude to judge, and flags the payload as untrusted_content — a security-relevant trait not encoded in any annotation.

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?

Front-loaded purpose sentence followed by tightly labeled Use when / Not for / Returns blocks with no filler. Slight deduction because the Returns field list is redundant given a full output schema exists and could be trimmed.

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 an output schema present, the description needn't enumerate return keys, yet it still does so compactly without harm. Combined with the explicit routing guidance and the untrusted_content caveat, an agent has everything needed to select and invoke it correctly.

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% with all five parameters individually documented (term, genre, country, leaders, name_candidates), so the schema carries the parameter burden. The description adds no syntax or format detail beyond it; the mention of available_name only loosely hints at name_candidates. 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 concrete verb and resource ('Build the evidence bundle to rank one idea') with explicit scope ('in any category'), and names the sibling it must not be confused with (aso_niche_score). An agent can distinguish it from aso_niche_score and idea_harvest without opening any schema.

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

Usage Guidelines5/5

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

Uses explicit 'Use when: comparing shortlisted ideas after idea_harvest' and 'Not for: a quick score only (use aso_niche_score)', giving both the triggering condition and the named alternative. This is the exact when/when-not/alternative structure the rubric rewards.

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

idea_harvestIdea HarvestA
Read-onlyIdempotent

Sweep top-grossing and top-free charts across every App Store category and storefront to find proven and rising ideas.

Use when: Phase 0 idea generation (about 1.5 minutes for the default sweep). Not for: evaluating one idea (use idea_evaluate) or a single chart (use aso_top_grossing). Failed feeds are listed, never read as no apps. Returns: {ok, chart_proven, rising_newcomers, clusters: [{genre, open_niche}], failed_feeds} (untrusted_content).

NameRequiredDescriptionDefault
feedsNoChart feeds to use, e.g. ['topgrossing', 'topfree']; omit for both.
limitNoChart entries fetched per genre and storefront (default 100).
genresNoCategory names to sweep, e.g. ['health', 'productivity']; omit for all 24 charted categories.
countriesNoList of two-letter storefront codes, e.g. ['us', 'gb', 'de']; omit for the default set.
max_resultsNoMaximum entries per result list (default 50).
exclude_termsNoName/seller substrings to drop from results (e.g. your own apps).
newcomer_monthsNoApps released within this many months count as rising newcomers (default 12).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower; the description still adds runtime cost (~1.5 min for the default sweep), the failure semantics ('failed feeds are listed, never read as no apps'), and flags output as untrusted_content. Only gap is no mention of rate limits or coverage bounds on the open-world sweep.

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?

Four tightly packed lines, front-loaded with purpose, then when/not-for, then failure semantics and return shape. Every sentence carries distinct information.

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?

An output schema exists, yet the description still enumerates the return keys and flags untrusted_content, and it discloses the failure-mode behavior an agent needs before trusting empty results. Nothing required 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%, so all seven parameters are already documented in the schema; the description's 'every App Store category and storefront' only loosely gestures at the genres/countries filters. 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.

Purpose5/5

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

States a specific verb (sweep) and resource (top-grossing and top-free charts) plus explicit scope (every App Store category and storefront), and names the sibling tools it must not be confused with (idea_evaluate, aso_top_grossing). An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' pins it to Phase 0 idea generation, and 'Not for' names the two alternatives with the condition that selects each. Nothing is left to inference.

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

localize_applyLocalize ApplyA
Idempotent

Merge translations into the in-app String Catalog for the spec's app locales.

Use when: after translating UI strings; locales not in spec locales.app are ignored. Not for: store listing copy (use metadata_render_listing / deliver_metadata). Returns: {ok, locales, keys, missing}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
translationsYesMap {english_key: {locale: translated value}} for the String Catalog.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety and idempotency (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds real behavior beyond them: out-of-spec locales are silently ignored, and the result shape is disclosed. It stops short of explaining merge/overwrite semantics on existing keys.

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?

Four terse, front-loaded lines: what it does, when to use, when not to, and what it returns. Every sentence earns its place with zero padding.

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 two-param, idempotent, non-destructive mutation with full annotation and schema coverage, the description covers trigger, exclusions, alternatives, and outcome. 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% with two well-documented required params, so the schema already carries the burden. The description adds only the spec-locale filtering rule, which is behavioral rather than parameter syntax, so baseline 3 is appropriate.

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 and resource ('Merge translations into the in-app String Catalog') plus the scope restriction ('for the spec's app locales'), which separates it from the many other localization and metadata siblings.

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

Usage Guidelines5/5

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

Explicitly names the trigger ('Use when: after translating UI strings'), the exclusion ('Not for: store listing copy'), and routes to the correct alternatives (metadata_render_listing / deliver_metadata).

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

maestro_testMaestro TestA

Run the app's Maestro flows (.maestro/) on the booted simulator with the live Viewer, and write .appfactory/verify/maestro.json.

Use when: verifying the app end to end; testflight_ship and the features gate require every smoke flow green. The app must already be installed (build_for_sim + simctl install). Opens the Viewer at http://localhost:7777; there is no headless mode. Returns: {ok, flows: [{name, passed}], report path}.

NameRequiredDescriptionDefault
tagsNoComma-separated Maestro tag filter, e.g. 'smoke'; omit to run every flow.
deviceNoSimulator UDID to run on; omit for the booted simulator.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations cover mutation safety (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description goes beyond them with a genuinely useful trait: it opens an interactive Viewer at http://localhost:7777 and has no headless mode, plus it writes a report file. It omits expected runtime/duration and what happens on partial flow failure, so not quite a 5.

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?

Three dense, front-loaded segments (action, when, returns) with zero filler. Every sentence carries actionable information for an agent deciding whether and how to call the tool.

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 test-runner tool it covers purpose, prerequisites, side-effect artifacts and the non-headless Viewer behavior; the output schema carries the return shape, and the description's brief 'Returns' restatement is harmless. Nothing an agent needs 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 description coverage is 100%, so tags, device and app_dir are already documented in the schema, including the tag-filter example and the 'omit for booted simulator' default. The description adds no parameter-level detail beyond what the schema provides, 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 and resource ('Run the app's Maestro flows (.maestro/) on the booted simulator'), names the artifact produced ('.appfactory/verify/maestro.json'), and the live Viewer variant. An agent can distinguish this from build_test or build_for_sim without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: verifying the app end to end' plus a dependency statement that testflight_ship and the features gate require every smoke flow green. It also states the prerequisite chain (app must be installed via build_for_sim + simctl install), leaving nothing to inference.

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

mascot_assetsMascot AssetsA
Idempotent

Import approved mascot poses and blink variants into Resources/Assets.xcassets/Mascot/.

Use when: after mascot_blink; states without a pose borrow a fallback. Returns: {ok, imagesets: [names]}.

NameRequiredDescriptionDefault
statesNoMascot pose/state names, e.g. ['idle', 'happy']; omit for all states.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
source_dirNoDirectory with approved pose PNGs; omit for <app>/design/mascot.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare non-read-only, idempotent, non-destructive, closed-world behavior. The description adds value beyond that by naming the write target (Resources/Assets.xcassets/Mascot/) and the fallback-substitution behavior for unposed states, which the schema/annotations do not cover.

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?

Three tight sentences with 'Use when' and 'Returns' labels front-loading the sequencing and output shape. No filler or restated boilerplate.

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?

An output schema exists, so the brief return mention is sufficient, and the description covers ordering, fallback behavior, and destination. It does not say whether pre-existing imagesets are overwritten or what failure looks like when source PNGs are 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%, so all three params (app_dir, states, source_dir) are already documented in the schema, making 3 the baseline. The description's mention that unposed states borrow a fallback adds a small semantic nuance about the 'states' param but no syntax or format details.

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 (import) and resource (mascot poses/blink variants) with a concrete destination path, so the agent knows exactly what gets written and where. It hints at sequencing with mascot_blink but does not explicitly contrast itself with that sibling.

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?

The 'Use when: after mascot_blink' clause gives a clear ordering precondition relative to a named sibling, and 'states without a pose borrow a fallback' explains downstream consequence. No explicit when-not guidance, though the prerequisite is unusually concrete for this set.

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

metadata_checkMetadata CheckA
Read-onlyIdempotent

Validate an apple-metadata.md file: required fields and character limits (no writes).

Use when: checking a single metadata file. For the store listing.json use metadata_listing_check; for the ASO outputs folder use aso_validate_metadata. Returns: {ok, problems: [...], locales}.

NameRequiredDescriptionDefault
source_mdYesPath to apple-metadata.md.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the '(no writes)' note is largely redundant. The description does confirm the operation is a pure validation and outlines the return shape, but it adds little behavioral context beyond the structured fields (e.g., what happens on a missing file or how problems are ordered).

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?

Three short, front-loaded lines: what it does, when to use it, what it returns. No filler and no repetition of the title.

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, read-only validator with an output schema and full annotations, everything an agent needs to select and call it is present; the return shape is even summarized despite the output schema carrying it.

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?

Only one parameter, and the schema documents it fully at 100% coverage ('Path to apple-metadata.md'). The description adds no format or path-resolution details beyond what the schema states, so the baseline 3 for high-coverage schemas 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 (Validate) and resource (apple-metadata.md) plus the exact validation scope: required fields and character limits. It also names the two nearest siblings and what they cover, so the agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: checking a single metadata file' plus direct alternatives for other cases (metadata_listing_check for listing.json, aso_validate_metadata for the ASO outputs folder). When-to-use and when-to-use-something-else are both covered.

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

metadata_exportMetadata ExportA
Idempotent

Export apple-metadata.md to fastlane/metadata//*.txt after validation.

Use when: preparing metadata for deliver_metadata. With app_dir set, refuses until the ASO stage is complete. Not for: uploading to App Store Connect (use deliver_metadata). Returns: {ok, written: [files], locales} or a gate refusal.

NameRequiredDescriptionDefault
app_dirNoApp directory; when given, export is refused until the ASO stage is complete.
dest_dirYesOutput directory for the per-locale .txt files, e.g. <app>/fastlane/metadata.
source_mdYesPath to apple-metadata.md to export.
privacy_urlNoPublic privacy policy URL written to the metadata files.
support_urlNoPublic support page URL.
primary_categoryNoPrimary App Store category id, e.g. 'PHOTO_AND_VIDEO'.
secondary_categoryNoSecondary App Store category id, e.g. 'PRODUCTIVITY'.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare non-readonly, non-destructive, idempotent, closed-world. The description goes beyond them by disclosing the ASO-stage gate that can cause refusal and the validation step before writing — real behavioral context an agent needs. It stops short of describing failure modes beyond the gate.

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?

Front-loaded with the core action, then structured as Use when / Not for / Returns blocks. Every line earns its place with no 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 an output schema present, return-value explanation is optional, yet the description still summarizes the return shape and the gate refusal. Combined with complete param docs and annotations, nothing needed to invoke 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%, so all seven parameters are already documented with format hints and examples. The description adds only the app_dir gate semantics, which is already mirrored in the schema; baseline 3 is appropriate.

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 (Export), the exact source (apple-metadata.md) and destination pattern (fastlane/metadata/<locale>/*.txt), plus the validation qualifier. Clearly distinct from deliver_metadata, which it names as the upload counterpart.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (preparing metadata for deliver_metadata), a conditional gate (app_dir set → refuses until ASO stage complete), and an explicit not-for routing to deliver_metadata. Both the selection condition and the exclusion are stated.

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

metadata_listing_checkMetadata Listing CheckA
Read-onlyIdempotent

Validate store/metadata/listing.json: length limits, keyword rules, no word overlap, subscription disclosure and legal links.

Use when: before deliver_metadata. For a bare apple-metadata.md use metadata_check. Returns: {ok, problems: [...]}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the validation scope and a return shape ({ok, problems: [...]}), which is useful context beyond the annotations, though it does not detail error conditions or execution behavior further.

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?

The description is two compact sentences that front-load the core action, followed by a short usage note and return shape. Every sentence earns its place with no redundancy.

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 read-only validation tool with rich annotations, a fully documented parameter schema, and an output schema, the description is complete. It covers what is validated, when to use it, the sibling alternative, and the return structure, leaving no critical gap for an agent.

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 single app_dir parameter is fully documented in the schema itself. The description adds no parameter-level meaning, which is acceptable and earns the baseline 3 for high schema coverage.

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?

The description names a specific verb (Validate), a precise resource (store/metadata/listing.json), and enumerates the validation categories (length limits, keyword rules, no word overlap, subscription disclosure, legal links). It also distinguishes itself from the sibling metadata_check by specifying that metadata_check is for a bare apple-metadata.md.

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

Usage Guidelines5/5

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

It states exactly when to use this tool (before deliver_metadata) and names the alternative tool (metadata_check) along with the condition that selects it (for a bare apple-metadata.md). No inference is required.

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

metadata_render_listingMetadata Render ListingA
Idempotent

Sync listing.json to the spec (store locales, IAP copy slots) and fill the legal URLs.

Use when: after changing the spec's store locales or products. Local writes only; verify with metadata_listing_check. Returns: {ok, locales, changed}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, idempotent, non-destructive, closed-world write. The description adds the genuinely new fact that writes are local-only, which tells the agent nothing remote is mutated and that state lives on disk. It also restates the return shape, though an output schema already exists.

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?

Three tight labeled lines: action, trigger, scope plus verification, and return shape. Front-loaded with the verb and resource, and every sentence carries distinct information.

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 local write with annotations covering the safety profile and a separate output schema, the description supplies everything needed: what changes, when to invoke it, that writes stay local, and which sibling verifies the result.

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?

Only one parameter, and the schema description already covers it at 100% (absolute path to the app directory containing app.spec.json). The description adds no syntax, format, or path-resolution detail beyond what the schema supplies, 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 and resource ('Sync listing.json to the spec') and enumerates the concrete payload it touches (store locales, IAP copy slots, legal URLs). It is clearly distinguishable from sibling metadata_listing_check, which it explicitly frames as the verification step.

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?

'Use when: after changing the spec's store locales or products' gives an explicit trigger condition, and the description routes the agent to metadata_listing_check for verification. No explicit when-not or edge-case exclusions are provided, so it falls just short of a 5.

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

onboarding_planOnboarding PlanA
Read-onlyIdempotent

Return guidance for choosing the onboarding step count; does not change any file.

Use when: deciding onboarding length with the user (quiz-style flow with about 5 personalization questions is the standard). Returns: {ok, step_count, ranges: {"8-10"|"11-13"|"14-15": description}, warning?}.

NameRequiredDescriptionDefault
step_countNoDesired number of onboarding steps; recommended range 8-15 (default 12).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/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 openWorldHint=false, and the description's 'does not change any file' largely restates readOnlyHint. It does add the shape of the returned ranges, but since an output schema exists that is modest incremental value.

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?

Front-loaded and cleanly segmented into purpose, 'Use when:', and 'Returns:' with no filler. The returns sentence is slightly redundant given the output schema, keeping it just under a 5.

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 one-parameter, read-only guidance tool with full schema coverage, annotations, and an output schema, the description covers what the tool does, when to invoke it, and that it is safe — nothing an agent needs 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 single step_count parameter is fully documented there (including default 12 and 8-15 range). The description adds no format or constraint 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.

Purpose5/5

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

States a specific verb and resource ('Return guidance for choosing the onboarding step count') and immediately scopes it as non-mutating ('does not change any file'). No sibling covers anything similar, so the agent can identify it unambiguously.

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?

The 'Use when:' clause gives a clear trigger context (deciding onboarding length with the user) and even adds a default scenario (quiz-style flow with about 5 questions). It stops short of naming when *not* to use it or an alternative tool, so it is clear context without exclusions.

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

orchestrator_needs_humanOrchestrator Needs HumanA
Idempotent

Write NEEDS_HUMAN.md when self-correction is exhausted and return its path.

Use when: a stage keeps failing and only the human can unblock it (stop the loop afterwards). Returns: {ok, path}.

NameRequiredDescriptionDefault
stageYesPipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list).
reasonYesWhy self-correction is exhausted (what failed).
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
how_to_resolveYesWhat the human needs to do to unblock the stage.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and idempotentHint=true, and the description adds the key behavioral fact that the loop should stop afterward. It doesn't fully explain side effects (does it also halt the orchestrator? does it overwrite existing NEEDS_HUMAN.md?), but it meaningfully exceeds 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.

Conciseness5/5

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

Three tight lines with front-loaded action, a use-when condition, and the return shape – no wasted words.

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?

Covers action, trigger, and return value with an output schema present. Minor gaps remain around whether writing is overwrite-safe and how it interacts with the orchestrator loop, but it is sufficient for correct invocation.

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%, so all four required params are documented in the schema itself. The description adds no parameter detail beyond implying the file path output, so baseline 3 is appropriate.

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+resource ('Write NEEDS_HUMAN.md') and its trigger ('when self-correction is exhausted'), plus the return value. Clearly distinguishable from siblings like orchestrator_record_attempt or pipeline_mark.

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

Usage Guidelines5/5

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

Explicitly names the condition ('a stage keeps failing and only the human can unblock it') and adds a critical operational caveat ('stop the loop afterwards'), which is genuine when-to-use guidance.

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

orchestrator_next_actionOrchestrator Next ActionA
Read-onlyIdempotent

Return the next action for the autonomous driver loop: stage, subagent role, retry budget and instructions.

Use when: running unattended. done=true means the pipeline is finished (submit still needs human approval). For a manual step use pipeline_next. Returns: {ok, done, stage, role, attempts_left, instructions}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
skip_options_checkNoIf true, do not require run_options_save to have been called first. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint/openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior the annotations cannot express: done=true means the pipeline is finished, and the final submit still requires human approval. It does not mention the skip_options_check prerequisite relationship to run_options_save, which is the one notable 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.

Conciseness4/5

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

Front-loaded with the purpose and organized into 'Use when' / alternative / 'Returns' beats, with zero filler prose. The explicit 'Returns: {ok, done, stage, role, attempts_left, instructions}' is mildly redundant given a separate output schema exists, which is the only thing keeping this short of a 5.

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?

For a two-parameter, read-only loop-driving tool with an output schema, the description supplies the essentials: purpose, unattended-use condition, sibling route, and the human-approval caveat on done. Return values need not be explained since an output schema exists; only the skip_options_check/run_options_save ordering precondition is left implicit.

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 app_dir and skip_options_check are already documented, including the default and its meaning. The description contributes nothing about input parameters – its only parameter-adjacent content (stage, role, retry budget) describes outputs, not inputs. Baseline 3 is correct when the schema carries the load.

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 (Return) and resource (the next action for the autonomous driver loop) and enumerates what the action contains: stage, subagent role, retry budget, instructions. It also names the sibling it is not (pipeline_next), so the agent can discriminate without opening any schema.

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

Usage Guidelines5/5

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

'Use when: running unattended' gives the triggering condition, and 'For a manual step use pipeline_next' names the explicit alternative and the condition that selects it. Nothing about routing is left to inference.

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

orchestrator_preflightOrchestrator PreflightA
Read-onlyIdempotent

Pre-flight for an autonomous run: run options confirmed, config keys present, fastlane session fresh, caffeinate command.

Use when: before starting the orchestrator_next_action loop. Ready when blockers is empty. Returns setup_required first if AppFactory is not set up. Returns: {ok, blockers: [...], caffeinate, ...}.

NameRequiredDescriptionDefault
app_dirNoApp directory; omit before the app is scaffolded.
skip_options_checkNoIf true, do not require run_options_save to have been called first. Default false.

Output Schema

NameRequiredDescription

No output parameters

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, so the safety bar is lower. The description adds real context: it explains the checks performed, the blockers contract, and the setup_required behavior when AppFactory isn't configured, though it doesn't detail rate limits or failure modes beyond that.

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?

Front-loaded with the core purpose, then usage, readiness, and return shape in tight order. It is dense and fragmentary in places (e.g. 'caffeinate command') 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?

An output schema exists, so explaining return values isn't strictly required, yet it sketches the return shape and the setup_required path. Combined with annotations, an agent has enough to call and interpret it, with only minor gaps around blocker semantics.

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 both parameters are already documented in the schema, making 3 the baseline. The description alludes to 'run options confirmed' which loosely maps to skip_options_check, but adds no syntax or format detail beyond the schema.

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?

The description states a specific verb+resource (pre-flight checks before an autonomous run) and enumerates what is validated: run options, config keys, fastlane session, caffeinate. It is clearly distinguishable from the sibling orchestrator_next_action loop it gates.

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

Usage Guidelines5/5

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

Explicitly says 'Use when: before starting the orchestrator_next_action loop,' names the alternative and the precondition, and adds the ready condition ('Ready when blockers is empty') plus the setup_required fallback path. Nothing is left to inference.

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

orchestrator_record_attemptOrchestrator Record AttemptA

Count one failed attempt of a stage after a gate failure.

Use when: a stage gate failed in the autonomous loop; escalate with orchestrator_needs_human when should_retry is false. Returns: {ok, stage, attempts, should_retry}.

NameRequiredDescriptionDefault
stageYesPipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list).
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the agent knows this is a non-idempotent, non-destructive write. The description adds the key behavioral fact that the return's should_retry field gates escalation to orchestrator_needs_human, which is meaningful state-machine context. It does not disclose where attempts are persisted or any retry threshold, but with annotations covering the safety profile the remaining gap is minor.

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?

Three compact lines, front-loaded with the action, then clearly separated 'Use when' and 'Returns' blocks. Every sentence carries information an agent needs.

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?

An output schema exists, so the description needn't explain return values, yet it does anyway, and it supplies the escalation logic that makes the tool usable inside the loop. What's missing is any note on retry limits or where the attempt counter lives, but for a two-parameter bookkeeping tool this is close to 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 description coverage is 100%, so both parameters (stage, app_dir) are already fully documented in the schema, including the example stage ids and the app.spec.json requirement. The description adds no parameter-level meaning beyond that, 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?

States a specific verb and resource: 'Count one failed attempt of a stage after a gate failure,' which is far more than a restatement of the name. It also names a sibling (orchestrator_needs_human) as the escalation path, giving partial sibling differentiation, though it doesn't distinguish itself from other orchestrator_* bookkeeping tools like orchestrator_next_action or pipeline_mark.

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

Usage Guidelines5/5

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

Explicit 'Use when' clause scopes it to a stage gate failure inside the autonomous loop, and the conditional escalation rule ('escalate with orchestrator_needs_human when should_retry is false') names the alternative and the exact condition that selects it. Nothing is left to inference.

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

pipeline_markPipeline MarkA
Idempotent

Set a pipeline stage's status (done, in_progress, pending) in the app manifest.

Use when: recording progress. Marking done runs the stage's enforced gate. To only test the gate use pipeline_validate. Returns: {ok, stage, status} or a gate refusal.

NameRequiredDescriptionDefault
stageYesPipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list).
statusNoNew stage status: 'done', 'in_progress' or 'pending'.done
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds real behavioral context beyond that: marking done triggers the stage's enforced gate, and the call can return a gate refusal. The return-shape sentence is mostly redundant with the output schema but harmless.

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?

Front-loads the action, then use-case, alternative, and return shape in four tight sentences with no filler. Every sentence carries information.

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 3-param mutation with 100% schema coverage, an output schema, and full annotations, the description supplies the remaining unknowns: when to call it, which sibling to use instead, and the gate side effect. Nothing needed for correct invocation 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%, so stage, status, and app_dir are already fully documented with examples and defaults. The description repeats the status enum values but adds no format or constraint information beyond the schema, 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 (Set), resource (a pipeline stage's status), the allowed values, and the storage location (app manifest). It also names the sibling it is not (pipeline_validate), so an agent can separate it from its closest neighbor without opening schemas.

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

Usage Guidelines5/5

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

Explicit 'Use when: recording progress', plus a concrete exclusion with the alternative ('To only test the gate use pipeline_validate'). Both the when and the when-not are present.

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

pipeline_nextPipeline NextA
Read-onlyIdempotent

Return the next mandatory pipeline step with its instructions.

Use when: driving the pipeline manually. Refuses until run options are confirmed (run_options, run_options_save) unless skip_options_check. Not for: the autonomous loop with retry budgets (use orchestrator_next_action). Returns: {ok, stage, instructions} or setup_required / options-not-confirmed errors.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
skip_options_checkNoIf true, do not require run_options_save to have been called first. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/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 useful behavioral context beyond annotations: it refuses until run options are confirmed and returns specific error modes (setup_required / options-not-confirmed). However, the core precondition is also implied by the schema's skip_options_check description, so this is strong but not maximally additive.

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?

The description is front-loaded with purpose, then scannable 'Use when', 'Not for', and 'Returns' sections. Every sentence carries actionable information, and there is no 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?

The tool's purpose, gating condition, alternative, and error modes are all covered, and an output schema exists so return-value details need not be exhaustively restated. Nothing an agent needs in order 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%, so both parameters are already fully documented in the input schema. The description only mentions skip_options_check in passing and adds no syntax, format, or usage detail beyond what the schema provides; baseline 3 is appropriate.

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 and resource: 'Return the next mandatory pipeline step with its instructions.' It also explicitly differentiates from the closest sibling by naming the alternative for the autonomous loop (orchestrator_next_action), so an agent can distinguish it without opening another schema.

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

Usage Guidelines5/5

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

Provides direct when-to-use guidance ('driving the pipeline manually'), explicit exclusions ('Not for: the autonomous loop with retry budgets'), and the exact replacement tool. It also states the gating precondition and the escape hatch, leaving no ambiguity about when this tool is appropriate.

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

pipeline_statusPipeline StatusA
Read-onlyIdempotent

Show which pipeline stages are done or pending and what comes next.

Use when: checking progress of one app. To get the next instructions use pipeline_next; for the autonomous loop use orchestrator_next_action. Returns: {ok, stages: {stage: status}, next}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only that it reports per-stage status and a 'next' field, which is largely restated by the output schema; no permissions, failure modes, or freshness caveats are disclosed.

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?

Three tight lines, front-loaded with the purpose and using explicit 'Use when' / 'Returns' labels. Every sentence carries routing or scope information; no 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?

A read-only status tool with one required parameter, 100% schema coverage, an output schema, and full annotation coverage. The description's routing guidance plus the structured fields give the agent everything needed to call it correctly.

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 app_dir parameter is fully documented in the schema with format and example. The description adds nothing about the parameter, so the baseline 3 for high coverage 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 and resource ('Show which pipeline stages are done or pending') plus the scope of the report. It explicitly names the sibling tools it is not (pipeline_next, orchestrator_next_action), so an agent can differentiate it without opening any schema.

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

Usage Guidelines5/5

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

Contains an explicit 'Use when' clause scoping it to checking progress of one app, and routes the agent to the correct alternatives for adjacent needs (pipeline_next for next instructions, orchestrator_next_action for the autonomous loop). No inference required.

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

pipeline_validatePipeline ValidateA
Read-onlyIdempotent

Run a stage's enforced gate without modifying the manifest.

Use when: self-checking before pipeline_mark(done). Read-only. Returns: {ok, stage, problems: [...]}.

NameRequiredDescriptionDefault
stageYesPipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list).
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/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 nonetheless adds the key behavioral fact that the manifest is not modified, reinforcing rather than contradicting the annotations. The only gap is that the 'Returns' line largely restates what the output schema already provides, so it adds little beyond the structured fields.

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?

Three short, front-loaded lines with zero filler: purpose, usage trigger, and return shape. Every sentence earns its place and the most decision-relevant information comes first.

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 rich annotations, a 100%-documented two-parameter schema, and an existing output schema, the description covers everything an agent needs: what it does, when to call it, and that it is side-effect-free. Nothing material 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%: both 'stage' and 'app_dir' are fully documented in the schema, including examples and the pointer to pipeline_status for valid stage ids. The description adds no parameter-level meaning, 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 and resource ('Run a stage's enforced gate') with a precise scope qualifier ('without modifying the manifest'). An agent can distinguish it from pipeline_mark, which does modify the manifest, without reading either schema.

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

Usage Guidelines5/5

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

The 'Use when: self-checking before pipeline_mark(done)' line gives an explicit trigger condition and names the alternative it precedes. The read-only contrast with pipeline_mark makes the selection decision unambiguous.

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

playbookPlaybookA
Read-onlyIdempotent

Return the AppFactory run playbook as markdown.

Use when: before driving the pipeline; the same text is the run prompt and the appfactory://playbook resource. Returns: markdown string.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered elsewhere. The description contributes only the extra fact that the returned text is identical to the `run` prompt and the playbook resource, which is mild but real context; it adds nothing about size, caching, or failure modes.

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 short, front-loaded lines in a 'what / use when / returns' shape with no filler. The 'Returns: markdown string' line slightly duplicates the output schema, but the total size is minimal.

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 rich annotations, a present output schema, and zero parameters, the description supplies everything needed to call it: what it yields, when it is appropriate, and what format to expect. Nothing essential is missing for a tool this simple.

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?

The tool takes zero parameters and the description correctly presents it as a no-argument fetch, so there is no parameter semantics to explain. Baseline for a zero-parameter tool.

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?

Names a specific verb and resource (return the AppFactory run playbook as markdown) and immediately disambiguates it from the adjacent `run` prompt and the appfactory://playbook resource. An agent can tell what it gets without opening the schema, though it doesn't explicitly contrast with a named sibling tool.

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?

The 'Use when: before driving the pipeline' clause gives a clear triggering condition tied to the orchestration workflow. There is no when-not guidance or named alternative, but for a static reference fetch there is little ambiguity to resolve.

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

preview_briefPreview BriefA
Idempotent

Write marketing/preview/BRIEF.md (the HyperFrames App Preview brief) from app.spec.json and create the recordings folders.

Use when: starting the App Preview video. Then record the real app and author the video with the hyperframes skill (real footage only). Check with preview_check. Returns: {ok, brief path, recordings dirs}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
messageNoOptional extra direction appended to the brief.
overwriteNoIf true, replace files that already exist; default false refuses to overwrite.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the agent knows this is a repeatable, non-destructive write. The description adds real value beyond that by disclosing the output artifacts (brief file + recordings dirs), the workflow constraint ("real footage only"), and the downstream verification path.

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?

Front-loads the concrete action, then structures guidance with "Use when:" and "Returns:" labels. Efficient overall, though the multi-line wrapping is slightly less scannable than a tight prose sentence.

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?

An output schema exists, so return-values need not be explained further, and the description still summarizes the return shape. Workflow placement and the follow-up tool are covered; only an explicit overwrite/preconditions note is absent, and that lives in the schema.

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 app_dir, message, and overwrite are already fully documented in the schema. The description adds no parameter-level meaning beyond what the schema provides, which is the baseline 3 case.

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 and resource: write marketing/preview/BRIEF.md from app.spec.json and create recordings folders. This is clearly distinguishable from preview_check (validation) and the recording/authoring steps it routes the agent toward.

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?

"Use when: starting the App Preview video" gives explicit timing, and it names the follow-up flow (record the real app, author with the hyperframes skill) and the verification tool preview_check. No explicit when-not condition is given, which is the only gap.

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

preview_checkPreview CheckA
Read-onlyIdempotent

Check offline readiness of the App Preview set: brief, recordings, one preview per locale, ffprobe specs, self-review status.

Use when: before preview_upload. Files must be 886x1920, <=30 fps, H.264, 15-30 s, <=500 MB, stereo AAC or silent. Returns: {ok, problems: [...], plan}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds real behavioral value beyond that: the concrete acceptance thresholds (886x1920, <=30 fps, H.264, 15-30 s, <=500 MB, stereo AAC or silent) that define pass/fail.

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?

Three front-loaded blocks (what it checks, when to use it with thresholds, what it returns) with no filler. Every clause carries information an agent needs.

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 an output schema present, the description does not need to detail return values, yet it still summarizes {ok, problems, plan}. Combined with rich annotations and full schema coverage, an agent has everything required to invoke it correctly; only failure-handling guidance is absent.

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?

There is a single parameter (app_dir) with 100% schema description coverage, and the schema already explains it fully as the path containing app.spec.json. The description adds no parameter-level detail, which is the expected baseline when the schema does the work.

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 ('Check') and a precisely scoped resource ('offline readiness of the App Preview set'), then enumerates exactly what is validated: brief, recordings, one preview per locale, ffprobe specs, self-review status. This clearly distinguishes it from siblings such as preview_upload, preview_brief, and preview_review_log.

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?

'Use when: before preview_upload' gives an explicit ordering gate that an agent can act on. It does not state when this tool should be skipped or what to do on failure, but the sequencing guidance is unambiguous.

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

preview_review_logPreview Review LogA
Idempotent

Log one self-review round (scores 1-10 and worst problems) for a final preview file.

Use when: after preview_review_sheets. Every score must reach 8+ on the exact final file (MD5-matched) or preview_upload and the gate refuse. Returns: {ok, passed, scores, problems}.

NameRequiredDescriptionDefault
fileYesPreview file path relative to the app dir, e.g. 'fastlane/app_previews/en-US/preview.mp4'.
scoresYesScores 1-10 for keys hook, readability, motion, variety, brand, music.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
problemsNoUp to 3 worst problems as [{t: seconds, issue: text}]; required while any score is under 8.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare a non-read-only, idempotent, non-destructive write; the description reinforces this by describing gating behavior, the MD5-match requirement, and downstream refusal by preview_upload. It does not explain what is persisted or how repeated logs for the same file interact, which is the remaining gap.

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?

Three front-loaded lines: action, when, and return shape. No filler, and the critical gating constraint arrives early enough to affect the call decision.

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?

Given four parameters, high schema coverage, and an existing output schema, the description covers purpose, sequencing, pass/fail gate, and consequence of failure. The duplicated 'Returns' line is redundant but harmless; nothing needed for correct invocation 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%, so the schema already documents file, scores keys, and the conditional problems requirement — the description largely repeats these ('scores 1-10 and worst problems'). The only added semantic is that the file must be the MD5-matched final artifact, which is a modest increment over the schema.

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+resource ('Log one self-review round') with explicit scope ('for a final preview file') and names the key inputs. It is clearly distinguishable from the sibling preview_review_sheets, which it references as the preceding step.

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

Usage Guidelines5/5

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

Explicitly gives the sequencing trigger ('after preview_review_sheets') and the hard acceptance condition ('Every score must reach 8+ on the exact final file (MD5-matched) or preview_upload and the gate refuse'), including what happens on failure. Alternatives and consequences are both named.

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

preview_review_sheetsPreview Review SheetsA
Idempotent

Generate self-review material (contact sheet, phone-size sheet, transition strip) for every final preview with ffmpeg.

Use when: reviewing a rendered preview; open the sheets, score them, then call preview_review_log. Returns: {ok, sheets: {locale: [paths]}}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds meaningful context beyond that: it writes files via ffmpeg, produces three named artifact types, and emits a per-locale path map. It does not say where files land on disk, but the behavioral picture is solid.

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?

Tightly structured with front-loaded purpose, a labeled 'Use when:' clause, and a labeled 'Returns:' clause. Every sentence earns its place and no filler is present.

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 one-parameter generation tool with an output schema, the description covers purpose, artifacts, prerequisite (a rendered preview), the downstream step, and the return shape. Nothing an agent needs 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?

Only one parameter (app_dir) and schema description coverage is 100%, so the schema fully documents the argument including the app.spec.json hint and an example path. The description adds nothing about parameters, which is the expected baseline when the schema carries the burden.

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 (generate) and enumerates the concrete artifacts produced (contact sheet, phone-size sheet, transition strip), scoped to 'every final preview'. This clearly separates it from siblings like preview_brief, preview_check, and the follow-up preview_review_log.

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?

Provides an explicit 'Use when: reviewing a rendered preview' trigger plus the workflow ('open the sheets, score them, then call preview_review_log'), which routes the agent to the correct next tool. No explicit when-not conditions or named alternatives for the review stage, so it stops short of a 5.

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

preview_uploadPreview UploadA
DestructiveIdempotent

Upload fastlane/app_previews// to the editable version's iPhone preview sets via the asc CLI (needs human approval unless dry_run).

Use when: preview_check is clean and self-review passed. dry_run=true (default) sends nothing. MD5-idempotent; refuses while preview_check has problems. Returns: {ok, uploaded/planned: [...], dry_run} or an approval_required refusal.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
dry_runNoIf true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action.
localesNoLocale codes to upload; omit for every locale in fastlane/app_previews/.
replaceNoIf true, replace preview sets that already exist on App Store Connect.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Goes beyond the annotations (destructiveHint, idempotentHint, openWorldHint) by disclosing the human-approval gate, the MD5-idempotency mechanism, the refusal condition, and the return/refusal shapes. The approval_required refusal path in particular is information the annotations cannot convey.

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?

Front-loaded with the action, then 'Use when', dry_run, idempotency, and return shape in tight form. Every sentence earns its place, though the opening sentence is dense enough to require a second read.

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 destructive, approval-gated upload tool with five parameters, the description supplies preconditions, default safety behavior, refusal handling, and the round-trip approval workflow. An output schema exists, yet the description still frames the result usefully for planning.

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 app_dir, dry_run, locales, replace, and approval_id in detail. The description reinforces the dry_run default and idempotency but does not add syntax or semantics beyond the schema, 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 and resource — uploads fastlane/app_previews/<locale>/ to the editable version's iPhone preview sets — and names the mechanism (asc CLI). It is clearly distinguishable from siblings like preview_check, preview_brief, and preview_review_log.

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

Usage Guidelines5/5

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

Gives an explicit precondition ('Use when: preview_check is clean and self-review passed'), an exclusion ('refuses while preview_check has problems'), and the safe default ('dry_run=true (default) sends nothing'). An agent knows exactly when this tool is and isn't appropriate.

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

pricing_unit_economicsPricing Unit EconomicsA
Idempotent

Compute unit economics from the measured AI cost per call and usage profiles, and write the generated blocks of store/pricing.md.

Use when: pricing a built app with real eval data. For quick what-if numbers at idea stage use aso_unit_economics. Returns: {ok, products: [{margin, ...}], path}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
apple_cutNoApple's commission as a fraction: 0.15 (Small Business Program, default) or 0.30.
cost_textNoMeasured AI cost in USD per text call; omit to read from backend/eval/results.
cost_photoNoMeasured AI cost in USD per photo call; omit to read from backend/eval/results.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and idempotentHint=true; the description usefully discloses the concrete write target (blocks of store/pricing.md), which annotations alone don't convey. It stops short of saying whether existing blocks are overwritten or what permissions are needed, so 4 rather than 5.

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?

Three tightly folded lines with zero waste: purpose first, then use-when/alternative, then return shape. Front-loaded and scannable.

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?

An output schema exists, so the return detail is optional, yet the description still summarizes {ok, products:[{margin,...}], path}. The write side effect is noted; only the overwrite/permission behavior is left implicit, which is minor for a tool this well-scoped.

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 app_dir, apple_cut, cost_text and cost_photo thoroughly. The description's 'measured AI cost per call' and 'usage profiles' loosely map to these params but add no syntax or default guidance 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.

Purpose5/5

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

Specific verb+resource ('Compute unit economics') plus the concrete inputs (measured AI cost per call, usage profiles) and the side effect (writing blocks of store/pricing.md). This is directly distinguishable from the sibling aso_unit_economics.

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

Usage Guidelines5/5

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

Explicit 'Use when: pricing a built app with real eval data' and a named alternative ('for quick what-if numbers at idea stage use aso_unit_economics'). Both the when and the when-not-with-alternative are stated.

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

revenuecat_setupRevenueCat SetupA
DestructiveIdempotent

Idempotently set up the RevenueCat v2 project: premium entitlement, subscription attachments, SDK key and Supabase secret (live write, needs human approval).

Use when: after a human created the RC project, linked ASC and supplied the v2 key. Returns NEEDS_HUMAN if no project exists. For ASC plus RC in one pass use store_setup. Returns: {ok, entitlement, sdk_key_set, secrets} or an approval_required refusal.

NameRequiredDescriptionDefault
v2_keyYesRevenueCat secret API v2 key (sk_...); used for this call only.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
env_suffixNoSuffix for secret names when several apps share one Supabase project, e.g. '_MYAPP'.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
set_secretsNoIf true (default) also write the RevenueCat secrets to Supabase.
supabase_refYesSupabase project ref that receives the RevenueCat secrets.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructive/idempotent/openWorld, but the description adds context they cannot carry: the live-write nature requiring human approval, the approval_required refusal path, and the NEEDS_HUMAN outcome when no project exists. This meaningfully de-risks a mutation tool.

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?

Three short, labeled blocks (action / Use when / Returns) with the live-write warning front-loaded in the first sentence. Every clause carries information; no 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?

For a multi-system, approval-gated idempotent write, the description covers prerequisites, failure modes, the approval loop, and the alternative tool, while the output schema handles return-value detail. An agent has everything needed to call it correctly.

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 all six parameters are already documented in the schema, including the approval_id workflow and env_suffix semantics. The description adds no per-parameter detail beyond naming the SDK key and Supabase secret in prose, so 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 and resource ('set up the RevenueCat v2 project') and enumerates the concrete artifacts it creates: premium entitlement, subscription attachments, SDK key, and Supabase secret. It also names the sibling it is not (store_setup), so an agent can distinguish it without opening either schema.

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

Usage Guidelines5/5

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

Explicit 'Use when:' precondition (human already created the RC project, linked ASC, supplied v2 key), an explicit failure mode ('Returns NEEDS_HUMAN if no project exists'), and a named alternative ('For ASC plus RC in one pass use store_setup'). Nothing is left to inference.

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

run_optionsRun OptionsA
Read-onlyIdempotent

List every optional part of a run with its question, kind, choices, default and current value.

Use when: BEFORE any other work when the user says run. Ask the user each question one at a time (or as a checklist), then call run_options_save. Returns: {ok, options: [{id, question, kind, choices, default, value}], confirmed}.

NameRequiredDescriptionDefault
app_dirNoApp directory to read current values from; omit before the app is scaffolded.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/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 workflow behavior beyond that — the tool blocks further work until questions are answered, questions are asked interactively, and the confirmed field signals whether the flow is done.

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?

Front-loaded with purpose, then when-to-use, then returns, in three tight chunks. The Returns block restates what the output schema already provides, which is minor redundancy rather than bloat.

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?

Given a read-only, single-parameter tool with an output schema, the description supplies everything needed: purpose, ordering constraint, interaction model, and handoff to run_options_save. Only the redundant return-value restatement keeps it from being fully optimal.

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?

Only one optional parameter (app_dir) and schema description coverage is 100%, so the schema already explains reading current values and omitting before scaffolding. The description adds nothing about app_dir, so 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?

Specific verb (list) plus resource (every optional part of a run) and enumerates the fields returned: question, kind, choices, default, current value. It is clearly distinguishable from the sibling run_options_save, which is named as the follow-up.

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

Usage Guidelines5/5

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

Explicit sequencing: 'BEFORE any other work when the user says run', instructs how to present questions (one at a time or checklist), and names the routing target run_options_save. Nothing about when-to-use is left to inference.

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

run_options_saveRun Options SaveA
Idempotent

Save the user's answers to the run options and mark options confirmed.

Use when: after asking every question from run_options. Validates types, choices and dependencies; services go to config.toml, the rest to app.spec.json (or a pending file that app_scaffold applies). Returns: {ok, saved, errors?}.

NameRequiredDescriptionDefault
answersYesMap {option id: value} covering every option id returned by run_options.
app_dirNoApp directory whose app.spec.json receives the answers; omit to save to the pending file used by app_scaffold.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare non-read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful context beyond that: it validates types, choices, and dependencies, and it explains the storage split between config.toml and app.spec.json or the pending file.

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?

The description is front-loaded with purpose, then usage, behavior, and return shape. Every sentence carries useful information and there is no redundant 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?

The tool is a mutation with a clear output schema and full annotation coverage. The description covers when to call it, what validation occurs, where data is written, and the return shape, leaving no significant gap for correct invocation.

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 100%, so the baseline is 3. The description still adds value by explaining that answers must cover every option id from run_options and by clarifying that services go to config.toml while the rest go to app.spec.json, which helps interpret how the answers parameter is applied.

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?

The description gives a specific verb and resource: save the user's answers to run options and mark options confirmed. It also distinguishes this tool from run_options (which asks the questions) and app_scaffold (which applies the pending file), so an agent can route correctly without inspecting sibling schemas.

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 explicitly says to use this after asking every question from run_options, which is clear and actionable. It also references app_scaffold for the pending-file case, but it does not state when not to use the tool or provide explicit alternatives beyond those dependencies.

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

screenshot_apply_layoutScreenshot Apply LayoutA
Idempotent

Merge the Claude Design store layout (design/project/store_layout.json) into marketing/screenshots/config.json.

Use when: before screenshot_brand so every locale renders the approved layout. Returns: {ok, config path, boards}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety and repeatability profile is covered. The description usefully names the exact target file that gets modified, but does not explain merge semantics (overwrite vs. deep merge of existing keys) or what happens if the design file is missing.

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?

Three tight sentences, front-loaded with the action, followed by the when-condition and the return shape. No filler or restated title.

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 an output schema present, the description needn't explain return values, and the brief 'Returns' line is a bonus rather than a necessity. It covers purpose, sequencing and output well; only the merge semantics and error behavior are absent.

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?

Only one parameter (app_dir) and schema description coverage is 100%, so the schema fully documents it. The description adds no meaning beyond the schema about how app_dir is used, which is the expected baseline 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 specific verb (Merge) and both resources by path: the design store layout into the screenshots config. The reference to screenshot_brand in the 'Use when' clause gives implicit sibling differentiation, though it doesn't explicitly say what this tool does that screenshot_sync or screenshot_capture do not.

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?

'Use when: before screenshot_brand so every locale renders the approved layout' gives a clear ordering context and the reason for it, which is more than most siblings offer. It stops short of stating when-not to use it or naming an alternative for a different situation.

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

screenshot_brandScreenshot BrandA
Idempotent

Render branded App Store screenshots with the node compositor using the Claude Design store layout.

Use when: raw captures exist; run screenshot_apply_layout first (screenshot_build_all does both). Returns: {ok, rendered: count, dir}.

NameRequiredDescriptionDefault
marketing_dirYesPath to the app's marketing/ directory.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: the ordering dependency on screenshot_apply_layout and what the tool returns. No auth or rate-limit detail, but the sequencing constraint is the key behavioral fact and it 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.

Conciseness5/5

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

Three short, front-loaded lines: purpose, usage precondition, return shape. Every sentence earns its place with zero 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?

An output schema exists, so return values need not be spelled out, and the description still summarizes them. Combined with the explicit prerequisite chain, an agent has everything needed to invoke this correctly.

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?

Only one parameter with 100% schema coverage, so the schema fully documents marketing_dir. The description adds no syntax or path semantics beyond what the schema already states; 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 (render) and resource (branded App Store screenshots), plus the mechanism (node compositor, Claude Design store layout). It clearly distinguishes itself from siblings like screenshot_apply_layout and screenshot_build_all.

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

Usage Guidelines5/5

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

Explicitly gives the precondition (raw captures exist), the required prior step (run screenshot_apply_layout first), and names the alternative that covers both steps (screenshot_build_all). Nothing is left to inference.

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

screenshot_build_allScreenshot Build AllA

Run the whole turnkey screenshot step: sample image, build and install, captions, capture 32 languages x 6 screens, brand, sync to fastlane/screenshots.

Use when: the mandatory screenshots stage. Not for: single captures (use screenshot_capture) or uploading (use deliver_screenshots). Long-running. Returns: {ok, locales, screens, dir} or the first failing step.

NameRequiredDescriptionDefault
udidYesSimulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'.
schemeYesXcode scheme name to build, e.g. 'MyApp'.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
localesNoList of locale codes, e.g. ['en-US', 'de-DE']; omit for the default set.
projectYesPath to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
sample_promptYesPrompt describing a sample output of the app (fills Result/Gallery screens).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive operation, so the safety profile is covered. The description adds genuinely new behavioral context: it is 'Long-running' and it short-circuits on 'the first failing step'. It stops short of describing side effects on disk (fastlane/screenshots writes) or any prerequisite setup, which keeps it below 5.

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?

Front-loaded action sentence, then clearly labelled Use when / Not for / Long-running / Returns lines. Every clause carries information and nothing is repeated from the schema.

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?

For a complex, mutation-style orchestrator tool, the description covers scope, alternatives, runtime characteristics and a return shape (with an output schema also present). It omits side-effect detail such as which directories get written and whether the stage is resumable after a failing step, which is the only remaining gap.

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% across all 7 parameters with concrete examples (UDID format, path examples, locale list format), so the schema does the heavy lifting. The description adds no parameter-level meaning beyond naming the 32x6 capture scope, which is the expected baseline of 3 when coverage is complete.

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 plus the full scope of the turnkey pipeline: sample image, build and install, captions, capture 32 languages x 6 screens, brand, sync to fastlane/screenshots. An agent can distinguish it from the granular screenshot_* siblings (screenshot_capture, screenshot_brand, screenshot_sync) without opening any schema.

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

Usage Guidelines5/5

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

Explicit routing: 'Use when: the mandatory screenshots stage. Not for: single captures (use screenshot_capture) or uploading (use deliver_screenshots).' Names both the condition and the two alternative tools, so the choice between this and its siblings is unambiguous.

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

screenshot_captureScreenshot CaptureA
Idempotent

Capture a raw screenshot from the booted simulator into marketing/raw//.png.

Use when: capturing a single screen manually. For the full localized set use screenshot_build_all. Returns: {ok, path}.

NameRequiredDescriptionDefault
nameYesScreen name, used as the file name, e.g. 'paywall'.
udidYesSimulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'.
localeYesApp locale of the capture, e.g. 'en-US'; used as the output subfolder.
marketing_dirYesPath to the app's marketing/ directory.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation and repeat-safety profile is covered. The description adds the output destination convention, but does not mention that an existing file at the same path is overwritten (implied by idempotentHint) or any prerequisites such as the simulator needing to be booted.

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?

Three short lines with the action, the condition, and the return value front-loaded. No filler; every sentence carries information.

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?

An output schema exists, so return-value detail is not the description's burden, and annotations carry the safety profile. Combined with a fully documented parameter schema and a clear alternative tool pointer, an agent has everything needed to invoke this correctly.

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 all four parameters are already documented in the schema, and a baseline of 3 applies. The description adds modest value by showing how 'locale' and 'name' compose into the output path, but it introduces no format or constraint detail beyond that.

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 (capture) and resource (raw screenshot) and pins the artifact to a concrete output path pattern 'marketing/raw/<locale>/<name>.png'. It is clearly distinguishable from siblings like screenshot_build_all and screenshot_brand.

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

Usage Guidelines5/5

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

Explicitly states the triggering condition ('capturing a single screen manually') and names the alternative for the contrasting case ('For the full localized set use screenshot_build_all'). This is textbook when/when-not plus alternative routing.

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

screenshot_generate_sampleScreenshot Generate SampleA

Generate a sample image with fal.ai into Resources/sample_headshot.jpg to fill the Result/Gallery screens (paid).

Use when: screenshots need real-looking app output; screenshot_build_all calls it for you. Returns: {ok, path}.

NameRequiredDescriptionDefault
promptYesImage generation prompt for the sample output.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already disclose readOnly=false, openWorld=true, idempotent=false, destructive=false, so the safety profile is covered. The description adds genuinely non-derivable context: the operation is '(paid)' (a real cost implication) and it writes to a specific on-disk path, which explains why it is a write with destructiveHint=false. Return shape is restated but that is minor.

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?

Three tight lines: what/where/cost first, then usage, then return. No filler, and the most decision-relevant facts (paid, output path, automatic invocation by screenshot_build_all) are front-loaded.

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 only two fully documented parameters, an existing output schema, and annotations covering the safety profile, the description supplies everything an agent needs: purpose, cost, artifact location, and the orchestrator relationship. Nothing material 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%, so both prompt and app_dir are already documented with examples in the schema. The description adds no syntax, format, or constraint detail beyond the schema, so the baseline of 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 and resource ('Generate a sample image'), names the external service (fal.ai), and gives the exact output artifact path (Resources/sample_headshot.jpg) plus the UI purpose (fill Result/Gallery screens). This is clearly distinguishable from sibling screenshot_capture, screenshot_brand, and screenshot_apply_layout.

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?

'Use when: screenshots need real-looking app output' gives a clear triggering condition, and 'screenshot_build_all calls it for you' tells the agent it is normally invoked transitively rather than directly. There is no explicit when-not-to-use or a named alternative for the manual path, so it stops short of a 5.

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

screenshot_onboarding_heroesScreenshot Onboarding HeroesA

LEGACY, opt-in: generate fal hero images per onboarding step (onb_step0..N).

Use when: only for a legacy hero-image onboarding. Onboarding visuals normally come from Claude Design boards. Requires allow_external_generator=true. Returns: {ok, images: [paths]} or a refusal.

NameRequiredDescriptionDefault
countNoNumber of onboarding hero images to generate (default 11).
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
conceptYesShort concept description of the app used to write the image prompt, e.g. 'AI pet portrait maker'.
allow_external_generatorNoMust be true to allow the paid fal.ai image generator; default false refuses.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, openWorld=true, destructive=false), and the description adds genuinely new context: it is legacy/opt-in, invokes a paid fal.ai generator, and returns a refusal when allow_external_generator is not set. It does not, however, discuss cost magnitude, latency, or overwrite behavior for existing hero images.

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?

Three short blocks — status, usage condition, return shape — with the LEGACY warning front-loaded. Every sentence carries distinct information and nothing is repeated.

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 4-parameter tool with full schema coverage and an output schema, the description supplies the missing decision-relevant context: deprecation status, the external-generator gate, and the refusal outcome. Nothing needed to call it correctly is absent.

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 baseline is 3. The description reinforces the onb_step0..N mapping and the allow_external_generator gate but adds no syntax or format detail beyond what the schema already documents.

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 and resource ('generate fal hero images per onboarding step') plus the onb_step0..N scope, and flags itself as LEGACY, which cleanly separates it from design_generate and screenshot_generate_sample. An agent can identify the operation and its status without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: only for a legacy hero-image onboarding' plus the counter-guidance that onboarding visuals normally come from Claude Design boards routes the agent away by default. The prerequisite allow_external_generator=true is also stated outright.

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

screenshot_syncScreenshot SyncA
Idempotent

Copy branded screenshots into fastlane/screenshots//.

Use when: after screenshot_brand, before deliver_screenshots. Local only; nothing is uploaded. Returns: {ok, synced: count}.

NameRequiredDescriptionDefault
marketing_dirYesPath to the app's marketing/ directory.
fastlane_screenshots_dirYesPath to fastlane/screenshots/ to sync branded images into.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnly=false, idempotent=true, destructive=false, openWorld=false). The description adds genuinely useful context beyond that: 'Local only; nothing is uploaded.' It could still say more about overwrite behavior on existing locale files, so it falls short of a 5.

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?

Three tight lines, front-loaded with the action and destination, then sequencing, then return shape. Every sentence 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 an output schema present, the tool need not explain return values, and annotations cover safety and idempotency; the description adds local-only scope. Only the overwrite semantics for pre-existing locale files are undocumented.

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%, so both parameters are already documented in the schema; the description adds only the implied <locale> subdirectory convention. Baseline 3 is appropriate when the schema carries the parameter burden.

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 (Copy), resource (branded screenshots), and destination (fastlane/screenshots/<locale>/), so an agent knows exactly what the tool produces. It is clearly distinct from sibling screenshot_brand (which brands) and deliver_screenshots (which uploads).

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

Usage Guidelines5/5

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

'Use when: after screenshot_brand, before deliver_screenshots' gives explicit pipeline ordering relative to named siblings. Nothing is left to inference about when this step runs.

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

setup_approvalsSetup ApprovalsA
Idempotent

Set human approvals for live writes to 'required' (recommended).

Use when: re-enabling approvals. 'off' is refused here; only the human can switch it off on the setup_credentials page. Returns: {ok, approvals}.

NameRequiredDescriptionDefault
modeYesApprovals mode; only 'required' is accepted here ('off' must be set by the human).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, idempotent mutation. The description adds context the annotations cannot: that only one value is accepted, that 'off' is rejected, and that disabling requires a human action elsewhere. It stops short of describing persistence or side effects of the change.

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?

Three short, front-loaded lines: the action, the when/refusal, and the return shape. No filler sentences.

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?

Given an output schema exists, the 'Returns: {ok, approvals}' line is technically redundant, but the description otherwise covers everything an agent needs: the accepted value, the refusal behavior, and the escape hatch. Complete and unambiguous.

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 parameter is fully documented, including the 'off' restriction. The description restates essentially the same constraint, so it adds little meaning beyond the schema.

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?

Names a specific verb (set) and resource (human approvals for live writes) plus the target mode (required). It references the setup_credentials page, giving the agent a way to separate this tool from its closest sibling.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('Use when: re-enabling approvals'), states what is refused ('off' is refused here), and routes the agent to the alternative path for turning approvals off (the human on the setup_credentials page). This is precisely the when-to-use / when-not-to-use guidance the dimension asks for.

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

setup_credentialsSetup CredentialsA

Open a local browser page (127.0.0.1, random port, one-time token) where the USER types credentials for the given services.

Use when: setup_status shows missing keys. Secrets never reach the agent; return immediately, tell the user to fill the form and Save, then call setup_status. Returns: {ok, url, services}.

NameRequiredDescriptionDefault
servicesNoService ids to collect credentials for; omit for every enabled service.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, it discloses key behaviors: a local-only loopback server on a random port, a one-time token, that secrets never reach the agent, and that the call returns immediately rather than blocking on user input. This is exactly the non-obvious operational context an agent needs.

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?

Three compact sentences, front-loaded with the action, then the trigger, then the post-call instructions. No 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?

For a one-parameter, output-schema-backed tool, the description covers what the tool does, when to invoke it, the interaction loop, and the safety property. Nothing required for correct invocation 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 the single parameter's description ('Service ids to collect credentials for; omit for every enabled service') already carries the semantics. The description's phrase 'for the given services' adds little beyond the schema, so the baseline of 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?

The description states a concrete action (open a local browser page at 127.0.0.1 with a one-time token) where the user manually enters credentials. It is clearly distinguishable from siblings like setup_status (which only reports state) and setup_set/config_set (which programmatically set values).

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 an explicit trigger ('Use when: setup_status shows missing keys') and prescribes the follow-up sequence (return, tell user to fill form and Save, then call setup_status). However, it does not contrast with other credential-adjacent siblings in this large tool set (setup_set, config_set, setup_services), leaving some routing ambiguity.

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

setup_servicesSetup ServicesA
Idempotent

Turn optional services on or off (research is always on).

Use when: the user has said which services they want; ask them first. Not for: entering credentials (use setup_credentials). Returns: the setup_status result after the change.

NameRequiredDescriptionDefault
enableNoService ids to turn on, e.g. ['apple', 'supabase', 'revenuecat', 'github', 'firebase', 'xcode', 'maestro', 'design', 'ai', 'lottie'].
disableNoService ids to turn off (same ids as enable).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already carry the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description doesn't need to restate them. It adds genuinely new context however: the 'research is always on' invariant and a statement of what is returned. It stops short of detailing error or partial-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.

Conciseness5/5

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

Three short lines with zero filler: operation first, then Usage/Not-for routing, then return value. Everything is front-loaded and each sentence 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 an output schema present and full parameter coverage, the description needn't explain return format, and the annotations cover safety/idempotency. The always-on note and sibling routing make it complete enough to invoke correctly; minor gaps only in failure-mode behavior.

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 both parameters are documented in the schema with concrete id examples. The description adds nothing about enable/disable semantics beyond naming the operation, so the baseline 3 for schema-does-the-work 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 and resource ('turn optional services on or off') and adds a scope constraint ('research is always on'). It also explicitly rules out a related sibling, so an agent can distinguish this from setup_credentials without opening the schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' clause (user has stated desired services; ask first) and a 'Not for' clause that routes to setup_credentials. When-to-use, prerequisite, and alternative are all spelled out.

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

setup_setSetup SetA
Idempotent

Set ONE non-secret config key such as asc_key_id, team_id or support_email; an empty value clears it.

Use when: changing a single key. Secrets are refused; use setup_credentials so they never pass through the chat. For several fields at once use config_set. Returns: {ok, key, error?}.

NameRequiredDescriptionDefault
keyYesNon-secret config key, e.g. 'asc_key_id', 'team_id', 'support_email'.
valueYesValue to store.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations cover the safety profile (idempotent, non-destructive, not read-only), and the description adds genuinely non-obvious behavior: an empty value clears the key and secrets are refused with a redirect. It does not elaborate further on auth or rate limits, but for a simple config setter that is minor.

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?

Three tight lines: behavior first, routing guidance second, return shape last. Every sentence carries information and nothing is padded.

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 annotations, a fully described schema, and an output schema present, the description supplies exactly the missing pieces (clearing semantics, secret refusal, sibling routing) and need not explain return values.

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 100%, so the baseline is 3; the description goes beyond the schema's terse 'Value to store' by defining the empty-string clearing semantics and reinforcing the non-secret constraint on key.

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 (set) and resource (ONE non-secret config key), gives concrete key examples, and explicitly scopes to a single key versus several. An agent can distinguish it from config_set and setup_credentials without opening a schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' clause (changing a single key) plus two named alternatives with their selecting conditions: setup_credentials for secrets and config_set for multiple fields. Nothing is left to inference.

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

setup_statusSetup StatusA
Read-onlyIdempotent

Report the AppFactory setup state per service: enabled, keys set or missing (never values), missing tools with install commands, approvals mode.

Use when: first call of every session, and after any setup change. Works with no config file. Returns: {ok, services: {name: {enabled, keys, missing}}, approvals, next: [steps]}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/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, so the safety profile is covered. The description adds genuinely non-obvious behavior: keys are reported as set/missing and 'never values', and it works without a config file, both of which the agent could not infer from 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.

Conciseness4/5

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

Front-loads the purpose and separates trigger ('Use when:') from output shape, so it scans well. The trailing 'Returns:' line largely restates the output schema, which is the only mild redundancy.

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?

An output schema exists, so the description need not spell out return values; the zero-parameter, no-config nature is disclosed, and the session-start usage guidance covers the operational context an agent needs. Nothing required 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.

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing parameter-level to clarify or clarify beyond the empty schema, and the description does not waste space on nonexistent inputs.

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 ('Report') and resource ('AppFactory setup state per service') and enumerates exactly what is reported: enabled, keys set/missing, missing tools with install commands, approvals mode. This clearly distinguishes it from siblings like setup_credentials, setup_approvals, and config_doctor, which each mutate a narrower slice of state.

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?

Gives an explicit trigger: 'first call of every session, and after any setup change', which is actionable context. It does not name an alternative tool or state when-not to use it, but the precondition ('Works with no config file') usefully signals it is safe as a cold-start probe.

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

signing_create_profileSigning Create ProfileA
Destructive

Create an IOS_APP_STORE provisioning profile and write it to the standard locations (live write, needs human approval).

Use when: after signing_setup_distribution; testflight_ship does this for you. Returns: {ok, profile_id, name, path}.

NameRequiredDescriptionDefault
nameNoProvisioning profile name (default 'AppFactory AppStore').AppFactory AppStore
cert_idYesApp Store Connect certificate id from signing_setup_distribution.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag destructive=true, idempotent=false, openWorld=true, and the description still adds the crucial operational facts: this is a live write to disk and it requires human approval. It doesn't detail failure modes or what happens to an existing profile of the same name, so it stops short of a 5.

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?

Three front-loaded chunks (what, when, returns) with zero filler; the destructive 'live write, needs human approval' caveat is surfaced before the usage guidance.

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 destructive, non-idempotent write with an output schema present, the description covers purpose, prerequisites, the approval gate, and the return shape. 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 approval_id parameter already documents the out-of-band approval loop, so the description has little left to add beyond naming the return fields. Baseline 3 applies 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.

Purpose5/5

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

States a specific verb and resource ('Create an IOS_APP_STORE provisioning profile') and even the side effect ('write it to the standard locations'). It names the sibling tools it relates to (signing_setup_distribution, testflight_ship), so an agent can place it without opening the schema.

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

Usage Guidelines5/5

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

The 'Use when: after signing_setup_distribution; testflight_ship does this for you' line gives both the triggering prerequisite and an explicit alternative path, which is exactly the routing guidance an agent needs.

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

signing_setup_distributionSigning Setup DistributionA
Destructive

Create a distribution certificate and install it into a temporary keychain (WWDR included; live write, needs human approval).

Use when: hand-running signing steps; testflight_ship does this for you. Returns: {ok, cert_id, identity, keychain}.

NameRequiredDescriptionDefault
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true, and non-idempotent, so the safety profile is covered structurally. The description adds genuinely new context—'live write', 'needs human approval', and installation into a *temporary* keychain (implying ephemeral, non-persistent state). It stops short of describing the two-call approval retry mechanics, which the schema handles instead.

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?

Three tight labeled fragments (action, Use when, Returns) with zero filler and the destructive/approval caveat front-loaded in the first sentence.

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?

An output schema exists, so the 'Returns' line is redundant rather than load-bearing, but the description covers purpose, alternative routing, and the destructive/approval nature of a risky write. The only real gap—the exact approval_id retry sequence—is already covered by the schema.

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 approval_id parameter is thoroughly documented in the schema, including the out-of-band human approval flow. The description adds no parameter detail; baseline 3 applies since the schema does all the work.

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 concrete verb and resource ('Create a distribution certificate and install it into a temporary keychain') plus material scope details (WWDR included). An agent can distinguish it from signing_create_profile and from the higher-level testflight_ship without opening schemas.

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

Usage Guidelines5/5

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

'Use when: hand-running signing steps; testflight_ship does this for you' explicitly names the trigger condition and the alternative tool that subsumes it. This is a model routing instruction, not vague guidance.

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

storekit_generateStoreKit GenerateA
Idempotent

Write Resources/Configuration.storekit from app.spec.json (group, levels, free-trial intros, trial-less offer product).

Use when: after any product change. Deterministic. app_sync_spec also regenerates it together with Swift sources. Returns: {ok, path, products}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is largely covered. The description adds useful behavioral context with 'Deterministic' and the app_sync_spec relationship, though it does not explicitly describe file-overwrite behavior or any required permissions.

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?

Three short, front-loaded sentences with no waste. The most important information, what gets written and when to use it, appears immediately.

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?

Given the rich annotations and the presence of an output schema, the description is complete enough: it names the input source, states timing, explains the sibling relationship, and even summarizes the return shape. Nothing needed to call the tool 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%, so the schema already documents the single app_dir parameter. The description adds only the source file context (app.spec.json), which is useful but does not add syntax or constraints beyond the schema; baseline 3 is appropriate.

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 and resource: writes Resources/Configuration.storekit from app.spec.json, and lists what it generates (group, levels, free-trial intros, trial-less offer product). It also distinguishes itself from the sibling app_sync_spec by noting that sibling regenerates it alongside Swift sources.

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

Usage Guidelines5/5

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

Explicitly says when to use it: 'Use when: after any product change.' It also names the relevant alternative, app_sync_spec, and explains how they differ, so an agent can choose correctly.

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

storekit_parityStoreKit ParityA
Read-onlyIdempotent

Compare a Configuration.storekit with app.spec.json and list every mismatch (read-only).

Use when: verifying products match before store_setup or release. ok=true means in parity. Returns: {ok, mismatches: [...]}.

NameRequiredDescriptionDefault
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
storekit_pathNoPath to a Configuration.storekit; omit for Resources/Configuration.storekit.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered, and the description reinforces it with '(read-only)'. It adds genuinely new behavioral context by defining the success semantics ('ok=true means in parity'), which annotations cannot express. It does not mention permissions, cost, or failure modes.

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?

Three short lines, each doing distinct work: what it does, when to use it, and what the result means. Purpose and scope are front-loaded with no 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?

For a two-parameter read-only comparison tool with full schema coverage, full annotations, and an output schema, the description covers purpose, timing, and the meaning of the ok flag. Nothing an agent needs in order 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%, with both app_dir and storekit_path fully documented including the default resolution rule for storekit_path. The description adds no parameter-level detail beyond the schema, 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 (compare) plus the two resources being compared (Configuration.storekit vs app.spec.json) and the outcome (list every mismatch). An agent can immediately distinguish it from storekit_generate and store_setup in the sibling list.

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 says when to use it: 'verifying products match before store_setup or release', which ties it to a workflow stage and names a sibling tool. It stops short of stating when not to use it or listing alternatives for adjacent checks (e.g. config_doctor, metadata_check).

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

store_setupStore SetupA
DestructiveIdempotent

Idempotent App Store Connect and RevenueCat setup from app.spec.json and listing.json (capabilities, subscriptions, prices, offers, age rating, legal URLs, RC entitlement/offerings).

Use when: the standard way to set up the store side. mode: plan (offline), check (live reads, simulated writes, reports CONFLICT), apply (live writes, needs human approval). Prefer this over the individual asc_* write tools; asc_create_app is still separate. Returns: {ok, mode, steps: [...], conflicts} or an approval_required refusal.

NameRequiredDescriptionDefault
modeNo'plan' (offline), 'check' (live reads, simulated writes, reports CONFLICT) or 'apply' (live writes, needs approval).plan
targetNoWhat to set up: 'capabilities', 'asc', 'rc' or 'all' (default).all
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.
rc_project_idNoRevenueCat project id (proj...) if it already exists.
rc_apple_notification_urlNoRevenueCat's Apple Server-to-Server notification URL, stored in app outputs.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered structurally. The description still adds meaningful context beyond them: the human-approval loop for 'apply', the CONFLICT reporting behavior of 'check', the approval_required refusal, and the return shape. It does not, however, spell out what 'apply' actually mutates or what reverting looks like, given the destructive flag.

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?

Front-loaded with the core action and its inputs, then the usage/mode guidance and return shape in short clauses. Dense but every line carries information; only the idempotency mention slightly overlaps the annotation.

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 multi-mode, approval-gated setup tool this covers the sources, modes, approval flow, conflict reporting and return contract, and it routes the agent away from the granular asc_* siblings. With an output schema present, no further return-value explanation is required.

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 every parameter is documented in the schema, including the mode, target values and the approval_id workflow. The description largely echoes the schema's mode definition rather than adding syntax or format detail, so the baseline of 3 is appropriate.

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 and resource ('setup' of App Store Connect and RevenueCat store side) with the exact input artifacts (app.spec.json, listing.json) and the scope of what is configured. It explicitly distinguishes itself from sibling write tools ('Prefer this over the individual asc_* write tools; asc_create_app is still separate').

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

Usage Guidelines5/5

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

Gives an explicit when-to-use statement ('the standard way to set up the store side'), enumerates the three modes with their semantics (plan/check/apply), and names the alternatives it supersedes as well as the one it does not (asc_create_app). Nothing about selection is left to inference.

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

supabase_create_projectSupabase Create ProjectA
Destructive

Create a new Supabase project (live write that provisions billable resources, needs human approval).

Use when: the app has no backend project yet. Check supabase_list_projects first to avoid duplicates. Returns: {ok, data: {id/ref, name, region, ...}} or an approval_required refusal.

NameRequiredDescriptionDefault
nameYesName of the new Supabase project.
org_idYesSupabase organization id from supabase_list_orgs.
regionYesSupabase region code, e.g. 'us-east-1', 'eu-central-1'.
db_passYesDatabase password for the new project.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description still adds real value beyond that: it discloses that the call provisions billable resources, requires human approval, and can return an approval_required refusal rather than succeeding. It does not describe what happens on partial failure or duplicate-name errors, which keeps it short of a 5.

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?

Three sentences with explicit 'Use when:' and 'Returns:' labels. The most important constraint (billable write, human approval) is front-loaded and every clause carries information.

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 destructive, open-world provisioning call, the description covers the approval gating, the duplicate-avoidance precondition, and the failure return. An output schema exists, so the brief return sketch is a bonus rather than a gap.

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 all five parameters including the approval_id workflow are already documented in the schema. The description adds no parameter-level syntax or format detail beyond what the schema provides, 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?

Specific verb ('Create') plus resource ('Supabase project'), and it flags the operation class ('live write that provisions billable resources'). This is enough to distinguish it from read-only siblings like supabase_list_projects and supabase_list_orgs without opening any schema.

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

Usage Guidelines5/5

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

Explicit 'Use when: the app has no backend project yet' gives the triggering condition, and 'Check supabase_list_projects first to avoid duplicates' names the concrete alternative to consult before invoking. Nothing about when to reach for this tool versus its siblings is left to inference.

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

supabase_get_keysSupabase Get KeysA
Idempotent

Get a Supabase project's URL and anon key; the service_role key is saved to ~/.appfactory/supabase/.json (0600) and never returned.

Use when: wiring the app (app_inject_config) or backend. Returns: {ok, project_url, anon_key, service_role_key_file}.

NameRequiredDescriptionDefault
refYesSupabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst').

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already disclose readOnlyHint=false, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable side-effect context beyond annotations: the service_role key is written to ~/.appfactory/supabase/<ref>.json with 0600 permissions and is never returned. It does not cover auth prerequisites or overwrite behavior, so a 4 rather than 5.

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?

Three compact lines: core action first, then 'Use when', then 'Returns'. Every sentence earns its place and nothing is buried or redundant.

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 a full output schema and annotations covering safety and openness, the description supplies the essential missing context (the file side effect and permissions). It could mention auth or file-overwrite behavior, but is otherwise complete for correct invocation.

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 'ref' parameter is fully documented in the schema. The description adds no additional parameter meaning, so the baseline 3 is appropriate.

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 and resource: gets a Supabase project's URL and anon key, and clarifies that the service_role key is saved to a file rather than returned. This distinguishes it clearly from siblings like supabase_set_secret, supabase_create_project, and supabase_run_sql.

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?

Provides explicit when-to-use guidance: 'wiring the app (app_inject_config) or backend.' It does not name alternatives or when-not-to-use cases, but the context is clear enough for correct selection.

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

supabase_list_orgsSupabase List OrgsA
Read-onlyIdempotent

List Supabase organizations (live, read-only).

Use when: you need the org_id for supabase_create_project. Returns: {ok, data: [{id, name}]}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description's '(live, read-only)' largely restates those hints, and the return shape is covered by the output schema, so it adds only modest context beyond structured fields.

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?

Three short sentences, front-loaded with the purpose and followed by usage and return shape. Every sentence earns its place with no filler or repetition.

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 zero-parameter list tool with an output schema and rich annotations, the description supplies the purpose, the trigger condition, and the return shape. Nothing material an agent needs to select or invoke it correctly is missing.

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?

The tool has zero parameters, so per the scoring rules the baseline is 4. There are no parameters for the description to clarify or compensate for, and it does not introduce any misleading parameter guidance.

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 (List) and resource (Supabase organizations), and the scope qualifier (live, read-only) makes the operation unambiguous. The resource name distinguishes it from siblings like supabase_list_projects without needing to open either schema.

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 says 'Use when: you need the org_id for supabase_create_project', which gives a clear trigger condition and names the downstream tool. It stops short of stating when-not to use it or alternative ways to obtain org_id, so it falls just below the top score.

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

supabase_list_projectsSupabase List ProjectsA
Read-onlyIdempotent

List Supabase projects (live, read-only).

Use when: you need a project ref. For org ids use supabase_list_orgs. Returns: {ok, projects: [{name, ref, region, status}]}.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered; the description's 'live, read-only' restates rather than extends it. The returns line adds a bit of shape, but an output schema already exists, so the incremental behavioral disclosure is modest.

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?

Three short, front-loaded sentences (what, when, output) with zero filler. Each sentence carries a distinct piece of information.

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 zero-parameter, read-only listing tool with full annotations and a dedicated output schema, the description supplies the only things not already structured: the usage trigger and the sibling routing. Nothing an agent needs 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.

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to explain and no schema gap to compensate for; the baseline of 4 applies. Nothing in the description contradicts or confuses the empty input schema.

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 and resource ('List Supabase projects') and explicitly scopes it as live/read-only, and it distinguishes itself from the nearest sibling by noting org ids belong to supabase_list_orgs.

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

Usage Guidelines5/5

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

The 'Use when: you need a project ref' clause gives the trigger condition directly, and the second sentence routes the agent to supabase_list_orgs for a different need. Both when-to-use and the alternative are explicit.

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

supabase_run_sqlSupabase Run SQLA
Destructive

Run SQL on a Supabase project (live write, needs human approval).

Use when: applying schema or migrations by hand; backend_deploy applies the spec's migrations for you. Destructive statements (DROP, TRUNCATE, ALTER ... DROP, GRANT/REVOKE on auth, DELETE/UPDATE without WHERE) always need approval. Returns: {ok, data} rows/result, or an approval_required refusal.

NameRequiredDescriptionDefault
refYesSupabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst').
sqlYesSQL to execute. Destructive statements (DROP, TRUNCATE, DELETE/UPDATE without WHERE) always need approval.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is partly structured. The description goes further by disclosing the human-approval workflow and enumerating which statement classes (DROP, TRUNCATE, ALTER ... DROP, GRANT/REVOKE on auth, DELETE/UPDATE without WHERE) trigger it, plus the refusal shape — meaningful context the annotations cannot convey.

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?

Four short, front-loaded segments (purpose, use-when, approval rules, return shape) with zero filler. The most decision-relevant information — that this is a live write requiring approval — appears in the first clause.

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 destructive, open-world SQL execution tool, the definition covers purpose, routing to the sibling, approval gating, and the return/refusal shape. An output schema exists so return details are supplementary rather than required, and nothing an agent needs to call this correctly is absent.

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 fully documents ref, sql, and approval_id, including the approval-id round-trip. The description adds no syntax, format, or defaulting detail beyond the schema, so the baseline of 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+resource ('Run SQL on a Supabase project') and immediately qualifies scope as a live write needing approval. It also implicitly distinguishes itself from sibling backend_deploy by noting that backend_deploy applies the spec's migrations automatically.

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

Usage Guidelines5/5

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

Explicit 'Use when:' clause names the scenario (applying schema or migrations by hand) and names the alternative (backend_deploy) with the condition that selects it. This is exactly the when/when-not/alternative guidance the dimension rewards.

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

supabase_set_secretSupabase Set SecretA
DestructiveIdempotent

Write one edge-function secret on a Supabase project, server-side only (live write, needs human approval).

Use when: adding a single secret such as FAL_KEY. backend_deploy sets the standard set for you. Returns: {ok, name} (value never echoed), or an approval_required refusal.

NameRequiredDescriptionDefault
refYesSupabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst').
nameYesEdge function secret name, e.g. 'FAL_KEY'.
valueYesSecret value; written server-side and never echoed back.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Adds meaningful context beyond the annotations: 'server-side only', 'live write, needs human approval', and the approval round-trip that yields an approval_required refusal. The annotations already declare destructive/idempotent/openWorld, and the description does not contradict them, but it could say more about overwrite behavior for an existing secret name.

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?

Three short, front-loaded lines covering what it does, when to use it, and what it returns. Every sentence earns its place with no 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?

Despite an output schema existing, the description still surfaces the two possible outcomes ({ok, name} vs approval_required refusal), and the approval workflow is fully described. Nothing an agent needs 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds workflow-level meaning by tying the approval_required refusal to the retry-with-approval_id pattern and by stressing that the value is never echoed, which helps the agent interpret the required params and the optional approval_id.

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 precise verb+resource+scope: 'Write one edge-function secret on a Supabase project'. It explicitly distinguishes itself from the bulk alternative ('backend_deploy sets the standard set for you'), so an agent can choose between them without opening a schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' clause with a concrete example (adding a single secret such as FAL_KEY) and names the alternative tool for the batch case. When-to-use and when-not-to-use are both covered.

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

team_briefTeam BriefA
Idempotent

Render the team docs (TEAM.md, per-role briefs, onboarding plan, ASO research, CHECKLIST.md) from the spec.

Use when: setting up multi-session work. Existing files are kept unless overwrite=true. Returns: {ok, files}.

NameRequiredDescriptionDefault
repoNoGitHub repo 'owner/name' to reference in the briefs; optional.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
sessionsNoNames of the team sessions as {lead, ios, backend, store}.
overwriteNoIf true, replace files that already exist; default false refuses to overwrite.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds meaningful nuance beyond that: the write is non-destructive because 'existing files are kept unless overwrite=true', which tells the agent the tool will not clobber work by default. It stops short of 5 by not clarifying where files land or whether the spec must already exist.

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?

Three compact lines: what it renders, when to use it, and what it returns. The artifact list is front-loaded, there is zero filler, and each sentence carries distinct information.

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?

For a multi-file generation tool with a full schema and an output schema present, the description covers purpose, trigger, overwrite safety, and return shape. The gap is minor: it does not state prerequisites (e.g., that app.spec.json must exist) or the output location of the rendered files.

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 all four parameters (repo, app_dir, sessions, overwrite) are already documented in the schema with types, defaults, and examples. The description only restates the overwrite behavior, adding no new parameter semantics, 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?

States a specific verb ('Render') and resource ('the team docs') and enumerates the exact artifacts produced (TEAM.md, per-role briefs, onboarding plan, ASO research, CHECKLIST.md), so an agent knows precisely what will be generated. It does not, however, distinguish itself from adjacent siblings like onboarding_plan or preview_brief, so it stops short of the top score.

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?

'Use when: setting up multi-session work' gives explicit triggering context, which is more than most definitions offer. It does not state when NOT to use it or name an alternative for single-session work, so it is clear but not fully routing.

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

testflight_shipTestFlight ShipA
Destructive

Build, sign and upload a TestFlight build end to end: distribution signing, archive, App Store profiles, manual-signing export, asc builds upload (needs human approval).

Use when: shipping a build to TestFlight. Refuses unless the Maestro smoke flows passed (maestro_test) and App ID capabilities exist. Never submits for App Store review (use asc_submit_for_review for that). Not for: single build steps (build_archive, build_export_ipa, signing_*). Returns: {ok, build, ...} or an error / approval_required refusal.

NameRequiredDescriptionDefault
schemeYesXcode scheme name to build, e.g. 'MyApp'.
app_dirYesAbsolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp.
projectYesPath to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj.
bundle_idYesApp bundle identifier in reverse-DNS form, e.g. com.example.app.
approval_idNoApproval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive/openWorld/non-idempotent, but the description adds genuinely non-derivable behavior: the tool refuses unless smoke tests passed, requires out-of-band human approval via approval_id, and can return an approval_required refusal rather than executing. Those gating semantics are the crux of calling this tool correctly.

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?

Three labeled blocks (purpose, 'Use when', 'Not for', 'Returns') that are front-loaded and free of filler. The telegraphic style costs nothing in clarity and every clause carries a routing or precondition fact.

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 high-stakes orchestration tool, the description covers prerequisites, approval workflow, refusal modes, and sibling routing, while the output schema handles return-value structure (the brief '{ok, build, ...}' note is a bonus, not a crutch). No gap remains that would cause a mis-invocation.

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 approval_id parameter is thoroughly documented in the schema itself, including the two-call approval dance. The description adds no additional parameter-level syntax or constraints, 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 specific verbs and resource chain: 'Build, sign and upload a TestFlight build end to end,' then enumerates the steps (distribution signing, archive, App Store profiles, export, asc upload). It explicitly names what it is not (build_archive, build_export_ipa, signing_*), so an agent can separate it from the sibling build steps without reading schemas.

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

Usage Guidelines5/5

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

Provides a 'Use when' trigger, hard preconditions (Maestro smoke flows passed via maestro_test, App ID capabilities exist), an explicit routing rule ('Never submits for App Store review – use asc_submit_for_review'), and a 'Not for' exclusion list. This is a textbook when/when-not/alternative section.

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.

  1. 115 tool updatesv0.1.5
    • Changedai_configure1 field changed
      • addedInput schema / properties / providers / description
        Added value: +"AI provider ids; default ['fal.ai']."
    • Changedai_deploy_proxy4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / daily_limit / description
        Added value: +"Per-user daily request cap for the legacy ai-proxy (default 20)."
      • addedInput schema / properties / project_ref / description
        Added value: +"Supabase project ref to deploy to."
    • Changedanimation_fetch_recolor5 fields changed
      • addedInput schema / properties / accent_hex / description
        Added value: +"Accent palette color as hex, '#' optional, e.g. 'FFB300'."
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / keyword / description
        Added value: +"App-themed search keyword override, e.g. 'happy dog celebration'."
      • addedInput schema / properties / primary_hex / description
        Added value: +"Primary palette color as hex, '#' optional, e.g. '006A63'."
      • addedInput schema / properties / slot / description
        Added value: +"Animation slot: 'loading', 'success', 'empty' or 'onboarding_hero'."
    • Changedapp_inject_config16 fields changed
      • addedInput schema / properties / ai_proxy_url / description
        Added value: +"URL of the deployed AI proxy/edge function."
      • addedInput schema / properties / credit_pack_large / description
        Added value: +"Credits in the large top-up pack (default 60)."
      • addedInput schema / properties / credit_pack_medium / description
        Added value: +"Credits in the medium top-up pack (default 30)."
      • addedInput schema / properties / credit_pack_small / description
        Added value: +"Credits in the small top-up pack (default 10)."
      • addedInput schema / properties / paywall_strategy / description
        Added value: +"'hard_only' (hard paywall only) or 'hard_and_offer' (default: plus a discounted offer paywall on dismiss)."
      • addedInput schema / properties / posthog_key / description
        Added value: +"PostHog project API key."
      • addedInput schema / properties / privacy_url / description
        Added value: +"Public privacy policy URL."
      • addedInput schema / properties / product_weekly / description
        Added value: +"Weekly subscription product id."
      • addedInput schema / properties / product_yearly / description
        Added value: +"Yearly subscription product id."
      • addedInput schema / properties / project_dir / description
        Added value: +"Path to the scaffolded app project directory."
      • addedInput schema / properties / revenuecat_key / description
        Added value: +"RevenueCat public SDK key (appl_...)."
      • addedInput schema / properties / supabase_anon_key / description
        Added value: +"Supabase anon (public) key."
      • addedInput schema / properties / supabase_url / description
        Added value: +"Supabase project URL, e.g. https://abcd.supabase.co."
      • addedInput schema / properties / support_email / description
        Added value: +"Public support email address."
      • addedInput schema / properties / weekly_credits / description
        Added value: +"Credits granted per week on the weekly plan (default 10)."
      • addedInput schema / properties / yearly_credits / description
        Added value: +"Credits granted per month on the yearly plan (default 15)."
    • Changedapp_scaffold5 fields changed
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / dest_dir / description
        Added value: +"Directory to create the app folder in; omit for the default apps directory."
      • addedInput schema / properties / display_name / description
        Added value: +"Name shown under the app icon; defaults to name."
      • addedInput schema / properties / name / description
        Added value: +"App name, e.g. 'PetPortrait'; used for the folder and target."
      • addedInput schema / properties / spec / description
        Added value: +"Full app.spec.json as a dict, a dict of overrides on the defaults, or a path to an app.spec.json file."
    • Changedapp_sync_spec1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedasc_add_subscription_group_localization4 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / group_id / description
        Added value: +"App Store Connect subscription group id."
      • addedInput schema / properties / locale / description
        Added value: +"Locale code, e.g. 'en-US', 'de-DE'."
      • addedInput schema / properties / name / description
        Added value: +"Subscription group display name shown to users."
    • Changedasc_append_subscription_disclosure5 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / disclosure_by_locale / description
        Added value: +"Optional {locale: disclosure text} overriding the default subscription disclosure per language."
      • addedInput schema / properties / privacy_url / description
        Added value: +"Public privacy policy URL, e.g. https://example.com/privacy."
      • addedInput schema / properties / terms_url / description
        Added value: +"Terms of Use/EULA URL; omit to use Apple's standard EULA."
    • Changedasc_create_app6 fields changed
      • addedInput schema / properties / app_name / description
        Added value: +"Single app name; prefer candidate_names. Converted to a one-element candidate list."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / candidate_names / description
        Added value: +"Ordered candidate App Store names; the first one not already taken is used."
      • addedInput schema / properties / primary_language / description
        Added value: +"Primary App Store language, e.g. 'en-US'."
      • addedInput schema / properties / sku / description
        Added value: +"Unique SKU string for the app record; omit to derive from the bundle id."
    • Changedasc_create_bundle_id5 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / apply_capabilities / description
        Added value: +"If true, also enable the spec's App ID capabilities (needs app_dir); false only checks them."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / identifier / description
        Added value: +"Bundle identifier to register, e.g. com.example.app."
      • addedInput schema / properties / name / description
        Added value: +"Human-readable name of the bundle id in the developer portal, e.g. 'My App'."
    • Changedasc_create_subscription6 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / family_shareable / description
        Added value: +"Whether the subscription can be shared with family members; default false."
      • addedInput schema / properties / group_id / description
        Added value: +"App Store Connect subscription group id."
      • addedInput schema / properties / name / description
        Added value: +"Internal reference name of the subscription product."
      • addedInput schema / properties / period / description
        Added value: +"Subscription period enum: ONE_WEEK, ONE_MONTH, TWO_MONTHS, THREE_MONTHS, SIX_MONTHS or ONE_YEAR."
      • addedInput schema / properties / product_id / description
        Added value: +"Product identifier of the subscription, e.g. com.example.app.yearly."
    • Changedasc_create_subscription_group3 fields changed
      • addedInput schema / properties / app_id / description
        Added value: +"App Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / reference_name / description
        Added value: +"Internal reference name of the subscription group (not shown to users)."
    • Changedasc_ensure_subscription_prices4 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / default_usd / description
        Added value: +"USD price string applied to subscriptions not listed in usd_price_by_product."
      • addedInput schema / properties / usd_price_by_product / description
        Added value: +"Map of subscription productId to USD price string, e.g. {'com.example.app.yearly': '49.99'}."
    • Changedasc_finalize_submission_requirements11 fields changed
      • addedInput schema / properties / ai_services / description
        Added value: +"Short description of the AI services the app uses, inserted into the review notes."
      • addedInput schema / properties / app_name / description
        Added value: +"App name used to fill the generic App Review notes template."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / contact_email / description
        Added value: +"App Review contact email; defaults to the config support_email."
      • addedInput schema / properties / contact_first / description
        Added value: +"App Review contact first name."
      • addedInput schema / properties / contact_last / description
        Added value: +"App Review contact last name."
      • addedInput schema / properties / contact_phone / description
        Added value: +"App Review contact phone in international format, e.g. '+14155550100'."
      • addedInput schema / properties / copyright / description
        Added value: +"Copyright line for the store listing, e.g. '2026 Example Ltd'; falls back to the config 'copyright' key."
      • addedInput schema / properties / free / description
        Added value: +"If true (default) the app price is set to Free."
      • addedInput schema / properties / review_notes / description
        Added value: +"Custom App Review notes; omit to fill the generic 7-item test-flow template."
    • Changedasc_finalize_subscription7 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / description / description
        Added value: +"Subscription description shown to users (en-US)."
      • addedInput schema / properties / intro / description
        Added value: +"Intro offer from the spec product, e.g. {\"type\": \"free\", \"duration\": \"P3D\"}; omit for offer products (no intro)."
      • addedInput schema / properties / name / description
        Added value: +"Subscription display name shown to users (en-US)."
      • addedInput schema / properties / period / description
        Added value: +"Ignored; kept for backward compatibility."
      • addedInput schema / properties / sub_id / description
        Added value: +"App Store Connect subscription id."
      • addedInput schema / properties / usd_price / description
        Added value: +"USD base price as a decimal string, e.g. '49.99'."
    • Changedasc_get_app1 field changed
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changedasc_localize_group3 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / group_id / description
        Added value: +"App Store Connect subscription group id."
      • addedInput schema / properties / name_by_locale / description
        Added value: +"Map {locale: group display name}."
    • Changedasc_localize_subscription3 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / items / description
        Added value: +"Map {locale: {name, description}} of subscription display copy per locale."
      • addedInput schema / properties / sub_id / description
        Added value: +"App Store Connect subscription id."
    • Changedasc_sbp_check2 fields changed
      • addedInput schema / properties / days_back / description
        Added value: +"How many days back to search for the latest report (default 7)."
      • addedInput schema / properties / report_date / description
        Added value: +"Sales report date YYYY-MM-DD; omit to use the latest available."
    • Changedasc_submit_for_review2 fields changed
      • addedInput schema / properties / app_id / description
        Added value: +"App Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
    • Changedaso_check_name2 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / name / description
        Added value: +"Candidate App Store app name to check."
    • Changedaso_competitor_iap2 fields changed
      • addedInput schema / properties / app_id / description
        Added value: +"App Store Connect app id (numeric Apple id, e.g. '1234567890'); for aso_competitor_iap the iTunes trackId."
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
    • Changedaso_complete1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedaso_fetch_competitors3 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / limit / description
        Added value: +"Number of competitor apps to return (default 10)."
      • addedInput schema / properties / term / description
        Added value: +"Search term or seed keyword, e.g. 'habit tracker'."
    • Changedaso_find_available_name2 fields changed
      • addedInput schema / properties / candidates / description
        Added value: +"Ordered candidate app names."
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
    • Changedaso_niche_score3 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / genre / description
        Added value: +"App Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred."
      • addedInput schema / properties / term / description
        Added value: +"Search term or seed keyword, e.g. 'habit tracker'."
    • Changedaso_run1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedaso_scaffold_outputs3 fields changed
      • addedInput schema / properties / app_name / description
        Added value: +"App name; creates outputs/<app_name>/."
      • addedInput schema / properties / base_dir / description
        Added value: +"Directory that contains (or will contain) the outputs/<App>/ folder."
      • addedInput schema / properties / locales / description
        Added value: +"Locale codes for the metadata skeleton; omit for the 32 default languages."
    • Changedaso_search_hints3 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / expand / description
        Added value: +"If true, append a-z to the seed to collect the full keyword universe; default false."
      • addedInput schema / properties / term / description
        Added value: +"Search term or seed keyword, e.g. 'habit tracker'."
    • Changedaso_top_grossing3 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / genre / description
        Added value: +"App Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred."
      • addedInput schema / properties / limit / description
        Added value: +"Number of chart entries to return (default 25)."
    • Changedaso_unit_economics6 fields changed
      • addedInput schema / properties / ai_cost_per_credit / description
        Added value: +"AI provider cost per credit in USD (default 0.003)."
      • addedInput schema / properties / apple_cut / description
        Added value: +"Apple's commission as a fraction: 0.15 (Small Business Program, default) or 0.30."
      • addedInput schema / properties / weekly_credits / description
        Added value: +"Credits per week on the weekly plan (default 10)."
      • addedInput schema / properties / weekly_price / description
        Added value: +"Weekly subscription price in USD (default 7.99)."
      • addedInput schema / properties / yearly_monthly_credits / description
        Added value: +"Credits per month on the yearly plan (default 15)."
      • addedInput schema / properties / yearly_price / description
        Added value: +"Yearly subscription price in USD (default 49.99)."
    • Changedaso_validate_metadata2 fields changed
      • addedInput schema / properties / app_name / description
        Added value: +"App name whose outputs/<app_name>/02-metadata/apple-metadata.md is validated."
      • addedInput schema / properties / base_dir / description
        Added value: +"Directory that contains (or will contain) the outputs/<App>/ folder."
    • Changedbackend_deploy4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / dry_run / description
        Added value: +"If true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action."
      • addedInput schema / properties / project_ref / description
        Added value: +"Supabase project ref to deploy to."
    • Changedbackend_render1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedbuild_archive4 fields changed
      • addedInput schema / properties / archive_path / description
        Added value: +"Path to the .xcarchive, e.g. build/App.xcarchive."
      • addedInput schema / properties / configuration / description
        Added value: +"Xcode build configuration, default 'Release'."
      • addedInput schema / properties / project / description
        Added value: +"Path to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj."
      • addedInput schema / properties / scheme / description
        Added value: +"Xcode scheme name to build, e.g. 'MyApp'."
    • Changedbuild_boot_sim1 field changed
      • addedInput schema / properties / udid / description
        Added value: +"Simulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'."
    • Changedbuild_export_ipa3 fields changed
      • addedInput schema / properties / archive_path / description
        Added value: +"Path to the .xcarchive, e.g. build/App.xcarchive."
      • addedInput schema / properties / export_dir / description
        Added value: +"Directory to write the exported .ipa into."
      • addedInput schema / properties / export_options_plist / description
        Added value: +"Path to the ExportOptions.plist for xcodebuild -exportArchive."
    • Changedbuild_for_sim3 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Simulator device name, e.g. 'iPhone 16'."
      • addedInput schema / properties / project / description
        Added value: +"Path to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj."
      • addedInput schema / properties / scheme / description
        Added value: +"Xcode scheme name to build, e.g. 'MyApp'."
    • Changedbuild_screenshot2 fields changed
      • addedInput schema / properties / out_path / description
        Added value: +"Output file path (PNG)."
      • addedInput schema / properties / udid / description
        Added value: +"Simulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'."
    • Changedbuild_test3 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Simulator device name, e.g. 'iPhone 16'."
      • addedInput schema / properties / project / description
        Added value: +"Path to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj."
      • addedInput schema / properties / scheme / description
        Added value: +"Xcode scheme name to build, e.g. 'MyApp'."
    • Changedconfig_set11 fields changed
      • addedInput schema / properties / apple_id / description
        Added value: +"Apple ID email of the developer account (used by fastlane produce only)."
      • addedInput schema / properties / asc_finance_key_filepath / description
        Added value: +"Path to the Finance-role .p8 key file."
      • addedInput schema / properties / asc_finance_key_id / description
        Added value: +"Key id of a Finance-role App Store Connect API key (for sales reports)."
      • addedInput schema / properties / asc_issuer_id / description
        Added value: +"App Store Connect API issuer id (UUID)."
      • addedInput schema / properties / asc_key_filepath / description
        Added value: +"Path to the App Store Connect .p8 private key file."
      • addedInput schema / properties / asc_key_id / description
        Added value: +"App Store Connect API key id (10 characters)."
      • addedInput schema / properties / asc_vendor_number / description
        Added value: +"App Store Connect vendor number (sales reports)."
      • addedInput schema / properties / copyright / description
        Added value: +"Copyright line for the store listing, e.g. '2026 Example Ltd'; falls back to the config 'copyright' key."
      • addedInput schema / properties / legal_controller / description
        Added value: +"Legal entity name shown as data controller in the privacy policy."
      • addedInput schema / properties / support_email / description
        Added value: +"Public support email address."
      • addedInput schema / properties / team_id / description
        Added value: +"Apple Developer Team id (10 characters)."
    • Changedcpp_build_all3 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / themes / description
        Added value: +"List of {name, locale} Search Ads themes, one Custom Product Page each."
    • Changeddeliver_metadata3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changeddeliver_screenshots3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changeddeliver_screenshots_audit2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changeddeliver_subscription_review_screenshots3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changeddesign_export_png5 fields changed
      • addedInput schema / properties / height / description
        Added value: +"Viewport height in CSS pixels, e.g. 1024 for the icon board or 956 for a store board."
      • addedInput schema / properties / out_path / description
        Added value: +"Output file path (PNG)."
      • addedInput schema / properties / scale / description
        Added value: +"Device scale factor (default 1; use 3 for store boards)."
      • addedInput schema / properties / serve_url / description
        Added value: +"Temporary serve_url from claude-design render_preview; used once, never stored."
      • addedInput schema / properties / width / description
        Added value: +"Viewport width in CSS pixels, e.g. 1024 for the icon board or 440 for a store board."
    • Changeddesign_generate1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changeddesign_record_upload3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / open_url / description
        Added value: +"The claude.ai/design link returned by render_preview (not the serve_url)."
      • addedInput schema / properties / project_id / description
        Added value: +"Claude Design project id from create_project."
    • Changeddesign_research_brief_template1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changeddesign_research_check1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changeddesign_research_collect5 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / countries / description
        Added value: +"List of two-letter storefront codes, e.g. ['us', 'gb', 'de']; omit for the default set."
      • addedInput schema / properties / max_apps / description
        Added value: +"Maximum reference apps to download (default 16)."
      • addedInput schema / properties / screenshots_per_app / description
        Added value: +"Screenshots to download per reference app (default 6)."
      • addedInput schema / properties / terms / description
        Added value: +"Search terms describing the app category, e.g. ['meditation', 'sleep sounds']."
    • Changeddesign_screens_skeleton3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / overwrite / description
        Added value: +"If true, replace files that already exist; default false refuses to overwrite."
      • addedInput schema / properties / write / description
        Added value: +"If true, save the skeleton to design/screens.json; default false only returns it."
    • Changeddesign_upload_status1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedfirebase_setup4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / app_name / description
        Added value: +"App name as shown on the App Store (globally unique, max 30 characters)."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
    • Changedgithub_create_repo4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / dry_run / description
        Added value: +"If true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action."
      • addedInput schema / properties / repo_name / description
        Added value: +"Name of the new private repository, e.g. 'my-app'."
    • Changedgithub_issue_create7 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory; when given, the github_issues run option is read from its spec."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / body / description
        Added value: +"Issue body with what / why / done-when sections."
      • addedInput schema / properties / dry_run / description
        Added value: +"If true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action."
      • addedInput schema / properties / labels / description
        Added value: +"Issue labels: one role label (ios, backend, store, lead, founder) plus next or later."
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository as 'owner/name', e.g. 'octocat/my-app'."
      • addedInput schema / properties / title / description
        Added value: +"Issue title in imperative form, e.g. 'Add offer paywall analytics'."
    • Changedgithub_issues_bootstrap4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory; when given, the github_issues run option is read from its spec."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / dry_run / description
        Added value: +"If true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action."
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository as 'owner/name', e.g. 'octocat/my-app'."
    • Changedgithub_push3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / message / description
        Added value: +"Git commit message."
    • Changedgrowth_build_slideshows2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / slideshows / description
        Added value: +"List of {name, slides: [{text, image_prompt or image, cta}]} to render at 1080x1920."
    • Changedicon_generate4 fields changed
      • addedInput schema / properties / allow_external_generator / description
        Added value: +"Must be true to allow the paid fal.ai image generator; default false refuses."
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / concept / description
        Added value: +"Short concept description of the app used to write the image prompt, e.g. 'AI pet portrait maker'."
      • addedInput schema / properties / extra / description
        Added value: +"Extra prompt text appended to the concept."
    • Changedicon_install2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / source / description
        Added value: +"Path to the 1024x1024 icon master, relative to the app dir (default 'design/icon.png')."
    • Changedidea_evaluate5 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Two-letter App Store storefront code, lowercase, e.g. 'us', 'gb', 'de'."
      • addedInput schema / properties / genre / description
        Added value: +"App Store category name (e.g. 'photo_video', 'productivity', 'health') or numeric genre id; omit for all/inferred."
      • addedInput schema / properties / leaders / description
        Added value: +"Number of category leaders to profile with price ladders (default 3)."
      • addedInput schema / properties / name_candidates / description
        Added value: +"Candidate app names; the first available one is reported."
      • addedInput schema / properties / term / description
        Added value: +"Search term or seed keyword, e.g. 'habit tracker'."
    • Changedidea_harvest7 fields changed
      • addedInput schema / properties / countries / description
        Added value: +"List of two-letter storefront codes, e.g. ['us', 'gb', 'de']; omit for the default set."
      • addedInput schema / properties / exclude_terms / description
        Added value: +"Name/seller substrings to drop from results (e.g. your own apps)."
      • addedInput schema / properties / feeds / description
        Added value: +"Chart feeds to use, e.g. ['topgrossing', 'topfree']; omit for both."
      • addedInput schema / properties / genres / description
        Added value: +"Category names to sweep, e.g. ['health', 'productivity']; omit for all 24 charted categories."
      • addedInput schema / properties / limit / description
        Added value: +"Chart entries fetched per genre and storefront (default 100)."
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum entries per result list (default 50)."
      • addedInput schema / properties / newcomer_months / description
        Added value: +"Apps released within this many months count as rising newcomers (default 12)."
    • Changedlegal_check1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedlegal_render2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / values / description
        Added value: +"Map of placeholder name to text for product-specific legal placeholders."
    • Changedlegal_verify1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedlocalize_apply2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / translations / description
        Added value: +"Map {english_key: {locale: translated value}} for the String Catalog."
    • Changedmaestro_test3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / device / description
        Added value: +"Simulator UDID to run on; omit for the booted simulator."
      • addedInput schema / properties / tags / description
        Added value: +"Comma-separated Maestro tag filter, e.g. 'smoke'; omit to run every flow."
    • Changedmascot_assets3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / source_dir / description
        Added value: +"Directory with approved pose PNGs; omit for <app>/design/mascot."
      • addedInput schema / properties / states / description
        Added value: +"Mascot pose/state names, e.g. ['idle', 'happy']; omit for all states."
    • Changedmascot_blink3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / paths / description
        Added value: +"Explicit pose PNG paths; overrides the default <app>/design/mascot/<state>.png."
      • addedInput schema / properties / states / description
        Added value: +"Mascot pose/state names, e.g. ['idle', 'happy']; omit for all states."
    • Changedmetadata_check1 field changed
      • addedInput schema / properties / source_md / description
        Added value: +"Path to apple-metadata.md."
    • Changedmetadata_export7 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory; when given, export is refused until the ASO stage is complete."
      • addedInput schema / properties / dest_dir / description
        Added value: +"Output directory for the per-locale .txt files, e.g. <app>/fastlane/metadata."
      • addedInput schema / properties / primary_category / description
        Added value: +"Primary App Store category id, e.g. 'PHOTO_AND_VIDEO'."
      • addedInput schema / properties / privacy_url / description
        Added value: +"Public privacy policy URL written to the metadata files."
      • addedInput schema / properties / secondary_category / description
        Added value: +"Secondary App Store category id, e.g. 'PRODUCTIVITY'."
      • addedInput schema / properties / source_md / description
        Added value: +"Path to apple-metadata.md to export."
      • addedInput schema / properties / support_url / description
        Added value: +"Public support page URL."
    • Changedmetadata_listing_check1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedmetadata_render_listing1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedonboarding_plan1 field changed
      • addedInput schema / properties / step_count / description
        Added value: +"Desired number of onboarding steps; recommended range 8-15 (default 12)."
    • Changedorchestrator_needs_human4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / how_to_resolve / description
        Added value: +"What the human needs to do to unblock the stage."
      • addedInput schema / properties / reason / description
        Added value: +"Why self-correction is exhausted (what failed)."
      • addedInput schema / properties / stage / description
        Added value: +"Pipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list)."
    • Changedorchestrator_next_action2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / skip_options_check / description
        Added value: +"If true, do not require run_options_save to have been called first. Default false."
    • Changedorchestrator_preflight2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory; omit before the app is scaffolded."
      • addedInput schema / properties / skip_options_check / description
        Added value: +"If true, do not require run_options_save to have been called first. Default false."
    • Changedorchestrator_record_attempt2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / stage / description
        Added value: +"Pipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list)."
    • Changedpipeline_mark3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / stage / description
        Added value: +"Pipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list)."
      • addedInput schema / properties / status / description
        Added value: +"New stage status: 'done', 'in_progress' or 'pending'."
    • Changedpipeline_next2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / skip_options_check / description
        Added value: +"If true, do not require run_options_save to have been called first. Default false."
    • Changedpipeline_status1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedpipeline_validate2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / stage / description
        Added value: +"Pipeline stage id, e.g. 'aso', 'screenshots', 'features' (see pipeline_status for the list)."
    • Changedpreview_brief3 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / message / description
        Added value: +"Optional extra direction appended to the brief."
      • addedInput schema / properties / overwrite / description
        Added value: +"If true, replace files that already exist; default false refuses to overwrite."
    • Changedpreview_check1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedpreview_review_log4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / file / description
        Added value: +"Preview file path relative to the app dir, e.g. 'fastlane/app_previews/en-US/preview.mp4'."
      • addedInput schema / properties / problems / description
        Added value: +"Up to 3 worst problems as [{t: seconds, issue: text}]; required while any score is under 8."
      • addedInput schema / properties / scores / description
        Added value: +"Scores 1-10 for keys hook, readability, motion, variety, brand, music."
    • Changedpreview_review_sheets1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedpreview_upload5 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / dry_run / description
        Added value: +"If true (default) nothing is changed or sent and the exact plan/command is returned; false performs the live action."
      • addedInput schema / properties / locales / description
        Added value: +"Locale codes to upload; omit for every locale in fastlane/app_previews/."
      • addedInput schema / properties / replace / description
        Added value: +"If true, replace preview sets that already exist on App Store Connect."
    • Changedpricing_unit_economics4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / apple_cut / description
        Added value: +"Apple's commission as a fraction: 0.15 (Small Business Program, default) or 0.30."
      • addedInput schema / properties / cost_photo / description
        Added value: +"Measured AI cost in USD per photo call; omit to read from backend/eval/results."
      • addedInput schema / properties / cost_text / description
        Added value: +"Measured AI cost in USD per text call; omit to read from backend/eval/results."
    • Changedrevenuecat_setup6 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / env_suffix / description
        Added value: +"Suffix for secret names when several apps share one Supabase project, e.g. '_MYAPP'."
      • addedInput schema / properties / set_secrets / description
        Added value: +"If true (default) also write the RevenueCat secrets to Supabase."
      • addedInput schema / properties / supabase_ref / description
        Added value: +"Supabase project ref that receives the RevenueCat secrets."
      • addedInput schema / properties / v2_key / description
        Added value: +"RevenueCat secret API v2 key (sk_...); used for this call only."
    • Changedrun_options1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory to read current values from; omit before the app is scaffolded."
    • Changedrun_options_save2 fields changed
      • addedInput schema / properties / answers / description
        Added value: +"Map {option id: value} covering every option id returned by run_options."
      • addedInput schema / properties / app_dir / description
        Added value: +"App directory whose app.spec.json receives the answers; omit to save to the pending file used by app_scaffold."
    • Changedscreenshot_apply_layout1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedscreenshot_brand1 field changed
      • addedInput schema / properties / marketing_dir / description
        Added value: +"Path to the app's marketing/ directory."
    • Changedscreenshot_build_all7 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / locales / description
        Added value: +"List of locale codes, e.g. ['en-US', 'de-DE']; omit for the default set."
      • addedInput schema / properties / project / description
        Added value: +"Path to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj."
      • addedInput schema / properties / sample_prompt / description
        Added value: +"Prompt describing a sample output of the app (fills Result/Gallery screens)."
      • addedInput schema / properties / scheme / description
        Added value: +"Xcode scheme name to build, e.g. 'MyApp'."
      • addedInput schema / properties / udid / description
        Added value: +"Simulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'."
    • Changedscreenshot_capture4 fields changed
      • addedInput schema / properties / locale / description
        Added value: +"App locale of the capture, e.g. 'en-US'; used as the output subfolder."
      • addedInput schema / properties / marketing_dir / description
        Added value: +"Path to the app's marketing/ directory."
      • addedInput schema / properties / name / description
        Added value: +"Screen name, used as the file name, e.g. 'paywall'."
      • addedInput schema / properties / udid / description
        Added value: +"Simulator UDID from build_list_simulators, e.g. 'A1B2C3D4-...'."
    • Changedscreenshot_generate_sample2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / prompt / description
        Added value: +"Image generation prompt for the sample output."
    • Changedscreenshot_onboarding_heroes4 fields changed
      • addedInput schema / properties / allow_external_generator / description
        Added value: +"Must be true to allow the paid fal.ai image generator; default false refuses."
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / concept / description
        Added value: +"Short concept description of the app used to write the image prompt, e.g. 'AI pet portrait maker'."
      • addedInput schema / properties / count / description
        Added value: +"Number of onboarding hero images to generate (default 11)."
    • Changedscreenshot_sync2 fields changed
      • addedInput schema / properties / fastlane_screenshots_dir / description
        Added value: +"Path to fastlane/screenshots/ to sync branded images into."
      • addedInput schema / properties / marketing_dir / description
        Added value: +"Path to the app's marketing/ directory."
    • Changedsetup_approvals1 field changed
      • addedInput schema / properties / mode / description
        Added value: +"Approvals mode; only 'required' is accepted here ('off' must be set by the human)."
    • Changedsetup_credentials1 field changed
      • addedInput schema / properties / services / description
        Added value: +"Service ids to collect credentials for; omit for every enabled service."
    • Changedsetup_services2 fields changed
      • addedInput schema / properties / disable / description
        Added value: +"Service ids to turn off (same ids as enable)."
      • addedInput schema / properties / enable / description
        Added value: +"Service ids to turn on, e.g. ['apple', 'supabase', 'revenuecat', 'github', 'firebase', 'xcode', 'maestro', 'design', 'ai', 'lottie']."
    • Changedsetup_set2 fields changed
      • addedInput schema / properties / key / description
        Added value: +"Non-secret config key, e.g. 'asc_key_id', 'team_id', 'support_email'."
      • addedInput schema / properties / value / description
        Added value: +"Value to store."
    • Changedsigning_create_profile4 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / cert_id / description
        Added value: +"App Store Connect certificate id from signing_setup_distribution."
      • addedInput schema / properties / name / description
        Added value: +"Provisioning profile name (default 'AppFactory AppStore')."
    • Changedsigning_setup_distribution1 field changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
    • Changedstore_setup6 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / mode / description
        Added value: +"'plan' (offline), 'check' (live reads, simulated writes, reports CONFLICT) or 'apply' (live writes, needs approval)."
      • addedInput schema / properties / rc_apple_notification_url / description
        Added value: +"RevenueCat's Apple Server-to-Server notification URL, stored in app outputs."
      • addedInput schema / properties / rc_project_id / description
        Added value: +"RevenueCat project id (proj...) if it already exists."
      • addedInput schema / properties / target / description
        Added value: +"What to set up: 'capabilities', 'asc', 'rc' or 'all' (default)."
    • Changedstorekit_generate1 field changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
    • Changedstorekit_parity2 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / storekit_path / description
        Added value: +"Path to a Configuration.storekit; omit for Resources/Configuration.storekit."
    • Changedsupabase_create_project5 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / db_pass / description
        Added value: +"Database password for the new project."
      • addedInput schema / properties / name / description
        Added value: +"Name of the new Supabase project."
      • addedInput schema / properties / org_id / description
        Added value: +"Supabase organization id from supabase_list_orgs."
      • addedInput schema / properties / region / description
        Added value: +"Supabase region code, e.g. 'us-east-1', 'eu-central-1'."
    • Changedsupabase_get_keys1 field changed
      • addedInput schema / properties / ref / description
        Added value: +"Supabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst')."
    • Changedsupabase_run_sql3 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / ref / description
        Added value: +"Supabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst')."
      • addedInput schema / properties / sql / description
        Added value: +"SQL to execute. Destructive statements (DROP, TRUNCATE, DELETE/UPDATE without WHERE) always need approval."
    • Changedsupabase_set_secret4 fields changed
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / name / description
        Added value: +"Edge function secret name, e.g. 'FAL_KEY'."
      • addedInput schema / properties / ref / description
        Added value: +"Supabase project ref (20-char id from supabase_list_projects, e.g. 'abcdefghijklmnopqrst')."
      • addedInput schema / properties / value / description
        Added value: +"Secret value; written server-side and never echoed back."
    • Changedteam_brief4 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / overwrite / description
        Added value: +"If true, replace files that already exist; default false refuses to overwrite."
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repo 'owner/name' to reference in the briefs; optional."
      • addedInput schema / properties / sessions / description
        Added value: +"Names of the team sessions as {lead, ios, backend, store}."
    • Changedtestflight_ship5 fields changed
      • addedInput schema / properties / app_dir / description
        Added value: +"Absolute path to the app project directory (contains app.spec.json), e.g. /Users/me/Apps/MyApp."
      • addedInput schema / properties / approval_id / description
        Added value: +"Approval id from a previous approval_required refusal; omit on the first call. The human approves out-of-band with `appfactory approve <id>`, then call again with the same arguments and this id."
      • addedInput schema / properties / bundle_id / description
        Added value: +"App bundle identifier in reverse-DNS form, e.g. com.example.app."
      • addedInput schema / properties / project / description
        Added value: +"Path to the .xcodeproj or .xcworkspace to build, e.g. /path/App/App.xcodeproj."
      • addedInput schema / properties / scheme / description
        Added value: +"Xcode scheme name to build, e.g. 'MyApp'."
  2. 125 tool updatesv0.1.1
    • First observedai_configure
    • First observedai_deploy_proxy
    • First observedanimation_fetch_recolor
    • First observedapp_inject_config
    • First observedapp_scaffold
    • First observedapp_sync_spec
    • First observedasc_add_subscription_group_localization
    • First observedasc_append_subscription_disclosure
    • First observedasc_create_app
    • First observedasc_create_bundle_id
    • First observedasc_create_subscription
    • First observedasc_create_subscription_group
    • First observedasc_ensure_subscription_prices
    • First observedasc_finalize_submission_requirements
    • First observedasc_finalize_subscription
    • First observedasc_get_app
    • First observedasc_list_apps
    • First observedasc_localize_group
    • First observedasc_localize_subscription
    • First observedasc_sbp_check
    • First observedasc_submit_for_review
    • First observedasc_token_check
    • First observedaso_check_name
    • First observedaso_competitor_iap
    • First observedaso_complete
    • First observedaso_fetch_competitors
    • First observedaso_find_available_name
    • First observedaso_niche_score
    • First observedaso_run
    • First observedaso_scaffold_outputs
    • First observedaso_search_hints
    • First observedaso_top_grossing
    • First observedaso_unit_economics
    • First observedaso_validate_metadata
    • First observedbackend_deploy
    • First observedbackend_render
    • First observedbuild_archive
    • First observedbuild_boot_sim
    • First observedbuild_export_ipa
    • First observedbuild_for_sim
    • First observedbuild_list_simulators
    • First observedbuild_screenshot
    • First observedbuild_test
    • First observedbuild_xcode_version
    • First observedconfig_doctor
    • First observedconfig_set
    • First observedcpp_build_all
    • First observeddeliver_metadata
    • First observeddeliver_screenshots
    • First observeddeliver_screenshots_audit
    • First observeddeliver_subscription_review_screenshots
    • First observeddesign_export_png
    • First observeddesign_generate
    • First observeddesign_record_upload
    • First observeddesign_research_brief_template
    • First observeddesign_research_check
    • First observeddesign_research_collect
    • First observeddesign_screens_skeleton
    • First observeddesign_upload_status
    • First observedenv_doctor
    • First observedfirebase_setup
    • First observedgithub_create_repo
    • First observedgithub_issue_create
    • First observedgithub_issues_bootstrap
    • First observedgithub_push
    • First observedgrowth_build_slideshows
    • First observedicon_generate
    • First observedicon_install
    • First observedidea_evaluate
    • First observedidea_harvest
    • First observedlegal_check
    • First observedlegal_render
    • First observedlegal_verify
    • First observedlocalize_apply
    • First observedmaestro_test
    • First observedmascot_assets
    • First observedmascot_blink
    • First observedmetadata_check
    • First observedmetadata_export
    • First observedmetadata_listing_check
    • First observedmetadata_render_listing
    • First observedonboarding_plan
    • First observedorchestrator_needs_human
    • First observedorchestrator_next_action
    • First observedorchestrator_preflight
    • First observedorchestrator_record_attempt
    • First observedpipeline_mark
    • First observedpipeline_next
    • First observedpipeline_status
    • First observedpipeline_validate
    • First observedplaybook
    • First observedpreview_brief
    • First observedpreview_check
    • First observedpreview_review_log
    • First observedpreview_review_sheets
    • First observedpreview_upload
    • First observedpricing_unit_economics
    • First observedrevenuecat_setup
    • First observedrun_options
    • First observedrun_options_save
    • First observedscreenshot_apply_layout
    • First observedscreenshot_brand
    • First observedscreenshot_build_all
    • First observedscreenshot_capture
    • First observedscreenshot_generate_sample
    • First observedscreenshot_onboarding_heroes
    • First observedscreenshot_sync
    • First observedsetup_approvals
    • First observedsetup_credentials
    • First observedsetup_services
    • First observedsetup_set
    • First observedsetup_status
    • First observedsigning_create_profile
    • First observedsigning_setup_distribution
    • First observedstore_setup
    • First observedstorekit_generate
    • First observedstorekit_parity
    • First observedsupabase_create_project
    • First observedsupabase_get_keys
    • First observedsupabase_list_orgs
    • First observedsupabase_list_projects
    • First observedsupabase_run_sql
    • First observedsupabase_set_secret
    • First observedteam_brief
    • First observedtestflight_ship

TDQS

A3.8/5.0

Scored across 125 tools

Disambiguation3/5

The tool descriptions are unusually thorough with 'Use when' and 'Not for' cross-references, which helps separate many overlapping areas. However, with 125 tools, several boundaries remain easy to confuse: setup_set vs config_set, pipeline_mark vs orchestrator_record_attempt, metadata_check vs metadata_listing_check vs aso_validate_metadata, and individual asc_* writes vs store_setup. Descriptions mitigate but do not fully eliminate ambiguity at this scale.

Naming Consistency4/5

Tool names are overwhelmingly snake_case and grouped by domain prefix (asc_, setup_, pipeline_, screenshot_, etc.), which gives a readable and predictable surface. The main inconsistency is the internal pattern: some names use verb_noun (asc_list_apps), others noun_verb (metadata_check) or noun_noun (config_doctor), but these deviations are minor and not chaotic.

Tool Count1/5

125 tools is an extreme mismatch for an MCP server, far beyond the recommended 3-15 range and well past the 50+ threshold that the rubric treats as severe. Even for a broad app-factory pipeline, the surface is too large for an agent to navigate reliably, with many legacy or narrowly scoped operations that could be consolidated.

Completeness4/5

The server covers an unusually complete app lifecycle: idea validation, ASO, design, scaffolding, backend deployment, store setup, screenshots, TestFlight shipping, metadata, legal pages, and submission. Remaining gaps are minor, such as TestFlight tester management, App Privacy settings (explicitly unavailable via API), and post-launch review/analytics management, which agents can work around or handle manually.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An opinionated MCP server for App Store Connect that provides 13 curated tools, slash-command workflows, and a Claude Skill to manage apps, reviews, sales, and pre-submission audits via natural language.
    41
    263 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that exposes the entire Apple App Store Connect API (1,200+ operations) as MCP tools, enabling AI assistants to query apps, manage builds, handle submissions, read analytics, and more.
    6 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that exposes the Apple App Store Connect API to AI agents, enabling management of apps, metadata, in-app purchases, subscriptions, TestFlight, provisioning, reviews, analytics, and more through 113 curated tools plus two generic JSON:API escape-hatch tools.
    2
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for App Store Optimization, enabling AI agents to read rankings, keywords, competitors, reviews, and revenue, and manage metadata with human approval.
    11
    -