oto — CLI toolkit for AI agents
Your LLM already uses gh for GitHub, aws for AWS, gcloud for GCP.
oto covers the long tail — the SaaS products that don't have a CLI.
The CLI is self-documenting via --help, so your AI agent discovers every connector on its own. For Claude Code, the oto plugin (otomata-tech/oto-plugin) bundles a universal skill + the Oto MCP connector.
Why CLI over MCP?
| CLI | MCP | |
|---|---|---|
| Token cost | ~80 tokens (prompt + --help) |
4-32x more (full schema in context) |
| Reliability | 100% | ~72% (source) |
| Setup | pipx install oto-cli |
Server + transport + config |
| Composability | Pipes: oto sirene search "fintech" | jq '.[]' |
None |
| Works with | Every LLM, every framework | MCP-compatible clients only |
Installation
# Standalone CLI
pipx install oto-cli
# With specific connectors
pipx install "oto-cli[google,browser]"
# All connectors
pipx install "oto-cli[all]"
# Development
git clone https://github.com/otomata-tech/oto-cli.git
cd oto-cli && pip install -e ".[all]"
Connectors
| Command | What it does | Extra |
|---|---|---|
oto google |
Gmail, Drive, Docs, Sheets, Slides, Calendar | google |
oto browser |
LinkedIn, Crunchbase, Pappers, Indeed, G2, Google | browser |
oto notion |
Search, pages, databases | — |
oto sirene |
French company data (INSEE SIRENE) | — |
oto search |
Web & news search (dispatches to Serper or browser) | — |
oto serper |
Direct Serper API (web, news, scrape, suggestions) | — |
oto enrichment |
Contact enrichment (Kaspr, Hunter, Lemlist) | — |
oto pennylane |
Accounting (Pennylane API) | — |
oto anthropic |
API usage & cost tracking | anthropic |
oto whatsapp |
Send & read WhatsApp messages | — |
oto folk |
Folk CRM (contacts, companies, deals) | — |
oto zoho |
Zoho CRM (records, contacts, deals, notes) | — |
oto zohodesk |
Zoho Desk (tickets, threads, contacts, departments) | — |
oto company |
French company lookup (multi-source) | — |
oto audio |
Audio recording, transcription, summaries | — |
oto gemini |
Image generation via Gemini 3 Pro (text-to-image, editing) | — |
oto openai |
Image generation via gpt-image-2 (text-to-image, editing) | — |
oto config |
Configuration & secrets management | — |
Connectors without an "Extra" only need requests (included in base install).
Quick start
# Configure secrets (file-based, default)
mkdir -p ~/.otomata
cat > ~/.otomata/secrets.env << 'EOF'
SERPER_API_KEY=xxx
NOTION_API_KEY=secret_xxx
SIRENE_API_KEY=xxx
EOF
# Or use Scaleway Secret Manager
oto config provider secrets scaleway
# Check config & secrets status
oto config
# Search the web (backend depends on config: serper or browser)
oto search web -q "AI agents 2026"
# Google OAuth setup (per account)
oto google auth myaccount
oto google gmail-search "from:bob" -a myaccount
# Browse LinkedIn
oto browser linkedin profile https://linkedin.com/in/someone
# French company data — INSEE SIRENE
oto sirene search "fintech"
# Enriched data via data.gouv recherche-entreprises (with --idcc filter by convention collective)
oto sirene entreprises --idcc 1285,3090 --naf 90.01Z --dept 75
For AI agents
The CLI is self-documenting — agents discover everything via --help:
oto --help # list namespaces
oto <namespace> --help # commands in a namespace
oto <namespace> <cmd> --help # arguments
For Claude Code, the oto plugin (otomata-tech/oto-plugin) bundles a single universal skill (entry-point doctrine) plus the Oto MCP connector — install it once instead of per-tool manuals.
Create your own connector
A connector is 2 files:
oto/commands/myservice.py # CLI commands (Typer app)
oto/tools/myservice/ # API client
See docs/create-connector.md for the full guide.
How it works
Auto-discovery — cli.py scans commands/ at startup. Any Python file exporting a Typer app becomes a sub-command. No registry, no config. Drop a file, it appears in oto --help.
Three types of connectors (same CLI contract: JSON stdout, lazy imports, get_secret()):
- API — call REST APIs via
requests. Each client handles auth/pagination/rate-limiting as the API requires. (notion, sirene, search, pennylane, folk...) - Browser — automate a real browser for sites without an API. Async, require
oto-cli[browser]. (linkedin, crunchbase, pappers, indeed, g2) - SDK — use an official client library. Currently Google Workspace via
google-api-python-client+ OAuth2. Requireoto-cli[google].
Secrets — provider-based resolution, configured via oto config provider secrets <file|scaleway>:
- Environment variables (always, highest priority)
- Configured provider: file (
.otomata/secrets.envproject → user) or Scaleway Secret Manager - Default value
Output contract — every command prints JSON to stdout, errors to stderr. Composable with jq, pipes, scripts.
Lazy imports — tool clients are imported inside functions, so the CLI starts fast regardless of how many connectors are installed.
See docs/concepts.md for the full architecture guide.
License
MIT
Metadata
Release files for oto-cli 1.7.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 | Provenance | Actions |
|---|---|---|---|---|
| oto_cli-1.7.1.tar.gz | 45.2 kB | Without provenance | Details for oto_cli-1.7.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| oto_cli-1.7.1-py3-none-any.whl | Python 3 | none | any | Details for oto_cli-1.7.1-py3-none-any.whl |
Total release size: 97.2 kB
Release files / oto_cli-1.7.1.tar.gz
| Download URL | oto_cli-1.7.1.tar.gz |
|---|---|
| Size | 45.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8fa7a39596c0452c8c7e80f1739b749c13203f1345aa3b0f18a3b64b7171238f
|
|
BLAKE2b-256 checksum How to use checksums |
622ba63cd35b5790dc7548c55f168bb727a9f9cab349abf9a50b31297d37409f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / oto_cli-1.7.1-py3-none-any.whl
| Download URL | oto_cli-1.7.1-py3-none-any.whl |
|---|---|
| Size | 51.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fc82fd5680121ba6c8ab990cc20fad5d65d9360930a44bf073f552857f0c79b6
|
|
BLAKE2b-256 checksum How to use checksums |
fc18a121c32d28a8e9bd1ca8f4ff8663229c5e43bcdd4745ad87e690107e173b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Security for oto-cli 1.7.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.