模型上下文协议服务器

MinMCPSharp是一个轻量级的模型上下文协议(MCP)服务器和客户端,适用于.NET和Unity,支持HTTP和stdio传输。

  • by ManuelKugelmann
  • C#
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 ManuelKugelmann/MinMCPSharp

使用说明

MinMCPSharp

轻量级 模型上下文协议 (MCP)服务器和客户端 .NET 和 统一.

  • 基于属性的API
  • HTTP和stdio
  • 最小依赖性

特性

  • [McpTool] / [McpResource] 属性API-标记方法,并且服务器已准备就绪
  • MCP客户端 --通过HTTP或stdio(子进程)连接到任何MCP服务器
  • HTTP传输 (可流式HTTP,MCP 2025-03-26规范) System.Net.HttpListener --没有ASP。NET必需
  • 标准运输 用于编辑器集成和管道通信
  • Unity兼容 --netstandard2.0,没有IL2CPP破坏依赖关系,包括主线程调度
  • 交叉装配工具装载 --从外部DLL注册工具
  • 运行时的动态工具注册
  • 客户端工具调用的权限门
  • 具有自动JSON模式生成功能的复杂对象参数

依赖项

包 目的 运行时依赖
Newtonsoft。Json Json序列化 0
PolySharp C#13 polyfills 仅限编译时

安装

dotnet add package MinMCPSharp

快速开始

1.定义工具

using MinMCPSharp;

public class Calculator
{
    /// <summary>Adds two numbers together</summary>
    /// <param name="a">First number</param>
    /// <param name="b">Second number</param>
    [McpTool]
    public static int Add([McpParameter(true)] int a, [McpParameter(true)] int b)
        => a + b;
}

2.启动服务器(HTTP)

using MinMCPSharp;

var server = new McpServer("CalculatorServer", "1.0.0");
server.Register<Calculator>();
await server.RunAsync(port: 8080); // POST http://localhost:8080/mcp

3.启动服务器(Stdio)

await server.RunStdioAsync();

动态工具注册

server.AddTool(new McpTool
{
    Name = "greet",
    Description = "Greets a user",
    InputSchema = new McpInputSchema
    {
        Type = "object",
        Required = ["name"],
        Properties = new Dictionary<string, McpParameterSchema>
        {
            { "name", new McpParameterSchema { Type = "string", Description = "User name" } }
        }
    }
}, (string name) => $"Hello, {name}!");

Unity集成

将netstandard2.0 DLL和两个下拉脚本复制到Unity项目中:

Assets/
  Plugins/
    MinMCPSharp.dll              # netstandard2.0 build
  Scripts/
    McpServerBehaviour.cs        # MonoBehaviour wrapper
    MainThreadDispatcher.cs      # Main-thread dispatch helper

CI构建生成了一个即用型 MinMCPSharp.Unity 这些文件中的工件。

// Option A: Inspector-driven
// Add McpServerBehaviour to a GameObject, configure in Inspector

// Option B: Code-driven
var behaviour = McpServerBehaviour.Create("MyGame", "1.0.0", port: 8080);
behaviour.Register<MyGameTools>();
behaviour.StartServer();

McpServerBehaviour 处理生命周期(唤醒/销毁),并可选择通过以下方式将工具调用分派到Unity的主线程 MainThreadDispatcher.

平台说明: HTTP传输使用 System.Net.HttpListener,适用于Windows和macOS桌面版本(Mono和IL2CPP)。 HttpListener 是 不可用 在iOS、Android或WebGL上——在这些平台上,你需要一个自定义的传输实现 IMcpTransport.

api参考

属性

属性 目标 属性
[McpTool] 方法、类 Name, Description
[McpParameter] 参数 Required, Description
[McpResource] 方法、性质 Name, Uri, MimeType, Description

McpServer

var server = new McpServer(name, version);
server.Register<T>();                          // Register tool/resource class
server.RegisterAssembly(assembly);             // Scan assembly for attributed types
server.AddTool(tool, delegate);                // Register dynamic tool
server.Start(endpoint, port);                  // Start HTTP (non-blocking)
server.Start(transport, endpoint, port);       // Start with custom transport
await server.RunAsync(port: 8080);             // Start HTTP and block
await server.RunStdioAsync();                  // Start stdio and block
server.Stop();                                 // Stop server

运输

运输 类别 用例
HTTP HttpListenerTransport Web客户端、跨进程、Unity
停止 StdioTransport 编辑器集成、管道I/O
自定义 实施 IMcpTransport 您自己的交通工具

MCP客户端

通过HTTP或生成子进程连接到任何MCP服务器:

// HTTP client
var client = new McpClient("MyClient", "1.0.0",
    new Uri("http://localhost:8080/mcp"));
await client.InitializeAsync();

var tools = await client.GetToolsAsync();
var result = await client.CallToolAsync("echo",
    new Dictionary<string, object> { { "input", "hello" } });
Console.WriteLine(result.Content[0].Text);

// Stdio client (spawns process)
var stdioClient = new McpClient("MyClient", "1.0.0",
    "dotnet", "path/to/server.dll");
await stdioClient.InitializeAsync();

许可门

client.GetPermission = (parameters) =>
{
    Console.WriteLine($"Tool: {parameters["tool"]}");
    Console.Write("Allow? (y/N) ");
    return Console.ReadKey().Key == ConsoleKey.Y;
};

交叉装配工具

从外部DLL注册工具:

// In ExternalTools.dll
public class MyExternalTool
{
    [McpTool("external-tool", "A tool from another assembly")]
    public static string Run() => "success";
}

// In your server
server.Register<MyExternalTool>();

贡献

我们欢迎捐款!请随时提交拉取请求。

致谢

该项目源自 afrise/MCPSharp.

许可证

此项目根据MIT许可证获得许可——请参阅 LICENSE.txt 了解详情。