はじめに
MCP(ModelContextProtocol)のC# SDKをF#で動かせるかを試してみました。
サンプルはMicrosoft Learnにある1~100まで数字をランダムに出力するMCPサーバーを作るところまでやってみました。
環境
実装
プロジェクト作成
- ターミナルでF#のプロジェクトを作成する
dotnet new console -lang "F#" -n SampleMcpServer
- プロジェクトに移動する
cd SampleMcpServer
- 使用するライブラリを追加する
dotnet add package ModelContextProtocol --prerelease dotnet add package Microsoft.Extensions.Hosting
- VSCordeで開く
code .
プログラム作成
- MCPの処理部分の
Tools/RandomNumberTools.fs
を作成するTools/RandomNumberTools.fsnamespace Tools.RandomNumberTools open System open System.ComponentModel open System.Runtime.InteropServices open ModelContextProtocol.Server /// <summary> /// Sample MCP tools for demonstration purposes. /// These tools can be invoked by MCP clients to perform various operations. /// </summary> type internal RandomNumberTools() = [<McpServerTool>] [<Description("Generates a random number between the specified minimum and maximum values.")>] member _.GetRandomNumber( [<Description("Minimum value (inclusive)"); Optional; DefaultParameterValue(0)>] min:int, [<Description("Maximum value (exclusive)"); Optional; DefaultParameterValue(100)>] max:int) : int = Random.Shared.Next(min, max)
- 作成した
Tools/RandomNumberTools.fs
をプロジェクトに設定するSampleMcpServer.fsproj<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> </PropertyGroup> <ItemGroup> <Compile Include="Tools\RandomNumberTools.fs" /> <Compile Include="Program.fs" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.8" /> <PackageReference Include="ModelContextProtocol" Version="0.3.0-preview.4" /> </ItemGroup> </Project>
-
Program.fs
を以下に修正するProgram.fsopen Microsoft.Extensions.DependencyInjection open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging open Microsoft.Extensions.Logging.Console open Tools.RandomNumberTools [<EntryPoint>] let main argv = let builder = Host.CreateApplicationBuilder(argv) // Configure all logs to go to stderr (stdout is used for the MCP protocol messages). builder.Logging.AddConsole(fun (o: ConsoleLoggerOptions) -> o.LogToStandardErrorThreshold <- LogLevel.Trace) |> ignore // Add the MCP services: the transport to use (stdio) and the tools to register. builder.Services .AddMcpServer() .WithStdioServerTransport() .WithTools<RandomNumberTools>() |> ignore let app = builder.Build() app.RunAsync() |> Async.AwaitTask |> Async.RunSynchronously 0 // Return
- VSCordeにMCPを設定するファイル
.vscode\mcp.json
を追加する。起動パスは作成したプロジェクトのパスをいれる.vscode\mcp.json{ "servers": { "SampleMcpServer": { "type": "stdio", "command": "dotnet", "args": [ "run", "--project", // ↓プロジェクトパスに書き換える "C:\\SampleMcpServer" ] } } }
MCPの起動
-
.vscode\mcp.json
で以下の画像のような"起動"ボタンが出るので、押して起動させる
- GitHub Copilotのチャットを開く
- チャットのモードを"Agent"にする
- 以下の画像の更新ボタンを押す
- "ツールの選択"からのツール一覧に作成したMCP(SampleMcpServer)があるのこを確認する
- 以下のプロンプトをチャットに入れて送信する
プロンプト
Give me a random number between 1 and 100.
- アクセス許可を要求されるので"継続"を選択する
- MCPサーバーから返答が返ってくる
以上