Amazon Web Services ブログ

エージェントステアリングと MCP を使って Kiro に新しいスキルを教える方法

本記事は 2025 年 10 月 23 日に公開された Brian Beach による “Teaching Kiro new tricks with agent steering and MCP” を翻訳したものです。

はじめに

過去 3 年間、私は数百の顧客がソフトウェア開発に AI ツールを採用するのを支援してきました。これらの顧客の多くは、独自のライブラリ、ツール、さらにはドメイン固有言語(DSL)を開発しています。ワークフロー自動化言語、設定構文、ルールエンジンなど、これらのカスタマイズはビジネス運営の基盤となっています。しかし、AI コーディングアシスタントにこれらの独自ライブラリを理解させ、連携させたい場合はどうすればよいでしょうか?

この記事では、AI エージェントおよび開発環境である Kiro に、MathJSON というライブラリを理解させる方法を探ります。MathJSON はこのデモンストレーションのために作成された架空のライブラリですが、企業が日常的に使用するワークフロー言語、設定システム、専門的な表記法の代理として機能します。この記事全体を通して、ステアリングModel Context Protocol(MCP)について説明し、これらを組み合わせて Kiro に新しいスキルを教える方法を紹介します。

MathJSON との出会い

この記事では、MathJSON を使用します。これは、適切な数学用語を使用する JSON ベースの数式表現言語です。MathJSON はこの記事のために作成されたものであり、実際のアプリケーションでの使用は推奨しないことに注意してください。以下が興味深い点です。

主な特徴

  • 構造化された数式表現のための JSON ベースの構文
  • 適切な数学用語 (加数、被減数、被乗数など)
  • 複雑な計算のためのネストされた式
  • 豊富な関数ライブラリ (三角関数、対数、定数)
  • ファイル拡張子: .math

式の例

{
  "multiplication": {
    "multiplicand": {"pi": {}},
    "multiplier": {
      "pow": {
        "base": {"variable": "env:RADIUS"},
        "exponent": 2
      }
    }
  }
}

この例は、環境変数として渡された半径に対する円の面積を計算します。pi * radius^2

ステアリングファイルで Kiro をガイドする

ステアリングは、マークダウンファイルを通じてプロジェクトに関する永続的な知識を Kiro に提供します。これらのファイルは .kiro/steering/ に保存され、ワークスペース内のすべてのインタラクションにコンテキストと指示を提供します。ステアリングファイルには、コーディング標準、プロジェクト構造などが含まれます。

最初に思いつくのは、MathJSON のドキュメントをステアリングフォルダに追加することかもしれません。私はまさにそれを行い、function_reference.md ファイルをステアリングフォルダに追加しました。これは良いスタートですが、いくつかの問題があります。第一に、ドキュメントは人間向けに書かれています。その結果、冗長で繰り返しが多くなります。第二に、Kiro が従うべき具体的なベストプラクティスが欠けています。第三に、プロジェクトフォルダにコピーされたドキュメントは必然的に古くなります。これらの問題とその対処方法を見ていきましょう。

ステアリングファイルの洗練

克服したい最初の問題は、ドキュメントの冗長性です。当然ながら、適切なドキュメントが存在することを前提としています。もしない場合は、Kiro が生成を手伝ってくれます。人間向けに作成されたドキュメントは、ステアリングファイルに含めるには冗長すぎることがよくあります。MathJSON はこの記事のために作成したシンプルなプロジェクトですが、それでも 6 つのマークダウンファイルにわたって 3500 行以上のドキュメントがあります。これは、Kiro とのすべての会話に追加するには情報が多すぎます。

幸いなことに、Kiro はステアリングファイルを洗練してくれます。Kiro でステアリングファイルを開き、Refine ボタンを選択するだけです。Kiro はファイルを読み取り、最適化してくれます。

Kiro が行った変更の 1 つを見てみましょう。元のドキュメントでは、加算は次のように説明されています。

## 算術演算

### 加算
適切な数学用語を使用して2つの数値の加算を実行します。

**構文:**
```json
{
  "addition": {
    "addend1": ,
    "addend2": 
  }
}
```

**パラメータ:**
- `addend1` (number|expression): 加算する最初の数値
- `addend2` (number|expression): 加算する2番目の数値

**戻り値:** 2つの加数の合計

**数式:** addend1 + addend2 = sum

**例:**
```json
// 単純な加算
{
  "addition": {
    "addend1": 15,
    "addend2": 25
  }
}
// 結果: 40

// ネストされた式を使用した加算
{
  "addition": {
    "addend1": {
      "multiplication": {
        "multiplicand": 3,
        "multiplier": 4
      }
    },
    "addend2": 8
  }
}
// 結果: 20 (12 + 8)
```

