使用说明
InfinityFlow C#评估MCP服务器
使用Roslyn评估和执行C#脚本的MCP(模型上下文协议)服务器。该工具允许AI助手从直接输入或.csx脚本文件动态运行C#代码。
特性
- 🚀 直接或从文件执行C#脚本
- 📦 完全支持Roslyn脚本,并预导入了通用命名空间
- 📚 通过以下方式支持NuGet包
#r "nuget: PackageName, Version"指令 - 🔒 控制台输出捕获(对MCP stdio协议安全)
- ⚡ 针对编译和运行时错误的全面错误处理
- 🐳 同时提供Docker容器和dnx包,支持卷挂载
- ✅ 使用NUnit和FluentAssessments进行全面测试覆盖
安装
使用dnx
# Install via dnx
dnx InfinityFlow.CSharp.Eval --version 1.0.0 --yes
# Run the tool
dnx run InfinityFlow.CSharp.Eval
使用Docker
# Pull from GitHub Container Registry
docker pull ghcr.io/infinityflowapp/csharp-mcp:latest
# Run interactively
docker run -it ghcr.io/infinityflowapp/csharp-mcp:latest
来源
# Clone the repository
git clone https://github.com/InfinityFlowApp/csharp-mcp.git
cd csharp-mcp
# Build and run
dotnet build
dotnet run --project src/InfinityFlow.CSharp.Eval
用法
MCP服务器公开了一个工具: EvalCSharp
参数
csxFile(可选):要执行的.csx文件的完整路径csx(可选):直接执行C#脚本代码timeoutSeconds(可选):最大执行时间(秒)(默认值:30)
要么 csxFile 或 csx 必须提供,但不能两者都提供。
例子
有关综合示例,请参阅 示例目录:
直接代码执行
{
"tool": "EvalCSharp",
"parameters": {
"csx": "Console.WriteLine(\"Hello World!\"); 2 + 2"
}
}
输出:
Hello World!
Result: 4
从文件执行
{
"tool": "EvalCSharp",
"parameters": {
"csxFile": "/scripts/example.csx"
}
}
使用LINQ的复杂示例
var numbers = Enumerable.Range(1, 10);
var evenSum = numbers.Where(n => n % 2 == 0).Sum();
Console.WriteLine($"Sum of even numbers: {evenSum}");
evenSum * 2
输出:
Sum of even numbers: 30
Result: 60
预导入命名空间
以下命名空间将自动可用:
SystemSystem.IOSystem.LinqSystem.TextSystem.Collections.GenericSystem.Threading.TasksSystem.Net.HttpSystem.Text.JsonSystem.Text.RegularExpressions
NuGet包支持
您可以使用以下命令在脚本中直接引用NuGet包 #r 指令:
#r "nuget: Newtonsoft.Json, 13.0.3"
#r "nuget: Humanizer, 2.14.1"
using Newtonsoft.Json;
using Humanizer;
var json = JsonConvert.SerializeObject(new { Message = "Hello World" });
Console.WriteLine(json);
Console.WriteLine("5 days".Humanize());
该工具将自动:
- 从NuGet.org下载指定的软件包
- 解决并下载依赖关系
- 缓存包以实现更快的后续运行
- 为无效的包规范提供详细的错误消息
MCP配置
光标
添加到光标设置(.cursor/mcp_settings.json 或通过设置UI):
{
"mcpServers": {
"csharp-eval": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/infinityflowapp/csharp-mcp:latest"],
"env": {
"CSX_ALLOWED_PATH": "/scripts"
}
}
}
}
或者,如果通过dnx安装:
{
"mcpServers": {
"csharp-eval": {
"command": "dnx",
"args": ["run", "InfinityFlow.CSharp.Eval"],
"env": {
"CSX_ALLOWED_PATH": "${workspaceFolder}/scripts"
}
}
}
}
克劳德代码
使用CLI添加MCP服务器:
使用Docker:
基本设置:
claude mcp add csharp-eval docker -- run -i --rm ghcr.io/infinityflowapp/csharp-mcp:latest
通过文件系统访问:
claude mcp add csharp-eval docker -- run -i --rm --pull=always -v "${HOME}:${HOME}" -w "${PWD}" ghcr.io/infinityflowapp/csharp-mcp:latest
使用受限脚本目录:
claude mcp add csharp-eval -e CSX_ALLOWED_PATH="/scripts" docker -- run -i --rm -v "${HOME}/scripts:/scripts:ro" ghcr.io/infinityflowapp/csharp-mcp:latest
使用dnx:
claude mcp add csharp-eval -e CSX_ALLOWED_PATH="/Users/your-username/scripts" dnx -- run InfinityFlow.CSharp.Eval
音量安装(-v ${HOME}:${HOME})允许该工具从您的文件系统访问.csx文件。
VS代码
创建 .vscode/mcp.json:
{
"servers": {
"csharp-eval": {
"type": "stdio",
"command": "dnx",
"args": ["run", "InfinityFlow.CSharp.Eval"]
}
}
}
Visual Studio
创建 .mcp.json 在解决方案目录中:
{
"servers": {
"csharp-eval": {
"type": "stdio",
"command": "dnx",
"args": [
"InfinityFlow.CSharp.Eval",
"--version",
"1.0.0",
"--yes"
]
}
}
}
发展
先决条件
- .NET 9.0 SDK或更高版本
- Docker(可选,用于容器化)
建筑
# Restore dependencies
dotnet restore
# Build the project
dotnet build
# Run tests
dotnet test
# Pack as MCP package
dotnet pack -c Release
测试
该项目包括使用NUnit和FluentAssessments的全面单元测试:
dotnet test
Docker构建
# Build the Docker image
docker build -t infinityflow/csharp-eval-mcp .
# Run the container
docker run -it infinityflow/csharp-eval-mcp
项目结构
csharp-mcp/
├── src/
│ └── InfinityFlow.CSharp.Eval/ # Main MCP server implementation
│ ├── Tools/
│ │ ├── CSharpEvalTools.cs # Roslyn script evaluation tool
│ │ └── NuGetPackageResolver.cs # NuGet package resolution
│ ├── Program.cs # MCP server entry point
│ └── .mcp/
│ └── server.json # MCP server configuration
├── tests/
│ └── InfinityFlow.CSharp.Eval.Tests/ # Unit tests
│ ├── CSharpEvalToolsTests.cs # Core functionality tests
│ └── ExamplesTests.cs # Example validation tests
├── examples/ # Example scripts with documentation
│ ├── basic-execution/ # Simple C# script examples
│ ├── fibonacci-sequence/ # Algorithm demonstrations
│ ├── data-processing/ # LINQ and data manipulation
│ ├── nuget-packages/ # External package usage
│ └── nunit-testing/ # Programmatic test execution
├── Directory.Packages.props # Central package management
├── Dockerfile # Docker containerization
└── .github/
└── workflows/ # GitHub Actions CI/CD
├── ci-cd.yml # Main CI/CD pipeline
├── validate-pr.yml # PR validation
└── release-drafter.yml # Automated release notes
CI/CD
该项目使用GitHub Actions进行持续集成和部署:
- CI/CD管道:自动化测试、Docker构建和NuGet发布
- PR验证:对所有拉取请求进行构建和测试验证
- 发布起草人:自动生成发行说明
- 依赖:自动依赖关系更新
发布
当按下版本标签时,发布会自动发布:
git tag v1.0.0
git push origin v1.0.0
这将:
- 构建和测试项目
- 将Docker镜像发布到GitHub容器注册表
- 将NuGet包发布到NuGet.org
- 使用自动生成的笔记创建GitHub版本
安全考虑
- ⚠️ 脚本在与MCP服务器相同的进程上下文中运行
- 🔐 捕获控制台输出以防止干扰MCP stdio协议
- 🐳 Docker容器以非root用户身份运行,以提高安全性
- 🛡️ 运行不受信任的脚本时使用适当的沙盒
- 📁 可以通过以下方式限制文件访问
CSX_ALLOWED_PATH环境变量 - 🔒 只允许执行.csx文件
- ⏱️ 脚本具有可配置的超时时间(默认为30秒)
文件访问限制
这 CSX_ALLOWED_PATH 环境变量限制了执行.csx文件时可以访问的目录:
# Restrict to specific directory
export CSX_ALLOWED_PATH=/path/to/allowed/scripts
# Multiple paths (colon-separated on Linux/Mac, semicolon on Windows)
export CSX_ALLOWED_PATH=/path/one:/path/two:/path/three
重要提示:
- 路径限制为 在Docker容器中禁用 (当
DOTNET_RUNNING_IN_CONTAINER=true) - 这是因为Docker已经通过卷挂载提供了隔离
- 如果未设置,则文件访问不受限制(谨慎使用)
- 递归检查路径-允许使用子目录
贡献
欢迎投稿!请随时提交拉取请求。
- 分叉存储库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add some amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
许可证
麻省理工学院
