Sisk

モデルコンテキストプロトコル

このページは英語から自動翻訳されています。 原文を読む

大規模言語モデル(LLM)を使用してエージェントモデルにコンテキストを提供するアプリケーションを、Sisk.ModelContextProtocol パッケージで構築することができます:

dotnet add package Sisk.ModelContextProtocol --prerelease

このパッケージは、Streamable HTTP 上で動作し、単一のリクエスト/レスポンスメッセージをサポートする MCP サーバーを構築するための便利なクラスとメソッドを提供します。バージョン 1.7.0-rc1 以降、プロトコルバージョン 2026-07-28 のステートレスリクエストをサポートし、2025-11-25、2025-06-18、2025-03-26 バージョンを使用するクライアント向けにレガシーな初期化フローを保持しています。ツールとスキルもサポートします。

注記

開始する前に、このパッケージは開発中であり、仕様に準拠しない動作を示す可能性があることに注意してください。開発中の内容やまだ動作しないものについては、パッケージの詳細 をご覧ください。

MCP の開始方法 #

McpProvider クラスは MCP サーバーを定義するためのエントリーポイントです。これはシールドされたプロバイダーオブジェクトで、起動時に構成できます。Sisk アプリケーションは 1 つまたは複数の MCP プロバイダーを持つことができます。

C#
McpProvider mcp = new McpProvider(
    serverName: "math-server",
    serverTitle: "Mathematics server",
    serverVersion: new Version(1, 0));

mcp.Tools.Add(new McpTool(
    name: "math_sum",
    description: "Sums one or more numbers.",
    schema: JsonSchema.CreateObjectSchema(
        properties: new Dictionary<string, JsonSchema>()
        {
            { "numbers",
                JsonSchema.CreateArraySchema(
                    itemsSchema: JsonSchema.CreateNumberSchema(),
                    minItems: 1,
                    description: "The numbers to sum.")
            }
        },
        requiredProperties: ["numbers"]),
    executionHandler: async (McpToolContext context) =>
    {
        var numbers = context.Arguments["numbers"].GetJsonArray().ToArray<double>();
        var sum = numbers.Sum();
        return await Task.FromResult(McpToolResult.CreateText($"Sum result: {sum:N4}"));
    }));

アプリケーションが 1 つの MCP プロバイダーだけを提供する場合は、ビルダーのシングルトンを使用できます:

C#
static void Main(string[] args)
{
    using var host = HttpServer.CreateBuilder()
        .UseMcp(mcp =>
        {
            mcp.ServerName = "math-server";
            mcp.ServerTitle = "Mathematics server";

            mcp.Tools.Add(new McpTool(
                name: "math_sum",
                description: "Sums one or more numbers.",
                schema: JsonSchema.CreateObjectSchema(
                    properties: new Dictionary<string, JsonSchema>()
                    {
                        { "numbers",
                            JsonSchema.CreateArraySchema(
                                itemsSchema: JsonSchema.CreateNumberSchema(),
                                minItems: 1,
                                description: "The numbers to sum.")
                        }
                    },
                    requiredProperties: ["numbers"]),
                executionHandler: async (McpToolContext context) =>
                {
                    var numbers = context.Arguments["numbers"].GetJsonArray().ToArray<double>();
                    var sum = numbers.Sum();
                    return await Task.FromResult(McpToolResult.CreateText($"Sum result: {sum:N4}"));
                }));
        })
        .UseRouter(router =>
        {
            router.MapAny("/mcp", async (HttpRequest req) =>
            {
                return await req.HandleMcpRequestAsync();
            });
        })
        .Build();

    host.Start();
}

エンドポイントは GET と POST の両方のリクエストを受け付ける必要があるため、MapAny が最もシンプルなルートマッピングです。HandleMcpRequestAsync は HttpResponse を返し、ルートはそれを返す必要があります。アプリ内で複数のプロバイダーが必要な場合は、シングルトンを使用せず、各ルートから直接 McpProvider.HandleRequestAsync を呼び出してください:

C#
var mathProvider = new McpProvider("math-server", "Mathematics server", new Version(1, 0));

router.MapAny("/mcp/math", async request =>
{
    return await mathProvider.HandleRequestAsync(request);
});

関数用 JSON スキーマの作成 #

[Sisk.ModelContextProtocol] ライブラリは JSON と JSON スキーマ操作のために LightJson のフォークを使用しています。この実装はさまざまなオブジェクト向けに流暢な JSON Schema ビルダーを提供します:

  • JsonSchema.CreateObjectSchema
  • JsonSchema.CreateArraySchema
  • JsonSchema.CreateBooleanSchema
  • JsonSchema.CreateNumberSchema
  • JsonSchema.CreateStringSchema
  • JsonSchema.Empty

例:

C#
JsonSchema.CreateObjectSchema(
    properties: new Dictionary<string, JsonSchema>()
    {
        { "numbers",
            JsonSchema.CreateArraySchema(
                itemsSchema: JsonSchema.CreateNumberSchema(),
                minItems: 1,
                description: "The numbers to sum.")
        }
    },
    requiredProperties: ["numbers"]);

以下のスキーマが生成されます:

JSON
{
  "type": "object",
  "properties": {
    "numbers": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "minItems": 1,
      "description": "The numbers to sum."
    }
  },
  "required": ["numbers"]
}

関数呼び出しの処理 #

McpTool の executionHandler パラメーターで定義された関数は、呼び出し引数を含む JsonObject を提供し、流暢に読み取ることができます:

C#
mcp.Tools.Add(new McpTool(
    name: "browser_do_action",
    description: "Run an browser action, such as scrolling, refreshing or navigating.",
    schema: JsonSchema.CreateObjectSchema(
        properties: new Dictionary<string, JsonSchema>()
        {
            { "action_name",
                JsonSchema.CreateStringSchema(
                    enums: ["go_back", "refresh", "scroll_bottom", "scroll_top"],
                    description: "The action name.")
            },
            { "action_data",
                JsonSchema.CreateStringSchema(
                    description: "Action parameter."
                ) }
        },
        requiredProperties: ["action_name"]),
    executionHandler: async (McpToolContext context) =>
    {
        // アクション名を読み取ります。null または明示的な文字列でない場合は例外がスローされます
        string actionName = context.Arguments["action_name"].GetString();
        
        // action_data は必須ではないため、ここでは null になる可能性があります
        string? actionData = context.Arguments["action_data"].MaybeNull()?.GetString();
        
        // actionName に基づいてブラウザアクションを処理します
        return await Task.FromResult(
            McpToolResult.CreateText($"Performed browser action: {actionName}"));
    }));

ツールの引数はハンドラが実行される前にスキーマに対して検証されます。検証に失敗した場合、プロバイダーはエラー結果を MCP クライアントに返し、ツールハンドラは呼び出されません。

関数の結果 #

McpToolResult オブジェクトは、ツールレスポンス用のコンテンツを作成するための 3 つのメソッドを提供します:

さらに、複数の異なるコンテンツを単一の JSON ツールレスポンスに結合することが可能です:

C#
mcp.Tools.Add(new McpTool(
    ...
    executionHandler: async (McpToolContext context) =>
    {
        // 実際の作業をシミュレート

        byte[] browserScreenshot = await browser.ScreenshotAsync();
        
        return McpToolResult.Combine(
            McpToolResult.CreateText("Heres the screenshot of the browser:"),
            McpToolResult.CreateImage(browserScreenshot, "image/png")
        )
    }));

プロバイダーは現在、server/discover、レガシーな initialize と ping メソッド、tools/list、tools/call、skills/list、skills/get、resources/list、resources/read、および通知を処理します。サポートされていない JSON-RPC メソッドは JSON-RPC エラーレスポンスを返します。

スキルの公開 #

MCP プロバイダーは io.modelcontextprotocol/skills 拡張を通じて Agent Skills を公開することもできます。プロバイダーがリクエストの処理を開始する前に、McpSkill オブジェクトを McpProvider.Skills に追加します:

C#
mcp.Skills.Add(new McpSkill(
    path: "acme/refunds",
    frontmatter: new JsonObject
    {
        ["name"] = "refunds",
        ["description"] = "Follow the refund workflow."
    },
    body: "# Refunds\nRead references/policy.md before using the refund tools.",
    files: new Dictionary<string, byte[]>
    {
        ["references/policy.md"] = File.ReadAllBytes("skills/refunds/references/policy.md")
    }));

McpSkill は frontmatter と Markdown 本文から SKILL.md ファイルを生成します。path の最後のセグメントは frontmatter の name フィールドと一致しなければなりません。スキルファイルはスキル作成時にコピーされ、プロバイダーによってディスクから読み取られることはありません。クライアントは skills/list、skills/get、resources/read を使用してスキルを一覧取得・読み取りし、2026-07-28 プロトコルバージョンを使用します。制限や検証ルールについては、パッケージの詳細 を参照してください。

今後の作業 #

Model Context Protocol はエージェントモデルとそれらにコンテンツを提供するアプリケーション間の通信プロトコルです。新しいプロトコルであるため、仕様は非推奨項目や新機能、破壊的変更などで常に更新されるのが一般的です。

エージェントアプリケーションの構築を始める前に、Model Context Protocol が解決する課題を理解することが重要です。

また、Sisk.ModelContextProtocol パッケージの仕様を読んで、進捗、ステータス、そして何ができるかを把握してください。

ドキュメントと API リファレンスを検索するには入力してください。