Metadata-Version: 2.4
Name: oto-cli
Version: 1.5.0
Summary: CLI toolkit for AI agents — covers the long tail of SaaS APIs that don't have a CLI
Project-URL: Repository, https://github.com/otomata-tech/oto-cli
Author: Alexis Laporte
License-Expression: MIT
License-File: LICENSE
Keywords: ai-agents,api,automation,cli,llm
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.10
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: requests>=2.28.0
Requires-Dist: typer>=0.9.0
Provides-Extra: all
Requires-Dist: anthropic>=0.40.0; extra == 'all'
Requires-Dist: gkeepapi>=0.16.0; extra == 'all'
Requires-Dist: google-api-python-client>=2.0.0; extra == 'all'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'all'
Requires-Dist: google-auth>=2.0.0; extra == 'all'
Requires-Dist: markdown>=3.5; extra == 'all'
Requires-Dist: o-browser; extra == 'all'
Requires-Dist: o-browser-vivatech; extra == 'all'
Requires-Dist: pandas>=1.5.0; extra == 'all'
Requires-Dist: pyarrow>=10.0.0; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.40.0; extra == 'anthropic'
Provides-Extra: browser
Requires-Dist: o-browser; extra == 'browser'
Provides-Extra: google
Requires-Dist: gkeepapi>=0.16.0; extra == 'google'
Requires-Dist: google-api-python-client>=2.0.0; extra == 'google'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'google'
Requires-Dist: google-auth>=2.0.0; extra == 'google'
Requires-Dist: markdown>=3.5; extra == 'google'
Provides-Extra: stock
Requires-Dist: pandas>=1.5.0; extra == 'stock'
Requires-Dist: pyarrow>=10.0.0; extra == 'stock'
Provides-Extra: vivatech
Requires-Dist: o-browser-vivatech; extra == 'vivatech'
Description-Content-Type: text/markdown

# 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](https://github.com/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](https://scalekit.com)) |
| 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

```bash
# 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 attio` | Attio CRM (contacts, companies, deals, tasks) | — |
| `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

```bash
# 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`:

```bash
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](https://github.com/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](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. Require `oto-cli[google]`.

**Secrets** — provider-based resolution, configured via `oto config provider secrets <file|scaleway>`:
1. Environment variables (always, highest priority)
2. Configured provider: **file** (`.otomata/secrets.env` project → user) or **Scaleway** Secret Manager
3. 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](docs/concepts.md) for the full architecture guide.

## License

MIT
