MCP Server核心源码解析以及自定义MCP Server

大家好,今天来讲一下mcpsover的一些核心组件以及这些核心组件的一些代码怎么来内部实现?还有举个例子,怎么自定义一个mcpserver?大家可以想一下这个场景,在现在的比较大型的服务里面肯定是有很多的服务,就是service,每个service可能有不同的功能。

这个时候如果把service升级成一个mcpserver,怎么去把一部分service放到amcpserver,把另一部分service放到bmcpserver?今天也一起来讲一下。

首先先看一个mcpserver这边几个重要的组件。

·第一个就是transportprovider,相当于是一个通信的提供者。

·第二个就是rootfunction,其实就是一个路由。

·第三个就是如何来创建一个mcpserver。

首先先看一下webfluxtransportprovider的代码,首先transportprovider其实有好几个实现类,因为现在这个项目是一个webflux的项目,所以来看一下webfluxsesotransport,看这个类的代码是怎么实现。

首先来看一下自定义,怎么自定义?要把它传入一个messageinput和sseinput,如果不去自定义的时候,其实上节课也看到了默认的其实就是杠sse和杠message这么两个端点,所以这个时候通过构造函数去定义了两个自定义的端点,一个是sce的端点,一个是message的端点。

可以看一下,其实最重要的就是这一步会把自定义的两个端点,比如sse的端点是一个注册的get请求,它的处理方法就是焊的sseconnection,post就是一个焊的message,这是它最重要的两块代码。

看的sse的connection的代码大体就是当请求一个刚sse地址的时候会怎么处理?处理就首先会去创建一个三审id,上节课也说到了会创建一个三审id,会把三审id加上messageandpoint,就是message的端点告诉客户端,通过sse的形式来告诉客户端,这样后续客户端在发起请求的时候post请求的时候就知道往哪个地址去发送请求,并且要带着这个。

但是id是一个绘画管理的机制,这就是创建了一个transportprovider,相当于是来创建一个通信机制,这样后续客户端可以来发起调用。

喊得message就是后续刚message请求过来之后是怎么处理的?喊得message请求其实首先会看一下赛神id,就是必须要携带赛神id,赛神id拿到之后会把通过三审id来取到一个mcpsetofsession,是一个绘画工厂。

下一步就是,它这个处理的就是handle,handle就是它会根据不同的请求的方法来进行处理。

后面看mcp server的怠慢的时候其实也能看到它是可以毁掉到之前定义的mcp server 的方法里边,所以这是去创建一个transport provider里边比较重要的一些代码,就是它定义了get请求和post请求,后续怎么处理?

它的核心机制就是绘画管理,会为每个sse连接创立独立的绘画赛事id,以及一个生命周期的管理,这是transport。

·下一个就是root function,root function其实通过参数也可以看出来,通过方法名也可以看出来就是路由的作用,其实就跟在平时super mvc里边写一个hgdp请求的时候,比如写一个request manping就是一个道理,它的意思就是当比如请求杠mcp杠message或者请求杠mcp杠s s e的时候,把请求处理转移到哪个方法里边?

其实就像刚才transport里边有一个red方格审get的处理方法是post处理方法是hand message,如果自定义去server,所以也需要去注册一个re read function,把next server以及它的处理类来注册进去,这是一个read function。

read function其实最重要的就是路由,并且可以对于路由做一些过滤,后面可以看代码。

·还有一个就是mcp server,它是一个同步的mcp server,mcp server就是用来构建一个mcp server,它的构建其实也可以根据代码去看一下。

mcp server的首先要有一个ambility的变量,它的作用就是到后面真正在构建mcp server的时候告诉mcp server去有哪些能力,比如现在可以有too的能力,有promote的能力,其他的就没有了,最终真正去创建mcp做过最重要的是这个必要的方法。

这个必要的方法大家看一下,首先在这里边会定义一个转换,把传入的这些serverinfo、servercambility、resource这些能力封装成一个对象,下一步就是再转成一个异步的mcp server futures,就是相当于同步做了转了一步,这里边的作用就是转换。

再往下其实这是new了一个mcp server,就是把transport provider以及mapper以及它的刚才传入的这些工具promote、several音否,这个车是放进去构造了一个mcp server,下一步其实就是看它怎么处理了,最重要的代码其实是。在这个里边就是mcp server,它扭了一个异步的server实现,这个地方根据传入的那些能力去做一个实例化,其实这个时候会把这些handle去做一个注册。

