次の方法で共有


Azure Functions の MCP ツール トリガー

MCP ツール トリガーを使用して、 モデル コンテンツ プロトコル (MCP) サーバーでツール エンドポイントを定義します。 クライアント言語モデルとエージェントは、ツールを使用して、コード スニペットの格納やアクセスなどの特定のタスクを実行できます。

セットアップと構成の詳細については、概要に関するページをご覧ください。

C# の場合、Azure Functions MCP 拡張機能では 、分離されたワーカー モデルのみがサポートされます。

このコードは、名前付きコード スニペットを BLOB ストレージに保持しようとする SaveSnippet という名前のツールを公開するエンドポイントを作成します。

private const string BlobPath = "snippets/{mcptoolargs.snippetname}.json";

[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
    [McpToolTrigger("save_snippet", "Saves a code snippet into your snippet collection.")]
        ToolInvocationContext context,
    [McpToolProperty("snippetname", "The name of the snippet.", isRequired: true)]
        string name,
    [McpToolProperty("snippet", "The code snippet.", isRequired: true)]
        string snippet
)
{
    return snippet;
}

このコードは、blob storage から名前でコード スニペットを取得しようとする GetSnippet という名前のツールを公開するエンドポイントを作成します。

private const string BlobPath = "snippets/{mcptoolargs.snippetname}.json";

[Function(nameof(GetSnippet))]
public object GetSnippet(
    [McpToolTrigger("get_snippets", "Gets code snippets from your snippet collection.")]
        ToolInvocationContext context,
    [BlobInput(BlobPath)] string snippetContent
)
{
    return snippetContent;
}

GetSnippet関数のツール プロパティは、Program.csで構成されます。

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

builder.Services
    .AddApplicationInsightsTelemetryWorkerService()
    .ConfigureFunctionsApplicationInsights();

builder
    .ConfigureMcpTool("get_snippets")
    .WithProperty("snippetname", "string", "The name of the snippet.", required: true);

builder.Build().Run();

ヒント

上記の例では、 Program.cs と関数の両方で "get_snippets" ツールの名前などにリテラル文字列を使用しています。 代わりに、共有定数文字列を使用して、プロジェクト間で同期を維持することを検討してください。

完全なコード例については、 SnippetTool.csを参照してください。

このコードは、名前付きコード スニペットを BLOB ストレージに保持しようとする SaveSnippets という名前のツールを公開するエンドポイントを作成します。

@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public String saveSnippet(
        @McpToolTrigger(
                name = "saveSnippets",
                description = "Saves a text snippet to your snippets collection."
        )
        String mcpToolInvocationContext,
        @McpToolProperty(
                name = "snippetName",
                propertyType = "string",
                description = "The name of the snippet.",
                required = true
        )
        String snippetName,
        @McpToolProperty(
                name = "snippet",
                propertyType = "string",
                description = "The content of the snippet.",
                required = true
        )
        String snippet,
        @BlobOutput(name = "outputBlob", path = "snippets/{mcptoolargs.snippetName}.json")
        OutputBinding<String> outputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(mcpToolInvocationContext);

    // Log the snippet name and content
    context.getLogger().info("Saving snippet with name: " + snippetName);
    context.getLogger().info("Snippet content:\n" + snippet);

    // Write the snippet content to the output blob
    outputBlob.setValue(snippet);

    return "Successfully saved snippet '" + snippetName + "' with " + snippet.length() + " characters.";
}

このコードは、blob storage から名前でコード スニペットを取得しようとする GetSnippets という名前のツールを公開するエンドポイントを作成します。

@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public String getSnippet(
        @McpToolTrigger(
                name = "getSnippets",
                description = "Gets a text snippet from your snippets collection."
        )
        String mcpToolInvocationContext,
        @McpToolProperty(
                name = "snippetName",
                propertyType = "string",
                description = "The name of the snippet.",
                required = true
        )
        String snippetName,
        @BlobInput(name = "inputBlob", path = "snippets/{mcptoolargs.snippetName}.json")
        String inputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(mcpToolInvocationContext);

    // Log the snippet name and the fetched snippet content from the blob
    context.getLogger().info("Retrieving snippet with name: " + snippetName);
    context.getLogger().info("Snippet content:");
    context.getLogger().info(inputBlob);

    // Return the snippet content or a not found message
    if (inputBlob != null && !inputBlob.trim().isEmpty()) {
        return inputBlob;
    } else {
        return "Snippet '" + snippetName + "' not found.";
    }
}

