
こんにちは。よっしーです(^^)
背景
この連載では、Claude Codeの公式ドキュメントを1ページずつ読み解いていきます。公式ドキュメントは情報が網羅されている分、「結局どの機能を、どんな場面で使えばいいのか」は自分で考える必要があり、読むのに意外と時間がかかります。そこで、私が実務で使うために読み込んだ内容を「使う場面→実例コード」の順に整理して残していくことにしました。専門家の解説というより、一次情報を読んだ記録です。推測や動作を確認していない部分には、その都度そう書きます。
公式ドキュメント:https://code.claude.com/docs/ja/agent-sdk/claude-code-features
1. 一言でいうと
Agent SDK は Claude Code と同じ土台の上に作られているので、SDK のエージェントも、Claude Code がファイルから読み込む機能(CLAUDE.md とルール、スキル、フック、設定など)をそのまま使えます。どの場所から読み込むかを決めるのが settingSources オプションで、省略すると CLI と同じくユーザー・プロジェクト・ローカルの全部を読み込み、[] を渡すと全部を切れます。ただし、管理ポリシー、~/.claude.json、自動メモリ、claude.ai の MCP コネクタなど、settingSources では止まらないものがあります。このページは、その「何が・どこから・どの条件で読み込まれるか」の地図です。
これまでの回で settingSources は何度も出てきました。第79回では「settingSources: [] でファイルシステムの設定を全部切れる」、第82回では「既定で .claude/settings.json のシェルのフックも動く」、第90回ではスキルの発見場所、第94回では「settingSources: [] にしても自動メモリは読まれる」。今回はそれらを1枚にまとめるページです。
2. どういう場面で役立つか
シーン1:CLI と SDK で同じプロジェクトの決まりを使う
開発者が普段 Claude Code で使っている CLAUDE.md(コーディング規約、ビルドコマンド、設計の決定)を、同じリポジトリで動く SDK の自動化にも効かせたい場合です。settingSources に "project" を入れれば、毎回プロンプトに規約を書かなくても、エージェントがそれに従います。
シーン2:サーバーで動かすエージェントから、余計な設定を締め出す
逆に、サーバー上のエージェントに、そのマシンのホームディレクトリにある個人の設定やスキルが混ざっては困る場合です。settingSources を絞ったうえで、settingSources では止まらない入力を個別に止める必要があります。このページの「settingSources が制御しないもの」の表が、その手順書になります。
シーン3:やりたいことにどの機能を使うか決める
「規約を守らせたい」「必要なときだけ参考資料を読ませたい」「危険なコマンドを確実に止めたい」など、目的ごとに CLAUDE.md・スキル・サブエージェント・フック・MCP のどれを使うかを、原文の表で選べます(3-6)。
不要・向かないケース
- ファイルを使わずにすべてプログラムで渡したい:システムプロンプトは
systemPrompt(第86回)、フックはhooks、サブエージェントはagents、MCP はmcpServersで直接渡せます。ファイルシステムの機能を使う理由は、原文の言葉では「同じコンテキストを対話型の Claude Code と SDK のエージェントで共有したい」場合です。ただしスキルだけは例外で、ファイルとしてしか作れません(3-4)。 settingSources: []だけでテナントを分離したつもりになる:原文が警告で明確に否定しています(3-2)。
3. コードと仕組みの解説
原文の fenced コードブロックは6本で、すべて Python と TypeScript の対訳です(settingSources の指定、スキルの有効化、フックの併用)。どれも内容が違うので全数を引用します。コードは原文から機械的に抜き出したもので、入れ子に由来する先頭インデントを外した以外は変えていません。このページでは原文が Python を先に並べているので、その順で載せます。
原文にはバージョン要件の記載がありません。
3-1. settingSources でファイルシステムの設定を決める
オプション名は Python が setting_sources、TypeScript が settingSources です。読み込むソースを明示的に並べるか、空の配列を渡してユーザー・プロジェクト・ローカルの設定を無効にします。次の例は ["user", "project"] で、ユーザーとプロジェクトの両方を読み込みます。
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage
import asyncio
async def main():
async for message in query(
prompt="Help me refactor the auth module",
options=ClaudeAgentOptions(
# "user" loads from ~/.claude/, "project" loads from ./.claude/ in cwd.
# Together they give the agent access to CLAUDE.md, skills, hooks, and
# permissions from both locations.
setting_sources=["user", "project"],
allowed_tools=["Read", "Edit", "Bash"],
),
):
if isinstance(message, AssistantMessage):
for block in message.content:
if hasattr(block, "text"):
print(block.text)
if isinstance(message, ResultMessage) and message.subtype == "success":
print(f"\nResult: {message.result}")
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Help me refactor the auth module",
options: {
// "user" loads from ~/.claude/, "project" loads from ./.claude/ in cwd.
// Together they give the agent access to CLAUDE.md, skills, hooks, and
// permissions from both locations.
settingSources: ["user", "project"],
allowedTools: ["Read", "Edit", "Bash"]
}
})) {
if (message.type === "assistant") {
for (const block of message.message.content) {
if (block.type === "text") console.log(block.text);
}
}
if (message.type === "result" && message.subtype === "success") {
console.log(`\nResult: ${message.result}`);
}
}
コメントにあるとおり、"user" は ~/.claude/ から、"project" は cwd の ./.claude/ から読み込み、合わせて両方の場所の CLAUDE.md・スキル・フック・権限をエージェントに与えます。実行すると、アシスタントの応答が標準出力に出て、終わると最後に結果の行が出ます。
テキストの取り出し方は言語で違います。Python は hasattr(block, "text") で「text を持つブロック」を選び、TypeScript は block.type === "text" で型を見ています。TypeScript は message.message.content の二重構造です(第77回)。
3つのソースと読み込む場所
<cwd> は cwd オプションで渡した作業ディレクトリで、設定していなければプロセスの現在のディレクトリです。
| ソース | 読み込むもの | 場所 |
|---|---|---|
"project" | プロジェクトの settings.json とフック/プロジェクトの CLAUDE.md と .claude/rules/*.md/プロジェクトのスキル・コマンド・サブエージェント | settings.json とフックは <cwd>/.claude/ のみ。CLAUDE.md とルールは <cwd> とすべての親ディレクトリ。スキル・コマンド・サブエージェントは <cwd> からリポジトリのルートまでのすべての親ディレクトリと、additionalDirectories(Python は add_dirs)で渡した各ディレクトリの .claude/skills/・.claude/commands/・.claude/agents/(SDK はこれを Claude Code に --add-dir として渡す) |
"user" | ユーザーの settings.json/ユーザーの CLAUDE.md と ~/.claude/rules/*.md/ユーザーのスキル・コマンド・サブエージェント | ~/.claude/(settings.json・CLAUDE.md・ルール)、~/.claude/skills/・~/.claude/commands/・~/.claude/agents/ |
"local" | CLAUDE.local.md、.claude/settings.local.json | settings.local.json は <cwd>/.claude/、CLAUDE.local.md は <cwd> とすべての親ディレクトリ |
settingSources を省略するのは ["user", "project", "local"] と同じです。
ここで見落としやすいのが、探す範囲が項目ごとに違うことです。
| 項目 | 親ディレクトリをさかのぼるか |
|---|---|
プロジェクトの settings.json とフック | さかのぼらない(<cwd>/.claude/ のみ) |
CLAUDE.md と .claude/rules/*.md、CLAUDE.local.md | すべての親ディレクトリまで |
| スキル・コマンド・サブエージェント | リポジトリのルートまで |
表は筆者の整理です。原文は「プロジェクトの settings.json とフックは <cwd>/.claude/ からのみ読み込まれ、親ディレクトリへのフォールバックはない」と明記しています。つまり、モノレポの下のパッケージを cwd にすると、ルートの CLAUDE.md やスキルは読まれるのに、ルートの .claude/settings.json にある権限ルールやフックは読まれない、ということが起こります(筆者の指摘)。ルートのフックで危険なコマンドを止めているつもりでも、cwd の位置によっては効いていない可能性があるので、cwd をどこにするかは設定の効き方を左右します。
3-2. settingSources が制御しないもの
settingSources が受け持つのは、ユーザー・プロジェクト・ローカルの3つだけです。その値に関係なく読み込まれる入力が5つあります。
| 入力 | 動き | 無効にするには |
|---|---|---|
| 管理ポリシーの設定 | エンドポイント管理のポリシー(MDM の plist、レジストリのポリシー、管理設定ファイルなど)はホストから読み込まれる。サーバー管理設定は、組織の OAuth ログイン、直接設定した API キー、user_oauth の Anthropic プロファイルなどの対象となる認証情報で認証したとき、対象の構成で取得される | エンドポイントのポリシーは、ホストから管理設定ファイル・plist・レジストリのポリシーを消す。サーバー管理設定は Claude の組織のオーナーが制御し、SDK からは無効にできない |
~/.claude.json のグローバル設定 | 常に読み込まれる | env の CLAUDE_CONFIG_DIR で場所を移す |
~/.claude/projects/<project>/memory/ の自動メモリ | セッション開始時にシステムプロンプトに読み込まれる。エージェントは専用のメモリツールではなく、標準の Write と Edit で新しいメモリを書くので、保存させるにはこれらのツールを有効にする必要がある | 設定で autoMemoryEnabled: false、または env で CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 |
| claude.ai の MCP コネクタ | claude.ai ログインで認証したときに読み込まれる。CLAUDE_CODE_OAUTH_TOKEN が claude setup-token のトークン(モデルへのリクエストしかできない)なら読み込まれない。mcpServers: {} を渡してもコネクタは抑えられない | strictMcpConfig: true、設定で disableClaudeAiConnectors: true、または env で ENABLE_CLAUDEAI_MCP_SERVERS=false |
sandbox.credentials の deny と、~/.claude/settings.json のファイルの mask | コマンドのサンドボックスが動くとき、deny を適用し、settingSources がユーザー設定を除外していても credentials.files の mask を制限として保持する。サンドボックス内のコマンドが触れるものを制限するためだけに使う | ~/.claude/settings.json から項目を消す |
5行目は他と性質が違います。他の4つは「意図せず読み込まれて困る」側ですが、5つ目は守りの設定が、settingSources で外しても残るという安全側の例外です。ユーザー設定を切っても、認証情報を隠すサンドボックスの設定まで一緒に消えないようにしている、と読めます(筆者の解釈)。
4行目の「mcpServers: {} では止まらない」も要注意です。「MCP サーバーを空にしたから外部につながらない」と考えると、claude.ai でログインした環境では、そのアカウントのコネクタがエージェントに見えることになります(筆者の指摘)。
原文の警告:マルチテナント分離に既定値を当てにしない
原文はこの表の後に警告を置いています。
- マルチテナントの分離のために、既定の
query()のオプションを当てにしない。 上の入力はsettingSourcesに関係なく読み込まれるので、SDK のプロセスはホスト単位の設定とディレクトリごとのメモリを拾える。 - マルチテナントでは、各テナントを自分のファイルシステムで動かし、
settingSources: []と、envでCLAUDE_CODE_DISABLE_AUTO_MEMORY=1を設定する。 - サーバー管理設定は、プロセスが組織の認証情報で認証したときに取得される。ファイルシステムを分けても消えない。
第79回で筆者は「settingSources: [] でファイルシステムの設定を全部切れる(第75回のベアモード相当)」とまとめましたが、このページから見ると、それは「ユーザー・プロジェクト・ローカルの3つを切れる」という意味に限られます。第94回のマルチテナント分離の手順(settingSources: []・自動メモリの停止・テナントごとの CLAUDE_CONFIG_DIR・cwd)は、この表の1〜3行目をふさぐものだったと整理できます(筆者の対応づけ)。claude.ai のコネクタを止める手段は、第94回の手順には入っていませんでした。
3-3. プロジェクトの指示(CLAUDE.md とルール)
CLAUDE.md と .claude/rules/*.md は、プロジェクトについての持続する文脈(コーディング規約、ビルドコマンド、設計の決定、指示)をエージェントに与えます。settingSources に "project" が入っていれば、SDK はセッション開始時にこれらをコンテキストに読み込み、エージェントは毎回プロンプトで繰り返さなくても規約に従います。
| レベル | 場所 | 読み込まれる条件 |
|---|---|---|
| プロジェクト(ルート) | <cwd>/CLAUDE.md または <cwd>/.claude/CLAUDE.md | "project" を含む |
| プロジェクトのルール | <cwd>/.claude/rules/*.md と、cwd より上のすべての親ディレクトリの .claude/rules/*.md | "project" を含む |
| プロジェクト(親ディレクトリ) | cwd より上のディレクトリの CLAUDE.md | "project" を含み、セッション開始時に読み込む |
| プロジェクト(子ディレクトリ) | cwd のサブディレクトリの CLAUDE.md | "project" を含み、必要になったときに読み込む |
| ローカル | <cwd>/CLAUDE.local.md と、cwd より上のすべての親ディレクトリの CLAUDE.local.md | "local" を含む |
| ユーザー | ~/.claude/CLAUDE.md | "user" を含む |
| ユーザーのルール | ~/.claude/rules/*.md | "user" を含む |
すべてのレベルは足し合わされます。 プロジェクトとユーザーの両方に CLAUDE.md があれば、エージェントは両方を見ます。レベル間に厳密な優先順位はなく、指示がぶつかったときの結果は Claude がどう解釈するか次第です。原文の勧めは、ぶつからないように書くか、より具体的なファイルの側で優先順位をはっきり書くこと(例:「このプロジェクトの指示は、ぶつかるユーザーレベルの既定より優先する」)です。第72回で見た「CLAUDE.md は加算、スキル・サブエージェント・MCP は上書き、フックはマージ」の、加算の側の具体的な姿です。
原文のヒントとして、CLAUDE.md を使わずに systemPrompt で文脈を直接入れることもできます(第86回)。CLAUDE.md を使うのは、同じ文脈を対話型の Claude Code と SDK のエージェントで共有したい場合です。
3-4. スキル
スキルは、専門知識や呼び出せるワークフローをエージェントに与える Markdown ファイルです。毎回のセッションで読み込まれる CLAUDE.md と違い、スキルは必要なときに読み込まれます。エージェントは起動時にスキルの説明だけを受け取り、関係するときに中身を読みます。
スキルは settingSources を通じてファイルシステムから見つけられます。query() の skills オプションを省略すると、見つかったユーザーとプロジェクトのスキルが有効になり、Skill ツールが使えるようになります(CLI と同じ)。有効にするスキルを絞るには、skills に "all"、スキル名のリスト、または全部を無効にする [] を渡します。skills を設定すると、SDK は Skill ツールを allowedTools に自動で足します。明示的な tools リストも渡すなら、そこに "Skill" を入れる必要があります。
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
import asyncio
# Skills in .claude/skills/ are discovered automatically
# when settingSources includes "project"
async def main():
async for message in query(
prompt="Review this PR using our code review checklist",
options=ClaudeAgentOptions(
setting_sources=["user", "project"],
skills="all",
allowed_tools=["Read", "Grep", "Glob"],
),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
// Skills in .claude/skills/ are discovered automatically
// when settingSources includes "project"
for await (const message of query({
prompt: "Review this PR using our code review checklist",
options: {
settingSources: ["user", "project"],
skills: "all",
allowedTools: ["Read", "Grep", "Glob"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
この例はコードレビューのチェックリストのスキルを想定し、allowedTools を Read・Grep・Glob という読み取り系に絞っています。skills="all"(TypeScript は skills: "all")なので、Skill ツールは SDK が自動で足します。
原文の注記は、第90回と同じく、スキルは .claude/skills/<name>/SKILL.md というファイルとして作る必要があり、SDK にはスキルをプログラムから登録する API が無いことです。
3-5. フック
SDK はフックを2つの方法で定義でき、両方が並行して動きます。
- ファイルシステムのフック:
settings.jsonに定義したシェルコマンドなど。settingSourcesに該当するソースが入っていれば読み込まれる。対話型の Claude Code 用に設定するのと同じフック。 - プログラムのフック:
query()に直接渡すコールバック関数。アプリケーションのプロセスで動き、構造化された判断を返せる(第82回)。
コールバックはツールの入力を受け取り、判断の辞書を返します。実行を止めるには、permissionDecision: "deny" と permissionDecisionReason を持つ hookSpecificOutput を返します。理由はツールの結果として Claude に送られます。
from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, ResultMessage
import asyncio
# PreToolUse hook callback. Positional args:
# input_data: HookInput dict with tool_name, tool_input, hook_event_name
# tool_use_id: str | None, the ID of the tool call being intercepted
# context: HookContext, reserved for future abort-signal support
async def audit_bash(input_data, tool_use_id, context):
command = input_data.get("tool_input", {}).get("command", "")
if "rm -rf" in command:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked",
}
}
return {} # Empty dict: allow the tool to proceed
# Filesystem hooks from .claude/settings.json run automatically
# when settingSources loads them. You can also add programmatic hooks:
async def main():
async for message in query(
prompt="Refactor the auth module",
options=ClaudeAgentOptions(
setting_sources=["project"], # Loads hooks from .claude/settings.json
hooks={
"PreToolUse": [
HookMatcher(matcher="Bash", hooks=[audit_bash]),
]
},
),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
asyncio.run(main())
import { query, type HookInput, type HookJSONOutput } from "@anthropic-ai/claude-agent-sdk";
// PreToolUse hook callback. HookInput is a discriminated union on
// hook_event_name, so narrowing on it gives TypeScript the right
// tool_input shape for this event.
const auditBash = async (input: HookInput): Promise<HookJSONOutput> => {
if (input.hook_event_name !== "PreToolUse") return {};
const toolInput = input.tool_input as { command?: string };
if (toolInput.command?.includes("rm -rf")) {
return {
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Destructive command blocked",
},
};
}
return {}; // Empty object: allow the tool to proceed
};
// Filesystem hooks from .claude/settings.json run automatically
// when settingSources loads them. You can also add programmatic hooks:
for await (const message of query({
prompt: "Refactor the auth module",
options: {
settingSources: ["project"], // Loads hooks from .claude/settings.json
hooks: {
PreToolUse: [{ matcher: "Bash", hooks: [auditBash] }]
}
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
言語差を整理します。
| Python | TypeScript | |
|---|---|---|
| コールバックの引数 | 位置引数3つ(input_data・tool_use_id・context)。context は将来の中断シグナル用の予約 | HookInput 1つ。hook_event_name で分岐すると、そのイベントの tool_input の形に絞り込める |
| 登録 | HookMatcher(matcher="Bash", hooks=[audit_bash]) | { matcher: "Bash", hooks: [auditBash] } |
| コマンドの取り出し | input_data.get("tool_input", {}).get("command", "") | input.tool_input as { command?: string } の後、toolInput.command?.includes("rm -rf") |
表は筆者の整理です。どちらの例も settingSources を ["project"] にしているので、.claude/settings.json のフック(シェルコマンドなど)と、このコールバックの両方が動きます。
筆者の指摘:原文はこの節で「{} を返すのはツールの実行を許可するという意味」と書いていますが、第82回のフックのページの説明に沿うと、{} は「このフックは口を出さない」という意味で、呼び出しはそのまま通常の権限評価(第80回の評価順序)に進みます。{} を返しても、権限ルールの拒否や確認は飛ばせません。ここでの「許可」は「このフックとしては止めない」と読むのが安全です。
また、例の "rm -rf" in command(TypeScript は includes("rm -rf"))は、文字列の部分一致です。rm -r -f や rm -fr と書き換えれば一致しなくなるので、これは例示であって守りとしては弱い、と言えます(筆者の指摘)。第81回では逆に、部分一致が関係のない文字列にも当たってしまう例を見ました。どちらの向きにも外れうるのが文字列の部分一致です。第95回の言葉を借りれば、確実に止めたいならサンドボックスなどの分離と組み合わせる必要があります。
どちらのフックを使うか
| 種類 | 向いている用途 |
|---|---|
ファイルシステム(settings.json) | CLI と SDK のセッションでフックを共有する。"command"(シェルスクリプト)、"http"(エンドポイントへの POST)、"mcp_tool"(接続済みの MCP サーバーのツールを呼ぶ)、"prompt"(LLM がプロンプトを評価する)、"agent"(検証用のエージェントを起動する)に対応。メインのエージェントと、それが起動するサブエージェントで動く |
プログラム(query() のコールバック) | アプリケーション固有のロジック、構造化された判断、プロセス内の統合。サブエージェントの中でも動く。フックの入力(コールバックの第1引数)に、どのエージェントが動かしたかを示す agent_id と agent_type が入る |
原文の注記として、TypeScript SDK は Python より多くのフックイベントに対応していて、SessionStart・SessionEnd・TeammateIdle・TaskCompleted が含まれます。第82回で見た「33イベント中 Python は10」の具体例です。
3-6. 目的に合った機能を選ぶ
どれを使うか迷ったときの、原文の対応表です。
| やりたいこと | 使うもの | SDK での指定 |
|---|---|---|
| エージェントが常に従うプロジェクトの規約を決める | CLAUDE.md | settingSources: ["project"] で自動で読み込む |
| 関係するときに読む参考資料を渡す | スキル | settingSources + skills オプション |
| 再利用できるワークフロー(デプロイ、レビュー、リリース)を実行する | ユーザーが呼び出せるスキル | settingSources + skills オプション |
| 切り離したサブタスク(調査、レビュー)を新しいコンテキストに任せる | サブエージェント | agents パラメータ + allowedTools: ["Agent"] |
| 共有のタスクリストとエージェント間の直接のメッセージで、複数の Claude Code を調整する | エージェントチーム | SDK のオプションでは直接設定しない。CLI の機能で、1つのセッションがチームリードとして独立したチームメイトの作業を調整する |
| ツールの呼び出しで決定的なロジックを動かす(監査、ブロック、変換) | フック | hooks パラメータとコールバック、または settingSources で読み込んだシェルスクリプト |
| 外部サービスへの構造化されたツールのアクセスを Claude に与える | MCP | mcpServers パラメータ |
5行目が、この表で唯一「SDK から直接は使えない」と書かれた機能です(第66回のエージェントチーム)。
原文は最後に、有効にした機能はそれぞれエージェントのコンテキストウィンドウに足されると注意しています。機能ごとのコストと重なり方は、本体側の「Claude Code を拡張する」(第72回)にあります。settingSources を省略して全部を読み込むと、使わない CLAUDE.md やスキルの説明までコンテキストを消費する、ということでもあります(筆者の指摘)。
4. まとめ
- SDK は Claude Code と同じ土台なので、
CLAUDE.md・ルール・スキル・フック・設定をファイルから読み込める。どこから読むかはsettingSources(Python はsetting_sources)。 - 省略は
["user", "project", "local"]と同じ(CLI と同じ)。[]で3つとも切れる。 "project"のsettings.jsonとフックは<cwd>/.claude/だけで、親ディレクトリにさかのぼらない。CLAUDE.md とルールは全部の親、スキル・コマンド・サブエージェントはリポジトリのルートまで。cwdの位置で効く設定が変わる。settingSourcesで止まらないもの:管理ポリシー(サーバー管理設定は SDK から無効にできない)、~/.claude.json(CLAUDE_CONFIG_DIR)、自動メモリ(CLAUDE_CODE_DISABLE_AUTO_MEMORY=1)、claude.ai の MCP コネクタ(mcpServers: {}では止まらない。strictMcpConfig: trueなど)、サンドボックスの認証情報のdeny/mask(守り側なので残る)。- マルチテナントは既定値を当てにしない。テナントごとのファイルシステム+
settingSources: []+自動メモリ停止。サーバー管理設定はファイルシステムを分けても消えない。 - CLAUDE.md の各レベルは足し合わされ、厳密な優先順位は無い。優先させたいなら具体的なファイルに書く。共有したくないなら
systemPromptで渡す。 - スキルは必要なときに読み込まれる。
skillsを設定すると Skill ツールが自動でallowedToolsに入る。toolsを明示するなら"Skill"を入れる。登録 API は無い。 - フックはファイルとプログラムの両方が並行して動く。ファイルのフックは5種類(command・http・mcp_tool・prompt・agent)でサブエージェントでも動く。TypeScript は Python より多くのイベントに対応。
- エージェントチームは SDK のオプションでは使えない。機能を足すほどコンテキストを使う。
次回予告
次回は 「ストリーミング出力」(agent-sdk/streaming-output) を取り上げる予定です。
今回の例は、アシスタントのメッセージや最後の結果を、届いた単位でまとめて表示するものでした。第92回のコスト追跡では、includePartialMessages を設定すると、生成の途中経過をストリームのイベントとして受け取れることにも触れています。次回は、エージェントの応答を文字が生成されるそばから受け取って画面に流すには、どのオプションを設定し、どんなイベントを読めばよいのかを見ていきます。

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)


コメント