ASP.NETのMCPで共通のログ機能を作成する方法

Higtyのシステムの作り方

MCPの初期化処理の際に以下のようにAddCallToolFilterメソッドを追加します。

services.AddMcpServer()
    .WithHttpTransport(options =>
    {
        options.Stateless = true;
    })
    .WithToolsFromAssembly()
    .WithPromptsFromAssembly()
    .WithResourcesFromAssembly()
    .AddCallToolFilter(HigLaboAppMcpErrorLogFilter.Handle);



using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
using System.Threading;

namespace HigLaboApp.Core;

public class HigLaboAppMcpErrorLogFilter
{
    public static McpRequestHandler<CallToolRequestParams, CallToolResult> Handle(McpRequestHandler<CallToolRequestParams, CallToolResult> next)
    {
        return async (context, cancellationToken) =>
        {
            try
            {
                return await next(context, cancellationToken);
            }
            catch (Exception ex)
            {
                //ログの追加処理を書く

                //エラーがあったことをクライアント(ChatGPTやClaude)に知らせる
                var result = new CallToolResult
                {
                    IsError = true,
                    Content =
                    [
                        new TextContentBlock
                    {
                        Text = $"Internal server error.\n{ex.Message}"
                    }
                    ]
                };
                return result;
            }
        };   
    }
}