Kiro はこれを洗練し、1 行に置き換えました。ネストされた式などの詳細は、洗練されたファイルで一度だけカバーされ、各操作の例で繰り返されることはありません。したがって、ここで繰り返す必要はありません。

### 算術演算
- `addition`: `{addend1, addend2}` - 基本的な加算

全体として、これは素晴らしいスタートです。ステアリングファイルは 3,500 行から 102 行に削減されました。他に何もしない場合でも、refine オプションを使用してステアリングファイルを最適化してください。ただし、さらに改善を続けることができます。

ベストプラクティスの定義

克服したい次の問題は、ドキュメントの具体性です。ユーザードキュメントは広範囲にわたる傾向があります。ライブラリや言語を使用できるすべての方法をカバーすることに焦点を当てています。しかし、ステアリングファイルは指針を持つべきです。Kiro が MathJSON をどのように使用できるかを伝えるのではなく、Kiro がどのように使用すべきかを正確に伝えたいのです。

Kiro は前のセクションでドキュメントを洗練したときにベストプラクティスの定義を開始しました。しかし、追加のルールを加えます。具体的には、Kiro が書くすべてのコードを検証およびテストすることを望んでいます。そこで、いくつかの新しいベストプラクティスを追加します。

5. **リテラルよりも定数**: 精度のために`3.14159`の代わりに`{"pi": {}}`を使用
6. **コードを検証**: `mathjson`がローカルにインストールされていると仮定します。`*.math`ファイルを作成または編集するときは、リントとテストを行います。

ステアリングファイルには、コマンドラインツールの使用方法に関する指示がすでに含まれていることに注意してください。それを繰り返すのではなく、Kiro にいつ使用するかを指示しています。ステアリングファイルは形になり始めていますが、時間の経過とともにどのように最新の状態を保つのでしょうか?

知識を最新の状態に保つ

克服したい最初の問題は、ドキュメントの鮮度です。時間の経過とともに、MathJSON は進化し、変化していきます。たとえば、最近三角関数のサポートを追加しました。ステアリングファイルで維持しなければならないコピーではなく、Kiro が元のドキュメントにアクセスできることを望んでいます。ここで Model Context Protocol(MCP)の出番です。

MathJSON の場合、GitHub リポジトリが信頼できる情報源です。したがって、GitHub 用の MCP サーバーを設定しました。これで、Kiro は必要なときに最新のドキュメントを読むことができます。GitHub は単なる例であることに注意してください。GitLab、Confluence などにドキュメントを保管している場合、それらにも MCP サーバーがある可能性があります。

Kiro が GitHub のドキュメントに直接アクセスできるようになったので、ステアリングファイルを削除したくなるかもしれません。しかし、実際には両方が必要であることがわかりました。Kiro に 2 つの数値を足し算する関数を作成 するように依頼したとします。そのプロンプトには、MathJSON を使用することや、MathJSON のドキュメントが GitHub に保存されていることを示すものは何もありません。Kiro は MathJSON ではなく Python で関数を書く可能性が高いです。ステアリングファイルは、Kiro が点と点を結ぶのに役立ちます。

次の例では、MathJSON を使用していることと、ドキュメントが GitHub で利用可能であることを Kiro に伝えるためにステアリングファイルを更新したことがわかります。さらに、GitHub の MCP サーバーを使用してドキュメントにアクセスするように Kiro に指示しました。

# MathJSON DSL 概要
このプロジェクトは、数式のためのドメイン固有言語である MathJSON を使用しています。MathJSON は、JSON 構文を使用して数式を表現および操作する構造化された方法を提供します。

## 主要なドキュメント参照

完全な MathJSON ドキュメントは、YOUR_ORG_NAME/mathjson リポジトリで利用できます。これらのファイルにアクセスするには、GitHub MCP サーバーを使用してください。
- **メインドキュメント**: owner="sampleorg", repo="mathjson", path="README.md"で`mcp_github_get_file_contents`を使用
- **関数リファレンス**: owner="sampleorg", repo="mathjson", path="function_reference.md"で`mcp_github_get_file_contents`を使用
- **構文リファレンス**: owner="sampleorg", repo="mathjson", path="syntax_reference.md"で`mcp_github_get_file_contents`を使用
- **例**: owner="sampleorg", repo="mathjson", path="examples.md"で`mcp_github_get_file_contents`を使用
- **環境変数**: owner="sampleorg", repo="mathjson", path="ENVIRONMENT_VARIABLES.md"で`mcp_github_get_file_contents`を使用
- **トラブルシューティング**: owner="sampleorg", repo="mathjson", path="TROUBLESHOOTING_VARIABLES.md"で`mcp_github_get_file_contents`を使用

