Claude Agent SDKに入門してみた

Claude Agent SDKに入門してみた

2026.04.23

大阪オフィスの小倉です。

4月は入園、入学の季節ですね。
私は毎日子供が持ち帰ってくるプリントをスキャナに投入する日々を過ごしています。スキャナは偉大。
最近はプライベートでClaude Codeを契約したのもあり、余ったトークンでClaudeにスキャン後のPDFファイルをリネームさせています。
スキャナにもファイル名を付けてくれる機能はあるのですが、文書タイトルの識別が難しいプリントもあるのです。

そんな中、Claude Agent SDKを使えばリネーム作業を自動化できるのでは?と思い、Agent SDKに入門してみました。

Claude Agent SDK

Claude Agent SDKは、Claude Codeの機能をプログラムから呼び出せるようにしたものです。
現在はPythonとTypeScriptで提供されています。

Agent SDK overview - Claude Code Docs

やってみた

今回やりたい事は以下です

  1. スキャナにプリントを投入 -> MacのフォルダにPDF(リネーム前)が作成される
  2. ファイルが作成されたことを監視しプログラムを呼び出し
  3. プログラムの中でClaude Agent SDKを使ってリネームを指示

ファイル監視にwatchdogを使うため、今回はPythonで実装しました。

ソフトウェア バージョン
Python 3.14
claude-agent-sdk 0.1.64
watchdog 6.0.0

実行環境は MacOS Tahoe(26.3.1) です。

実装コードは以下です。


import asyncio
import os
from pathlib import Path
from claude_agent_sdk import ResultMessage, query, ClaudeAgentOptions
from watchdog.events import FileSystemEventHandler, FileCreatedEvent, DirCreatedEvent
from watchdog.observers.polling import PollingObserver

# 監視対象フォルダ
WATCH_DIR = Path(__file__).resolve().parent / "Scans"

async def rename_by_claude(file_path: str):
    print(f"[rename] start: {file_path}", flush=True)
    try:
        async for message in query(
            prompt=f"{file_path}の1ページ目を読み取り、適切なファイル名にリネームしてください。リネーム後の確認は不要です。",
            options=ClaudeAgentOptions(
                allowed_tools=["Read", "Bash"],
                cwd=str(WATCH_DIR),
                ),
            ):
            if isinstance(message, ResultMessage):
                print(f"[rename] done: {message.result}", flush=True)
    except Exception as e:
        print(f"[rename] error: {e!r}", flush=True)

class PdfRenameHandler(FileSystemEventHandler):
    def on_created(self, event):
        if isinstance(event, FileCreatedEvent):
            src_path = os.fsdecode(event.src_path)
            print(f"[watch] created: {src_path}", flush=True)
            if not src_path.endswith(".pdf"):
                print(f"[watch] skip (not pdf): {src_path}", flush=True)
                return
            asyncio.run(rename_by_claude(src_path))

if __name__ == "__main__":
    print(f"[main] watching: {WATCH_DIR}", flush=True)
    # Observerだと検知できないディレクトリがある為PollingObserverを採用
    observer = PollingObserver(timeout=2)
    observer.schedule(PdfRenameHandler(), str(WATCH_DIR), recursive=False)
    observer.start()
    print("[main] observer started", flush=True)

    try:
        while observer.is_alive():
            observer.join(1)
    finally:
        print("[main] stopping observer", flush=True)
        observer.stop()
        observer.join()
        print("[main] stopped", flush=True)

watchdogがファイルの作成を検知したときにon_createdを呼び出してくれるので、そこからAgent SDKを呼び出します。

Claude Agent SDKの呼び出しは以下の部分です。

        async for message in query(
            prompt=f"{file_path}の1ページ目を読み取り、適切なファイル名にリネームしてください。リネーム後の確認は不要です。",
            options=ClaudeAgentOptions(
                allowed_tools=["Read", "Bash"],
                cwd=str(WATCH_DIR),
                ),
            ):

ファイルの読み取りにRead、リネーム(mvコマンド)のためにBashを指定しました。

プロンプトはチャットで指示する場合と同じです。
スキャンするプリントは基本1ページ目に文書タイトルがあるので、1ページのみ読むように指示しています。

実際にこのスクリプトをuv run <file name>で起動した状態で、スキャナにプリントを投入してみます。

プリントを投入すると、、、、

introduction-claude-agent-sdk-01.png

introduction-claude-agent-sdk-02.png

自動でファイル名をリネームしてくれました。成功です。

まとめ

簡単なプログラムでClaude Agent SDKに入門してみました。
私は最初、「Claude Codeから指示すれば十分でしょ」と考えていたのですが、
Claude Agent SDKのドキュメントに記載されているサンプルコードを動かすと、思ったより体験が良かったので、今回入門してみたところです。

まだClaude Agent SDKを触ったことが無い方は、是非サンプルコードだけでも動かして体験してもらえばと思います。

なお、新入園、新入学の子供がいるご家庭は、ぜひスキャナを導入しましょう。スキャナは偉大。

参考

この記事をシェアする

関連記事