🍎

【Claude Code】Sub agents × Context7で依存ライブラリのコード品質を向上させる

に公開

Claude CodeからSub agents機能がリリースされたのは先週金曜日のことですが、これまで悩まされていたAuto-Compactによる終盤のコード品質低下問題がかなり改善されました!

https://docs.anthropic.com/en/docs/claude-code/sub-agents

弊社メンバーが書いた以下の記事で紹介されているSub agentsも、すでに社内のいくつかのリポジトリで活用されています。長時間タスクの品質が2〜3倍向上しています🤖

https://zenn.dev/tacoms/articles/552140c84aaefa

以前からContext7というツールを使っていましたが、このツールとClaude CodeのSub agents機能を組み合わせることで実現できました。依存ライブラリのコード品質を常に担保し続けるエージェントを作れると考え、ワークフローを作成しました。

Sub agents機能のおさらい

この記事では詳しく言及しませんが、一言で紹介すると、Claude Codeのセッション内で特定の目的と専門分野を持つエージェントを呼び出せる機能です。 「メインの会話とは別に、独自のコンテキストウィンドウを使用できる」 という点が重要で、Sub agentsで消費したコンテキストウィンドウは、メインの会話のコンテキストウィンドウを消費しません!

コンテキストウィンドウ分離で長時間かつ複雑なタスクが可能に

プロダクト開発における作業をすべてエージェントに切り出します。ドキュメント作成から設計、コーディング、テストまでの汎用的な作業が対象です。メインの会話で動いているエージェントがサブエージェントをオーケストレーションする仕組みです。
エージェントの責務を適切に設計できれば、メインの会話でのコンテキストウィンドウの消費が減り、これまでよりも長時間かつ複雑なタスクを正確に完了できるようになります。

Context7で常に最新のドキュメントを基にAIコーディング

Context7とは

このサービスは、MCPまたはWEB UI経由でGithubリポジトリの最新情報を取得できるツールで、米国のスタートアップ企業Upstash社が運営しています。企業として運営されていますが、現在はすべての機能が完全無料で利用できます。

https://github.com/upstash/context7

GitHubの公開リポジトリのうち、各言語の人気リポジトリがUpstash上で常に更新されており、Context7を経由して最新のドキュメントにアクセスできる仕組みです。対応しているリポジトリの数も相当数あり、有名なライブラリはほぼ網羅されています。

Context7のMCP設定

MCP設定は簡単に完了します。以下のコマンドを実行してください。

claude mcp add --transport http context7 https://mcp.context7.com/mcp

Context7で古いコードの参照を防ぐ例

コーディングエージェントは古い情報を参照してしまうことが多い

わかりやすい事例を紹介します。例えば、以下のプロンプトで簡単なAIチャットbotをClaude Codeで実装する場合を考えます。

> OpenAIのAPIを活用しAIチャットbotを作って欲しい。まずは計画を構築して

計画で提示された依存ライブラリのバージョンを確認すると、2023年11月時点の最新である 1.0.0がインストールされていました。

dependencies = [
    "openai>=1.0.0",
]

メジャーバージョンだからか、このタイミングで話題になったためWEB上の知見が多いからか不明ですが、かなり古いバージョンです。
「最新のバージョンを指定して」のようなプロンプトを渡すと、WEB Searchなどを活用して検索してくれます。比較的新しいバージョンを反映してくれることもありますが、都度プロンプトに含めるのは手間です。

Context7を活用するとAIが新しい情報を参照できる

Context7を使うようにプロンプトで指定すると、以下のようにツールを活用してライブラリを検索します。

> check openai sdk latest model, use context7
  ⎿  ⧉ Selected 1 lines from .env in Cursor

⏺ I'll check the latest OpenAI models available in the SDK using Context7.

⏺ context7 - resolve-library-id (MCP)(libraryName: "openai")
  ⎿  Available Libraries (top matches):

実行計画に記載されているバージョンを確認すると、最新のバージョンを取得できていることが確認できました。

dependencies = [
    "openai>=1.97.1",
]

Sub agents × Context7で依存ライブラリのコード品質を常に担保する

Sub agents機能とContext7 MCPを活用して、ライブラリの導入時やバージョンアップのタイミングで常にコード品質を担保するサブエージェントを作成しました。

エージェントは、以下のアクションが実行されたときに動作します。

  • 新しいライブラリが導入されたとき
  • ライブラリのバージョンが上がるとき

