十分钟入门MCPServer,创建您自己的MCPServer工具

AI飞书交流群:

如果您需要深入交流了解请加入我们一块交流:

https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=b7co0430-daed-441b-8b6f-99c423d91221

  1. 创建一个MCPServer的WebAPI项目

img
img
  1. 增加MCP的依赖

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.14"/>
        <PackageReference Include="ModelContextProtocol" Version="0.1.0-preview.2" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2"/>
    </ItemGroup>

</Project>
  1. 创建McpEndpointRouteBuilderExtensions代码实现

public staticclassMcpEndpointRouteBuilderExtensions
{
    public static IEndpointConventionBuilder MapMcpSse(this IEndpointRouteBuilder endpoints)
    {
        IMcpServer? server = null;
        SseResponseStreamTransport? transport = null;
        var loggerFactory = endpoints.ServiceProvider.GetRequiredService<ILoggerFactory>();
        var mcpServerOptions = endpoints.ServiceProvider.GetRequiredService<IOptions<McpServerOptions>>();

        var routeGroup = endpoints.MapGroup("");

        routeGroup.MapGet("/sse", async (HttpResponse response, CancellationToken requestAborted) =>
        {
            awaitusingvar localTransport = transport = new SseResponseStreamTransport(response.Body);
            awaitusingvar localServer = server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider);

            await localServer.StartAsync(requestAborted);

            response.Headers.ContentType = "text/event-stream";
            response.Headers.CacheControl = "no-cache";

            try
            {
                await transport.RunAsync(requestAborted);
            }
            catch (OperationCanceledException) when (requestAborted.IsCancellationRequested)
            {
                // RequestAborted always triggers when the client disconnects before a complete response body is written,
                // but this is how SSE connections are typically closed.
            }
        });

        routeGroup.MapPost("/message", async context =>
        {
            if (transport isnull)
            {
                await Results.BadRequest("Connect to the /sse endpoint before sending messages.").ExecuteAsync(context);
                return;
            }

            var message = await context.Request.ReadFromJsonAsync<IJsonRpcMessage>(McpJsonUtilities.DefaultOptions, context.RequestAborted);
            if (message isnull)
            {
                await Results.BadRequest("No message in request body.").ExecuteAsync(context);
                return;
            }

            await transport.OnMessageReceivedAsync(message, context.RequestAborted);
            context.Response.StatusCode = StatusCodes.Status202Accepted;
            await context.Response.WriteAsync("Accepted");
        });

        return routeGroup;
    }
}
  1. 创建MCPServer的Tool支持

/Tools/CalculateTool.cs
using System.ComponentModel;
using ModelContextProtocol.Server;

namespace MCPServer.Tools;

[McpServerToolType]
public static class CalculateTool
{
    ///<summary>
    /// 计算加法
    ///</summary>
    [McpServerTool("add"), Description("计算俩个数的和")]
    public static async Task<string> Add(
        IMcpServer thisServer,
        [Description("第一个数字")] int a,
        [Description("第二个数字")] int b)
    {
        // 计算加法
        int result = a + b;
        return $"计算结果: {result}";
    }
}
/Tools/SampleLlmTool.cs
/// <summary>
/// This tool uses dependency injection and async method
/// </summary>
[McpServerToolType]
public static class SampleLlmTool
{
    [McpServerTool("sampleLLM"), Description("Samples from an LLM using MCP's sampling feature")]
    public static async Task<string> SampleLLM(
        IMcpServer thisServer,
        [Description("The prompt to send to the LLM")]
        string prompt,
        [Description("Maximum number of tokens to generate")]
        int maxTokens,
        CancellationToken cancellationToken)
    {
        ChatMessage[] messages =
        [
            new(ChatRole.System, "You are a helpful test server."),
            new(ChatRole.User, prompt),
        ];

        ChatOptions options = new()
        {
            MaxOutputTokens = maxTokens,
            Temperature = 0.7f,
        };

        var samplingResponse =
            await thisServer.AsSamplingChatClient().GetResponseAsync(messages, options, cancellationToken);

        return $"LLM sampling result: {samplingResponse}";
    }
}
  1. 修改Program.cs文件

using MCPServer;
using ModelContextProtocol;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddMcpServer().WithToolsFromAssembly();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.MapMcpSse();

app.Run();

启动服务,然后打开您的cursor,添加你的sse服务的信息

{
  "mcpServers": {
    "token": {
      "url": "http://localhost:5000/sse"
    }
  }
}
  1. 开始运行MCPServer

然后在这里显示绿色则是成功了,如果没成功先启动您的服务,然后点击右边的刷新按钮即可

img
im

然后我们需要使用Agent模式执行函数,先通过提示词告诉它您需要通过tool帮我们计算,然后就会如图的效果,那么您的MCPServer就完成了。

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值