次の方法で共有


Azure Functions の MCP ツール トリガー

MCP ツール トリガーを使用して、クライアント言語モデルとエージェントがアクセスする モデル コンテンツ プロトコル (MCP) サーバーでツール エンドポイントを定義し、コード スニペットの格納やアクセスなどの特定のタスクを実行します。 MCP クライアントは、関数アプリをサブスクライブして、公開されているツールへの変更に関する通知を受け取ることもできます。

Von Bedeutung

Azure Functions MCP 拡張機能は現在プレビュー段階です。 拡張機能が一般公開されるまで、トリガーとバインド API の変更が予想されます。
運用アプリでプレビュー拡張機能を使用しないようにする必要があります。

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

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

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

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

[Function(nameof(GetSnippet))]
public object GetSnippet(
    [McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)]
        ToolInvocationContext context,
    [BlobInput(BlobPath)] string snippetContent
)
{
    return snippetContent;
}

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

private const string BlobPath = "snippets/{mcptoolargs." + SnippetNamePropertyName + "}.json";
[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
    [McpToolTrigger(SaveSnippetToolName, SaveSnippetToolDescription)]
        ToolInvocationContext context,
    [McpToolProperty(SnippetNamePropertyName, PropertyType, SnippetNamePropertyDescription)]
        string name,
    [McpToolProperty(SnippetPropertyName, PropertyType, SnippetPropertyDescription)]
        string snippet
)
{
    return snippet;
}

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

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

@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public void getSnippet(
        @McpToolTrigger(
                toolName = "getSnippets",
                description = "Gets a text snippet from your snippets collection.",
                toolProperties = GET_SNIPPET_ARGUMENTS
        )
        String toolArguments,
        @BlobInput(name = "inputBlob", path = BLOB_PATH)
        String inputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(toolArguments);

    // Parse the JSON and get the snippetName field
    String snippetName = JsonParser.parseString(toolArguments)
            .getAsJsonObject()
            .getAsJsonObject("arguments")
            .get(SNIPPET_NAME_PROPERTY_NAME)
            .getAsString();

    // 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);
}

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

@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public void saveSnippet(
        @McpToolTrigger(
                toolName = "saveSnippets",
                description = "Saves a text snippet to your snippets collection.",
                toolProperties = SAVE_SNIPPET_ARGUMENTS
        )
        String toolArguments,
        @BlobOutput(name = "outputBlob", path = BLOB_PATH)
        OutputBinding<String> outputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(toolArguments);

    // Parse the JSON and extract the snippetName/snippet fields
    JsonObject arguments = JsonParser.parseString(toolArguments)
            .getAsJsonObject()
            .getAsJsonObject("arguments");
    String snippetName = arguments.get(SNIPPET_NAME_PROPERTY_NAME).getAsString();
    String snippet = arguments.get(SNIPPET_PROPERTY_NAME).getAsString();

    // 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);
}

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

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

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

  }

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

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

// Register the GetSnippet tool
app.mcpTool("getSnippet", {
  toolName: GET_SNIPPET_TOOL_NAME,
  description: GET_SNIPPET_TOOL_DESCRIPTION,

これは、 getsnippet トリガーを処理するコードです。


// GetSnippet function - retrieves a snippet by name
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);

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

      propertyName: SNIPPET_NAME_PROPERTY_NAME,
      propertyType: PROPERTY_TYPE,
      description: SNIPPET_NAME_PROPERTY_DESCRIPTION,
    },
  ],
  extraInputs: [blobInputBinding],
  handler: getSnippet,
});

// Register the SaveSnippet tool
app.mcpTool("saveSnippet", {
  toolName: SAVE_SNIPPET_TOOL_NAME,
  description: SAVE_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: [
    {
      propertyName: SNIPPET_NAME_PROPERTY_NAME,
      propertyType: PROPERTY_TYPE,
      description: SNIPPET_NAME_PROPERTY_DESCRIPTION,

これは、 savesnippet トリガーを処理するコードです。

  }

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

// SaveSnippet function - saves a snippet with a name
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";
  }

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

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

@app.generic_trigger(
    arg_name="context",
    type="mcpToolTrigger",
    toolName="get_snippet",
    description="Retrieve a snippet by name.",
    toolProperties=tool_properties_get_snippets_json,
)
@app.generic_input_binding(arg_name="file", type="blob", 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

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

@app.generic_trigger(
    arg_name="context",
    type="mcpToolTrigger",
    toolName="save_snippet",
    description="Save a snippet with a name.",
    toolProperties=tool_properties_save_snippets_json,
)
@app.generic_output_binding(arg_name="file", type="blob", 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"

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

Von Bedeutung

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

属性

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

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

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

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

注釈

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

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

パラメーター 説明
toolName (必須) MCP トリガー エンドポイントによって公開されているツールの名前。
説明 (省略可能) クライアントのツール エンドポイントのわかりやすい説明。
toolProperties ツールのプロパティをクライアントに公開する 1 つ以上のプロパティ オブジェクトの JSON 文字列表現。

デコレータ

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

現時点では、ジェネリック デコレーターを使用して MCP トリガーを定義する必要があります。

generic_triggerでは、次の MCP トリガー プロパティがサポートされています。

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

コンフィギュレーション

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

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

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

使用方法

MCP プロトコルを使用すると、MCP サーバーはツール エンドポイントの他のプロパティをクライアントに認識できます。 C# では、トリガー関数コードの McpToolProperty 属性を使用するか、アプリの起動時に FunctionsApplicationBuilder を使用して、ツールのプロパティを入力パラメーターとして定義できます。

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

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

プロパティ 説明
プロパティ名 クライアントに公開されるツール プロパティの名前。
PropertyType ツール プロパティのデータ型 ( stringなど)。
説明 (省略可能)ツール プロパティの動作の説明。

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

リモート MCP サーバーによって公開されるツールのプロパティは、ツールのプロパティを使用して定義されます。 これらのプロパティは、 toolProperties フィールドによって返されます。これは、 ToolProperty オブジェクトの配列の文字列表現です。

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

{
    "propertyName": "Name of the property",
    "propertyType": "Type of the property",
    "description": "Optional property description",
}

リモート MCP サーバーによって公開されるツールのプロパティは、ツールのプロパティを使用して定義されます。 これらのプロパティは、 toolProperties フィールドによって返されます。これは、 ToolProperty オブジェクトの配列の文字列表現です。

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

{
    "propertyName": "Name of the property",
    "propertyValue": "Type of the property",
    "description": "Optional property description",
}

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

host.json 設定

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

Azure Functions 用の Azure OpenAI 拡張機能