Skip to main content
Glama
Appo MCP

Appo MCP

Official
by appolabs

@appolabs/appo-mcp

Retired. The Appo MCP is the remote connector served by Appo itself: https://apps.goappo.io/mcp. Register it with npx @appolabs/appo mcp, or add it as an HTTP MCP server in your client (claude mcp add --transport http appo https://apps.goappo.io/mcp, codex mcp add appo --url https://apps.goappo.io/mcp). This package is no longer maintained.

Local MCP (Model Context Protocol) server for the Appo app platform. It gives an AI agent the same app lifecycle outcomes as the appo CLI — create, configure, preview, publish, push, rejection recovery, test builds, resubmission — plus local code-generation dev-tools for the @appolabs/appo SDK.

The server carries no API client of its own: every lifecycle call reuses the CLI core (@appolabs/appo ops/api/config). Tool names mirror the canonical /mcp AppoServer vocabulary documented in apps-web-app/docs/CROSS-SURFACE-PARITY.md, so an agent sees one vocabulary across both MCP surfaces.

Installation

Add to your .mcp.json:

{
  "mcpServers": {
    "appo": {
      "command": "npx",
      "args": ["-y", "@appolabs/appo-mcp"]
    }
  }
}

Related MCP server: React Native Expo MCP

Authentication

The server does not prompt for credentials or hold credential state. It resolves auth exactly as the CLI does, so both surfaces always target the same environment:

  1. appo login once. After a device-flow login with the CLI, the token is stored in the active profile (~/.appo/config.json). The server reads it through the shared config module — no extra configuration.

  2. APPO_TOKEN override. Set APPO_TOKEN to supply a PAT directly (CI / non-interactive contexts); it takes precedence over the stored profile token.

  3. Base URL / profile. APPO_API_BASE env → the active profile's api_base → http://localhost:8002. Profile selection: APPO_ENV → config current → default.

If no token can be resolved, every lifecycle tool returns a structured { error: "not_authenticated", message, next_actions: [] } envelope (it never crashes) — the message tells the operator to run appo login.

Tools (20)

App lifecycle

Reuse the CLI core; names match the canonical /mcp inventory.

Tool

Outcome

Gate

create_app

Create an app (name, base_url)

—

configure_app

Set content fields (name, base_url); content-only, mirrors CLI apps update

—

set_icon

Set the app icon from an https icon_url

—

list_apps

List the apps owned by the authenticated principal

—

get_app_overview

App config, publication state, and metadata in one read; single-app default when app_id is omitted. Start here

—

preview_app

Open-on-device payload (iOS TestFlight URL, Android deeplink, QR target, per-platform readiness)

—

get_build_status

Poll a build by id until ready/failed

—

get_rejection

Curated required action for a rejected app (never raw reviewer text)

—

get_fix_recipe

Code-free remediation recipes for the current rejection

—

publish_app

Start publication to the chosen stores

confirm

unpublish_app

Remove an app from the chosen stores

confirm

send_push

Send a push to the app's devices

confirm

trigger_resubmission

Resubmit a rejected app for review (requires a customer-owned Apple credential)

confirm

There is intentionally no ship tool and no publish-build trigger. Agents chain create_app → publish_app (and trigger_resubmission for rejection cycles). Build triggering is not exposed: the store-publish-kind build is operator-internal (Nova Release), and self-serve verification is via preview_app (the managed preview).

Local dev-tools

Operate on the local project; no CLI or remote-MCP equivalent by design.

Tool

Description

generate_hook

Generate a React hook for an SDK feature

generate_component

Generate a UI component with SDK integration

scaffold_feature

Scaffold a feature (hook + component + types)

validate_setup

Validate SDK installation and configuration

check_permissions

Analyze permission-handling patterns

diagnose_issue

Diagnose common SDK integration issues

generate_universal_links

Emit apple-app-site-association + assetlinks.json with hosting instructions

Confirm-gate semantics

