<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MCP on AI2CORE - AI技術ブログ</title>
    <link>https://www.ai2core.com/tags/mcp/</link>
    <description>Recent content in MCP on AI2CORE - AI技術ブログ</description>
    <generator>Hugo -- 0.146.4</generator>
    <language>ja</language>
    <lastBuildDate>Sun, 01 Mar 2026 09:35:00 +0900</lastBuildDate>
    <atom:link href="https://www.ai2core.com/tags/mcp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MCPサーバー本番設計ガイド：AIエージェント連携を安全・安定に運用するアーキテクチャ</title>
      <link>https://www.ai2core.com/posts/2026-03-01-mcp-server-production-architecture/</link>
      <pubDate>Sun, 01 Mar 2026 09:35:00 +0900</pubDate>
      <guid>https://www.ai2core.com/posts/2026-03-01-mcp-server-production-architecture/</guid>
      <description>Model Context Protocol（MCP）サーバーを本番運用するための設計指針を、権限分離、監査、失敗制御、運用チェックリストまで実装レベルで解説。</description>
      <content:encoded><![CDATA[<h1 id="mcpサーバー本番設計ガイドaiエージェント連携を安全安定に運用するアーキテクチャ">MCPサーバー本番設計ガイド：AIエージェント連携を安全・安定に運用するアーキテクチャ</h1>
<p>MCP（Model Context Protocol）は、LLM と外部ツールを接続する強力な仕組みです。便利な一方で、本番運用では「権限の過剰付与」「監査不能」「障害時の暴走」が起きやすく、設計を誤ると一気にリスクが跳ね上がります。</p>
<p>本記事では、MCP サーバーを業務利用する前提で、<strong>安全性・可観測性・運用性</strong>を満たす設計パターンをまとめます。PoC から本番へ上げる際のチェックリストとして使える構成にしています。</p>
<h2 id="1-mcp本番運用で先に決めるべきこと">1. MCP本番運用で先に決めるべきこと</h2>
<p>最初に決めるべきは、技術スタックではなく「権限境界」です。</p>
<ul>
<li>どのエージェントが、どのツールを使えるか</li>
<li>書き込み系操作（作成・更新・削除）の承認方式</li>
<li>外部送信（メール、投稿、通知）の監査ルール</li>
<li>失敗時の停止条件（fail-open か fail-closed か）</li>
</ul>
<p>ここを決めずに実装を始めると、あとから制約を入れられず、結果として運用停止になります。</p>
<h2 id="2-推奨アーキテクチャcontrol-plane-と-tool-plane-の分離">2. 推奨アーキテクチャ：Control Plane と Tool Plane の分離</h2>
<p>MCP 構成は最低でも2層に分けると安全です。</p>
<ol>
<li><strong>Control Plane</strong>: 認証、認可、監査、レート制御</li>
<li><strong>Tool Plane</strong>: 実際のツール実行（DB、GitHub、Browser、Messaging）</li>
</ol>
<h3 id="2-1-なぜ分離するのか">2-1. なぜ分離するのか</h3>
<p>Tool 実装に認可ロジックを埋め込むと、ツール追加のたびにセキュリティ品質がブレます。Control Plane で一元化すれば、ポリシー変更時も1箇所で反映できます。</p>
<h3 id="2-2-リクエストフロー例">2-2. リクエストフロー例</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Agent -&gt; MCP Gateway(Control Plane)
</span></span><span style="display:flex;"><span>      -&gt; Policy Engine (allow/deny, scope check)
</span></span><span style="display:flex;"><span>      -&gt; Tool Adapter (Tool Plane)
</span></span><span style="display:flex;"><span>      -&gt; Audit Logger
</span></span></code></pre></td></tr></table>
</div>
</div><p>deny の場合も必ず監査ログに記録し、試行の痕跡を残します。</p>
<h2 id="3-認可設計rbacだけでは足りない">3. 認可設計：RBACだけでは足りない</h2>
<p>本番では RBAC（役割）に加えて ABAC（属性）を使うと事故が減ります。</p>
<ul>
<li>RBAC: <code>writer</code>, <code>reviewer</code>, <code>admin</code></li>
<li>ABAC: 時間帯、環境（prod/staging）、対象リポジトリ、操作種別</li>
</ul>
<p>例:</p>
<ul>
<li>staging では <code>write</code> 可、prod は <code>read</code> のみ</li>
<li>23:00〜08:00 の外部送信を自動 deny</li>
<li><code>delete</code> は人間承認トークン必須</li>
</ul>
<p>このルールを YAML 等で宣言的に持つと、監査とレビューが容易になります。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">policies</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">deny-night-send</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">when</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">action</span>: <span style="color:#ae81ff">message.send</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">time_between</span>: [<span style="color:#e6db74">&#34;23:00&#34;</span>, <span style="color:#e6db74">&#34;08:00&#34;</span>]
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">effect</span>: <span style="color:#ae81ff">deny</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">allow-read-docs</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">when</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">action</span>: <span style="color:#ae81ff">docs.read</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">env</span>: [<span style="color:#e6db74">&#34;prod&#34;</span>, <span style="color:#e6db74">&#34;staging&#34;</span>]
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">effect</span>: <span style="color:#ae81ff">allow</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="4-書き込み操作のガードレール">4. 書き込み操作のガードレール</h2>
<p>削除や公開投稿など不可逆操作は、二段階に分けます。</p>
<ol>
<li><strong>Planフェーズ</strong>: 何を変更するか差分提示</li>
<li><strong>Applyフェーズ</strong>: 承認トークン付きで実行</li>
</ol>
<h3 id="4-1-git操作の安全化">4-1. Git操作の安全化</h3>
<ul>
<li><code>main</code> 直 push 禁止（PR 経由のみ）</li>
<li>commit message に実行主体IDを埋め込む</li>
<li>重要ディレクトリは CODEOWNERS レビュー必須</li>
</ul>
<p>これにより「誰が」「なぜ」「どの差分を」適用したか追跡できます。</p>
<h2 id="5-可観測性最低限必要な監査ログ項目">5. 可観測性：最低限必要な監査ログ項目</h2>
<p>MCP の障害は、アプリログだけでは追えません。次を構造化ログで保存します。</p>
<ul>
<li>request_id</li>
<li>agent_id / session_id</li>
<li>tool_name</li>
<li>action（read/write/delete/send）</li>
<li>policy_decision（allow/deny）</li>
<li>latency_ms</li>
<li>result（success/failure）</li>
<li>redacted_input_hash</li>
</ul>
<p>入力本文を丸ごと保存すると個人情報漏えいリスクが高いので、ハッシュ化・マスキングが原則です。</p>
<h2 id="6-障害設計mcpが壊れても全体を止めない">6. 障害設計：MCPが壊れても全体を止めない</h2>
<h3 id="6-1-circuit-breaker-を必ず入れる">6-1. Circuit Breaker を必ず入れる</h3>
<p>下流ツール（例: GitHub API）が遅延した際、MCP 全体が巻き込まれないようにします。</p>
<ul>
<li>連続失敗 N 回で open</li>
<li>cool-down 後に half-open</li>
<li>成功確認後に close</li>
</ul>
<h3 id="6-2-タイムアウト予算">6-2. タイムアウト予算</h3>
<p>MCP リクエストは複数ツールを跨ぐため、全体予算を先に決めます。</p>
<ul>
<li>全体: 10 秒</li>
<li>認可: 500ms</li>
<li>ツール実行: 7 秒</li>
<li>ログ書き込み: 1 秒</li>
</ul>
<p>予算超過時は中断し、部分成功を明示するレスポンスを返すほうが、黙って待つより運用しやすいです。</p>
<h2 id="7-実運用チェックリスト導入前に必須">7. 実運用チェックリスト（導入前に必須）</h2>
<h3 id="セキュリティ">セキュリティ</h3>
<ul>
<li><input disabled="" type="checkbox"> デフォルト deny（明示 allow のみ）</li>
<li><input disabled="" type="checkbox"> 外部送信系に承認フローあり</li>
<li><input disabled="" type="checkbox"> APIキー/トークンのローテーション手順あり</li>
<li><input disabled="" type="checkbox"> 監査ログの改ざん防止（WORM/署名）</li>
</ul>
<h3 id="信頼性">信頼性</h3>
<ul>
<li><input disabled="" type="checkbox"> タイムアウト・再試行・サーキットブレーカ設定済み</li>
<li><input disabled="" type="checkbox"> ツールごとのレート制限あり</li>
<li><input disabled="" type="checkbox"> 障害時の degraded mode 定義済み</li>
<li><input disabled="" type="checkbox"> 週次で復旧訓練（ゲームデイ）実施</li>
</ul>
<h3 id="運用">運用</h3>
<ul>
<li><input disabled="" type="checkbox"> Runbook とオンコール体制がある</li>
<li><input disabled="" type="checkbox"> 重大操作の通知先が明確</li>
<li><input disabled="" type="checkbox"> 監査レポートを定期出力できる</li>
<li><input disabled="" type="checkbox"> ポリシー変更はPRレビュー必須</li>
</ul>
<h2 id="8-pocから本番へ上げるときの移行手順">8. PoCから本番へ上げるときの移行手順</h2>
<p>おすすめは次の4段階です。</p>
<ol>
<li><strong>Read-only段階</strong>: 読み取り専用ツールのみ許可</li>
<li><strong>限定Write段階</strong>: staging への書き込みのみ解放</li>
<li><strong>承認付きProd段階</strong>: prod 書き込みは人間承認必須</li>
<li><strong>自動化段階</strong>: 低リスク操作だけ自動承認</li>
</ol>
<p>この順序なら、事故を起こさず運用知見を溜められます。</p>
<h2 id="まとめ">まとめ</h2>
<p>MCP は「つなげる技術」ですが、本番では「制御する技術」に重心があります。成功する導入の共通点は次の3つです。</p>
<ul>
<li>権限境界を最初に設計する</li>
<li>監査可能な実行経路を持つ</li>
<li>障害時に安全側へ倒れる設計にする</li>
</ul>
<p>AI エージェント活用は今後さらに広がります。だからこそ、機能追加より先に運用設計を固めることが、長期的な速度と安全性を両立する最短ルートです。今日から始めるなら、まずは「default deny + 監査ログ項目定義」この2つを先に確定してください。</p>
<h2 id="9-監査レビューを回すための実務フロー">9. 監査レビューを回すための実務フロー</h2>
<p>ログを取って終わりでは意味がありません。週次または隔週で、次の観点で監査レビューを実施します。</p>
<ul>
<li>deny された操作のうち、正当要求だったものはないか</li>
<li>承認付き操作で承認理由が空欄になっていないか</li>
<li>失敗率の高いツールに設計欠陥がないか</li>
<li>夜間・休日の危険操作が発生していないか</li>
</ul>
<p>監査レビューはセキュリティ部門だけでなく、実際に運用する開発チームが同席することで改善速度が上がります。ポリシーは「守らせるもの」ではなく「運用と一緒に育てるもの」と捉えるのが重要です。</p>
<h2 id="10-導入初期に決めておくべきslo">10. 導入初期に決めておくべきSLO</h2>
<p>MCP 基盤にも SLO を置くと、感覚論で運用しなくて済みます。例として以下が扱いやすいです。</p>
<ul>
<li>正常リクエスト成功率: 99.5%以上</li>
<li>ポリシー判定レイテンシ p95: 300ms 以下</li>
<li>重大操作の監査ログ欠損率: 0%</li>
<li>障害発生時の検知時間: 5分以内</li>
</ul>
<p>このSLOをダッシュボード化し、週次で逸脱をレビューするだけで、MCP運用の成熟度は大きく上がります。PoC段階から数値を持っておくと、本番移行時の説得材料としても有効です。</p>
<p>補足として、導入時は「全ツール同時公開」を避け、1ツールずつトラフィックを段階開放するのが安全です。障害発生時の切り戻し対象が明確になり、原因分析時間を大幅に短縮できます。</p>
]]></content:encoded>
      <category>Tech</category>
      <category>MCP</category>
      <category>AI Agent</category>
      <category>Architecture</category>
      <category>Security</category>
    </item>
    <item>
      <title>【完全解剖】Claude Codeで「SKILLS」が発動する仕組み：裏側で何が起きているのか？</title>
      <link>https://www.ai2core.com/posts/2026-02-13-claude-skills-mechanism/</link>
      <pubDate>Fri, 13 Feb 2026 10:20:00 +0900</pubDate>
      <guid>https://www.ai2core.com/posts/2026-02-13-claude-skills-mechanism/</guid>
      <description>Claude Codeがツール（SKILLS）を認識し、実行するまでの内部プロセスを徹底解説。MCPの仕組みからカスタムスキルのデバッグまで。</description>
      <content:encoded><![CDATA[<h2 id="魔法の裏側を知りたくないですか">「魔法」の裏側を知りたくないですか？</h2>
<p>Claude Codeに「このファイルのバグを直して」と言うと、勝手にファイルを読み、修正し、保存してくれます。
また、「天気を教えて」と言えば、外部APIを叩いて答えてくれます。</p>
<p>まるで魔法のようですが、裏側では<strong>非常に論理的なプロセス</strong>が動いています。</p>
<p>本記事では、エンジニア向けに**「Claude CodeでSKILLS（スキル）が発動する仕組み」**を徹底的に解剖します。</p>
<p>ここを理解すれば、あなたはClaude Codeを「ただ使う人」から「自在に操る人（ツール開発者）」になれます。</p>
<h2 id="1-全体像発動までの4ステップ">1. 全体像：発動までの4ステップ</h2>
<p>Claude Codeがスキルを実行する時、内部では以下の4段階のプロセスが走っています。</p>
<ol>
<li><strong>ツール定義の読み込み (Tool Definition)</strong></li>
<li><strong>意図の検出 (Intent Detection)</strong></li>
<li><strong>引数の生成 (Argument Generation)</strong></li>
<li><strong>実行と結果のフィードバック (Execution &amp; Feedback)</strong></li>
</ol>
<p>それぞれ詳しく見ていきましょう。</p>
<h3 id="step-1-ツール定義の読み込み">Step 1. ツール定義の読み込み</h3>
<p>Claude Codeが起動する時、設定ファイルや <strong>MCP (Model Context Protocol)</strong> サーバーから、「自分は何ができるか」というリストを読み込みます。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;read_file&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;指定されたパスのファイルを読み込む&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;parameters&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;object&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;properties&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;path&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;string&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;読み込むファイルの絶対パスまたは相対パス&#34;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;required&#34;</span>: [<span style="color:#e6db74">&#34;path&#34;</span>]
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="step-2-意図の検出-intent-detection">Step 2. 意図の検出 (Intent Detection)</h3>
<p>ユーザーが「<code>src/main.py</code> の中身が見たい」と発言したとします。</p>
<p>Claudeの脳内（推論プロセス）では、以下のような思考が行われます。</p>
<blockquote>
<p>ユーザーはファイルの中身を知りたがっている。
私の持っている道具リストの中に、それを叶えるものはあるか？
&hellip;あった。<code>read_file</code> だ。
この道具を使おう。</p></blockquote>
<p>これが <strong>Function Calling（関数呼び出し）</strong> のトリガーです。</p>
<h3 id="step-3-引数の生成-argument-generation">Step 3. 引数の生成 (Argument Generation)</h3>
<p>道具を使うと決めたら、次は「どう使うか」を決めます。</p>
<p>定義書の <code>parameters</code> に従って、必要な情報を会話履歴から抽出します。</p>
<ul>
<li>ユーザーの発言: &ldquo;<code>src/main.py</code> の中身&hellip;&rdquo;</li>
<li>引数 <code>path</code>: <code>&quot;src/main.py&quot;</code></li>
</ul>
<p>Claudeは以下のような特殊なトークン（またはJSON）を出力します。</p>
<pre tabindex="0"><code>&lt;tool_use&gt;
  &lt;name&gt;read_file&lt;/name&gt;
  &lt;parameters&gt;
    {&#34;path&#34;: &#34;src/main.py&#34;}
  &lt;/parameters&gt;
&lt;/tool_use&gt;
</code></pre><h3 id="step-4-実行と結果のフィードバック">Step 4. 実行と結果のフィードバック</h3>
<p>ここが重要です。<strong>Claude自身がファイルを読むわけではありません。</strong></p>
<p>Claudeが出力した上記のJSONを、<strong>Claude Codeのランタイム（実行環境）</strong> が受け取ります。
そして、PythonやNode.jsで書かれた実際のプログラム（<code>open()</code> 関数など）が実行されます。</p>
<p>実行結果（ファイルの中身）は、再びテキストとしてClaudeに返されます。</p>
<pre tabindex="0"><code>&lt;tool_result&gt;
  import os
  print(&#34;Hello World&#34;)
&lt;/tool_result&gt;
</code></pre><p>これを見て初めて、Claudeは「ファイルの中身はこうなっていました」とユーザーに回答できるのです。</p>
<h2 id="2-mcp-model-context-protocol-とは">2. MCP (Model Context Protocol) とは？</h2>
<p>最近話題の <strong>MCP</strong> は、この「ツールの渡し方」を標準化した規格です。</p>
<p>これまで、Claudeに独自のツールを追加するには、複雑な設定が必要でした。
しかしMCPを使えば、<strong>「MCPサーバー」</strong> を立ち上げるだけで、Claude Codeが勝手にツールを認識してくれます。</p>
<h3 id="仕組み">仕組み</h3>
<ol>
<li><strong>MCPサーバー</strong>: ツール（関数）の実装を持つプロセス。</li>
<li><strong>MCPクライアント</strong>: Claude Code本体。</li>
</ol>
<p>クライアントとサーバーが通信し、「使えるツール一覧」と「実行リクエスト」をやり取りします。
これにより、ローカルのデータベース操作や、社内APIへのアクセスが安全かつ簡単に実装できるようになりました。</p>
<h2 id="まとめ">まとめ</h2>
<p>Claude Codeの「SKILLS」は、魔法ではありません。
<strong>「定義を読む」→「選ぶ」→「JSONを作る」→「実行結果を読む」</strong> という、非常に泥臭いテキスト処理のループです。</p>
<p>しかし、この仕組みを理解していれば、あなたはClaude Codeを
「ただの話し相手」から
<strong>「手足となって働く最強のパートナー」</strong> に進化させることができます。</p>
<p>ぜひ、自分だけのカスタムスキルを作ってみてください。</p>
]]></content:encoded>
      <category>Coding AI</category>
      <category>Claude Code</category>
      <category>MCP</category>
      <category>Agent</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Claude Codeに「自分専用スキル」を追加する方法（MCP活用術）</title>
      <link>https://www.ai2core.com/posts/2026-02-12-claude-code-skills/</link>
      <pubDate>Thu, 12 Feb 2026 16:30:00 +0900</pubDate>
      <guid>https://www.ai2core.com/posts/2026-02-12-claude-code-skills/</guid>
      <description>Claude Codeに独自のツールやAPIを連携させ、最強のアシスタントにする方法を解説。</description>
      <content:encoded><![CDATA[<h1 id="claude-codeに自分専用スキルを追加する方法mcp活用術">Claude Codeに「自分専用スキル」を追加する方法（MCP活用術）</h1>
<h2 id="はじめに">はじめに</h2>
<p>Anthropic社のClaude 3、特にコーディング能力に優れた<code>claude-3-opus-20240229</code>モデルは、多くの開発者にとって強力な相棒となりつつあります。コード生成、リファクタリング、デバッグ支援など、その能力は多岐にわたります。</p>
<p>しかし、こんな風に感じたことはありませんか？</p>
<ul>
<li>「Claudeに社内のデータベースへアクセスさせて、最新の売上データを分析させたい…」</li>
<li>「GitHubリポジトリの最新のIssueを要約させたり、新しいチケットをJIRAに起票させたりできたら最高なのに…」</li>
<li>「特定の計算や、自作のコマンドラインツールを実行するよう指示できれば、作業が劇的に効率化されるはずだ…」</li>
</ul>
<p>標準のClaudeは、学習データに含まれる一般的な知識しか持っておらず、あなたの会社のプライベートな情報や、リアルタイムの外部情報にアクセスすることはできません。これまでは、開発者が手動でAPIを叩き、その結果をコピー＆ペーストしてClaudeに与える、という手間のかかる作業が必要でした。</p>
<p>もし、Claudeに**「あなた専用のスキル」**を自由に追加できたらどうでしょう？まるで優秀なアシスタントに新しい能力を教え込むように、独自のツールやAPIと連携させることができたら。</p>
<p>この記事では、Anthropicが提供する**「Tool Use（ツール使用）」機能<strong>を活用し、Claudeをあなただけの最強コーディング・アシスタントへと進化させる具体的な方法を、詳細なコード例とともに解説します。この記事で言う</strong>MCP（Multi-turn Conversational Platform）活用術**とは、まさにこのTool Use機能を駆使して、対話型AIの能力を最大限に引き出す実践的なテクニックを指します。</p>
<p>この記事を読み終える頃には、あなたはClaudeに独自の「スキル」を授け、開発ワークフローを根本から変革する力を手に入れているはずです。</p>
<h2 id="なぜ今tool-useが重要なのか">なぜ今、「Tool Use」が重要なのか？</h2>
<p>LLM（大規模言語モデル）は、単に質問に答えたり文章を生成したりするだけの存在から、外部の世界と対話し、能動的にタスクを実行する**「エージェント」**へと進化しつつあります。その中核をなす技術が、ChatGPTにおける「Function Calling」であり、Claudeにおける「Tool Use」です。</p>
<p>この技術がなぜゲームチェンジャーとなり得るのか、その背景にある課題と合わせて見ていきましょう。</p>
<h3 id="従来のllmが抱えていた課題">従来のLLMが抱えていた課題</h3>
<ol>
<li><strong>知識の陳腐化と非公開情報へのアクセス不可:</strong> LLMの知識は、学習データがカットオフされた時点のものであり、リアルタイムの情報（今日の天気、最新の株価など）を知りません。また、社内DBや個人のファイルなど、インターネット上に公開されていない情報には当然アクセスできません。</li>
<li><strong>手動による連携の非効率性:</strong> 開発者が外部APIから取得したデータをLLMに渡す場合、手動でのコピー＆ペーストが必要でした。このプロセスは手間がかかるだけでなく、ヒューマンエラーの温床にもなります。</li>
<li><strong>プロンプトの複雑化と再現性の低さ:</strong> 複雑なタスクを指示しようとすると、プロンプトが非常に長大かつ複雑になりがちです。「まずこのAPIを叩いてJSONを取得し、その中の<code>items</code>配列をループして、各<code>name</code>と<code>price</code>を抽出し、マークダウンのテーブル形式で出力して…」といった詳細な手順を毎回プロンプトに記述するのは現実的ではありません。</li>
</ol>
<h3 id="tool-useがもたらす解決策">「Tool Use」がもたらす解決策</h3>
<p>ClaudeのTool Use機能は、これらの課題をエレガントに解決します。その仕組みは、LLMと開発者が協調して動作するフレームワークです。</p>
<p><strong>Tool Useの基本的なフロー</strong></p>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">sequenceDiagram
    participant User as ユーザー
    participant App as 開発者のアプリケーション
    participant Claude as Claude
    participant Tool as 外部ツール/API

    User-&gt;&gt;App: 「東京の天気は？」
    App-&gt;&gt;Claude: ユーザーの質問と利用可能なツール定義を渡す
    Claude-&gt;&gt;Claude: 質問を解釈し、「get_weather」ツールが使えると判断
    Claude-&gt;&gt;App: 「get_weather(city=&#39;Tokyo&#39;)」を実行してほしい、とJSON形式で要求
    App-&gt;&gt;Tool: 実際に天気APIを呼び出す
    Tool--&gt;&gt;App: 天気データ（JSON）を返す
    App-&gt;&gt;Claude: ツール実行結果（天気データ）を渡す
    Claude-&gt;&gt;Claude: 実行結果を解釈し、自然言語の回答を生成
    Claude-&gt;&gt;App: 「東京の天気は晴れです。」
    App-&gt;&gt;User: 最終的な回答を表示
</code></pre><p>このフローが示すように、Tool Useは以下の役割分担によって成り立っています。</p>
<ul>
<li><strong>Claudeの役割:</strong> ユーザーの意図を汲み取り、どのツールを、どのような引数で使うべきかを判断し、JSON形式で開発者に伝達する。そして、ツールの実行結果を受け取り、それを基に最終的な回答を生成する。</li>
<li><strong>開発者の役割:</strong> Claudeが利用可能な「スキル」（ツール）の仕様を定義し、Claudeからツール実行の要求を受け取ったら、実際にそのツール（関数やAPIコール）を実行し、結果をClaudeに返す。</li>
</ul>
<p>これにより、LLMは思考や判断に集中し、実際の「行動」は開発者が用意した信頼性の高いコードが担う、という強力な分業体制が実現します。これは、LLMを単なる「知識ベース」から、具体的なタスクをこなす「実行エンジン」へと昇華させる、きわめて重要なパラダイムシフトなのです。</p>
<h2 id="具体的な実装方法claudeに天気を尋ねるスキルを追加する">具体的な実装方法：Claudeに天気を尋ねるスキルを追加する</h2>
<p>それでは、実際に手を動かして、Claudeに「天気を尋ねるスキル」を追加してみましょう。ここではPython用のAnthropic SDKを使用します。</p>
<h3 id="step-1-準備">Step 1: 準備</h3>
<p>まず、必要なライブラリをインストールし、APIキーを設定します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install anthropic
</span></span></code></pre></td></tr></table>
</div>
</div><p>APIキーは環境変数に設定しておくのが一般的です。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>export ANTHROPIC_API_KEY<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;YOUR_ANTHROPIC_API_KEY&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="step-2-スキルツールの定義">Step 2: 「スキル」（ツール）の定義</h3>
<p>最初に、Claudeに「こんなツールが使えますよ」と教えるための定義を作成します。今回は、特定の都市の天気を取得する<code>get_weather</code>というツールを定義しましょう。</p>
<p>このツール定義は、Claudeがツールの機能、目的、そして必要な引数を理解するために非常に重要です。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> anthropic
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Anthropicクライアントの初期化</span>
</span></span><span style="display:flex;"><span>client <span style="color:#f92672">=</span> anthropic<span style="color:#f92672">.</span>Anthropic()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- ここからがツールの定義 ---</span>
</span></span><span style="display:flex;"><span>tools <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;get_weather&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;特定の都市の現在の天気を取得します。ユーザーが天気について尋ねた場合に使用します。&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;input_schema&#34;</span>: {
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;object&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;properties&#34;</span>: {
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;city&#34;</span>: {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;string&#34;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;天気を知りたい都市名。例: &#39;東京&#39;, &#39;サンフランシスコ&#39;&#34;</span>
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;required&#34;</span>: [<span style="color:#e6db74">&#34;city&#34;</span>]
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- ここまでがツールの定義 ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 開発者側で実際にツールを実行する関数を定義</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># (この例では実際のAPIは叩かず、ダミーデータを返す)</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">get_weather</span>(city: str):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;指定された都市の天気を取得する（ダミー関数）&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;--- ツール実行: get_weather(city=&#39;</span><span style="color:#e6db74">{</span>city<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;) ---&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;東京&#34;</span> <span style="color:#f92672">in</span> city:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#34;city&#34;</span>: <span style="color:#e6db74">&#34;東京&#34;</span>, <span style="color:#e6db74">&#34;temperature&#34;</span>: <span style="color:#ae81ff">25</span>, <span style="color:#e6db74">&#34;weather&#34;</span>: <span style="color:#e6db74">&#34;晴れ&#34;</span>})
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">elif</span> <span style="color:#e6db74">&#34;大阪&#34;</span> <span style="color:#f92672">in</span> city:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#34;city&#34;</span>: <span style="color:#e6db74">&#34;大阪&#34;</span>, <span style="color:#e6db74">&#34;temperature&#34;</span>: <span style="color:#ae81ff">22</span>, <span style="color:#e6db74">&#34;weather&#34;</span>: <span style="color:#e6db74">&#34;くもり&#34;</span>})
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#34;city&#34;</span>: city, <span style="color:#e6db74">&#34;temperature&#34;</span>: <span style="color:#e6db74">&#34;不明&#34;</span>, <span style="color:#e6db74">&#34;weather&#34;</span>: <span style="color:#e6db74">&#34;不明&#34;</span>})
</span></span></code></pre></td></tr></table>
</div>
</div><p>ここで重要なのは<code>tools</code>リストの中身です。</p>
<ul>
<li><code>name</code>: ツールの名前です。Claudeがどのツールを呼び出すか指定するのに使います。</li>
<li><code>description</code>: <strong>最も重要な要素の一つです。</strong> Claudeはこの説明を読んで、いつ、何のためにこのツールを使うべきかを判断します。具体的で分かりやすい説明を心がけましょう。</li>
<li><code>input_schema</code>: ツールが必要とする引数をJSON Schema形式で定義します。これにより、Claudeは正しい引数名とデータ型でツールを呼び出そうとします。</li>
</ul>
<h3 id="step-3-claudeにツール使用を促すリクエストを送信">Step 3: Claudeにツール使用を促すリクエストを送信</h3>
<p>次に、ユーザーからの質問と、先ほど定義したツールリストをClaudeに渡します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># ユーザーからの質問</span>
</span></span><span style="display:flex;"><span>user_message <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;今日の東京の天気はどうですか？&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;ユーザー: </span><span style="color:#e6db74">{</span>user_message<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Claudeに最初のメッセージを送信</span>
</span></span><span style="display:flex;"><span>response <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>messages<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;claude-3-opus-20240229&#34;</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">1024</span>,
</span></span><span style="display:flex;"><span>    messages<span style="color:#f92672">=</span>[{<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: user_message}],
</span></span><span style="display:flex;"><span>    tools<span style="color:#f92672">=</span>tools, <span style="color:#75715e"># ここで定義したツールを渡す</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">--- Claudeからの初回応答 ---&#34;</span>)
</span></span><span style="display:flex;"><span>print(response)
</span></span></code></pre></td></tr></table>
</div>
</div><p>このコードを実行すると、Claudeからの応答は通常のテキストではなく、ツールを使用するべきだという特別な形式で返ってきます。</p>
<h3 id="step-4-claudeからの応答ツール使用要求を処理する">Step 4: Claudeからの応答（ツール使用要求）を処理する</h3>
<p><code>response</code>の中身を確認してみましょう。特に<code>stop_reason</code>と<code>content</code>に注目です。</p>
<pre tabindex="0"><code># responseの出力例
Message(
    id=&#39;...&#39;,
    content=[
        ToolUseBlock(
            id=&#39;toolu_01A09q90e9QyqG7LLVf9i4t4&#39;,  # ツール使用ごとのユニークID
            input={&#39;city&#39;: &#39;東京&#39;},
            name=&#39;get_weather&#39;,
            type=&#39;tool_use&#39;
        )
    ],
    model=&#39;claude-3-opus-20240229&#39;,
    role=&#39;assistant&#39;,
    stop_reason=&#39;tool_use&#39;, # 停止理由が &#39;tool_use&#39; になっている！
    stop_sequence=None,
    type=&#39;message&#39;,
    usage=Usage(input_tokens=..., output_tokens=...)
)
</code></pre><p><code>stop_reason</code>が<code>'tool_use'</code>になっているのが分かります。これは、「私は会話を一旦停止します。なぜなら、あなたが定義したツールを使いたいからです」というClaudeからの合図です。</p>
<p><code>content</code>リストには、<code>ToolUseBlock</code>オブジェクトが含まれており、どのツール（<code>name</code>）を、どの引数（<code>input</code>）で呼び出してほしいかが具体的に示されています。</p>
<p>この情報を使って、実際にツールを実行します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># 会話の履歴を保持するリスト</span>
</span></span><span style="display:flex;"><span>conversation_history <span style="color:#f92672">=</span> [{<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: user_message}]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Claudeの応答を履歴に追加</span>
</span></span><span style="display:flex;"><span>assistant_response_content <span style="color:#f92672">=</span> response<span style="color:#f92672">.</span>content
</span></span><span style="display:flex;"><span>conversation_history<span style="color:#f92672">.</span>append({<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;assistant&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: assistant_response_content})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ツール使用要求があるかチェック</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> response<span style="color:#f92672">.</span>stop_reason <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;tool_use&#34;</span>:
</span></span><span style="display:flex;"><span>    tool_use <span style="color:#f92672">=</span> next((block <span style="color:#66d9ef">for</span> block <span style="color:#f92672">in</span> response<span style="color:#f92672">.</span>content <span style="color:#66d9ef">if</span> block<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;tool_use&#34;</span>), <span style="color:#66d9ef">None</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> tool_use:
</span></span><span style="display:flex;"><span>        tool_name <span style="color:#f92672">=</span> tool_use<span style="color:#f92672">.</span>name
</span></span><span style="display:flex;"><span>        tool_input <span style="color:#f92672">=</span> tool_use<span style="color:#f92672">.</span>input
</span></span><span style="display:flex;"><span>        tool_use_id <span style="color:#f92672">=</span> tool_use<span style="color:#f92672">.</span>id
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">--- Claudeがツール &#39;</span><span style="color:#e6db74">{</span>tool_name<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39; の使用を要求 ---&#34;</span>)
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;引数: </span><span style="color:#e6db74">{</span>tool_input<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># ツール名に応じて適切な関数を実行</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> tool_name <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;get_weather&#34;</span>:
</span></span><span style="display:flex;"><span>            tool_result <span style="color:#f92672">=</span> get_weather(city<span style="color:#f92672">=</span>tool_input[<span style="color:#e6db74">&#34;city&#34;</span>])
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># 未知のツールが要求された場合のエラーハンドリング</span>
</span></span><span style="display:flex;"><span>            tool_result <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#34;error&#34;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unknown tool: </span><span style="color:#e6db74">{</span>tool_name<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>})
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="step-5-ツール実行結果をclaudeに返す">Step 5: ツール実行結果をClaudeに返す</h3>
<p>ツールを実行したら、その結果をClaudeにフィードバックする必要があります。これにより、Claudeは次のステップに進むことができます。</p>
<p>結果を返す際は、「どのツール実行要求に対する結果なのか」を明確にするために、Step 4で取得した<code>tool_use_id</code>を使います。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;ツール実行結果: </span><span style="color:#e6db74">{</span>tool_result<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># ツール実行結果を会話履歴に追加</span>
</span></span><span style="display:flex;"><span>        conversation_history<span style="color:#f92672">.</span>append(
</span></span><span style="display:flex;"><span>            {
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;content&#34;</span>: [
</span></span><span style="display:flex;"><span>                    {
</span></span><span style="display:flex;"><span>                        <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;tool_result&#34;</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#e6db74">&#34;tool_use_id&#34;</span>: tool_use_id,
</span></span><span style="display:flex;"><span>                        <span style="color:#e6db74">&#34;content&#34;</span>: tool_result,
</span></span><span style="display:flex;"><span>                    }
</span></span><span style="display:flex;"><span>                ],
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        )
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="step-6-claudeからの最終的な回答を得る">Step 6: Claudeからの最終的な回答を得る</h3>
<p>最後に、ツール実行結果を含む更新された会話履歴を、再度Claudeに送信します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">--- ツール実行結果をClaudeに送信し、最終回答を要求 ---&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># ツール実行結果を踏まえた最終的な応答をClaudeに生成させる</span>
</span></span><span style="display:flex;"><span>        final_response <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>messages<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>            model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;claude-3-opus-20240229&#34;</span>,
</span></span><span style="display:flex;"><span>            max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">2048</span>,
</span></span><span style="display:flex;"><span>            messages<span style="color:#f92672">=</span>conversation_history, <span style="color:#75715e"># 更新された会話履歴を渡す</span>
</span></span><span style="display:flex;"><span>            tools<span style="color:#f92672">=</span>tools,
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">--- Claudeからの最終回答 ---&#34;</span>)
</span></span><span style="display:flex;"><span>        final_answer <span style="color:#f92672">=</span> final_response<span style="color:#f92672">.</span>content[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        print(final_answer)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 実行結果の例:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ユーザー: 今日の東京の天気はどうですか？</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- Claudeからの初回応答 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ... (ToolUseBlockを含むMessageオブジェクト) ...</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- Claudeがツール &#39;get_weather&#39; の使用を要求 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 引数: {&#39;city&#39;: &#39;東京&#39;}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- ツール実行: get_weather(city=&#39;東京&#39;) ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ツール実行結果: {&#34;city&#34;: &#34;東京&#34;, &#34;temperature&#34;: 25, &#34;weather&#34;: &#34;晴れ&#34;}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- ツール実行結果をClaudeに送信し、最終回答を要求 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- Claudeからの最終回答 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 東京の今日の天気は晴れで、気温は25度です。</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>見事にClaudeが外部ツール（今回はダミー関数）と連携し、ユーザーの質問に答えることができました。これがTool Useの基本的な流れです。</p>
<h2 id="メリットとデメリット">メリットとデメリット</h2>
<p>この強力なTool Use機能ですが、もちろん良い点ばかりではありません。導入を検討する上で、メリットとデメリットを正しく理解しておくことが重要です。</p>
<h3 id="メリット">メリット</h3>
<ol>
<li><strong>無限の拡張性:</strong> Claudeの能力を、事実上無限に拡張できます。社内API、外部のSaaS、ローカルのスクリプト実行、データベース操作など、APIや関数として呼び出せるものなら何でも連携可能です。</li>
<li><strong>タスクの自動化と生産性向上:</strong> JIRAチケットの作成、GitHubのIssue要約、デプロイメントのキックなど、これまで手作業で行っていた定型的なタスクを自然言語の指示で自動化でき、開発者の生産性を劇的に向上させます。</li>
<li><strong>対話の自然さ:</strong> ユーザーはツールの存在やAPIの仕様を意識する必要がありません。ただ自然言語で「〜して」と頼むだけで、裏側で適切なツールが呼び出されます。</li>
<li><strong>信頼性の向上:</strong> LLM単体では事実に基づかない回答（ハルシネーション）を生成することがありますが、Tool Useを使えば、信頼できる情報源（APIの実行結果など）に基づいた回答を生成させることができます。</li>
<li><strong>プロンプトの抽象化:</strong> 複雑な手順を長々とプロンプトに書く代わりに、それらを一つのツールとしてカプセル化できます。プロンプトは簡潔になり、メンテナンス性も向上します。</li>
</ol>
<h3 id="デメリット">デメリット</h3>
<ol>
<li><strong>実装コスト:</strong> ツール定義の作成、API連携ロジックの実装、エラーハンドリングなど、開発者側でのコーディングが必要です。手軽に試せるものではなく、システムへの組み込みには設計と実装のコストがかかります。</li>
<li><strong>APIコストの増加:</strong> 一つの質問応答フローの中で、ClaudeのAPIを複数回（ツール使用判断で1回、最終回答生成で1回）呼び出すことになります。これにより、APIの利用料金が増加する可能性があります。</li>
<li><strong>レイテンシの増加:</strong> ツール実行（特に外部APIの呼び出し）には時間がかかるため、応答全体のレイテンシは長くなる傾向にあります。ユーザー体験を損なわないよう、パフォーマンスへの配慮が必要です。</li>
<li><strong>セキュリティリスク:</strong> データベースの更新やファイルの削除など、破壊的な操作を伴うツールを連携させる場合は、細心の注意が必要です。Claudeに意図しない操作を実行させないよう、厳格な権限管理、入力値のサニタイズ、実行前の人間による確認ステップなどを設けるべきです。</li>
</ol>
<h2 id="現場で使える実践的なtips">現場で使える実践的なTips</h2>
<p>基本的な使い方をマスターしたところで、より実践的なシナリオでTool Useを使いこなすためのヒントをいくつか紹介します。</p>
<h3 id="1-良いツール設計の原則descriptionが命">1. 良いツール設計の原則：<code>description</code>が命</h3>
<p>Claudeがツールを正しく使いこなせるかどうかは、ツールの<code>description</code>（説明文）の品質に大きく依存します。</p>
<p><strong>悪い例 ❌:</strong>
<code>&quot;description&quot;: &quot;DBからデータを取得する&quot;</code>
→ これでは、いつ、何のデータを、どのように取得するのかが全く分かりません。</p>
<p><strong>良い例 ✅:</strong>
<code>&quot;description&quot;: &quot;指定されたSQLクエリを読み取り専用の分析データベースで実行し、結果をJSON形式で返します。主に売上データやユーザー行動ログの集計・分析に使用します。データの更新や削除はできません。&quot;</code>
→ この説明により、Claudeは「売上分析の依頼が来たらこのツールを使おう」「SQLを生成して引数に渡せばいいんだな」「データを書き換えることはできないな」といったことを正確に理解できます。</p>
<p><strong>引数の説明も同様に重要です。</strong> ユーザーが曖昧な指示をした際に、Claudeがどの情報を追加でヒアリングすべきかの判断材料になります。</p>
<h3 id="2-堅牢なエラーハンドリング">2. 堅牢なエラーハンドリング</h3>
<p>ツールの実行は常に成功するとは限りません。APIがタイムアウトしたり、データベース接続に失敗したり、不正な引数が渡されたりすることもあります。</p>
<p>このような場合、エラー情報を適切にClaudeに返すことで、Claudeがユーザーに対して状況を説明したり、リトライを促したりできるようになります。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">query_database</span>(sql_query: str):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># ... データベース接続とクエリ実行のロジック ...</span>
</span></span><span style="display:flex;"><span>        result <span style="color:#f92672">=</span> db<span style="color:#f92672">.</span>execute(sql_query)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;success&#34;</span>, <span style="color:#e6db74">&#34;data&#34;</span>: result})
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># エラーが発生したら、エラー情報を返す</span>
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;--- ツール実行エラー: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74"> ---&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> json<span style="color:#f92672">.</span>dumps({
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;error&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;error_message&#34;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;データベースクエリの実行に失敗しました: </span><span style="color:#e6db74">{</span>str(e)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ツール実行結果をClaudeに返す部分</span>
</span></span><span style="display:flex;"><span>tool_result <span style="color:#f92672">=</span> query_database(sql_query<span style="color:#f92672">=</span>tool_input[<span style="color:#e6db74">&#34;sql_query&#34;</span>])
</span></span><span style="display:flex;"><span>conversation_history<span style="color:#f92672">.</span>append({
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;content&#34;</span>: [{
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;tool_result&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;tool_use_id&#34;</span>: tool_use_id,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;content&#34;</span>: tool_result, <span style="color:#75715e"># エラー情報が含まれたJSONをそのまま渡す</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;is_error&#34;</span>: <span style="color:#e6db74">&#34;error&#34;</span> <span style="color:#f92672">in</span> json<span style="color:#f92672">.</span>loads(tool_result) <span style="color:#75715e"># (Optional) エラーであることを明示</span>
</span></span><span style="display:flex;"><span>    }]
</span></span><span style="display:flex;"><span>})
</span></span></code></pre></td></tr></table>
</div>
</div><p>こうすることで、Claudeは「データベースクエリの実行に失敗しました。SQLの構文が間違っている可能性があります。クエリを確認してください: <code>SELECT * FRM sales</code>」のように、具体的なフィードバックを返すことができます。</p>
<h3 id="3-複数のツールを組み合わせる思考の連鎖">3. 複数のツールを組み合わせる（思考の連鎖）</h3>
<p>より複雑なタスクでは、複数のツールを段階的に実行する必要があります。</p>
<p><strong>例: 「先月の売上トップだった商品の担当営業に、Slackでお祝いメッセージを送って」</strong></p>
<p>このタスクを達成するには、おそらく2つのツールが必要です。</p>
<ol>
<li><code>get_top_sales_product(month: str)</code>: 指定した月の売上トップ商品と担当者を取得するツール。</li>
<li><code>send_slack_message(user_id: str, message: str)</code>: 指定したユーザーにSlackメッセージを送信するツール。</li>
</ol>
<p>このようなシナリオでは、Claudeは自律的に思考の連鎖（Chain of Thought）を行い、ツールを順番に呼び出します。</p>
<ol>
<li>ユーザーの指示を解釈し、まず<code>get_top_sales_product</code>を呼び出す必要があると判断する。</li>
<li>開発者側でこのツールを実行し、結果（<code>{&quot;product&quot;: &quot;商品A&quot;, &quot;sales_person_id&quot;: &quot;U12345&quot;}</code>）を返す。</li>
<li>Claudeは結果を受け取り、次に<code>send_slack_message</code>を、引数 <code>user_id='U12345'</code>, <code>message='...お祝いメッセージ...'</code> で呼び出す必要があると判断する。</li>
<li>開発者側でSlack送信ツールを実行し、成功した旨を返す。</li>
<li>Claudeはすべてのステップが完了したことを確認し、「先月の売上トップ商品Aの担当者である山田さんに、お祝いのSlackメッセージを送信しました。」と最終報告を行う。</li>
</ol>
<p>このように、複数のツールを適切に設計・定義することで、Claudeをより高度な自律エージェントとして機能させることができます。</p>
<h2 id="まとめ">まとめ</h2>
<p>本記事では、Claudeの「Tool Use」機能を用いて、Claudeに独自の「スキル」を追加し、あなた専用の最強アシスタントへと進化させる方法を解説しました。</p>
<p>Tool Useは、単なる機能追加ではありません。それは、<strong>LLMという強力な「脳」に、あなたの世界のツールやシステムという「手足」を与える</strong>ことに他なりません。これまで分断されていたLLMの対話能力と、既存のソフトウェア資産を繋ぐ、きわめて重要な架け橋です。</p>
<p>今回紹介した基本的なフローと実践的なTipsを参考に、まずは身近なタスクを自動化する簡単なツールから試してみてください。天気予報の取得、簡単な計算、テキストファイルの読み書きなど、小さな成功体験を積み重ねることで、Tool Useの持つ無限の可能性を実感できるはずです。</p>
<p>LLMをワークフローに統合する動きは、今後ますます加速していくでしょう。Tool Useを使いこなし、Claudeを真の「相棒」として活用できるかどうかは、これからの開発者にとって大きなアドバンテージとなります。ぜひ、あなただけの「最強のClaude」を育て上げてみてください。</p>
]]></content:encoded>
      <category>Coding AI</category>
      <category>Claude Code</category>
      <category>MCP</category>
      <category>Customization</category>
    </item>
  </channel>
</rss>