特定のファイルへの参照を提供していることに注意してください。これはパフォーマンスの最適化です。リポジトリへの参照だけを提供した場合、Kiro はリポジトリを探索してファイルを読むのに時間がかかりすぎます。また、GitHub は理想的なドキュメントリポジトリではないことも指摘しておきたいと思います。Kiro は、ドキュメントをトピックにチャンク化し、それらのチャンクをベクトルデータベースに保存することで恩恵を受けるでしょう。これにより、Kiro は必要なドキュメントの部分だけにアクセスできます。ただし、この記事は少し長くなっているので、そのトピックは別の記事に残しておきます。

Kiro に知識の更新を依頼する

この時点で、私のステアリングファイルは主にドキュメントへのポインタとして機能しています。ただし、ベストプラクティスセクションとともに、ステアリングファイルにいくつかの高レベルのドキュメントがまだあります。さらに重要なことに、定期的にステアリングファイルを更新するように Kiro に依頼しています。Kiro が間違いを犯したり、問題に遭遇したりするたびに、問題がまだコンテキストにある間に更新を行うように Kiro に依頼します。

次の例では、Kiro が環境変数のフォーマットの問題に取り組んでいるのがわかります。リンターが問題を特定すると、Kiro は MCP サーバーを使用してドキュメントを読み、エラーを修正します。

Kiro がこれらの問題に取り組むにつれて、新しいスキルを学びます。ただし、その新しい知識は会話の期間中のみ保持されます。したがって、Kiro は将来のセッションで同じ間違いを犯す可能性があります。これは、ステアリングファイルを更新するように Kiro に依頼する絶好の機会です。

MathJSON の環境変数の構文について学んだ後、Kiro はステアリングファイルに次のセクションを追加しました。

## 環境変数のベストプラクティス

### 変数構文
- 環境変数には`{"variable": "env:VARIABLE_NAME"}`構文を使用
- 変数名は文字またはアンダースコアで始まり、英数字とアンダースコアのみを含む必要があります
- `PRINCIPAL`、`ANNUAL_RATE`、`LOAN_TERM_YEARS`のような説明的な名前を使用

時間の経過とともに、Kiro はガイダンスを洗練し続け、私の DSL に関する知識を拡大し、書くコードを改善していきます。

すべてをまとめる

数回の反復の後、Kiro は MathJSON を作成する準備ができています。住宅ローンの過払いをモデル化する関数を作成するように Kiro に依頼します。

元金、金利、過払い額を入力として受け取り、ローンの期間中の節約額を返す住宅ローン過払いをモデル化する関数を作成してください。

Kiro は私のために MathJSON を生成する準備ができました。以下は、住宅ローン過払い計算のために Kiro が生成した MathJSON です。

{
  "multiplication": {
    "multiplicand": {"variable": "env:OVERPAYMENT_AMOUNT"},
    "multiplier": {
      "subtraction": {
        "minuend": {
          "multiplication": {
            "multiplicand": {"variable": "env:LOAN_TERM_YEARS"},
            "multiplier": 12
          }
        },
        "subtrahend": {
          "division": {
            "dividend": {
              "log": {
                "value": {
                  "subtraction": {
                    "minuend": 1,
                    "subtrahend": {
                      "division": {
                        "dividend": {
                          "multiplication": {
                            "multiplicand": {"variable": "env:OVERPAYMENT_AMOUNT"},
                            "multiplier": {
                              "division": {
                                "dividend": {"variable": "env:ANNUAL_RATE"},
                                "divisor": 12
                              }
                            }
                          }
                        },
                        "divisor": {"variable": "env:PRINCIPAL"}
                      }
                    }
                  }
                },
                "base": {
                  "addition": {
                    "addend1": 1,
                    "addend2": {
                      "division": {
                        "dividend": {"variable": "env:ANNUAL_RATE"},
                        "divisor": 12
                      }
                    }
                  }
                }
              }
            },
            "divisor": {
              "log": {
                "value": {
                  "addition": {
                    "addend1": 1,
                    "addend2": {
                      "division": {
                        "dividend": {"variable": "env:ANNUAL_RATE"},
                        "divisor": 12
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

そしてもちろん、Kiro はステアリングファイルで定義されたベストプラクティスに従って、書いたコードをリントおよびテストし、コードが構文的に正しいことを検証します。

結論

MathJSON のようなカスタムライブラリを理解し、それと連携するように Kiro を教えることは、ステアリングファイルと Model Context Protocol を組み合わせる力を示しています。この記事で概説されたアプローチ(ドキュメントの洗練、明確なベストプラクティスの確立、最新の知識のための MCP の活用)に従うことで、カスタムライブラリ、言語、ツールと連携するように Kiro へ教えることができます。Kiro を始めましょう