完全なコード例については、 Snippets.javaを参照してください。

JavaScript のコード例は現在使用できません。 Node.jsを使用した一般的なガイダンスについては、TypeScript の例を参照してください。

このコードは、名前付きコード スニペットを BLOB ストレージに保持しようとする savesnippet という名前のツールを公開するエンドポイントを作成します。

import { app, InvocationContext, input, output, arg } from "@azure/functions";

app.mcpTool("saveSnippet", {
  toolName: SAVE_SNIPPET_TOOL_NAME,
  description: SAVE_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION),
    [SNIPPET_PROPERTY_NAME]: arg.string().describe(SNIPPET_PROPERTY_DESCRIPTION)
  },
  extraOutputs: [blobOutputBinding],
  handler: saveSnippet,
});

このコードは、 savesnippet トリガーを処理します。

export async function saveSnippet(
  _toolArguments: unknown,
  context: InvocationContext
): Promise<string> {
  console.info("Saving snippet");

  // Get snippet name and content from the tool arguments
  const mcptoolargs = context.triggerMetadata.mcptoolargs as {
    snippetname?: string;
    snippet?: string;
  };

  const snippetName = mcptoolargs?.snippetname;
  const snippet = mcptoolargs?.snippet;

  if (!snippetName) {
    return "No snippet name provided";
  }

  if (!snippet) {
    return "No snippet content provided";
  }

  // Save the snippet to blob storage using the output binding
  context.extraOutputs.set(blobOutputBinding, snippet);

  console.info(`Saved snippet: ${snippetName}`);
  return snippet;
}

このコードは、blob storage から名前でコード スニペットを取得しようとする getsnippet という名前のツールを公開するエンドポイントを作成します。

import { app, InvocationContext, input, output, arg } from "@azure/functions";

app.mcpTool("getSnippet", {
  toolName: GET_SNIPPET_TOOL_NAME,
  description: GET_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
  },
  extraInputs: [blobInputBinding],
  handler: getSnippet,
});

このコードは、 getsnippet トリガーを処理します。

export async function getSnippet(
  _toolArguments: unknown,
  context: InvocationContext
): Promise<string> {
  console.info("Getting snippet");

  // Get snippet name from the tool arguments
  const mcptoolargs = context.triggerMetadata.mcptoolargs as {
    snippetname?: string;
  };
  const snippetName = mcptoolargs?.snippetname;

  console.info(`Snippet name: ${snippetName}`);

  if (!snippetName) {
    return "No snippet name provided";
  }

  // Get the content from blob binding - properly retrieving from extraInputs
  const snippetContent = context.extraInputs.get(blobInputBinding);

  if (!snippetContent) {
    return `Snippet '${snippetName}' not found`;
  }

  console.info(`Retrieved snippet: ${snippetName}`);
  return snippetContent as string;
}

完全なコード例については、 snippetsMcpTool.tsを参照してください。

このコードでは、 mcp_tool_trigger デコレーターを使用してエンドポイントを作成し、名前付きコード スニペットを BLOB ストレージに永続化しようとする save_snippet という名前のツールを公開します。

@app.mcp_tool_trigger(
    arg_name="context",
    tool_name="save_snippet",
    description="Save a snippet with a name.",
    tool_properties=tool_properties_save_snippets_json,
)
@app.blob_output(arg_name="file", connection="AzureWebJobsStorage", path=_BLOB_PATH)
def save_snippet(file: func.Out[str], context) -> str:
    content = json.loads(context)
    snippet_name_from_args = content["arguments"][_SNIPPET_NAME_PROPERTY_NAME]
    snippet_content_from_args = content["arguments"][_SNIPPET_PROPERTY_NAME]

    if not snippet_name_from_args:
        return "No snippet name provided"

    if not snippet_content_from_args:
        return "No snippet content provided"

    file.set(snippet_content_from_args)
    logging.info(f"Saved snippet: {snippet_content_from_args}")
    return f"Snippet '{snippet_content_from_args}' saved successfully"

