找回密码
 立即注册
首页 业界区 业界 干货分享!MCP 实现原理,小白也能看懂

干货分享!MCP 实现原理,小白也能看懂

虹姥 前天 22:29
不知道大家有没有发现?对于添加到 MCP 服务市场的成千上万个 MCP 服务(而且这个数字每天还在增加),我们可以不写一行代码,轻松实现调用,但背后的原因究竟是啥呢?
1.webp

MCP 虽然用起来很方便,但搞不懂背后的实现原理,总感觉这个知识点还没完全掌握,所以接下来,我们一起来看它的实现原理。
从某个 MCP 的调用说起

在调用某个 MCP 服务的时候,只需要在 json 配置文件中添加一段 MCP 服务厂商提供的 json 信息就可以实现服务调用了。
例如要调用百度地图提供的 8 大核心功能:地理编码、逆地理编码、地点检索、路线规划、天气查询、IP 定位等功能时,我们只需要添加以下 json 就能轻松调用了:
  1. {
  2.   "mcpServers": {
  3.     "baidu-map": {
  4.       "command": "npx",
  5.       "args": [
  6.         "-y",
  7.         "@baidumap/mcp-server-baidu-map"
  8.       ],
  9.       "env": {
  10.         "BAIDU_MAP_API_KEY": "xxx"
  11.       }
  12.     }
  13.   }
  14. }
复制代码
执行结果如下:
2.webp

要搞明白调用的实现原理,我们需要先从 json 配置文件说起,以上配置文件是 nodejs 的调用命令,其中“npx”是 “npm execute package” 的缩写,它的主要功能是运行一个包中的可执行文件,而无需先将其全局安装或添加到项目的依赖中,此时我们使用传统的 npm 使用方式,将百度提供的依赖下载到本地:
3.webp

源码分析

我们查看其源码就可以发现:
4.webp

其主要文件 dist/index.js 的核心源码如下:
  1. // 启动一个 stdio 服务器
  2. async function runServer() {
  3.   const transport = new StdioServerTransport();
  4.   await server.connect(transport);
  5.   console.error("Baidu Map MCP Server running on stdio");
  6. }
  7. // 查询天气的工具实现
  8. async function handleWeather(districtId, location) {
  9.   const url = new URL("https://api.map.baidu.com/weather/v1/");
  10.   url.searchParams.append("data_type", "all");
  11.   url.searchParams.append("coordtype", "bd09ll");
  12.   url.searchParams.append("ak", BAIDU_MAP_API_KEY);
  13.   url.searchParams.append("from", "node_mcp");
  14.   if (location) {
  15.     url.searchParams.append("location", location);
  16.   }
  17.   if (districtId) {
  18.     url.searchParams.append("district_id", districtId);
  19.   }
  20.   const response = await fetch(url.toString());
  21.   const data = await response.json();
  22.   if (data.status !== 0) {
  23.     return {
  24.       content: [{
  25.         type: "text",
  26.         text: `Weather searth failed: ${data.message || data.status}`
  27.       }],
  28.       isError: true
  29.     };
  30.   }
  31.   return {
  32.     content: [{
  33.       type: "text",
  34.       text: JSON.stringify({
  35.         location: data.result.location,
  36.         now: data.result.now,
  37.         forecasts: data.result.forecasts,
  38.         forecast_hours: data.result.forecast_hours,
  39.         indexes: data.result.indexes,
  40.         alerts: data.result.alerts,
  41.       }, null, 2)
  42.     }],
  43.     isError: false
  44.   };
  45. }
复制代码
从以上源码我们可以大致看出,百度作为 MCP 服务提供商,帮我们做了以下这些事:

  • 启动 stdio 服务端,等待 MCP 客户端连接。
  • 当检测到客户端的通讯请求之后,它通过 HTTP 协议请求自己服务器的信息,再将返回结果以 stdio 方式发送给 MCP 客户端。
到这里,我们就搞明白了,之所以 MCP 使用比较简单,原因是每家 MCP 服务厂商,帮我们实现了服务的具体调用
并且他们遵循了 MCP 通讯协议,因此我们只需要使用 MCP Client 简单调用就可以实现某个功能了,它的具体执行流程如下:
5.webp

小结

MCP 只使用调用简单是每家 MCP 厂商帮我们实现了服务调用的细节,并且遵循了 MCP 协议,开启了 stdio 本地线程通讯的服务,让我们可以轻松的通过 MCP 客户端进行调用了。所以,你能自己实现一个 MCP 带 UI 的客户端吗?
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、场景题等模块。
   

关注公众号(加好友):

            
作者:        王磊的博客        
出处:        http://vipstone.cnblogs.com/        
   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册