Destructive tools (publish_app, unpublish_app, send_push, trigger_resubmission) take an optional confirm: boolean. Without confirm:true they perform no write and return a preview envelope ({ error: "confirm_required", will, ..., next_actions }) describing what would happen. This mirrors the CLI's --confirm flag / exit-code-3 semantics at the MCP idiom layer.

Error envelopes

Errors are returned as structured data, never thrown. Every tool returns { error, message, next_actions } (plus status for HTTP errors). HTTP status maps to a stable code: 401 → not_authenticated, 403 → forbidden, 404 → not_found, 409 → conflict, 422 → validation_error, otherwise request_failed. Each response carries structuredContent (the canonical envelope) and a JSON text mirror in content for text-only clients.

Resources & prompts

URI

Description

appo://overview

SDK overview and capabilities

appo://api/{feature}

API reference per feature

appo://examples/{feature}

Code examples per feature

appo://best-practices

Integration best practices

appo://troubleshooting

Common issues and solutions

Prompts: setup_wizard, integrate_feature, debug_assistant. Features: push, biometrics, camera, location, haptics, storage, share, network, device.

Breaking changes in 2.0.0

This release adopts the canonical tool vocabulary and the CLI-shared auth chain.

  • get_app removed — superseded by get_app_overview (single-call config + publication state + metadata, with a single-app default).

  • update_app split into configure_app (content fields name/base_url via PATCH /apps/{id}) and set_icon (POST /apps/{id}/icon, https icon_url). update_app's catch-all field list (splash colors, injected CSS/JS, path fields, …) is gone — webview injection is a dashboard concern and is not on the CLI/MCP configure surface.

  • Env vars renamed — APPS_API_URL / APPS_API_TOKEN are no longer read. Use the CLI-canonical APPO_API_BASE / APPO_TOKEN, or simply appo login and let the server read the stored profile.

Development

pnpm install
pnpm build       # tsup (ESM + CJS + DTS)
pnpm dev         # watch
pnpm typecheck   # tsc --noEmit
pnpm test        # vitest

License

MIT

Available Tools

21 tools
check_permissionsB

Analyze permission handling patterns in code for a specific SDK feature. Returns analysis with suggestions for proper permission flow.

Inputs: code (required), feature (required).

configure_appA

Configures an app's content fields (name, base_url) and who prepares it (prep_mode). Reversible - executes immediately. Content-only, matching the CLI apps update; icon is set_icon, webview injection is a dashboard concern.

Inputs: app_id (required), name, base_url, prep_mode.

create_appA

Creates a new app for the authenticated user. Non-destructive — executes immediately. Authenticate once with appo login (or set APPO_TOKEN). Omit prep_mode when app source code is available in context.

Inputs: name (required), base_url (required), user_id, metadata_name, +1 more.

diagnose_issueB

Diagnose common @appolabs/appo SDK integration issues. Provides diagnosis with solutions and code fixes.

Inputs: symptom (required), feature, platform, errorMessage.

generate_componentB

Generate a UI component that uses @appolabs/appo SDK features. Returns a complete React component with SDK integration.

Inputs: feature (required), styling, variant, componentName.

generate_hookA

Generate a custom React hook for an @appolabs/appo SDK feature. Returns TypeScript code with types, error handling, and loading states.

Inputs: feature (required), hookName, includeError, includeLoading.

get_app_overviewA

Returns app configuration, publication state, and metadata in one call. Start here. If app_id is omitted and you own exactly one app, that app is used.

Inputs: app_id.

get_build_statusB

Returns the status of a build by id. Poll until the status reaches ready (then publish_app) or failed. Non-destructive.

Inputs: app_id (required), build_id (required).

get_fix_recipeA

Returns code-free Appo remediation recipes for the current rejection. Non-destructive.

Inputs: app_id (required).

get_rejectionA

Returns the Appo publication status and the curated required action for a rejected app. Never exposes raw reviewer text. Non-destructive.

Inputs: app_id (required).

