【C# × MCP入門②】RoslynでC#コードを動的実行させるMCPサーバを作る【C#実践アプリ開発ラボ】
前回は、MCP(Model Context Protocol)の基本概念を学び、現在時刻を返す簡単なMCPサーバを作成しました。
今回は、Roslyn(C#コンパイラプラットフォーム)を使って、Claude DesktopからC#コードを動的に実行できるMCPサーバを作ります。
以下のような方に役立つ内容となっています。
- Roslynによる動的コード実行に興味がある
- AIにC#コードを書かせて、その場で実行・検証したい
- ファイル生成やデータ処理をAIに自動化させたい
本記事では、Roslynの基本から、C#コード実行MCPサーバの実装、Claude Desktopでの活用デモまでを紹介します。
今回作るMCPサーバを使うと、Claudeが「自分で書いたC#コードをその場で実行」できるようになります!
例えば「テスト用のCSVファイルを10個作って」と言うだけで、AIがC#コードを生成→実行→ファイル出力まで行ってくれます。

MCPサーバの基本的な作り方やClaude Desktopにおける使い方については、前回記事で解説しているので、ぜひそちらも参考にしてください。
GitHubで作成したコードを公開しています。
動画も作成しています。
Roslynとは?
Roslynは、C#およびVB.NETのコンパイラプラットフォームSDKです。Microsoftがオープンソースで提供しており、以下の機能を持っています。
- コード解析
- コンパイル
- 動的コード実行
今回使うのは「動的コード実行」です。
Roslynの動的コード実行(Scripting API)を使うと、文字列として渡されたC#コードをその場でコンパイル・実行できます。以下が動的コード実行の例です。
using Microsoft.CodeAnalysis.CSharp.Scripting;
// 文字列として渡されたC#コードを実行(クラスとメソッドを定義)
// 最後に記述した式の結果が、スクリプトを実行した結果となる
var code = """
class Calculator
{
public int Add(int a, int b) => a + b;
}
var calc = new Calculator();
calc.Add(2, 3)
""";
var result = await CSharpScript.EvaluateAsync<int>(code);
Console.WriteLine(result); // 5通常のC#コード実行時の「ファイルに保存→ビルド→実行」というステップを省略して、文字列として受け取ったコードを即座に実行できます。
これをMCPサーバと組み合わせると、AIが生成したC#コードをその場で動かせるようになります。
Roslynは以下のような様々な場面で活用されていて、縁の下の力持ち的な存在です。
- IDEの入力補完やリファクタリング機能
- コード生成(例:定型コードの自動生成)
- アプリ内でのスクリプト実行(例:ゲームエンジン)
- 静的コード解析ツール(例:セキュリティ脆弱性の検出)
通常のC#.NETのビルド・コンパイルの仕組み自体もこのRoslynをベースとして作られています!
C#コード実行を行うMCPサーバを作る
それでは、Roslynの動的コード実行機能(Scripting API)を使ってC#コード実行を行うMCPサーバを作ってみましょう。
手順1:プロジェクト作成とNuGetパッケージ導入
前回の手順1と同様にコンソールプロジェクトを作成し、Hosting・MCPのためのパッケージをインストールしましょう。プロジェクト名は「CSharpScriptingMcp」とします。
今回、Roslynのスクリプト実行機能を提供する以下のパッケージも追加します。
- Microsoft.CodeAnalysis.CSharp.Scripting
手順2:MCPサーバコードを作成
Program.csを以下のように作ります。
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;
// アプリケーションのホストビルダーを作成
var builder = Host.CreateApplicationBuilder(args);
// ログをコンソールに出力する設定
builder.Logging.AddConsole(consoleLogOptions =>
{
// すべてのログレベルを標準エラー出力に出力
// (【重要】通常の標準出力はMCPプロトコルの通信に使用されるため)
consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});
// MCPサーバーの設定
builder.Services
.AddMcpServer() // MCPサーバをDIコンテナに登録
.WithStdioServerTransport() // 標準入出力でクライアントと通信
.WithToolsFromAssembly(); // アセンブリ内のツールを自動登録
// アプリケーションを起動
await builder.Build().RunAsync();
// MCPサーバーのツールとして登録するクラス
[McpServerToolType]
public static class CSharpScriptTool
{
// C#スクリプトを実行するツール
[McpServerTool, Description("C#スクリプトを実行します。スクリプトは最後が式で終わる必要があります(その式の評価結果が返されます)。")]
public static async Task<string> ExecuteCSharpScript(
[Description("実行するC#コード。最後は評価したい式で終わること。")] string code)
{
try
{
var result = await CSharpScript.EvaluateAsync<object>(code);
return result?.ToString() ?? "(null)";
}
catch (Exception ex)
{
return $"エラー: {ex.Message}";
}
}
}大枠としては前回作成したコードと同じ感じです。今回、「CSharpScriptTool」というC#コード実行用のクラス(MCPツールとして提供)を用意しました。
ツールのDescriptionもしっかり記述しましょう!AIがこの回答時にこのMCPツールを使うかどうかの判断材料となります。
デバッグビルドで、このMCPサーバ(CSharpScriptingMcp)の実行用バイナリ(exeファイル)を作成しておきます。
手順3:Claude Desktopの設定ファイルへ追記
「%APPDATA%\Claude\claude_desktop_config.json」へMCPサーバを追記します。以下は例です。
{
"mcpServers": {
"CSharpScriptingMcp": {
"command": "D:/data/projects/00apps/CSharpScriptingMcp/bin/Debug/net10.0/CSharpScriptingMcp.exe"
}
},
...Claude Desktopで動かす
Claude Desktopを起動し、MCPサーバが認識されていることを確認したら、実際に動かしてみましょう。
デモ①:基本的なコード実行
まずは簡単な現在時刻の取得からです。

一度失敗したけど、二度目でうまくできてるね!
コンパイルエラーの結果も取得できるため、AIがそれを確認して誤りを自分で修正したのですね。
デモ②:テストデータの作成
もう少し実用的な例を試してみましょう。テストデータとなる複数のCSVファイルを、ローカルのファイルシステム上に作ってもらいましょう。指示は以下です。
C#コードを作成・実行することで、D:\data\testdata1 フォルダに、
ユーザーデータのテスト用csvファイルを10件作ってください。
各ファイルは user_001.csv 〜 user_010.csv という名前で、
それぞれ3~5件のレコード(id, name, email, age, createdAt のフィールドをもつ)
を含めてください。指示をすると、以下のようにC#コードを作成し、それをローカルで実行してくれます。

以下のように、ローカルフォルダでテストデータが作成されています。

すごい!AIが指示に従って自分でC#コードを作って作業をして、ローカルフォルダ上に成果物が格納されるようになったね!
これがMCPの威力ですね。「AIが書いたコードを検証したい」「ちょっとしたスクリプト処理を自動化したい」といった場面で非常に便利ですね。
参考として、Claudeが今回作成して実行したC#コードは以下です。
using System;
using System.IO;
using System.Text;
// フォルダが存在しない場合は作成
var folderPath = @"D:\data\testdata1";
Directory.CreateDirectory(folderPath);
var random = new Random();
var firstNames = new[] { "太郎", "花子", "健太", "美咲", "翔太", "彩", "大輔", "優子", "隆", "愛" };
var lastNames = new[] { "田中", "佐藤", "鈴木", "高橋", "伊藤", "渡辺", "山本", "中村", "小林", "加藤" };
// 10個のCSVファイルを作成
for (int fileNum = 1; fileNum <= 10; fileNum++)
{
var fileName = $"user_{fileNum:D3}.csv";
var filePath = Path.Combine(folderPath, fileName);
var sb = new StringBuilder();
sb.AppendLine("id,name,email,age,createdAt");
// 各ファイルに3~5件のレコードを追加
var recordCount = random.Next(3, 6); // 3~5件
for (int recordNum = 1; recordNum <= recordCount; recordNum++)
{
var id = (fileNum - 1) * 10 + recordNum;
var name = lastNames[random.Next(lastNames.Length)] + firstNames[random.Next(firstNames.Length)];
var email = $"user{id:D3}@example.com";
var age = random.Next(20, 65);
var createdAt = DateTime.Now.AddDays(-random.Next(1, 365)).ToString("yyyy-MM-dd HH:mm:ss");
sb.AppendLine($"{id},{name},{email},{age},{createdAt}");
}
File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
}
$"D:\\data\\testdata1 フォルダに user_001.csv ~ user_010.csv を作成しました"今回作成したMCPサーバは、任意のC#コードを実行できるという強力な機能を持ってるため、以下のようなリスクがあります。
- 誤って意図しないファイルを削除してしまう
- 悪意ある指示により、不正なコードがローカルで実行される
そのため、実行する前にコードを確認するなど扱いには注意しましょう。
実務で多くのユーザが使う可能性がある場合には、使用可能なAPIの制限・サンドボックス化などセキュリティ観点での改良が必要になるでしょう。
まとめ
本記事では、以下の内容を解説しました。
- Roslynの基本
- C#コード実行MCPサーバの実装
- Claude Desktopでの活用
このMCPサーバを使えば、Claudeが「自分で書いたC#コードをその場で検証」できるようになり、テストデータ生成、ファイル処理、計算処理など、様々な場面で活用できます。
ぜひ今回作ったアプリを自分でもカスタマイズしてみて、便利なAIツールを作ってみてください!
引き続き、一緒にC#・MCPによる開発を学んでいきましょう!




