MCPのツールを、MCPサーバー本体exeとは別のdllに定義する

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

以前作ったMCPサーバーでは、 MCPサーバー本体のexeの中に、ツールも実装していた。

が、いろいろな事情で、本体exeとは別のdllにツールを実装したい。

やったこと

別のdllにツールを定義して、それをMCPサーバー本体exeの冒頭で読み込み、

以前は

var builder = Host.CreateEmptyApplicationBuilder(settings: null);

builder.Services.AddMcpServer()
    .WithStdioServerTransport()
    .WithToolsFromAssembly();

var app = builder.Build();

としていたのを

var builder = Host.CreateEmptyApplicationBuilder(settings: null);

var mcp = builder.Services.AddMcpServer()
    .WithStdioServerTransport()
    .WithToolsFromAssembly();

// ツールを定義したDLL(ここではMcpServer1.dll)読み込み処理
// 本体exeと同じフォルダにdllもいる前提
var baseDir = AppContext.BaseDirectory;
var pluginPath = Path.Combine(baseDir, "McpServer1.dll");
if (File.Exists(pluginPath))
{
    var externalAssembly = Assembly.LoadFrom(pluginPath);
    mcp.WithToolsFromAssembly(externalAssembly);             // ★←ここが肝
}

var app = builder.Build();

とする。

※dll側に書くツールは、exe側に書いていた内容と全く同じでOK。

コード置き場

github.com