{"tools":[{"type":"function","function":{"name":"auth","description":"Sign up or sign in, no browser needed. Call with {email}: a 6-digit code is emailed (valid 10 minutes). Ask the person for it, then call again with {email, otp}: returns session_key (30 days); a new email gets a free account right here. Or {api_key} swaps an aipps API key for a session key. Then send 'Authorization: Bearer <session_key>' on every other tool call.","parameters":{"type":"object","properties":{"email":{"type":"string","description":"The person's email address."},"otp":{"type":"string","description":"The 6-digit code from the email."},"api_key":{"type":"string","description":"An aipps API key (ak_...) instead of email + otp."}}}}},{"type":"function","function":{"name":"get_pricing","description":"Free builds a day, what a build pack adds and costs, build size classes. No sign-in needed.","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"get_account","description":"The signed-in account: email, build packs, today's usage (allowance, counted, pending, left).","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"list_apps","description":"The account's apps: slug, name, framework, iOS bundle id, Android package.","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"create_app","description":"Add an app to build. Free. Do this once per project; the slug it returns is used by start_build.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The app's name."},"slug":{"type":"string","description":"Optional; made from the name when left out."},"framework":{"type":"string","enum":["expo","react-native","android-native","android","ios-native","ios","macos","electron","capacitor"],"description":"Default expo."},"ios_bundle_id":{"type":"string"},"android_package":{"type":"string"}},"required":["name"]}}},{"type":"function","function":{"name":"start_build","description":"Start a build of an app for one platform. It waits for the project upload: PUT the .tar.gz to the returned upload_url with the same Authorization header, then it joins the queue. A simple build uses 1 of today's builds, a complex one 3 (counted when it finishes). submit sends a production build to TestFlight (ios) or a Play track (android) with the app's own store key.","parameters":{"type":"object","properties":{"app":{"type":"string","description":"The app's slug (see list_apps)."},"platform":{"type":"string","enum":["android","ios","macos"]},"profile":{"type":"string","description":"preview (default: an install link) or production (store)."},"message":{"type":"string","description":"A note shown with the build."},"submit":{"type":"string","description":"testflight (ios) or internal | alpha | beta | production (android)."}},"required":["app","platform"]}}},{"type":"function","function":{"name":"list_builds","description":"Recent builds, newest first, optionally for one app.","parameters":{"type":"object","properties":{"app":{"type":"string","description":"The app's slug (see list_apps)."},"limit":{"type":"integer","description":"1-200, default 20."}}}}},{"type":"function","function":{"name":"get_build","description":"One build's status (waiting_source, queued, running, succeeded, failed, canceled) and, once it has succeeded, install_url (a page with a QR code to share) and qr_url.","parameters":{"type":"object","properties":{"build_id":{"type":"string","description":"The build id from start_build or list_builds."}},"required":["build_id"]}}},{"type":"function","function":{"name":"get_build_logs","description":"Build log text from offset; call again with next_offset until done is true.","parameters":{"type":"object","properties":{"build_id":{"type":"string","description":"The build id from start_build or list_builds."},"offset":{"type":"integer","description":"Default 0."}},"required":["build_id"]}}},{"type":"function","function":{"name":"cancel_build","description":"Cancel a build that hasn't finished. Nothing is counted if it hadn't started.","parameters":{"type":"object","properties":{"build_id":{"type":"string","description":"The build id from start_build or list_builds."}},"required":["build_id"]}}},{"type":"function","function":{"name":"list_updates","description":"An Expo app's over-the-air updates, newest first (kind update or rollback, channel, runtime_version, platform), and url: the value for app.json updates.url (null until the first `npx aipps update`).","parameters":{"type":"object","properties":{"app":{"type":"string","description":"The app's slug (see list_apps)."},"channel":{"type":"string","description":"Only this channel (e.g. production)."}},"required":["app"]}}},{"type":"function","function":{"name":"rollback_update","description":"to=embedded (default; needs runtime_version): apps on the channel go back to the bundle inside their build. to=<update or group id>: that update is published again as the newest on the channel (also promotes, e.g. preview to production). Counts against the 30 publishes a day.","parameters":{"type":"object","properties":{"app":{"type":"string","description":"The app's slug (see list_apps)."},"channel":{"type":"string","description":"Default production."},"to":{"type":"string","description":"embedded (default), or an update id or group id from list_updates."},"runtime_version":{"type":"string","description":"Needed for to=embedded, as in app.json."},"platform":{"type":"string","description":"ios, android or all (default)."},"message":{"type":"string","description":"A note shown with the update."}},"required":["app"]}}}]}