[プレビュー] Azure Functions をリモート MCP サーバーとして使えるようになったので試してみた

[プレビュー] Azure Functions をリモート MCP サーバーとして使えるようになったので試してみた

Clock Icon2025.04.24

いわさです。

最近話題な MCP ですが、先日 Microsoft Azure の Azure Functions をリモート MCP サーバーとしてデプロイできるアップデートがプレビューでリリースされました。

https://azure.microsoft.com/en-us/updates?id=489433

こちら、.NET / Python / TypeScript の 3 つのクイックスタートテンプレートが用意されており、数ステップですぐに試すことが出来ます。

https://github.com/Azure-Samples/remote-mcp-functions

.NET で試してみた

今回はこの中から .NET を使ったデプロイしてみます。
右も左もわからない状態なので、以下に従って進めてみたいと思います。

https://github.com/Azure-Samples/remote-mcp-functions-dotnet

まず、ローカル上で関数の動作確認をし、その後クラウド上へデプロイする手順が紹介されています。

ローカルでの実行

サンプルの関数が Azure Storage を使うため、ローカル開発用に「Azurite」を使います。Azurite はオープンソースの Azure Blob、Queue Storage、Table Storage のエミュレーターです。Azure Storage を扱うアプリケーションのローカル開発に使うことが出来ます。[1]

% docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \
    mcr.microsoft.com/azure-storage/azurite
Unable to find image 'mcr.microsoft.com/azure-storage/azurite:latest' locally
latest: Pulling from azure-storage/azurite
6e771e15690e: Already exists 

:

Azurite Blob service is starting at http://0.0.0.0:10000
Azurite Blob service is successfully listening at http://0.0.0.0:10000
Azurite Queue service is starting at http://0.0.0.0:10001
Azurite Queue service is successfully listening at http://0.0.0.0:10001
Azurite Table service is starting at http://0.0.0.0:10002
Azurite Table service is successfully listening at http://0.0.0.0:10002

また、手順では Azure Functions Core Tools を使ってローカルで関数を実行しています。[2]

brew tap azure/functions
brew install azure-functions-core-tools@4
# if upgrading on a machine that has 2.x or 3.x installed:
brew link --overwrite azure-functions-core-tools@4

準備が出来たので、サンプルリポジトリからコードをクローンし、関数をローカル実行してみましょう。

https://github.com/Azure-Samples/remote-mcp-functions-dotnet.git

% func start
  Determining projects to restore...
  Restored /Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/FunctionsMcpTool.csproj (in 5.14 sec).
/Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/SnippetsTool.cs(8,49): warning CS9113: Parameter 'logger' is unread. [/Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/FunctionsMcpTool.csproj]
  Determining projects to restore...
  Restored /Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/obj/Debug/net8.0/WorkerExtensions/WorkerExtensions.csproj (in 4.13 sec).
  WorkerExtensions -> /Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/obj/Debug/net8.0/WorkerExtensions/buildout/Microsoft.Azure.Functions.Worker.Extensions.dll
  FunctionsMcpTool -> /Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/bin/output/FunctionsMcpTool.dll

Build succeeded.

/Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/SnippetsTool.cs(8,49): warning CS9113: Parameter 'logger' is unread. [/Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/FunctionsMcpTool.csproj]
    1 Warning(s)
    0 Error(s)

Time Elapsed 00:00:14.60

Azure Functions Core Tools
Core Tools Version:       4.0.7030 Commit hash: N/A +bb4c949899cd5659d6bfe8b92cc923453a2e8f88 (64-bit)
Function Runtime Version: 4.1037.0.23568

[2025-04-21T20:23:24.563Z] Found /Users/iwasa.takahito/work/hoge0422azurefunc/remote-mcp-functions-dotnet/src/FunctionsMcpTool.csproj. Using for user secrets file configuration.
[2025-04-21T20:23:25.375Z] MCP server SSE endpoint: http://localhost:7071/runtime/webhooks/mcp/sse
[2025-04-21T20:23:27.225Z] Worker process started and initialized.

Functions:

        GetSnippet: mcpToolTrigger

        SaveSnippet: mcpToolTrigger

        SayHello: mcpToolTrigger

For detailed output, run func with --verbose flag.
[2025-04-21T20:23:32.267Z] Host lock lease acquired by instance ID '000000000000000000000000BA677196'.

ローカル実行が出来ました。
MCP サーバーの SSE エンドポイントが払い出されたので、試しに普段使っている Claude Desktop に設定してみました。
知らなかったのですが、Claude Desktop では SSE エンドポイントを直接設定出来ないのでmcp-remoteを使う必要があるようなのでこちらの方法を使ってみました。

claude_desktop_config.json
{
  "mcpServers": {
    "Azure Functions Local": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:7071/runtime/webhooks/mcp/sse"
      ]
    }
  }
}

このサンプル MCP サーバーではget_snippetshellosave_snippetが用意されてます。

5CF0A065-6FE3-4FBF-A969-9C45D46B346C.png

