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
{
/// Adds two numbers together
///
First number
///
Second number
[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();
await server.RunAsync(port: 8080); // POST http://localhost:8080/mcp3.启动服务器(Stdio)
await server.RunStdioAsync();动态工具注册
server.AddTool(new McpTool
{
Name = "greet",
Description = "Greets a user",
InputSchema = new McpInputSchema
{
Type = "object",
Required = ["name"],
Properties = new Dictionary
{
{ "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 helperCI构建生成了一个即用型 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();
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(); // 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 { { "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();贡献
我们欢迎捐款!请随时提交拉取请求。
致谢
该项目源自 afrise/MCPSharp.
许可证
此项目根据MIT许可证获得许可——请参阅 LICENSE.txt 了解详情。
