gtm CLI is the front door to the SDK: ten command groups covering account
research, CRM sync, web search, enrichment, meeting exports, and webhook operations.
Invocation
The package installs agtm entrypoint; both forms are equivalent:
gtm hello (smoke test) and
gtm version (prints gtm v<VERSION>).
Command groups
| Group | Covers |
|---|---|
gtm accounts | GTM workflows: research, enrichment, people discovery, batch CRM loads |
gtm apollo | Apollo people and organization enrichment and search |
gtm attio | Attio CRM: people, companies, notes, enrichment backfills |
gtm enrichment | LinkedIn enrichment via Harvest |
gtm exa | Exa web search, company and people discovery |
gtm gmail | Gmail URL and token decoding |
gtm granola | Local-first Granola meeting exports |
gtm parallel | Parallel web search, content extraction, entity discovery |
gtm sanity | Sanity CMS content downloads |
gtm webhook | Webhook registry: Modal endpoints + Hookdeck wiring |
Shared conventions
Every command follows the CLI contract:- Success data is JSON on stdout; errors and logs go to stderr.
- Mutations preview by default —
--apply(or--modal-syncon Attio people commands) is required to write. - Provider-backed commands execute on your deployed Modal app; local-only
commands (
version,gmail url decode,granola export,sanity blog download,webhook list) need no deployment. - Every command accepts
--jsonwith a full payload that overrides individual flags. - Keys resolve per Secrets and API keys, with per-invocation
--<service>-api-keyoverrides.
The per-group reference pages are generated from the CLI’s own
--help text by
scripts/docs-cli_reference-generate.py, and CI fails if they drift from the code —
what you read here is what the binary ships.