このコードでは、 mcp_tool_trigger デコレーターを使用してエンドポイントを作成し、BLOB ストレージから名前でコード スニペットを取得しようとする get_snippet という名前のツールを公開します。

@app.mcp_tool_trigger(
    arg_name="context",
    tool_name="get_snippet",
    description="Retrieve a snippet by name.",
    tool_properties=tool_properties_get_snippets_json,
)
@app.blob_input(arg_name="file", connection="AzureWebJobsStorage", path=_BLOB_PATH)
def get_snippet(file: func.InputStream, context) -> str:
    """
    Retrieves a snippet by name from Azure Blob Storage.

    Args:
        file (func.InputStream): The input binding to read the snippet from Azure Blob Storage.
        context: The trigger context containing the input arguments.

    Returns:
        str: The content of the snippet or an error message.
    """
    snippet_content = file.read().decode("utf-8")
    logging.info(f"Retrieved snippet: {snippet_content}")
    return snippet_content

完全なコード例については、 function_app.pyを参照してください。

Von Bedeutung

MCP 拡張機能は現在、PowerShell アプリをサポートしていません。

属性

C# ライブラリでは、 McpToolTriggerAttribute を使用して関数トリガーを定義します。

この属性のコンストラクターは、次のパラメーターを受け取ります。

パラメーター 説明
ToolName (必須) MCP トリガー エンドポイントによって公開されているツールの名前。
説明 (省略可能) クライアントのツール エンドポイントのわかりやすい説明。

エンドポイントのプロパティを入力パラメーターとして定義する方法については、「 使用法」 を参照してください。

注釈

@McpToolTrigger注釈は、リモート MCP サーバーでツール エンドポイントを公開する関数を作成します。

注釈は、次の構成オプションをサポートしています。

パラメーター 説明
name (必須) MCP トリガー エンドポイントによって公開されているツールの名前。
説明 (省略可能) クライアントのツール エンドポイントのわかりやすい説明。

@McpToolProperty注釈は、ツールの個々のプロパティを定義します。 関数内の各プロパティ パラメーターには、この注釈を付ける必要があります。

@McpToolProperty注釈では、次の構成オプションがサポートされています。

パラメーター 説明
name (必須) クライアントに公開されるツール プロパティの名前。
propertyType (必須) ツール プロパティの種類。 有効な型は、 stringnumberintegerbooleanobjectです。
説明 (省略可能) ツール プロパティの動作の説明。
必須 (省略可能) trueに設定されている場合、ツールのプロパティはツール呼び出しの引数として必要です。 既定値は false です。

デコレータ

"Python v2 プログラミング モデルにのみ適用されます。"

mcp_tool_trigger デコレーターには、azure-functionsパッケージのバージョン 1.24.0 以降が必要です。 mcp_tool_triggerでは、次の MCP トリガー プロパティがサポートされています。

プロパティ 説明
arg_name 実行コンテキストにアクセスするために関数コードで使用される変数名 (通常は context)。
tool_name (必須)関数エンドポイントによって公開される MCP サーバー ツールの名前。
説明 関数エンドポイントによって公開される MCP サーバー ツールの説明。
tool_properties ツールのプロパティをクライアントに公開する 1 つ以上のプロパティ オブジェクトの JSON 文字列表現。

コンフィギュレーション

トリガーでは、コードで定義されている次のバインド オプションがサポートされています。

オプション 説明
タイプ mcpToolTriggerに設定する必要があります。 ジェネリック定義でのみ使用されます。
toolName (必須)関数エンドポイントによって公開される MCP サーバー ツールの名前。
説明 関数エンドポイントによって公開される MCP サーバー ツールの説明。
toolProperties ツールのプロパティをクライアントに公開する toolProperty オブジェクトの配列。
extraOutputs 定義されている場合は、関数の出力を別のバインドに送信します。
ハンドラー 実際の関数コードを含むメソッド。

完全な例については、セクションの例を参照してください。

使用方法

MCP ツール トリガーは、次の種類にバインドできます。

