Skip to content

Introduction

appctl gives an LLM a controlled set of tools for your existing application. It reads an app surface you already have, writes a local tool contract, executes the tool calls the model requests, and records what happened.

The source can be an OpenAPI document, framework project, SQL information_schema, Supabase/PostgREST service, MCP server, URL login flow, or plugin. The generated files live under .appctl/, so the contract can be reviewed before the agent uses it.

At runtime, appctl sends your prompt to the configured model provider. If the model asks to call a tool, appctl performs the HTTP, SQL, MCP, or plugin-backed operation using your configured auth and safety settings. Call history is stored locally, for example in .appctl/history.db.

Use appctl when you want to operate or inspect a real backend from natural language without writing a custom agent bridge first. Typical use cases include internal admin workflows, support operations, reporting, QA checks, demo apps, and local developer tools.

Start with appctl setup if you want the guided path.

  1. appctl setup — provider, sync source, checks, and next steps in one flow.
  2. appctl sync — generate the schema and tools from one selected source. If .appctl/schema.json already exists, --force is required to replace it.
  3. appctl chat or appctl run — send user text; the model may emit tool calls which appctl executes.
  4. appctl serve — expose HTTP/WebSocket and the embedded web console.
  • A web framework: your application is unchanged; appctl only consumes what it can read.
  • A database: data remains in your systems.
  • An LLM product: you configure providers in config.toml.

Not sure which flag to use? Start with Choosing a sync source (Nest, Spring, Next.js, and other stacks without a built-in flag).

SourceDocumentation
OpenAPIOpenAPI
Django (DRF), FlaskDjango, appctl sync --flask
Rails, Laravel, ASP.NET, StrapiRails, Laravel, ASP.NET, Strapi
Supabase / PostgRESTSupabase
SQL and other datastoresDatabases
URL + loginURL login
MCPMCP
Dynamic pluginsPlugins