🗂

GitHub Copilot Agent Mode の MCP の Tools, Prompts, Resources の使い方

に公開

GitHub Copilot の Agent Mode が MCP (Model Context Protocol) をサポートして暫く経ちますが、個人的には Tools くらいしか使っていませんでした。
実は GitHub Copilot は Prompts と Resources にも対応しています。今回はそれらの使い方を試してみたいと思います。

Tools の使い方

Tools は Agent Mode を使っている人は、ほとんど使っていると思います。Agent Mode にしたときに、チャット欄のスパナのアイコンをクリックすると対応しているツール(MCP 以外のツールも含まれます)が表示されます。

この時出てきたリストから使いたいツールを選択しておいたり、ここでは説明しませんがツールセットなどを作っておくことで Agent Mode で使うツールを予め絞り込むことが出来ます。

試してみましょう。今回は Streamable HTTP で作っていきます。stdio もサポートしていますが、将来的には Streamable HTTP の方が重要度が上がるのではないかと思っているのでそっちでいきます。ASP.NET Core Web API プロジェクトを作成して以下のパッケージを追加します。

  • ModelContextProtocol.AspNetCore (試した時点では 0.3.0-preview.2 でした)

とりあえず現在地の天気を返すツールを作成します。返す天気はランダムにしましょう。

WeatherTools.cs というファイルを作成して以下のコードを書きます。今回の本題とは関係ありませんが DI もできるので、時間を取得するために TimeProvider を DI で注入しています。

WeatherTools.cs
using ModelContextProtocol.Server;

namespace McpTestApp;

[McpServerToolType]
public class WeatherTools(TimeProvider timeProvider)
{
    [McpServerTool(ReadOnly = true), Description("本日の天気を取得します。")]
    public string GetTodaysWeather()
    {
        var today = DateOnly.FromDateTime(timeProvider.GetLocalNow().DateTime);
        var temperatureC = Random.Shared.Next(-20, 55);
        var summary = new[]
        {
            "凍えるような寒さ", "身を切る寒さ", "肌寒い", "涼しい", "穏やか", "暖かい", "快適", "暑い", "うだるような暑さ", "灼熱"
        }[Random.Shared.Next(10)];
        return $"本日の天気({today}):{temperatureC}°C、{summary}";
    }
}

次に Program.cs を以下のように変更します。

Program.cs
using McpTestApp;

var builder = WebApplication.CreateBuilder(args);
// WeatherTools で使う TimeProvider を DI コンテナに登録
builder.Services.AddSingleton(TimeProvider.System);
// Streamable HTTP で MCP サーバーを構築
builder.Services.AddMcpServer()
    .WithHttpTransport()
    // MCP サーバーのツールを登録
    .WithTools<WeatherTools>();

var app = builder.Build();

// MCP サーバーのエンドポイントをマッピング
app.MapMcp();

app.Run();

これで実行すると以下のようにログが表示されます。

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7135
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5066
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\source\McpTestApp\McpTestApp

HTTP のエンドポイントのポート番号を控えて Visual Studio Code のコマンドパレットで MCP:Add Server... を実行して先ほどのエンドポイントを登録します。

HTTPhttp://localhost:<<先ほど起動したサーバーのポート番号>>任意の名前Workspace Settings のように入力します。 今回のようなお試し MCP サーバーを間違えても User Settings に登録することはやめましょう。登録しちゃったら消すのを忘れないようにしないとツールの定義が残り続けてめんどくさいことになります。

これで MCP サーバーが登録されました。次に GitHub Copilot のチャットで以下のように入力してみます。

今日の天気を教えて

すると以下のようにツールが呼び出されます。

ばっちりですね。

Prompts の使い方

では、続けて Prompts の使い方を見ていきましょう。まずは先ほどの MCP サーバーにプロンプトを追加していきます。

CopilotInstructionsPrompts.cs
using ModelContextProtocol.Server;
using System.ComponentModel;

namespace McpTestApp;

[McpServerPromptType]
public class CopilotInstructionsPrompts
{
    [McpServerPrompt, Description("Copilot が従うべき指示を取得します。")]
    public string GetDefaultInstructions(
        [Description("利用者の言語(JA or EN)")]
        Languages language)
    {
        return language switch
        {
            Languages.JA => "あなたは猫型アシスタントです。猫らしく振舞うために語尾は「にゃん」にしてください。",            
            Languages.EN => "You are a cat assistant. Please speak in a cute and playful way, and occasionally end your sentences with 'meow' to sound like a cat.",
            _ => throw new ArgumentOutOfRangeException(nameof(language), "Unsupported language")
        };
    }
}