首先,如果能力里边有兔子,就会把list和core这两个方法给注入进来。to list的方法怎么执行?就是list request穿的,所以这样等客户端去请求to list请求的时候,就是这个在处理。是怎么处理的?就是这里边的逻辑。

下一个就是request,request的时候怎么处理?就是在这个里边去发起调用,包括下面的promote都是,这个就是相当于构建了一个mcp server。

拿mcp的拷兔来看一下,就是在注册mcp server的时候定义了要靠to要执行这个方法,怎么执行的?就是前面不看了,最终其实就是这个地方凸点靠点apply,然后exchange,以及客户端传过来的参数,其实就是在注册的时候就把吐的一些方法作为毁掉函数放到了注册的mcp server里面。

所以等后面mcp server接到to co的请求的时候,其实就是执行了已提前注册好的回调方法,其实就是这个逻辑。再往下看,最后会放到了session factory,就是绘画工厂里边,这就和刚才在看provider那里边逻辑是对的起来的了。

所以比如这个地方进来看message的时候,比如会拿到请求的方法,比如路径是promotegant或者car to,这个时候其实就是从刚才的三十factory里边取到对应的方法,然后再去执行。执行其实就是刚才提前放进去的回调函数去做执行。

其实mcp server的创建其实就是这些逻辑,怎么去实现在一个服务里边去注册多个mcp server?就是相当于自定义一个mcp server,基于刚才看的这三个基本组件,相当于就了解要怎么处理了。

·第一步就是都要new一个web flux,一个transport provider,这个时候要自定义message端点和sse端点,这里就是一个叫customer mcp message,一个叫weather mcp message。

·下一步就是路由,需要把sse的端点和message的端点路由放到整个项目的路由表里边,这样等比如客户端请求weather message 的时候才认为是可处理的,否则就会报404,相当于没有handle就没法处理,所以这里就要把rot function,这里肯定是这两个provider都会注入进来。

·注入进来之后下一步就是循环两个provider,分别,把它放到rot function里边。rot function其实在自定义写的时候其实是有一个feeler方法的,这个时候其实可以做一些对于sse请求的一些过滤,比如对于一些客户端可以让他携带一些参数,对他这个请求做一些拦截都是可以的。

路由是可以组合的,它可以随时按的,所以就是有多个proy的都可以去注册到路由表里边。完成了这一步之后相当于整个mcp的两个mcp server的两个端点才可以被访问到,被客户端访问到。

下一步就是怎么去构建mcp server,这里就是有两个server,一个是customer,一个是weather两个server。其实也可以看到也有两个promote,一个是minepromote,一个是weatherpromote,两个端点以及两个custom对应的to,它的方法就是查询周边美食的方法。

weather还是之前的查询天际的图所,所以其实就是分别各自有一个to。下一步就是来构建mcp server。刚才说到了首先就是把canbility的对象给构造出来,就是要有哪些能力就把它放进去。比如没有一个promote,这个地方放的就是false,这个地方应该写错了。

没有promote的时候相当于就不去注册它对应的实现方法了。刚才必要的就是在这个地方把mcp server构建出来,这样一套流程下来相当于就是暴露了我的端点,以及把它放到了路由表里边,以及勾走了一个mcp server,这样就可以实现两个不同的mcp server的构建。

现在来看一下效果,直接用inspector去试试一下,不需要接客户端。respect就是看这里,比如现在是一个weather的mcp server,理论上来讲应该拿到的就是weather的two和weather的promote。先清一下,listtwo是有weather的,它并没有拿到customer里边儿的to,查一下它就是天气的to。

promote也同样的道理,listpromote拿到的就是weather的promote,这个时候再去换一下,换成customer清一下,这个时候拿到的promote就是customer的promote,promote同样的道理,拿到的就是周边美食的一个,就不是天气了。

所以这样其实就实现了在springboot的服务中来自定义多个mcp server,相当于这样就可以把自己本身项目中不同的service服务来进行分类。这样如果客户端在用的时候,可以根据不同的客户端,service来提供不同的端,这样就不至于把mcp server里边所有的工具和端点都拿过去。

这里其实有一个关键点,如果是自定义的mcp server,需要把threeai的mcp server自动的注册关掉,关掉的方式就是在启动类里边,在上面去clue的把它排除掉。如果不排除其实是有问题的,相当于还是会走默认的那套逻辑,观点都是刚sse,没设置,所以一定要去把它给去掉。

今天主要讲了几个核心组件,是不是mcp server的几个核心组件?一个是web flux transport provider,还有就是root function,还有就是mcp server的构建。下次再去看一下客户端的一些关键的配置,其实客户端可能就比较少了。

今天就先到这里。