2025/12/27 23:24:15
网站建设
项目流程
做兼职比较好的网站有哪些,百度官方网站下载安装,wordpress 文章 视频,重庆新闻第一眼Model Context Protocol (MCP) 是一个标准化协议#xff0c;让 AI 客户端#xff08;如 Claude、ChatGPT 等#xff09;能够通过统一的接口调用你的 API。本文将详细介绍如何在 ASP.NET Core WebApi 项目中集成 MCP 支持#xff0c;实现 AI 与你的服务无缝对接。什么是 MCP…Model Context Protocol (MCP) 是一个标准化协议让 AI 客户端如 Claude、ChatGPT 等能够通过统一的接口调用你的 API。本文将详细介绍如何在 ASP.NET Core WebApi 项目中集成 MCP 支持实现 AI 与你的服务无缝对接。什么是 MCPMCPModel Context Protocol是一个开放协议旨在标准化 AI 应用与外部工具、数据源之间的通信方式。通过 MCP你的 API 可以被 AI 助手自动发现和调用提供标准化的工具描述和参数定义支持多种传输模式HTTP、Stdio实现安全的认证和授权核心特性本项目实现了以下功能✅ 使用官方 ModelContextProtocol.AspNetCore SDK✅ 通过 [McpServerTool] 特性快速定义工具✅ 自动参数绑定和 JSON Schema 生成✅ 支持 HTTP 和 Stdio 双传输模式✅ 基于 Token 的认证和授权✅ 与现有 WebApi 完美共存快速开始第一步安装 NuGet 包dotnet add package ModelContextProtocol.AspNetCore --version 0.4.0-preview.3第二步配置 MCP 服务在 Program.cs 中添加 MCP 配置using ModelContextProtocol.Server;var builder WebApplication.CreateBuilder(args);builder.Services.AddControllers();// 添加 MCP 服务器支持 HTTP 和 Stdio 双模式builder.Services.AddMcpServer(options {options.ServerInfo new ModelContextProtocol.Protocol.Implementation{Name Weather API,Version 1.0.0};}).WithHttpTransport() // HTTP 模式用于 Web 客户端.WithStdioServerTransport() // Stdio 模式用于 Kiro IDE 等本地工具.WithToolsFromAssembly();var app builder.Build();// 添加认证中间件可选app.UseMiddlewareMcpAuthenticationMiddleware();app.UseAuthorization();app.MapControllers();// 映射 MCP 端点app.MapMcp(/mcp);app.Run();第三步定义 MCP 工具创建 Tools/WeatherTools.csusing System.ComponentModel;using ModelContextProtocol.Server;[McpServerToolType]public static class WeatherTools{[McpServerTool][Description(Get weather forecast for the next 5 days)]public static IEnumerableWeatherForecast GetWeatherForecast(){var rng new Random();return Enumerable.Range(1, 5).Select(index new WeatherForecast{Date DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();}[McpServerTool][Description(Get current weather for a specific city)]public static WeatherForecast GetWeatherByCity([Description(The name of the city)] string city){var rng new Random();return new WeatherForecast{Date DateOnly.FromDateTime(DateTime.Now),TemperatureC rng.Next(-20, 55),Summary $Weather in {city}: {Summaries[rng.Next(Summaries.Length)]}};}private static readonly string[] Summaries new[]{Freezing, Bracing, Chilly, Cool, Mild,Warm, Balmy, Hot, Sweltering, Scorching};}第四步配置认证可选在 appsettings.json 中配置{McpAuth: {Enabled: true,ValidTokens: [your-secret-token-here]}}开发环境可以禁用认证appsettings.Development.json{McpAuth: {Enabled: false}}第五步运行和测试dotnet run应用启动后可以访问Swagger UI: http://localhost:5000/swaggerWebApi: http://localhost:5000/weatherforecastMCP 端点: http://localhost:5000/mcp传输模式详解HTTP 模式适用于 Web 应用、Claude Desktop、远程访问等场景。测试示例# 列出所有工具curl -X POST http://localhost:5000/mcp \-H Content-Type: application/json \-d {jsonrpc:2.0,id:1,method:tools/list}# 调用工具curl -X POST http://localhost:5000/mcp \-H Authorization: Bearer your-secret-token-here \-H Content-Type: application/json \-d {jsonrpc:2.0,id:2,method:tools/call,params:{name:GetWeatherForecast,arguments:{}}}Claude Desktop 配置编辑配置文件Windows: %APPDATA%\Claude\claude_desktop_config.json{mcpServers: {weather-api: {url: http://localhost:5000/mcp,headers: {Authorization: Bearer your-secret-token-here}}}}Stdio 模式适用于 Kiro IDE、本地命令行工具等场景无需网络端口。Kiro IDE 配置编辑 .kiro/settings/mcp.json{mcpServers: {weather-api: {command: dotnet,args: [run, --project, path/to/NetCoreApiMcpDemo.csproj],env: {ASPNETCORE_ENVIRONMENT: Development}}}}模式对比特性 HTTP 模式 Stdio 模式传输方式 HTTP POST 标准输入/输出适用场景 Web 应用、远程访问 本地工具、IDE 集成认证 HTTP Header 环境变量/配置网络 需要网络端口 无需网络性能 网络开销 进程间通信更快认证和授权实现认证中间件创建 Middleware/McpAuthenticationMiddleware.cspublic class McpAuthenticationMiddleware{private readonly RequestDelegate _next;private readonly IConfiguration _configuration;private readonly ILoggerMcpAuthenticationMiddleware _logger;public McpAuthenticationMiddleware(RequestDelegate next,IConfiguration configuration,ILoggerMcpAuthenticationMiddleware logger){_next next;_configuration configuration;_logger logger;}public async Task InvokeAsync(HttpContext context){// 只对 MCP 端点进行认证if (!context.Request.Path.StartsWithSegments(/mcp)){await _next(context);return;}// 检查是否启用认证var authEnabled _configuration.GetValuebool(McpAuth:Enabled);if (!authEnabled){await _next(context);return;}// 验证 Tokenvar authHeader context.Request.Headers[Authorization].FirstOrDefault();if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith(Bearer )){context.Response.StatusCode 401;await context.Response.WriteAsJsonAsync(new { error Unauthorized });return;}var token authHeader.Substring(Bearer .Length).Trim();var validTokens _configuration.GetSection(McpAuth:ValidTokens).Getstring[]();if (validTokens null || !validTokens.Contains(token)){context.Response.StatusCode 401;await context.Response.WriteAsJsonAsync(new { error Invalid token });return;}await _next(context);}}安全最佳实践使用强 Token至少 32 字符的随机字符串定期轮换定期更换 Token使用 HTTPS生产环境必须使用 HTTPS环境隔离开发和生产使用不同的 Token日志安全不要在日志中记录完整 Token客户端集成示例C# 客户端using ModelContextProtocol;using ModelContextProtocol.Client;var transport new HttpClientTransport(new HttpClientTransportOptions{BaseUrl new Uri(http://localhost:5000/mcp),Headers new Dictionarystring, string{[Authorization] Bearer your-secret-token-here}});var client await McpClient.CreateAsync(transport);await client.InitializeAsync(new InitializeParams{ProtocolVersion 2025-06-18,ClientInfo new Implementation{Name MyApp,Version 1.0.0}});// 列出工具var tools await client.ListToolsAsync();// 调用工具var result await client.CallToolAsync(GetWeatherForecast,new Dictionarystring, object?());JavaScript/Vue 客户端script setupimport { ref } from vue;const weather ref();const MCP_URL http://localhost:5000/mcp;const TOKEN your-secret-token-here;const callMcp async (method, params {}) {const response await fetch(MCP_URL, {method: POST,headers: {Content-Type: application/json,Authorization: Bearer ${TOKEN},},body: JSON.stringify({jsonrpc: 2.0,id: Date.now(),method,params,}),});return response.json();};const getWeather async () {const data await callMcp(tools/call, {name: GetWeatherForecast,arguments: {},});weather.value data.result.content[0].text;};/scriptMCP Tools 最佳实践让 AI 更准确地使用你的工具是成功的关键。以下是经过实践验证的最佳实践。核心原则AI 通过以下信息决定是否使用你的工具工具名称 - 清晰、描述性Description - 详细的功能说明参数描述 - 明确的参数用途使用场景 - 何时应该使用这个工具1. 使用清晰的命名// ❌ 不好 - 名称模糊[McpServerTool]public static string Get() { }// ✅ 好 - 动词开头描述清晰[McpServerTool]public static string GetWeatherForecast() { }// ✅ 更好 - 包含具体信息[McpServerTool]public static string GetWeatherForecastForNextDays() { }命名建议使用动词开头Get, Search, Calculate, Compare, Analyze包含操作对象Weather, Temperature, Forecast避免缩写和简称使用 PascalCase2. 编写详细的 Description最重要这是最关键的部分AI 主要通过 Description 判断是否使用工具。// ❌ 不好 - 太简短[Description(Get weather)]// ⚠️ 一般 - 有基本信息但不够[Description(Get weather forecast for the next 5 days)]// ✅ 好 - 包含详细信息和使用场景[Description(Get detailed weather forecast for the next several days including temperature, weather conditions, and trends.Use this tool when users ask about:- Future weather (tomorrow, next week, upcoming days)- Weather predictions or forecasts- Planning activities based on weather- Temperature trendsExamples of user queries:- Whats the weather forecast for the next 5 days?- Will it rain this week?- Whats the temperature trend?)]Description 应该包含功能说明 - 工具做什么使用场景 - 何时使用Use this tool when...示例查询 - 用户可能的提问方式支持的功能 - 特殊能力或限制3. 详细的参数描述