最近話題のMCP
最近話題のMCP(Model Context Protocol)、なんかおもしろそうだけどよく分からない。
どうやらAIと外部ツールをつなぐ新しい仕組みらしく、すごいらしい。
そんなMCPを少しでも理解するために、こちらの記事を参考にしながら、.NETで「現在時刻を返すだけ」のシンプルなMCPサーバーを実装してみました。
この記事では、その手順をまとめていきます。
前提
Cursorのチャット機能で、特定の都市、タイムゾーンの現在時刻を聞いてみると、以下のような回答が得られます。
LLMはデフォルトでインターネット接続を持たないため、リアルタイムな情報を取得することはできません。
これを補うために、現在時刻を提供する MCP Server を構築し、Cursorに統合します。
MCPサーバーを作成する
ステップ1:プロジェクトを作成する
dotnet new console -n McpTimeServer
cd McpTimeServer
ステップ2:必要となるパッケージをインストールする
dotnet add package ModelContextProtocol --prerelease
dotnet add package Microsoft.Extensions.Hosting
ModelContextProtocol パッケージは、MCPサーバーに接続するクライアントを作成するAPI、MCPサーバーを作成するAPI、およびMicrosoft.Extensions.AI
を通じてLLMと統合するためのAIヘルパーライブラリの利用を可能にするAPIへのアクセスを提供します。
ステップ3:MCPサーバーを実装する
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
var builder = Host.CreateEmptyApplicationBuilder(null);
builder.Services
.AddMcpServer() // MCPサーバーを追加
.WithStdioServerTransport() // 標準入出力を通じて通信を行うように設定
.WithToolsFromAssembly(); // アセンブリからMCPツールを読み込む
var app = builder.Build();
await app.RunAsync();
.WithToolsFromAssembly()
についてですが、これを設定することにより、関連する属性が付与されているクラス、メソッドを自動で検知して、MCPツールとして読み込むようになります。
MCPツールって?(ChatGPTに聞いてみた)
MCPツールは、AIが外部システムと連携するための「機能の窓口」として機能します。例えば、以下のような操作が可能です。
- 天気情報の取得:指定された都市の現在の天気を取得する
- カレンダー操作:予定の追加や確認を行う
- ファイル検索;特定の条件に合致するファイルを検索する
- データベースクエリ:指定された条件でデータベースを検索する
これらのツールは、AIがユーザーの指示に基づいて適切な外部リソースと連携し、必要な情報を取得・操作するための手段を提供します。
次に、MCPサーバー上で呼び出されるツールを実装します。
using System.ComponentModel;
using ModelContextProtocol.Server;
namespace McpTimeServer;
[McpServerToolType]
public static class TimeTools
{
[McpServerTool, Description("現在の時刻を取得します。")]
public static string GetCurrentTime()
{
return DateTimeOffset.Now.ToString();
}
[McpServerTool, Description("指定されたタイムゾーンの現在の時刻を取得します。")]
public static string GetTimeInTimeZone(string timeZone)
{
try
{
var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
return TimeZoneInfo.ConvertTime(DateTimeOffset.Now, tz).ToString();
}
catch
{
return "指定されたタイムゾーンが見つかりません。";
}
}
}
[McpServerToolType]
はこのクラスにMCPツールを含んでいることを表します。
[McpServerTool]
を付与された二つのメソッドは、MCPクライアント(今回でいうCursor)から利用可能になります。
MCPクライアント(Cursor)と統合する
MCPサーバーが完了したので、Cursorに設定します。
ステップ1:CursorにMCPサーバーを設定する
多分この辺にある「Cursor Settings」を開きます。
「Cursor Settings」を開くと、「MCP」のセクションがあるので、そこから「Add new global MCP server」のボタンを押します。
するとmcp.jsonが開くので、以下のように設定します。
{
"mcpServers": {
"timeServer": {
"command": "dotnet",
"args": [
"run",
"--project",
"path/to/your/McpTimeServer",
"--no-build"
]
}
}
}
ステップ2:作成したMCPサーバーをテスト
MCPサーバーの設定が完了して、「Cursor Settings」の「MCP」セクションに戻ると、MCPサーバーが利用可能になっています。(「Refresh」を押してください。)
チャット機能を使って、もう一度パリの現在時刻を聞いてみます。
作成したMCPサーバーを利用して、LLMが特定の都市、タイムゾーンの現在時刻を取得できるようになりました。また、どのツールを使ったのか、そのツールを利用する時に渡された値も確認することができます。
すごい。