public enum Languages
{
    JA,
    EN,
}

猫っぽく振舞うプロンプトを追加しました。次に Program.cs を以下のように変更してプロンプトも登録します。

Program.cs
using McpTestApp;

var builder = WebApplication.CreateBuilder(args);
// WeatherTools で使う TimeProvider を DI コンテナに登録
builder.Services.AddSingleton(TimeProvider.System);
// Streamable HTTP で MCP サーバーを構築
builder.Services.AddMcpServer()
    .WithHttpTransport()
    // MCP サーバーのツールを登録
    .WithTools<WeatherTools>()
    // MCP サーバーのプロンプトを登録
    .WithPrompts<CopilotInstructionsPrompts>();

var app = builder.Build();

// MCP サーバーのエンドポイントをマッピング
app.MapMcp();

app.Run();

プログラムをデバッグ実行した後に Visual Studio Code で MCP サーバーを Restart をしましょう。

Restart すると、以下のように Prompts が認識されていることがわかります。

GitHub Copilot の Agent Mode のチャットで / を入力するとプロンプトが出てきます。/mcp.MCPサーバーにつけた名前.get_default_instructions を選択します。そうするとパラメーターを入力するように求められるので、それを入力します。今回は JA を入力します。以下のような感じになります。

Insert as text を選択するとプロンプトがチャット欄に入力されます。

今回の例では使えないですが Run as Command を選択するとコマンドとして実行されます。

Resources の使い方

次はリソースです。リソースは MCP サーバーからファイルとかデータを AI に提供するためのものです。
ちゃんとしたケースではドキュメントとか、参考になるデータとかを提供するべきだと思うのですが今回は以下のようなどうでもいいデータを提供する感じでやります。作り方と VS Code での使い方が主題なので。

using ModelContextProtocol.Server;
using System.ComponentModel;

namespace McpTestApp;

[McpServerResourceType]
public class DogResources
{
    [McpServerResource, Description("可愛い犬の名前")]
    public string GetCuteDog() => "実家の犬の名前はベリーです!吠えてくるけどかわいいよ!";
}

このリソースも Program.cs で以下のように登録します。

Program.cs
using McpTestApp;

var builder = WebApplication.CreateBuilder(args);
// WeatherTools で使う TimeProvider を DI コンテナに登録
builder.Services.AddSingleton(TimeProvider.System);
// Streamable HTTP で MCP サーバーを構築
builder.Services.AddMcpServer()
    .WithHttpTransport()
    // MCP サーバーのツールを登録
    .WithTools<WeatherTools>()
    // MCP サーバーのプロンプトを登録
    .WithPrompts<CopilotInstructionsPrompts>()
    // MCP サーバーのリソースを登録
    .WithResources<DogResources>();

var app = builder.Build();

// MCP サーバーのエンドポイントをマッピング
app.MapMcp();

app.Run();

では実行して、VS Code で MCP サーバーを Restart します。コマンドパレットから MCP: Browse Resources を実行してみましょう。

そうすると以下のように登録されているリソースが表示されます。

リソースを選択すると以下のように内容が表示されます。

いい感じですね。GitHub Copilot のチャットで Add Context... を選択すると、追加するコンテキストの選択肢が出てくるのですが、ここにも
MCP Resources... が表示されます。

MCP Resources... を選択すると、先ほどのリソースが表示されるので、選択しするとチャットの入力欄の上にリソースが追加されます。この状態でチャットを行うと、リソースの内容をコンテキストに含んだ状態で回答をしてくれます。

まとめ

GitHub Copilot の Agent Mode で MCP を使うと、ツールだけでなくプロンプトやリソースも使えます。(正直知らなかった)
今回はシンプルな例で静的なデータを返していましたが、状況に応じて動的なデータを返すようにすることで通常の Copilot への xxx.instructions.mdxxx.chatmode.md のようなファイルを使うよりも、より柔軟に AI に指示やコンテキストを与えることが出来る余地があると思います。もしくは xxx.instructions.mdxxx.chatmode.md で、それらのツールなどを使うように指示しておくことで、より柔軟な AI の振る舞いを実現できるのではないかと思います。

個人的には静的なファイルの指示だけで大多数のことは出来ると思うので MCP の主戦場はツールだと思っていますが、プロンプトやリソースも手札として知っておくと、何かあったときに役に立つかもしれません。

Microsoft (有志)

Discussion