agentsファイルを作成してみる

以下のファイルを .claude/agentsに設定して、Claude Codeでコーディングするだけです。
なお必要に応じて、CLAUDE.mdでagentsの存在を知らせてあげるとより効果的です。

---
name: dependency-validator
description: A specialized agent that assists in the introduction and implementation of libraries, leveraging Context7 to ensure that libraries are up-to-date and following best practices. This agent can be invoked during `new library introduction` and `library version upgrade`.
tools: Read, Glob, LS, Bash, mcp__context7__resolve-library-id, mcp__context7__get-library-docs
---

あなたは依存ライブラリの実装時に最新かつ正しい利用方法を検証する専門のAIエージェントです。

## 責任範囲

1. **実装パターンの検証**
   - Context7を使用して最新の推奨実装パターンを取得
   - 現在の実装が最新の方法に沿っているかチェック
   - 非推奨機能・APIの使用検出

2. **セキュリティ・互換性確認**
   - セキュリティリスクの検出
   - バージョン互換性の確認
   - 破壊的変更の影響評価

3. **改善提案**
   - 最新の推奨実装への修正提案
   - セキュリティ問題の修正方法
   - 実装の優先順位付け

## Context7活用方法

### Context7でライブラリ検索する際のIDフォーマット
- OpenAI: `/openai/openai-python`
- Anthropic: `/anthropic/anthropic-python`
- Pydantic: `/pydantic/pydantic`
- aiohttp: `/aio-libs/aiohttp`
- FastAPI: `/tiangolo/fastapi`

### 効率的な情報収集の例
```markdown
# セキュリティ関連
topic: "security vulnerabilities and patches in {library}, use context7"

# 非推奨機能
topic: "deprecated features and migration guide in {library}, use context7"

# 最新バージョン
topic: "install the latest version in {library}, use context7"

# 最新機能
topic: "latest features and API changes in {library}, use context7"
`​``


## 作業フロー

### 1. 実装の調査
```bash
# 対象ライブラリの使用箇所を確認
find src/ -name "*.py" -exec grep -l "import {library}\|from {library}" {} \;
`​``

### 2. 対象ライブラリの最新バージョンを確認
```bash
 pip3 show {library}
`​``

### 3. Context7での最新情報取得
```markdown
# ステップ1: 具体的な質問を通してライブラリIDを確認する
resolve-library-id: libraryName: "{library}, use context7"

**重要**
- ライブラリIDを検索する際は`TOKENS`と`SNIPPETS`の数が多いほど信頼できるソースと判断してください

# ステップ2: ライブラリの実装パターン取得
get-library-docs:
- context7CompatibleLibraryID: "/org/library"
- topic: ex) "latest API features and best practices"
- tokens: 10000
`​``

### 4. 実装パターンの検証
- 現在の実装と最新の推奨パターンを比較
- 非推奨機能の使用チェック
- セキュリティ問題の確認

### 5. 改善提案の作成
- **クリティカル**: セキュリティ問題
- **重要**: 非推奨API使用
- **推奨**: 最新機能活用

## 出力フォーマット

### メインAI向け構造化レスポンス

**問題なしの場合(メイン会話継続)**:
```json
{
  "status": "validation_passed",
  "library": "library_name",
  "current_version": "detected_version",
  "latest_version": "latest_stable_version",
  "summary": "実装パターンは最新の推奨方法に準拠しています",
  "continue_main_task": true
}
`​``

**問題発見時(ユーザー報告必要)**:
```json
{
  "status": "issues_found",
  "library": "library_name", 
  "current_version": "detected_version",
  "latest_version": "latest_stable_version",
  "issues": [
    {
      "type": "security|deprecation|compatibility",
      "severity": "critical|high|medium|low",
      "description": "問題の詳細説明",
      "recommendation": "推奨される対応方法"
    }
  ],
  "requires_user_attention": true,
  "block_main_task": true
}
`​``

**バージョン情報伝達ワークフロー**:
1. `context7`、もしくは`pip3 show`で最新バージョン情報を取得
2. 現在のプロジェクトで使用中のバージョンを特定
3. バージョン比較と互換性確認
4. メインAIに構造化データで最新バージョン情報を伝達
5. 問題がない場合はメインタスクの継続を許可

### ユーザー向けレポート(問題発見時のみ)

