C#脚本执行服务

一个基于Roslyn的MCP服务器,用于动态评估和执行C#脚本,支持直接输入或.csx脚本文件,适用于AI助手运行C#代码。

  • by InfinityFlowApp
  • C#
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 InfinityFlowApp/csharp-mcp

使用说明

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

预导入命名空间

以下命名空间将自动可用:

  • System
  • System.IO
  • System.Linq
  • System.Text
  • System.Collections.Generic
  • System.Threading.Tasks
  • System.Net.Http
  • System.Text.Json
  • System.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

这将:

  1. 构建和测试项目
  2. 将Docker镜像发布到GitHub容器注册表
  3. 将NuGet包发布到NuGet.org
  4. 使用自动生成的笔记创建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已经通过卷挂载提供了隔离
  • 如果未设置,则文件访问不受限制(谨慎使用)
  • 递归检查路径-允许使用子目录

贡献

欢迎投稿!请随时提交拉取请求。

  1. 分叉存储库
  2. 创建功能分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add some amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

许可证

麻省理工学院

链接