The Father Of All CLIs
Many services. Many agents. One door.
One CLI for all your SaaS providers, built for the coding agents on your machine rather than for you. Install it once, log in once, and every harness uses every provider without any setup of its own.
Three harnesses and six adapters is eighteen integrations to configure and keep authenticated. foac collapses them into one binary that already knows the APIs.
$ mise use -g github:alephic-ai/foacfoac update keeps it current after that
Why harnesses like it
foac <provider> <resource> <verb>
An MCP server pushes its whole tool catalog into the context before the first call. foac has one consistent hierarchy that every provider follows, so an agent discovers commands progressively and only reads what the task needs.
$ foac linear issue list --team ENG
$ foac slack conversation list
$ foac github pr list --state open
Auth once, share everywhere
foac auth <provider> login validates and stores your token once. Every harness and script on the machine reuses the same auth — a new harness needs no configuration at all.
Offline discovery
Every command tree is compiled into the binary. An agent learns an API through --help without a network round-trip, a doc lookup, or the tokens to pay for either.
A grammar agents can guess
One hierarchy — foac <provider> <resource> <verb> — for every provider. Knowing foac linear user list exists is knowing foac slack user list exists.
Many tenants, side by side
Two Slack workspaces or Atlassian sites live side by side as named instances, addressable from any folder. Auth is never affected by per-project toggles.
Eight providers, one grammar
The CLI shrinks and grows with what you enable.
Disabled or unauthenticated providers disappear from --help and from the installed agent skills, so they never take up context. Toggle them globally or per project without touching auth.
.foac.toml / per project
enabled_providers = ["linear"]
disabled_providers = ["slack@workb"]
[defaults]
slack = "workb"Linear
Issues, projects, teams, cycles, documents, initiatives
GitHub
Repos, issues, pull requests, reviews, Actions, releases
Jira
Issues, comments, projects, sprints, transitions
Confluence
Spaces, pages, footer comments, CQL search
Neon
Organizations, projects, branches, connection URIs
Sentry
Organizations, projects, issues, error events
Slack
Conversations, messages, threads, users, search
Vercel
Teams, projects, deployments, domains
Composable, like a Unix tool
Pipe one provider into another. foac does the join.
Compact JSON on stdout, errors as JSON on stderr, exit code 1 — and --from names the field to match on, so one provider's list feeds another's get with no jq or xargs glue. Responses are the provider's raw JSON, so the upstream API docs describe foac's output too.
$ foac linear user list | foac slack user get --from email
id | name | ok | real_name | tz
-------------+-------+------+--------------+------------------
U0200000001 | ada | true | Ada Lovelace | Europe/London
U0200000002 | grace | true | Grace Hopper | America/New_YorkSelf-installing skills, self-updating binary
Teach every agent at once.
foac skill install writes one skill per active provider for Claude Code and every agent reading ~/.agents/skills/, and removes the skills of inactive providers. foac update pulls the latest release and refreshes them.
mise use -g github:alephic-ai/foac