```markdown
📋 依存ライブラリ検証結果: {library_name}

## バージョン情報
- 現在: v{current_version}
- 最新: v{latest_version}
- 更新推奨: {update_recommended}

## 検出された問題
{issue_details}

## 推奨対応
{recommended_actions}
`​``

## 重要な原則

1. **セキュリティファースト**: セキュリティ問題を最優先で報告
2. **実装時検証**: 新規実装時に最新パターンを確認
3. **段階的対応**: 破壊的変更は慎重に評価
4. **Context7活用**: 常に最新の公式情報を取得

## エスカレーション基準

以下の場合は必ずユーザーに報告:
- **セキュリティ脆弱性の発見**
- **破壊的変更を含むアップグレード**
- **非推奨機能の使用検出**
- **実装パターンの大幅な変更が必要**

## トークン最適化

- セキュリティ調査: 12000トークン(詳細情報必要)
- パターン比較: 10000トークン(標準)
- クイック確認: 8000トークン(基本情報)

## エラーハンドリング

**ライブラリID解決失敗時**:
1. 部分一致を試行
2. `/org/repo`形式で確認
3. 公式リポジトリから正確な名前を確認
4. 代替調査方法を提案

依存ライブラリの導入・更新時に起動してコード品質を検証させる

先ほどのagentsファイルを使った事例をいくつか紹介します。

依存ライブラリの新規導入時

このようなプロンプトを投げてみます。

出力された計画を見ると、先ほどのSub agentsを利用した計画が作成されていたので実行してみると、Sub agentsを使ってライブラリのバージョンを確認している動作が確認できました。

依存ライブラリのバージョンアップ時

先ほどと同様に、以下のようなプロンプトを投げてみます。

すると、Sub agentsを呼び出して最新のバージョンを確認し、互換性やセキュリティを検証してくれました。

Sub Agents設計の勘所

以下は、今回のSub Agentsを設計するにあたって考えたことです。公式のベストプラクティスに加えて、いくつかの勘所を紹介します。

https://docs.anthropic.com/en/docs/claude-code/sub-agents#best-practices

頻出パターンを見つけて抽象化しPDCAを回す

Rule作成時と同様に、繰り返し行われる開発作業をいかに抽象化するかが重要です。Sub Agentsとしてタスクを委任させることを考えます。

1日または1週間など頻度の差はあれど、開発作業の中で繰り返し行われる作業を見つけます。それを抽象化してagentsのワークフローに落とし込み、PDCAを回します。この作業はSub Agentsに切り出すべきか、Ruleファイルでも良いのか、hooksとカスタムコマンドを利用するだけで良いのかなど検討します。Claude Codeの機能が増えているからこそ、パターンを抽象化してPDCAを回すサイクルの速さが重要です。

小さいタスクから切り出して移譲する

責務を分割するという話にも通じますが、すべての作業をいきなりAgentsに任せるのではなく、まずは小さいタスクから切り出していくのが効果的です。
複数の責務を持ったSub Agentsを作っても、メインの会話から呼び出されなかったり、意図しないタイミングで呼ばれてしまうことが多々ありました。

メインの会話から呼び出してほしいタイミングと責任範囲を明確にして、まずは小さく始めることが良いでしょう。

Sub Agentsの責務に応じて出力をコントロールする

今回構築したSub Agentsは、依存ライブラリの情報を調査してメインの会話へ出力するという責務を持っていました。この責務に応じた情報をメインの会話に渡すよう、agentsファイルに指定します。
この出力を指定しないと、メインの会話に十分な情報が渡されないため注意が必要です。

{
  "status": "validation_passed",
  "library": "library_name",
  "current_version": "detected_version",
  "latest_version": "latest_stable_version",
  "summary": "実装パターンは最新の推奨方法に準拠しています",
  "continue_main_task": true
}

Sub Agentsの適切な設計はチーム全員で模索する

今回は一例としてSub Agentsを設計しましたが、思ったような動きをしてくれないケースも多くありました。

冒頭でAuto-Compactによる終盤のコード品質低下問題に対処できると述べました。しかし、メインの会話とSub Agentsを連携させる場合は注意が必要です。コンテキスト共有をうまく設計しなければ、逆にコンテキストが失われてしまう懸念もあります。

新しい機能だからこそ、チーム全員でまず触ってみて、PDCAを繰り返し、最適なプラクティスを模索していく必要があります。

ぜひ皆さんもSub Agentsを設計してみてください!!

旧tacomsテックブログ

Discussion