Anthropic が公式 CLI「ant」を出してたので調べた(curl で殴るより全然よかった)
はじめに
Claude API をシェルスクリプトから使いたいとき、自分はずっと curl で JSON を手書きしていました。
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-4-6","max_tokens":1024,"messages":[{"role":"user","content":"こんにちは"}]}'
毎回これを書くのが面倒で、claude -p というコマンドを使い始めました。Claude Code に付属しているやつで、echo "質問" | claude -p みたいに使えてわりと便利です。ただ、これは Claude Code の一部なので「Claude API だけ使いたい、Claude Code は要らない」という状況にはあまり向きません。
で、最近 Anthropic が公式 CLI を出していたことに気づきました。名前は ant。2026年4月9日に v1.1.0 がリリースされたばかりです。
ant とは
ant は Anthropic が公式で開発している Claude API 用のコマンドラインクライアントです。anthropics/anthropic-cli として MIT ライセンスで公開されており、Go で書かれています。
Claude API に対してリソースベースのコマンドを発行できる、というのが基本コンセプト。aws s3 ls とか gh pr list みたいな感じで、ant messages create のように使います。
なぜ今これが出てきたか
Claude Code が普及するにつれて、「エージェントとして使うのではなく、純粋に API クライアントとして呼び出したい」というニーズが増えてきた背景があると思います。フックスクリプトや自動化パイプラインで Claude を使いたいとき、Claude Code ごとインストールするのは少し重い。ant はそこを埋める立ち位置です。
あと個人的には、.claude/hooks/ 内で claude -p を呼び出しているスクリプトが何個かあって、「もっとシンプルに書けないか」と思っていたので、タイミングが良かった。
インストール
# Homebrew(推奨)
brew install anthropics/tap/ant
# Go がある場合
go install 'github.com/anthropics/anthropic-cli/cmd/ant@latest'
Homebrew が一番楽です。Go のほうはインストール後に $GOPATH/bin にパスが通っているか確認が必要なので少し手間。
基本的な使い方
メッセージを送る
export ANTHROPIC_API_KEY="sk-ant-..."
ant messages create \
--max-tokens 1024 \
--message '{"role":"user","content":[{"type":"text","text":"こんにちは"}]}' \
--model claude-sonnet-4-6
ANTHROPIC_API_KEY を環境変数に入れておけば --api-key は省略できます。
出力フォーマットを変える
デフォルトは auto(整形済み表示)ですが、スクリプトで使うなら raw か json が扱いやすいです。
# テキストだけ取り出す
ant messages create \
--message '{"role":"user","content":[{"type":"text","text":"一言で答えてください:空の色は?"}]}' \
--model claude-sonnet-4-6 \
--format raw
# → 青です。
json にするとレスポンス全体が JSON で返ってくるので jq で加工できます。
ant messages create \
--message '...' \
--model claude-sonnet-4-6 \
--format json | jq '.content[0].text'
ファイルを渡す
これが地味に便利で、@ プレフィックスでファイルをそのまま引数に渡せます。
# ソースコードをレビューしてもらう
ant messages create \
--message "{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"このコードをレビューして\n\`\`\`python\n$(cat script.py)\n\`\`\`\"}]}" \
--model claude-sonnet-4-6
↑ これだと $(cat ...) が必要だけど、@ 記法を使えばもっとスッキリ書けます。JSON/YAML の中で "@script.py" と書くとファイルの内容に自動展開されます。
ant messages create \
--message '{"role":"user","content":[{"type":"text","text":"@script.py の内容をレビューして"}]}' \
--model claude-sonnet-4-6
画像も渡せます。@image.jpg とすると base64 に自動変換してくれるので、マルチモーダルな呼び出しも手間いらず。
GJSON で出力を絞る
--transform オプションで GJSON クエリを使った出力変換もできます。
ant messages create \
--message '...' \
--model claude-sonnet-4-6 \
--format json \
--transform 'content.0.text'
# → レスポンスのテキスト部分だけ取り出せる
jq より記法が独特ですが、jq を使い慣れているなら --format json | jq ... のほうが直感的かもしれません。
claude -p と何が違うか
自分が claude -p を使っていた場面と比較するとこんな感じ。
| やりたいこと | claude -p |
ant |
|---|---|---|
| テキストを一問一答で投げる | ◎ シンプル | △ JSON 構造が必要 |
| ファイルを渡す | △ stdin か引数で工夫 | ◎ @file で直接 |
| 出力フォーマット制御 | △ テキストのみ | ◎ json/yaml/raw 等 |
| モデルを変える | ○ --model
|
◎ --model
|
| Claude Code なしで使う | ✗ 依存あり | ◎ 独立インストール |
「echo "質問" | claude -p」のシンプルさは claude -p が勝つ。ファイルを渡したい・JSON で結果を受け取りたい・Claude Code に依存させたくない、という場合は ant のほうが合っています。
実際に使えそうな場面
自分の場合、.claude/hooks/ 内でセッション終了時に要約を書くスクリプトを作りたいと思っていて、そこで ant が使えるか試してみる予定です。claude -p だと Claude Code の内部コンテキストに引きずられる懸念があるけど、ant なら純粋な API 呼び出しなので文脈が混ざらない。
あとはローカル PDF を流し込んでサマリーを取りたいとき。@ 記法でファイルを直接渡せるので、python → API 呼び出し → 結果表示 という一連の流れがシェルスクリプト1本で書けるようになります。
まとめ
ant はまだリリースされたばかりの v1.1.0 なので機能は最小限ですが、「Claude API をシェルから叩く」という用途には十分使えます。curl で JSON を手書きしていた人は試してみる価値があります。
claude -p と競合するわけではなく、「Claude Code との連携」なら claude -p、「純粋な API クライアント」なら ant、という使い分けが自然だと思います。