.NET MCP 文档

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);
}

集成步骤说明:
  1. 创建 Anthropic 客户端并配置 API 密钥

  2. 启用函数调用功能

  3. 创建聊天选项,包括模型 ID、最大输出令牌数和工具列表

  4. 使用流式响应 API 处理用户查询

  5. 处理模型返回的消息,包括工具调用和文本响应

Cursor 配置与集成

MCP Server 添加步骤

在 Cursor 中配置 MCP Server 的步骤如下:

  1. 导航至 Cursor Settings > FeaturesMCP

  2. 点击+ Add New MCP Server按钮

  3. 在配置窗口中:

    • 选择传输类型

    • 配置服务器信息

  4. 完成添加后,服务器将显示在 MCP 服务器列表中

  5. 如需更新工具列表,可能需要手动点击刷新按钮

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 热度关键词是:

  1. Model Context Protocol (MCP) Integration

  2. Custom MCP Server Development

  3. MCP Server Templates

  4. Database Integration

  5. 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 社区做出贡献。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】vim配置----超详细

目录 一、插件管理器准备 二、目录准备 三、安装插件 一、插件管理器准备 Vim-plug 是一个Vim插件管理器,利用异步并行可以快速地安装、更新和卸载插件。它的安装和配置都非常简单,而且在操作过程中会给出很多易读的反馈信息,是一个自由、…

PHP实现图片自动添加水印效果

<?php // 设置原始图片路径和水印图片路径 $original_image original.jpg; $watermark_image watermark.png;// 创建图片资源 $original imagecreatefromjpeg($original_image); $watermark imagecreatefrompng($watermark_image);// 获取图片尺寸 $original_width im…

检查新接手LINUX服务器应用的部署情况和正在运行的服务

当接手一台新的 Linux 服务器时&#xff0c;第一要务就是摸清系统上已经安装部署了哪些应用和服务。 本文将以 CentOS7为例&#xff0c;详细介绍如何系统地排查已安装的应用和服务&#xff0c;包括它们的安装方式和安装位置。 1.查看系统基本信息 首先获取系统整体信息&…

使用注解方式整合ssm时,启动tomcat扫描不到resource下面的xxxmapper.xml问题,解决方法

解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.方法 在Spring与Mybatis整合时&#xff0c;可能会遇到这样的报错 原因&#xff1a; 其原因为mapper路径的映射错误&#xff0c;表示在尝试执行某个 Mapper 接口的方法时…

C++11特性补充

目录 lambda表达式 定义 捕捉的方式 可变模板参数 递归函数方式展开参数包 数组展开参数包 移动构造和移动赋值 包装器 绑定bind 智能指针 RAII auto_ptr unique_ptr shared_ptr 循环引用 weak_ptr 补充 总结 特殊类的设计 不能被拷贝的类 只能在堆上创建…

My SQL 索引

核心目标&#xff1a; 理解 mysql 索引的工作原理、类型、优缺点&#xff0c;并掌握创建、管理和优化索引的方法&#xff0c;以显著提升数据库查询性能。 什么是索引&#xff1f; 索引是一种特殊的数据库结构&#xff0c;它包含表中一列或多列的值以及指向这些值所在物理行的指…

极狐GitLab 注册限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制&#xff1a; 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…

10.(vue3.x+vite)div实现tooltip功能(css实现)

1:效果截图 2:代码实现 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;

Linux下 文件的查找、复制、移动和解压缩

1、在/var/log目录下创建一个hehe.log的文件&#xff0c;其文件内容是&#xff1a; myhostname ghl mydomain localdomain relayhost [smtp.qq.com]:587 smtp_use_tls yes smtp_sasl_auth_enable yes smtp_sasl_security_options noanonymous smtp_sasl_tls_security_opt…

Ubuntu 安装 Docker 教程(官方推荐方式)

✅ 步骤 1&#xff1a;卸载旧版本&#xff08;如果有&#xff09; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ✅ 步骤 2&#xff1a;更新 APT 索引并安装依赖项bash sudo a…

计算机视觉与深度学习 | Transformer原理,公式,代码,应用

Transformer 详解 Transformer 是 Google 在 2017 年提出的基于自注意力机制的深度学习模型,彻底改变了序列建模的范式,解决了 RNN 和 LSTM 在长距离依赖和并行计算上的局限性。以下是其原理、公式、代码和应用的详细解析。 一、原理 核心架构 Transformer 由 编码器(Encod…

计算机基础 | 常见进制与单位简介 / 表示 / 描述

注&#xff1a;本文为 “进制与常见单位应用” 相关文章合辑。 原文为繁体&#xff0c;注意术语描述差异。 略作重排。 进制简介&#xff08;二进制、八进制、十进制、十六进制&#xff09; 发表于 2017-01-20 郑中胜 数字系统&#xff08;Numeral system&#xff09;&#…

门面模式与适配器模式

一、门面模式 门面模式&#xff1a;提供统一接口访问子系统接口 1、包含角色 外观系统对外的统一接口子系统类的集合&#xff1b;并不知道外观角色的存在&#xff0c;需要为了配合外观角色而做特殊处理或修改 2、举例 原本开关灯要分别操作各个房间的灯&#xff0c;现在设置总…

SpringBoot Actuator指标收集:Micrometer与Prometheus集成

文章目录 引言一、Spring Boot Actuator基础二、Micrometer简介与集成三、基本指标收集与配置四、自定义业务指标实现五、与Prometheus集成六、实战案例&#xff1a;API性能监控总结 引言 在现代微服务架构中&#xff0c;监控应用程序的健康状况和性能指标变得至关重要。Sprin…

【Android面试八股文】Android应用进程的启动流程【二】

应用进程 1.1 Android系统进程的启动过程&#xff1a; 1、init进程fork出Zygote进程后&#xff0c;Zygote进程会创建一个服务端socket&#xff0c;等待AMS发起socket请求。 同时&#xff0c;由Zygote进程fork出的SystemServer进程会启动各项系统服务&#xff0c;其中就包含了A…

基于Django的AI客服租车分析系统

基于Django的AI客服租车分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】AI智能客服与用户交互指导手册 【技术栈】 ①&#xff1a;系统环境&#xff1a;Python 3.8&#xff0c;Django 4.2框架 ②&#xff1a;开发环境&a…

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…

linux 搭建 dvwa 渗透测试环境

linux 安装 dvwa 1、分为4个部分&#xff0c;搭建dvwa渗透测试环境2、安装centos 7.63、安装apache http server4、安装mysql5、安装php6、运行dvwa 1、分为4个部分&#xff0c;搭建dvwa渗透测试环境 本文基于centos 7.6 搭建 dvwa 渗透测试环境 安装一个linux系统安装apache…

stm32(gpio的四种输出)

其实GPIO这个片上外设的功能&#xff1a; 用于控制IO引脚。 CPU就如同大脑&#xff0c;而这些片上外设就如同四肢一样的关系 如图 —————————————————————————————— OK类比了以上 其实GPIO是有 八种工作模式的 这八种工作模式 因为GPIO是面向IO…

Flask(3): 在Linux系统上部署项目

1 前言 说实话&#xff0c;我并不想接触linux系统&#xff0c;要记住太多的命令。我更习惯windows系统&#xff0c;鼠标点点&#xff0c;只要记住少量的命令就可以了。 但是我选择了python&#xff0c;就注定无法逃避linux系统。虽然python也能在windows上很好的运行&#xff0…