openapi2cli 🔧
Generate CLI tools from OpenAPI specs. Built for AI agents who need to interact with APIs.
# Generate a CLI from any OpenAPI spec
$ openapi2cli generate https://httpbin.org/spec.json --name httpbin
# Use it immediately
$ ./httpbin_cli.py get --output json
{
"url": "https://httpbin.org/get",
"headers": { ... }
}
Why?
AI agents are great at executing CLI commands. They're less great at crafting HTTP requests from memory. This tool bridges the gap:
- OpenAPI spec → any API with a spec becomes usable
- CLI generation → instant
--help, tab completion, validation - No code changes → just point at a spec and go
Installation
One-liner
curl -fsSL https://raw.githubusercontent.com/Olafs-World/openapi2cli/main/install.sh | bash
Quick run (no install)
uvx openapi2cli generate https://petstore3.swagger.io/api/v3/openapi.json --name petstore
Install as CLI tool
uv tool install openapi2cli
openapi2cli generate https://httpbin.org/spec.json --name httpbin
Add to a project
uv add openapi2cli
Install as OpenClaw skill
clawhub install openapi2cli
Or with pip:
pip install openapi2cli
Quick Start
Generate a CLI
# From a URL
openapi2cli generate https://petstore3.swagger.io/api/v3/openapi.json --name petstore
# From a local file
openapi2cli generate ./api-spec.yaml --name myapi --output myapi
Use the Generated CLI
# See available commands
./petstore --help
# List pets
./petstore pet find-by-status --status available
# Add a pet (with auth)
export PETSTORE_API_KEY=your-key
./petstore pet add --name "Fluffy" --status available
# JSON output for scripting
./petstore pet get --pet-id 123 --output json | jq '.name'
Inspect a Spec
# See what's in a spec without generating
openapi2cli inspect https://httpbin.org/spec.json
Features
| Feature | Description |
|---|---|
| 🔍 Auto-discovery | Parses OpenAPI 3.x specs (YAML or JSON) |
| 🏷️ Smart grouping | Commands grouped by API tags |
| 🔐 Auth support | API keys, Bearer tokens, env vars |
| 📊 Output formats | JSON, table, or raw |
| ⚡ Fast generation | Single command, instant CLI |
| 🤖 Agent-friendly | Self-documenting with --help |
Configuration
Authentication
Generated CLIs support multiple auth methods:
# Via environment variable (recommended)
export PETSTORE_API_KEY=your-key
./petstore pet list
# Via CLI option
./petstore --api-key your-key pet list
# Bearer token
export PETSTORE_TOKEN=your-bearer-token
./petstore pet list
The env var prefix is derived from the CLI name (uppercase, underscores).
Base URL Override
# Use a different API server
./petstore --base-url https://staging.petstore.io/api pet list
Output Formats
# JSON (default, good for piping)
./petstore pet list --output json
# Table (human-readable, requires rich)
./petstore pet list --output table
# Raw (API response as-is)
./petstore pet list --output raw
Generated CLI Structure
For a spec with tags pet, store, user:
petstore
├── pet
│ ├── add # POST /pet
│ ├── get # GET /pet/{petId}
│ ├── update # PUT /pet
│ ├── delete # DELETE /pet/{petId}
│ └── find-by-status
├── store
│ ├── order
│ └── inventory
└── user
├── create
├── login
└── logout
API Reference
openapi2cli generate
openapi2cli generate SPEC --name NAME [--output PATH] [--stdout]
Arguments:
SPEC OpenAPI spec (file path or URL)
Options:
-n, --name CLI name (required)
-o, --output Output file path (default: {name}_cli.py)
--stdout Print to stdout instead of file
openapi2cli inspect
openapi2cli inspect SPEC
Arguments:
SPEC OpenAPI spec (file path or URL)
Python API
from openapi2cli import OpenAPIParser, CLIGenerator
# Parse a spec
parser = OpenAPIParser()
spec = parser.parse("https://api.example.com/openapi.json")
print(f"API: {spec.title}")
print(f"Endpoints: {len(spec.endpoints)}")
# Generate CLI
generator = CLIGenerator()
cli = generator.generate(spec, name="example")
# Save to file
cli.save("example_cli.py")
# Or get the code
code = cli.to_python()
Development
# Clone
git clone https://github.com/Olafs-World/openapi2cli.git
cd openapi2cli
# Install dev dependencies
uv sync --extra dev
# Run tests
uv run pytest tests/ -v
# Run only unit tests (no API calls)
uv run pytest tests/ -v -m "not integration"
How It Works
- Parse - Load OpenAPI 3.x spec (YAML/JSON, local/URL)
- Extract - Pull endpoints, parameters, auth schemes, request bodies
- Generate - Create Click-based CLI with proper groups and options
- Output - Save as standalone Python script (executable)
The generated CLI uses requests for HTTP and optionally rich for pretty output.
Limitations
- OpenAPI 3.x only (not Swagger 2.0)
- No file upload support yet
- Complex nested request bodies may need
--dataJSON flag - OAuth2 flows not fully implemented (use
--tokenwith pre-obtained tokens)
Links
License
MIT © Olaf
Built by an AI who got tired of writing curl commands 🤖
Metadata
Release files for openapi2cli 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openapi2cli-0.1.1.tar.gz | 789.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openapi2cli-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 804.4 kB
Release files / openapi2cli-0.1.1.tar.gz
| Download URL | openapi2cli-0.1.1.tar.gz |
|---|---|
| Size | 789.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d89c381c9cec0b07a83bb7b347d45a49284c93216f775d5159597dbdb7948041
|
|
BLAKE2b-256 checksum How to use checksums |
4873b906c735b01c7fb11baeb52bf42e455482832f4e1c4a3a4f22f9a048e1db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / openapi2cli-0.1.1-py3-none-any.whl
| Download URL | openapi2cli-0.1.1-py3-none-any.whl |
|---|---|
| Size | 15.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
86d01bebdb749d1218dc17cb3a9133e2d8dd500af948fc080d29541e1c7c7a3d
|
|
BLAKE2b-256 checksum How to use checksums |
d49ff0e95195365b2c89b65572ddddd15c3fb3a503cde0dc3f9949cb62f89dc0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|