mcp 概述
mcp(model context protocol)是由 anthropic 推出的一种开放协议,类似 ai 的 usb-c 扩展坞,用于在大模型和数据源之间建立安全的通信(授权),让 ai 应用能够安全地访问和操作本地或远程数据,例如操作本地文件、浏览器和 web 服务。
为了更好地理解 mcp,我们可以用一个简单的类比:如果把 ai 比作电脑主机,那么 mcp 就相当于 usb 协议,而 mcp server 则类似于各种 usb 设备(如摄像头、麦克风等)。通过实现 mcp server,我们可以让 ai 轻松连接到各种数据源,大大扩展其功能范围。
mcp 协议的核心价值在于标准化了 ai 模型与外部工具和数据源的交互方式,使开发者能够创建可被多种 ai 应用程序使用的工具和服务。这种标准化的接口极大地简化了 ai 应用的开发过程,并提高了工具和服务的可重用性。
mcp 的主要特点
- 标准化的工具调用接口
- 安全的双向通信
- 支持多种传输方式(stdio、sse、websocket 等)
- 丰富的数据类型支持
- 与主流 llm 的无缝集成
- 跨平台和跨语言支持
mcp 服务器
mcp 服务器是实现 mcp 协议的服务端,负责注册和提供工具,处理客户端的工具调用请求,并返回结果。服务器可以使用多种传输方式与客户端通信,如标准输入输出、sse 或 websocket。
mcp 客户端
mcp 客户端是实现 mcp 协议的客户端,负责连接到 mcp 服务器,获取可用工具列表,调用工具,并处理返回结果。客户端通常与 llm 集成,使 llm 能够使用 mcp 工具。
.net mcp 实现项目对比
在 .net 生态系统中,目前有几个主要的 mcp 实现项目,它们各有特点。以下是这些项目的对比分析:
官方 c# sdk:csharp-sdk
这是 model context protocol(mcp)官方提供的 c# sdk,为 mcp 服务器和客户端提供简单易用的接口,主要由微软维护。该项目已经成为 mcp 社区的官方 sdk 项目,最近发布了 0.1.0-preview 版本。
github 仓库:
https://github.com/modelcontextprotocol/csharp-sdk
mcpsharp
mcpsharp 是一个 .net 库,旨在帮助开发者构建 model context protocol(mcp)服务器和客户端。它提供了创建 mcp 合规的工具和函数、连接现有 mcp 服务器、将 .net 方法暴露为 mcp 端点、处理 mcp 协议细节和 json-rpc 通信等功能。
特点:
- 与 microsoft.extensions.ai 集成
- semantic kernel 支持
- 动态工具注册
- 工具变更通知
- 复杂对象参数支持
- 错误处理
- 易用的基于属性的 api
- 内置 json-rpc 支持
- 自动参数验证和类型转换
github 仓库:
https://github.com/afrise/mcpsharp
mcpdotnet
mcpdotnet 是一个 .net 实现的模型上下文协议(mcp),使 .net 应用程序能够与 mcp 客户端和服务器进行交互。该项目已经进入归档状态,相关的开发工作都集中到了官方的 csharp-sdk。
特点:
- 支持多种 mcp 功能
- 遵循规范的实现
- 提供全面的日志支持
- 兼容 .net 8.0 及以上版本
github 仓库:
https://github.com/pederhp/mcpdotnet
modelcontextprotocol.net
modelcontextprotocol.net 是一个 c# sdk,实现了模型上下文协议(mcp)。
特点:
- 标准输入输出通信
- 工具集成框架
- 原生 aot 兼容
- 计算器演示实现
- 开发中功能:websocket 支持、资源管理和提示系统
github仓库:
https://github.com/salty-flower/modelcontextprotocol.net
服务器端实现
基本结构
使用官方的 c# sdk (csharp-sdk) 实现 mcp 服务器的基本结构如下:
这段代码展示了如何创建一个基本的 mcp 服务器,它使用标准输入输出(stdio)作为传输方式,并自动注册当前程序集中的所有工具。
关键组件说明:
addmcpserver()
- 向依赖注入容器添加 mcp 服务器服务
withstdioservertransport()
- 配置服务器使用标准输入输出作为传输方式
withtoolsfromassembly()
- 自动注册当前程序集中的所有 mcp 工具
工具注册与实现
在 mcp 服务器中,工具是通过特性(attribute)来注册的。下面是一个简单的工具实现示例:
[mcpservertooltype] public static class echotool { [mcpservertool, description("echoes the message back to the client.")] public static string echo(string message) => $"hello {message}"; }
更复杂的工具可以使用依赖注入和服务器交互:
在 quickstartweatherserver 示例中,我们可以看到更实际的工具实现:
[mcpservertooltype] public static class weathertools { [mcpservertool, description("get weather alerts for a us state.")] public static async task getalerts( httpclient client, [description("the us state to get alerts for.")] string state) { var jsonelement = await client.getfromjsonasync($"/alerts/active/area/{state}"); var alerts = jsonelement.getproperty("features").enumeratearray(); if (!alerts.any()) { return "no active alerts for this state."; } return string.join("\n-\n", alerts.select(alert => { jsonelement properties = alert.getproperty("properties"); return $""" event: {properties.getproperty("event").getstring()} """; })); } }
工具注册特性说明: [mcpservertooltype]
- 标记一个类包含 mcp 工具
[mcpservertool]
- 标记一个方法作为 mcp 工具
[description]
- 提供工具和参数的描述信息
服务配置
mcp 服务器的配置主要通过 .net 的依赖注入系统完成。以下是一个配置 httpclient 的示例:
builder.services.addsingleton(_ => { var client = new httpclient() { baseaddress = new uri("https://api.weather.gov") }; client.defaultrequestheaders.useragent.add(new productinfoheadervalue("weather-tool", "1.0")); return client; });
高级配置选项:
- 自定义传输方式:除了标准的 stdio 传输方式,还可以配置 sse 或 websocket 传输
- 工具过滤:可以选择性地注册特定的工具,而不是注册所有工具
- 中间件:可以添加自定义中间件来处理请求和响应
- 错误处理:可以配置全局错误处理策略
- 日志记录:可以配置详细的日志记录选项
客户端实现
连接到 mcp 服务器
使用官方的 c# sdk 连接到 mcp 服务器的基本代码如下:
var mcpclient = await mcpclientfactory.createasync(new() { id = "demo-server", name = "demo server", transporttype = transporttypes.stdio, transportoptions = new() { ["command"] = command, ["arguments"] = arguments, } });
这段代码创建了一个 mcp 客户端,并连接到指定的服务器。transporttype
指定了通信方式(这里是标准输入输出),transportoptions
提供了额外的配置选项。
支持的传输类型: transporttypes.stdio
- 使用标准输入输出进行通信
transporttypes.sse
- 使用服务器发送事件 (sse) 进行通信
transporttypes.websocket
- 使用 websocket 进行通信
工具调用
连接到服务器后,客户端可以列出可用的工具并调用它们:
var tools = await mcpclient.listtoolsasync(); foreach (var tool in tools) { console.writeline($"connected to server with tools: {tool.name}"); } // 调用工具示例 var result = await mcpclient.calltoolasync( "echo", new dictionary() { ["message"] = "hello mcp!" }, cancellationtoken.none); // 输出结果 console.writeline(result.content.first(c => c.type == "text").text);
工具调用参数说明: toolname
- 要调用的工具名称
parameters
- 工具参数字典,键为参数名,值为参数值
cancellationtoken
- 取消令牌,用于取消操作
结果处理:
工具调用结果包含一个 content
集合,每个内容项都有一个 type
和一个 text
。常见的内容类型包括:
text
- 纯文本内容
application/json
- json 格式的内容
image/*
- 图像内容(如 image/png、image/jpeg 等)
与 claude 模型集成
mcp 客户端可以与 claude 等 ai 模型集成,使模型能够使用 mcp 工具:
var anthropicclient = new anthropicclient(new apiauthentication(builder.configuration["anthropic_api_key"])) .messages .asbuilder() .usefunctioninvocation() .build(); var options = new chatoptions { maxoutputtokens = 1000, modelid = "claude-3-5-sonnet-20240229", tools = [.. tools] }; // 使用 claude 模型处理用户查询 await foreach (var message in anthropicclient.getstreamingresponseasync(query, options)) { console.write(message); }
集成步骤说明:
- 创建 anthropic 客户端并配置 api 密钥
- 启用函数调用功能
- 创建聊天选项,包括模型 id、最大输出令牌数和工具列表
- 使用流式响应 api 处理用户查询
- 处理模型返回的消息,包括工具调用和文本响应
cursor 配置与集成
mcp server 添加步骤
在 cursor 中配置 mcp server 的步骤如下:
- 导航至
cursor settings
>features
>mcp
- 点击
+ add new mcp server
按钮 - 在配置窗口中:
- 选择传输类型
- 配置服务器信息
- 完成添加后,服务器将显示在 mcp 服务器列表中
- 如需更新工具列表,可能需要手动点击刷新按钮
cursor mcp 服务器配置界面示例
传输类型配置
cursor 支持两种主要的传输类型:
stdio
用于标准输入输出通信,适用于本地运行的 mcp 服务器。
配置方式:输入可执行命令
示例:
npx -y @smithery/cli@latest run @mzxrai/mcp-webresearch --config "{}"
sse
用于服务器发送事件通信,适用于远程 mcp 服务器。
配置方式:输入服务器 url
示例:
https://example.com/mcp
工具使用方法
在 cursor 的 composer 中使用 mcp 工具时,你可以:
- 让 composer agent 自动选择合适的工具
- 明确指定使用特定工具
- 查看工具调用的详细信息
- 对工具调用进行管理:
- 检查调用参数
- 决定是否批准调用
- 查看调用结果
工具使用示例:
用户: 搜索关键词 cursor mcp server,列出 top 5 热度的关键词
claude: 我将使用 web search 工具来搜索这些关键词。
工具调用:web search 参数:{"query": "cursor mcp server"}
claude: 根据搜索结果,关于 "cursor mcp server" 的 top 5 热度关键词是:
model context protocol (mcp) integration
custom mcp server development
mcp server templates
database integration
desktop application integration
最佳实践与示例
服务器端最佳实践
使用依赖注入:
利用 .net 的依赖注入系统管理服务和工具的依赖关系。
适当的错误处理:
确保工具实现中包含适当的错误处理逻辑。
详细的工具描述:
使用description
特性为工具和参数提供清晰的描述。
模块化设计:
将不同功能的工具分组到不同的类中。
客户端最佳实践
异步操作:
使用异步方法处理 mcp 客户端的所有操作。
资源管理:
确保适当释放客户端资源。
错误处理:
实现适当的错误处理逻辑,处理服务器连接和工具调用中可能出现的问题。
用户体验:
提供清晰的用户反馈,特别是在工具调用过程中。
集成示例
以下是一个将 mcp 客户端与 claude 模型集成的完整示例:
using anthropic.sdk; using microsoft.extensions.ai; using microsoft.extensions.configuration; using microsoft.extensions.dependencyinjection; using microsoft.extensions.hosting; using modelcontextprotocol.client; using modelcontextprotocol.protocol.transport; using system.componentmodel; var builder = host.createapplicationbuilder(args); builder.configuration .addenvironmentvariables() .addusersecrets(); var (command, arguments) = getcommandandarguments(args); await using var mcpclient = await mcpclientfactory.createasync(new() { id = "demo-server", name = "demo server", transporttype = transporttypes.stdio, transportoptions = new() { ["command"] = command, ["arguments"] = arguments, } }); var tools = await mcpclient.listtoolsasync(); foreach (var tool in tools) { console.writeline($"connected to server with tools: {tool.name}"); } var anthropicclient = new anthropicclient(new apiauthentication(builder.configuration["anthropic_api_key"])) .messages .asbuilder() .usefunctioninvocation() .build(); var options = new chatoptions { maxoutputtokens = 1000, modelid = "claude-3-5-sonnet-20240229", tools = [.. tools] }; console.foregroundcolor = consolecolor.green; console.writeline("mcp client started!"); console.resetcolor(); promptforinput(); while(console.readline() is string query && !("exit".equals(query, stringcomparison.ordinalignorecase))) { if (string.isnullorwhitespace(query)) { promptforinput(); continue; } await foreach (var message in anthropicclient.getstreamingresponseasync(query, options)) { console.write(message); } console.writeline(); promptforinput(); } static void promptforinput() { // 提示用户输入 } static (string, string) getcommandandarguments(string[] args) { // 解析命令行参数 }
这个示例展示了如何创建 mcp 客户端,连接到服务器,获取可用工具,并将这些工具与 claude 模型集成,使模型能够使用这些工具来响应用户查询。
结论
本文档详细介绍了 .net 使用 mcp 的相关内容,包括服务器端实现、客户端实现以及 cursor 集成配置等方面。通过使用 mcp,开发者可以创建强大的工具和服务,使 ai 模型能够安全地访问和操作各种数据源。
随着 mcp 生态系统的不断发展,我们可以期待更多的功能和改进。官方的 c# sdk 提供了一个稳定的基础,使 .net 开发者能够轻松地实现 mcp 服务器和客户端。
我们鼓励开发者探索 mcp 的各种可能性,创建创新的工具和服务,并为 mcp 社区做出贡献。
到此这篇关于.net mcp 文档的文章就介绍到这了,更多相关.net mcp 文档内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论