WEB制作18年のフリーランス兼個人事業主が、半年で自社のVPSに自律エージェントを構築した記録。
Claude Agent SDK と Model Context Protocol (MCP) で何が変わって、どこでつまずいたか。
コード断片付きで実用ベースで書く。
なぜ自分で実装することにしたか
ChatGPTを毎日開いて同じプロンプトを打つ作業に、ある日疲れた。
「効率化」と呼んでいたが、効率化を演じているだけだった。
1日30分の作業が積み重なって週3〜4時間が消えていく。これでは何も変わらない。
業務にAIを組み込むには、対話ツールではなく自律エージェントが要る。
2026年初頭にAnthropicが Claude Agent SDK を本格化させたタイミングで、自分でVPSに構築し始めた。
構成の全体像
最終的にこの形になった。
[Conductor] (Claude Sonnet 4.6)
│
├─→ [Sub Agent: code-review] (Claude Sonnet)
├─→ [Sub Agent: market-research] (Grok-3, リアルタイム)
├─→ [Sub Agent: content-draft] (GPT-4o-mini, コスト効率)
├─→ [Sub Agent: trade-analysis] (Claude Opus, 複雑判定のみ)
└─→ [Auditor] (Claude Sonnet) ← 全state遷移をレビュー
各Sub Agentは MCP server 経由で外部ツールにアクセス:
- mcp-vps-shell (VPSシェル実行)
- mcp-trading (取引APIラッパー)
- mcp-note (note記事公開)
- mcp-sheets (Google Sheets更新)
中央コンダクターが目的を解釈してSub Agentに振り、auditorが並列に判断レビューする。
これで「自律させると暴走する」問題を緩和できる。
最初の3週間で起きた事故
最初に作ったのは「ニュースを集めて毎朝Slackに要約を投げる」だけのシンプルなエージェント。
動かして3日でこんなことが起きた。
-
無限ループに入って同じAPIを30回叩いた
- 検索結果が空だった時の処理を書いていなかった
-
重要じゃない記事を10本要約してSlackを埋めた
- 「重要度判定」を入れていなかった
-
ある日突然、ユーザーに「次は補助金を申請しましょう」と勧めだした
- LLMの「親切心」が暴走、業務範囲を逸脱
この3つが重なって、私は朝起きて50通のSlack通知を見た。
「自律させると、人が見ていない時に予算と信頼を食い潰す」という当たり前を体感した瞬間。
解決策: Auditor 並列レビューと予算上限
ここで Auditor pattern を導入した。
1つのエージェントが行動するたびに、別のエージェントがその判断を並列にレビューする。
判断が一致しない時はコンダクターに戻して人間の介入を待つ。
# 簡易版: auditor parallel review
async def execute_with_audit(action, primary_agent, auditor_agent):
primary_decision = await primary_agent.decide(action)
auditor_decision = await auditor_agent.review(action, primary_decision)
if auditor_decision.disagrees:
return escalate_to_human(action, primary_decision, auditor_decision)
return execute(primary_decision)
加えて以下も標準装備:
- 予算上限(時間/API呼び出し回数)
- 無限ループ検出(同じツールを連続5回呼んだら停止)
- 重要操作の人間承認ゲート(金銭が動く・公開される操作)
- 全操作のログ取得(事後検証用)
これらを入れてから、ようやく業務に置けるようになった。
マルチLLM協調でコストを75%削減
3月頃、Claudeだけで全部やっていたコストが月¥15,000を超え始めた。
ここで気づいた。全部の作業に最強モデルは要らない。
| 用途 | モデル | 単価 | 担当 |
|---|---|---|---|
| 推論・コードレビュー・最終判定 | Claude Sonnet | 中 | Conductor / Auditor |
| ルーチン整形・要約・抽出 | GPT-4o-mini | 1/20 | content-draft |
| リアルタイム情報・X検索 | Grok-3 | 中 | market-research |
| 複雑な戦略判定(稀) | Claude Opus | 高 | trade-analysis |
3つのLLMを1ワークフローで使い分けるようにした結果、月コストが¥4,000程度まで下がり、
むしろ各モデルが得意な仕事だけをするので品質が上がった。
実装はシンプル。Sub Agent毎にプロバイダーをルーティングする層を1段噛ませるだけ。
// Multi-LLM router (簡易)
interface LLMProvider {
name: 'claude-sonnet' | 'claude-opus' | 'gpt-4o-mini' | 'grok-3';
call(prompt: string): Promise<string>;
}
function routeByTask(task: TaskType): LLMProvider {
switch (task) {
case 'reasoning': return claudeSonnet;
case 'realtime': return grok3;
case 'extract': return gpt4oMini;
case 'critical': return claudeOpus;
}
}
MCP server を1個書くと、その業務はもう触らなくていい
MCP(Model Context Protocol)は Anthropic が公開した「LLM↔ツール」の共通プロトコル。
JSON-RPC over stdio で、Python/Node.js のどちらでも書ける。
書いたMCPサーバーの一例:
# mcp_note_server.py — note記事を公開するMCP
from mcp.server import Server
import requests
server = Server("note-publisher")
@server.tool()
def publish_note_article(title: str, body: str, tags: list[str]) -> str:
"""note.com に新規記事を公開する"""
# note APIに POST(認証はcookie or token、ここでは簡略化)
resp = requests.post(
"https://note.com/api/v3/notes",
json={"name": title, "body": body, "labels": tags},
cookies={"note_session_v5": NOTE_SESSION}
)
return f"Published: {resp.json()['url']}"
server.run()
これを Claude Code から呼べるように ~/.claude/mcp.json に登録するだけで、
エージェントが「今日の取引結果をまとめて → noteに下書き保存 → Slackに通知」を
1コマンドで完了するようになる。
ChatGPTでこれをやろうとすると、コピペが何往復も発生する。
MCP serverを1個書くと、その業務はもう人が触らなくていい。
これが半年で見つけた最大の発見だった。
残っている課題
正直に書く。
- ハルシネーション: auditorを並列にしても完全には消えない。重要操作は人間承認を残す
- 長セッションのコンテキスト圧縮: 序盤の前提を午後忘れる現象。memory file をdiskに書き出して再読する仕組みで緩和
- 「親切すぎる」LLM: ユーザーが頼んでないことまでやろうとする。system prompt で範囲を明示
- 運用コスト: 月¥4,000でも、毎月の経費としては馬鹿にならない
最後の点は、ここを書いている動機にも繋がる。
自分でClaude Agent SDK + MCP server を書ける人は、まだ国内に多くない。
半年で蓄積した実装ノウハウは、外に出してこそ価値が増える。
受託開発を始めた
中小企業・個人事業主向けに「AIエージェント開発受託」を始めた。
スポット開発¥300,000〜、月額運用保守¥50,000〜。無料30分Zoom相談あり。
https://mildsolt.jp/services/ai-agent-dev/
「ChatGPTを毎朝開いている自分」を「目的だけ伝えれば自律で完了するエージェント」に
置き換える。半年やってみると、この差は圧倒的だった。
同じ道を通る人の参考になれば。
筆者: 金杉昌俊 / Mild Solt
note: @mildsolt