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 設定」を参照してください。