1.はじめに
OpenClawのような常駐型AIエージェントを自作したいと思い、Claude-Agent-SDKを使って作ってみました。
■ Claude-Agent-SDKとは
Claude-Agent-SDKはAnthropicが提供する公式のエージェント実行フレームワークです。
以下はPython版の例ですが、「プロンプト」と「オプション」を渡すだけで、
プログラム上でClaudeエージェントが定義できます。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Find and fix the bug in auth.py",
options=ClaudeAgentOptions(allowed_tools=["Read", "Edit", "Bash"])
):
print(message) # Claude reads the file, finds the bug, edits it
asyncio.run(main())
■ なぜClaude-Agent-SDKか?
私個人の感想ですが、OpenClawは設定周りに若干癖があり、使い慣れているClaude Codeの設定をそのまま使いたいと感じていました。
一方で、Claude-Agent-SDKは、Claude Codeと同じツールセット(Read/Write/Bash など)を持ったエージェントの構築ができます。
言い換えると、常駐型AIエージェントを自作する上で次の利点があると言えます。
- Claude CodeライクなAIエージェントをプログラム上で定義しプロダクトへ組み込める。
-
使い慣れている
.claude/配下のファイルをそのまま流用可能。
※余談ですが、三大クラウド(AWS/Azure/GCP)との連携も可能なので、エンタープライズ利用もしやすいという利点もあります。

2.作ったものと機能
Claude-Agent-SDK(Python版)を使った常駐型AIエージェントシステムになります。
特徴としては、Claude-Agent-SDKを使用しているので、普段使いなれているClaude Codeの設定(CLAUDE.md/settings.jsonなど)を流用しつつOpenClawのような運用が可能です。
現時点の実装済みの機能になります。
正直、本家OpenClawには遠く及ばない機能数ですが、セッション管理、エージェント実行のCRON化、Discord連携など基本的な部分は抑えています。
| 機能 | コマンド / エンドポイント |
|---|---|
| デーモン管理 | openclaude start/stop/restart/status |
| メッセージ送信(ストリーミング) | openclaude -m "メッセージ" |
| パイプ入力 | git diff | openclaude -m "このdiffをレビューして" |
| セッション管理 | openclaude sessions / cleanup / delete |
| Cronジョブ | openclaude cron add/list/delete/run |
| ログ表示 | openclaude logs [--tail N] |
| 設定管理 | openclaude config set/get/show |
| REST API |
POST /message, POST /message/stream など |
| systemdサービス | systemctl --user start openclaude |
| Discord連携 | config.jsonにtokenを設定するだけで自動接続 |
| Slack連携 | config.jsonにtokenを設定するだけで自動接続 |
■ 構成
■ 機能①:Claude Code関連ファイルの流用を可能に
Claude-Agent-SDKの特徴を活用した機能です。
下記のようにsetting_sources=["user", "project"]とすると、自動的に.claude配下のClaude Code関連ファイルの設定が有効化されます。
つまり、AIエージェントの運用方針や権限設定を、日常的に利用しているClaude Codeに近い方式で運用することが可能となります。
※ユーザ設定とプロジェクト設定を自動有効化する例
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage
async for message in query(
prompt="プロンプト",
options=ClaudeAgentOptions(
setting_sources=["user", "project"],
# 設定の上書きも可能
allowed_tools=["Read", "Edit", "Bash"],
),
):
■ 機能②:デーモン
デーモンはUnixソケットサーバーとしてバックグラウンドに常駐します。
起動している限り24時間いつでもエージェントに指示が可能です。
Unixソケットサーバー/FastAPIサーバー/各種連携機能を同一プロセス内で並行動作させています。

■ 機能③:セッション管理
複数のエージェントセッションを管理できる機能です。
用途別(Discord用/Slack用/調査用)にセッションを分けたり、マルチエージェント実行などが可能です。
会話履歴はClaude Codeと同じで.claude/projects/配下のJSONLファイルに保存されます。

■ 機能④:AIエージェント実行のCRONジョブ化
Pythonのスケジューリングライブラリであるapschedulerをデーモンに組み込み、定期実行を実現しています。
# 毎朝9時に「今日のAI駆動開発に関するニュースを整理して」と送信
openclaude cron add "0 9 * * *" --name "morning" --session main -m "今日のAI駆動開発に関するニュースを整理して"
openclaude cron list
openclaude cron run <job-id> # 手動で即時実行も可能です
■ 機能⑤:REST API
FastAPI + uvicornによるREST APIが動作します。
REST APIサーバとして利用すると、外部ツールやn8nなどのワークフロー自動化ツールからも利用可能です。
# ストリーミングでメッセージ送信(SSE形式)
curl -N -X POST http://localhost:28789/message/stream \
-H "Content-Type: application/json" \
-d '{"session_id": "main", "message": "AIエージェントへの指示"}'
■ 機能⑥: Discord連携
PythonのDiscord連携用ライブラリであるdiscord.pyを使用しています。
本家OpenClawと同じように、DiscordのボットトークンとチャンネルIDを指定することで、
自身のPC、サーバ上で常駐しているAIエージェントに作業依頼することができます。
openclaude config set discord.bot_token "ボットトークン"
openclaude config set discord.channel_id "チャンネルID"
openclaude restart
■ 機能⑦:Slack連携
PythonのSlack連携用ライブラリであるBolt For Pythonを使用しています。
こちらもSlackのボットトークンとアプリトークンを指定することで、
自身のPC、サーバ上で常駐しているAIエージェントに作業依頼することができます。
openclaude config set slack.bot_token Botトークン
openclaude config set slack.app_token アプリトークン
openclaude restart
3.感じたこと
■ Claude-Agent-SDKの使用感
普段使い慣れているClaude Codeの設定ファイル群がそのまま使えるのが強力です。
また、Claude-Agent-SDK側で設定の調節を行う場合は、ClaudeAgentOptionsに設定を追記します。
その際、Claude Codeをよく使う人なら直感的に設定を反映できる点も魅力だと感じました。
https://platform.claude.com/docs/en/agent-sdk/python#claude-agent-options
■ asyncio との相性が良い
エージェント実行の肝となるquery()が非同期ジェネレータとして実装されています。
結果として、Unixソケットサーバー/FastAPI/Discord連携をasyncio.gatherで並行動作させる際に自然に組み合わさる形で実装できました。
実際のコードでは、以下のように3つのコルーチンをasyncio.gatherでまとめています。
coros = [_run_daemon(), api_server.serve()]
if discord_bot is not None:
coros.append(discord_bot.start())
await asyncio.gather(*coros)
デーモン(Unixソケットサーバー)・uvicorn(FastAPI)・Discord Bot のいずれも async def のコルーチンとして提供されています。
結果として、スレッド管理や同期処理を追加することなく、上記だけで3つを同一プロセス内で並行動作させることができました。
■ Claude-Agent-SDKの課題
Claude-Agent-SDKはまだv0.x系のライブラリであり、発展途上な部分が多く残っていると感じています。(2026年3月時点)
GitHubのIssueを見ると、バグ報告・機能リクエストが多数Openのまま積まれており、実用上気になる問題がいくつかあります。
私自身、デフォルトスラッシュコマンド(/clearなど)がエージェントスキルとして認識される不具合に遭遇しました。
少し前にClaude Code側でエージェントスキルがスラッシュコマンドに統合されましたが、その対応がClaude-Agent-SDK側に反映されていないことが原因だと考えます。
このように、一部Claude Code側の開発にClaude-Agent-SDKが追い付いていないような場面が多々ありました。