list_appsA

Lists all apps owned by the authenticated user. Non-destructive.

Inputs: no named parameters.

preview_appA

Returns the open-on-device payload: iOS TestFlight URL, Android deeplink, QR target URL, and per-platform readiness. Non-destructive — executes immediately.

Inputs: app_id (required).

publish_appA

Starts publication to the chosen stores. Destructive — call with confirm:true to execute; without it returns a preview of the target stores.

Inputs: app_id (required), app_stores (required), confirm.

scaffold_featureB

Scaffold complete feature integration including hook, component, and types. Returns multiple files with integration instructions.

Inputs: feature (required), directory, includeTests.

send_pushA

Sends a push to the app's devices. Destructive — call with confirm:true to send; without it returns a preview.

Inputs: body (required), title (required), app_id (required), confirm, +3 more.

set_iconA

Sets an app's icon from a publicly reachable https URL. The server fetches, validates, and stores the image. Reversible — executes immediately.

Inputs: app_id (required), icon_url (required).

set_permissionsA

Sets an app's native permissions. Pass permissions as an object of { name: boolean }; keys are tracking, camera, microphone, nfc. Only the keys you include change — the rest and every usage message are preserved. Reversible — executes immediately. Request only permissions the app actually uses (store-review discipline).

Inputs: app_id (required), permissions (required).

trigger_resubmissionA

Resubmits a rejected app for review. Destructive — call with confirm:true to execute; without it returns a preview. Requires a customer-owned Apple credential.

Inputs: app_id (required), confirm.

unpublish_appA

Removes an app from the chosen stores. Destructive — call with confirm:true to execute; without it returns a preview of the target stores.

Inputs: app_id (required), app_stores (required), confirm.

validate_setupB

Validate @appolabs/appo SDK installation and configuration. Analyzes package.json and optionally checks import patterns.

Inputs: packageJson (required), tsConfig, sampleCode.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 21 tools

    Disambiguation3/5

    Some tools have clear boundaries (create_app, list_apps, set_icon), but several overlap in purpose: generate_hook, generate_component, and scaffold_feature all produce SDK integration code, and diagnose_issue, get_fix_recipe, and get_rejection all deal with app rejection/diagnosis. The descriptions help somewhat, but an agent could easily confuse generate_hook with generate_component or diagnose_issue with get_fix_recipe.

    Naming Consistency4/5

    Most tools follow a consistent verb_noun pattern (validate_setup, generate_hook, list_apps, configure_app, set_icon, publish_app, get_app_overview, send_push). Minor deviations exist: trigger_resubmission and generate_universal_links are longer but still verb-based, and scaffold_feature is a verb_noun pair. Overall the pattern is predictable.

    Tool Count4/5

    21 tools is on the higher end but reasonable for a server covering both SDK code generation and app lifecycle management. The count is slightly heavy, but each tool addresses a distinct aspect of the Appo platform, and the two clusters (code generation vs. app management) justify the size.

    Completeness4/5

    The server covers the core app lifecycle well: create, list, configure, set icon/permissions, publish, unpublish, preview, build status, rejection handling, and push. Minor gaps exist: there's no delete_app or update_app (only configure_app for content fields), and no tool for managing team members or viewing analytics. The code generation side is also somewhat redundant but complete.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      An MCP server that provides utilities for web developers to automate API integration, convert Figma designs to code, and optimize development workflows with tools for asset management and code generation.
      8
      25 npm
      38
      Mozilla Public 2.0
    • A
      license
      A
      quality
      D
      maintenance
      An MCP server designed for React Native and Expo development that provides specialized tools for project scaffolding, architectural best practices, and troubleshooting. It enables AI assistants to guide users through setup, navigation configuration, and CI/CD processes using modern stacks like NativeWind and Zustand.
      13
      4
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      This MCP server enables real-time debugging and inspection of running React Native apps, providing access to console logs, errors, network requests, navigation state, storage, and performance profiling.
      1
      MIT