タイプ 説明
ToolInvocationContext ツールの呼び出しを表すオブジェクト (呼び出しのツール名と引数を含む)。
JSON シリアル化可能な型 関数は、ツール引数を単純な CLR オブジェクト (POCO) 型に逆シリアル化しようとします。 この型は、 ツールのプロパティの定義にも使用されます。

JSON シリアル化可能な型にバインドする場合は、必要に応じて ToolInvocationContext 型のパラメーターを含め、ツール呼び出し情報にアクセスすることもできます。

ツールのプロパティ

MCP クライアントは、ツールの操作のデータとコンテキストを提供するために、引数を使用してツールを呼び出します。 クライアントは、ツールがプロトコルの一部としてアドバタイズするプロパティに基づいて、これらの引数を収集して渡す方法を知っています。 そのため、関数コードでツールのプロパティを定義する必要があります。

ツール プロパティを定義する場合、既定では省略可能であり、クライアントはツールを呼び出すときに省略できます。 ツールがプロパティなしで動作できない場合は、プロパティを必須として明示的にマークする必要があります。

以前のバージョンの MCP 拡張機能プレビューでは、すべてのツール プロパティが既定で必要になりました。 この動作はバージョン 1.0.0-preview.7の時点で変更されました。プロパティを必須として明示的にマークする必要があります。

C# では、いくつかの方法でツールのプロパティを定義できます。 どの方法を使用するかは、コード スタイルの好みの問題です。 オプションは次のとおりです。

  • 関数は、 McpToolProperty 属性を使用して入力パラメーターを受け取ります。
  • プロパティを使用してカスタム型を定義すると、関数はその型にバインドされます。
  • FunctionsApplicationBuilderを使用して、Program.cs ファイル内のプロパティを定義します。

McpToolProperty属性を関数の入力バインド スタイル パラメーターに適用することで、1 つ以上のツール プロパティを定義できます。

McpToolPropertyAttribute型では、次のプロパティがサポートされています。

プロパティ 説明
プロパティ名 クライアントに公開されるツール プロパティの名前。
説明 ツール プロパティの動作の説明。
必須 (省略可能) trueに設定した場合、ツールの呼び出しの引数としてツール プロパティが必要です。 既定値は false です。

プロパティ型は、属性を適用するパラメーターの型から推論されます。 たとえば、[McpToolProperty("snippetname", "The name of the snippet.", true)] string nameでは、MCP メッセージ内のsnippetname型のstringという名前の必要なツール プロパティを定義します。

SaveSnippet ツールで使用されているこれらの属性は、「例」で確認できます。

Java では、個々の関数パラメーターに対して @McpToolProperty 注釈を使用して、ツールのプロパティを定義します。 ツール プロパティを表す各パラメーターには、プロパティ名、型、説明、および必要かどうかを指定して、この注釈で注釈を付ける必要があります。

これらの注釈は 、例で使用されています。

トリガー定義の toolProperties フィールドでツール のプロパティを構成できます。これは、 ToolProperty オブジェクトの配列の文字列表現です。

ToolProperty オブジェクトには、次の構造があります。

{
    "propertyName": "Name of the property",
    "propertyType": "Type of the property",
    "description": "Optional property description",
    "isRequired": true|false,
    "isArray": true|false
}

ToolProperty オブジェクトのフィールドは次のとおりです。

プロパティ 説明
propertyName クライアントに公開されるツール プロパティの名前。
propertyType ツール プロパティの種類。 有効な型は、 stringnumberintegerbooleanobjectです。 配列型については、「 isArray 」を参照してください。
説明 ツール プロパティの動作の説明。
isRequired (省略可能) trueに設定した場合、ツールの呼び出しの引数としてツール プロパティが必要です。 既定値は false です。
isArray (省略可能) trueに設定すると、ツール プロパティは指定したプロパティ型の配列になります。 既定値は false です。

toolPropertiesフィールドを ToolProperty オブジェクトの配列として提供することもできますし、arg@azure/functionsヘルパーを使って、より型に安全な方法でプロパティを定義することもできます。

  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
  }

詳細については、「」を参照してください。

host.json 設定

host.json ファイルには、MCP トリガーの動作を制御する設定が含まれています。 使用可能な設定の詳細については、「host.json 設定」を参照してください。

Azure Functions 用の Azure OpenAI 拡張機能