Claude Desktop が直接 SSE エンドポイントを設定出来なかったので、以降は MCP Inspector を使って動作の確認をしてみたいと思います。ローカルエンドポイントについては次のように確認が出来ました。

01F2AD53-0EFE-443B-B9BE-51BA1758671B.png

Azure での実行

ローカルで動作確認が出来たので、今度は Azure 上にデプロイして動作確認してみましょう。
Azure Developer CLI (azd) を使ってデプロイします。

% azd auth login
  Logged in to Azure as admin@aad.tak1wa.com
% azd up        
  () Done: Downloading Bicep
? Select an Azure Subscription to use:  1. hoge subscription (a50aeedb-979c-428f-8b2d-28974d5e3d3b)
? Enter a value for the 'location' infrastructure parameter:  7. (US) East US (eastus)
? Enter a value for the 'vnetEnabled' infrastructure parameter: False

Packaging services (azd package)

  () Done: Packaging service api
  - Package Output: /var/folders/4d/nhd1bp3d161crsn900wjrprm0000gp/T/remote-mcp-functions-dotnet-api-azddeploy-1745267851.zip

Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: hoge subscription (a50aeedb-979c-428f-8b2d-28974d5e3d3b)
Location: East US

  You can view detailed progress in the Azure Portal:
  https://portal.azure.com/#view/HubsExtension/DeploymentDetailsBlade/~/overview/id/%2Fsubscriptions%2Fa50aeedb-979c-428f-8b2d-28974d5e3d3b%2Fproviders%2FMicrosoft.Resources%2Fdeployments%2Fhoge0422-1745267855

  () Done: Resource group: rg-hoge0422 (5.232s)
  () Done: App Service plan: plan-tehexyshtiewy (9.582s)
  () Done: Storage account: sttehexyshtiewy (23.55s)
  () Done: Log Analytics workspace: log-tehexyshtiewy (19.404s)
  () Done: Application Insights: appi-tehexyshtiewy (4.844s)
  () Done: Function App: func-api-tehexyshtiewy (25.778s)

Deploying services (azd deploy)

  () Done: Deploying service api
  - Endpoint: https://func-api-tehexyshtiewy.azurewebsites.net/


SUCCESS: Your up workflow to provision and deploy to Azure completed in 2 minutes 31 seconds.

先ほどのローカル時はhttp://localhost:7071/runtime/webhooks/mcp/sseというエンドポイントでしたが、上記発行されたエンドポイントに置き換えましょう。SSE でいうとhttps://func-api-tehexyshtiewy.azurewebsites.net/runtime/webhooks/mcp/sseですね。

また、Azure Functions へのアクセスの際にキーを使用します。
mcp_extension というキーが発行されているはずなので、こちらを使います。

27D8B812-5E46-4F56-AEB2-BC289D911ACA.png

MCP Inspector から使ってみると、Azure Functions 上のリモート MCP サーバーに接続してツールを実行することが出来ました。

46C6396A-C851-4485-AB8F-EEBA004CE8B9.png

コードも見てみる

ついでにサンプルコードを見てみましょう。
ツールの定義やディスクリプションですが、内容自体はこちらに定義されています。

remote-mcp-functions-dotnet/src/ToolsInformation.cs
namespace FunctionsSnippetTool;

internal sealed class ToolsInformation
{
    public const string SaveSnippetToolName = "save_snippet";
    public const string SaveSnippetToolDescription =
        "Saves a code snippet into your snippet collection.";
    public const string GetSnippetToolName = "get_snippets";
    public const string GetSnippetToolDescription =
        "Gets code snippets from your snippet collection.";
    public const string SnippetNamePropertyName = "snippetname";
    public const string SnippetPropertyName = "snippet";
    public const string SnippetNamePropertyDescription = "The name of the snippet.";
    public const string SnippetPropertyDescription = "The code snippet.";
    public const string PropertyType = "string";
    public const string HelloToolName = "hello";
    public const string HelloToolDescription =
        "Simple hello world MCP Tool that responses with a hello message.";
}

そして、関数側ではMcpToolTriggerとして使用しています。

https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp/1.0.0-preview.2

remote-mcp-functions-dotnet/src/HelloTool.cs
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Mcp;
using Microsoft.Extensions.Logging;
using static FunctionsSnippetTool.ToolsInformation;

namespace FunctionsSnippetTool;

public class HelloTool(ILogger<SnippetsTool> logger)
{
    [Function(nameof(SayHello))]
    public string SayHello(
        [McpToolTrigger(HelloToolName, HelloToolDescription)] ToolInvocationContext context
    )
    {
        logger.LogInformation("Saying hello");
        return "Hello I am MCP Tool!";
    }
}

さいごに

本日は Azure Functions をリモート MCP サーバーとして使えるようになったので試してみました。

サンプル実行しただけはあるのですが、コードを見た感じでもかなり簡単にリモート MCP サーバーをサーバーレスで用意できますね。
まだプレビューではありますが、色々触ってみたいと思います。

脚注
  1. Use Azurite emulator for local Azure Storage development | Microsoft Learn ↩︎

  2. Develop Azure Functions locally using Core Tools | Microsoft Learn ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.