干货分享!MCP 实现原理,小白也能看懂
不知道大家有没有发现?对于添加到 MCP 服务市场的成千上万个 MCP 服务(而且这个数字每天还在增加),我们可以不写一行代码,轻松实现调用,但背后的原因究竟是啥呢?

MCP 虽然用起来很方便,但搞不懂背后的实现原理,总感觉这个知识点还没完全掌握,所以接下来,我们一起来看它的实现原理。
从某个 MCP 的调用说起
在调用某个 MCP 服务的时候,只需要在 json 配置文件中添加一段 MCP 服务厂商提供的 json 信息就可以实现服务调用了。
例如要调用百度地图提供的 8 大核心功能:地理编码、逆地理编码、地点检索、路线规划、天气查询、IP 定位等功能时,我们只需要添加以下 json 就能轻松调用了:
{
"mcpServers": {
"baidu-map": {
"command": "npx",
"args": [
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "xxx"
}
}
}
}
执行结果如下:

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

源码分析
我们查看其源码就可以发现:

其主要文件 dist/index.js 的核心源码如下:
// 启动一个 stdio 服务器
async function runServer() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Baidu Map MCP Server running on stdio");
}
// 查询天气的工具实现
async function handleWeather(districtId, location) {
const url = new URL("https://api.map.baidu.com/weather/v1/");
url.searchParams.append("data_type", "all");
url.searchParams.append("coordtype", "bd09ll");
url.searchParams.append("ak", BAIDU_MAP_API_KEY);
url.searchParams.append("from", "node_mcp");
if (location) {
url.searchParams.append("location", location);
}
if (districtId) {
url.searchParams.append("district_id", districtId);
}
const response = await fetch(url.toString());
const data = await response.json();
if (data.status !== 0) {
return {
content: [{
type: "text",
text: `Weather searth failed: ${data.message || data.status}`
}],
isError: true
};
}
return {
content: [{
type: "text",
text: JSON.stringify({
location: data.result.location,
now: data.result.now,
forecasts: data.result.forecasts,
forecast_hours: data.result.forecast_hours,
indexes: data.result.indexes,
alerts: data.result.alerts,
}, null, 2)
}],
isError: false
};
}
从以上源码我们可以大致看出,百度作为 MCP 服务提供商,帮我们做了以下这些事:
- 启动 stdio 服务端,等待 MCP 客户端连接。
- 当检测到客户端的通讯请求之后,它通过 HTTP 协议请求自己服务器的信息,再将返回结果以 stdio 方式发送给 MCP 客户端。
到这里,我们就搞明白了,之所以 MCP 使用比较简单,原因是每家 MCP 服务厂商,帮我们实现了服务的具体调用。
并且他们遵循了 MCP 通讯协议,因此我们只需要使用 MCP Client 简单调用就可以实现某个功能了,它的具体执行流程如下:

小结
MCP 只使用调用简单是每家 MCP 厂商帮我们实现了服务调用的细节,并且遵循了 MCP 协议,开启了 stdio 本地线程通讯的服务,让我们可以轻松的通过 MCP 客户端进行调用了。所以,你能自己实现一个 MCP 带 UI 的客户端吗?
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、场景题等模块。
干货分享!MCP 实现原理,小白也能看懂的更多相关文章
- 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门
前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...
- 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 s ...
- 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了
各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...
- 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单
不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...
- 【vscode高级玩家】Visual Studio Code❤️安装教程(最新版🎉教程小白也能看懂!)
目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过 ...
- 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)
一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...
- 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理
前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...
- 小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理
前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...
- RSA 非对称加密原理(小白也能看懂哦~)
来源. https://blog.csdn.net/jijianshuai/article/details/80582187 RSA 加密原理 步骤 说明 描述 备注 1 找出质数 P .Q - 2 ...
- 小白也能看懂的JVM内存区域
前言 最近在准备面试题刷到了JVM这块,作为一个小白,巩固知识点最好的方式就是亲手写出来并分享:相信我的理解,同样是小白的你,一定有很大的帮助.不信,请你往下看! JVM内存区域简介 如果有人问Jav ...
随机推荐
- 远程连接Windows
远程桌面连接 限制 1.同网段 (1)服务器关闭防火墙 (2)服务器端 右键点击'我的电脑'进入'属性'点击左侧菜单栏中的'远程设置': 把远程桌面选项设置成'允许运行任意版本远程桌面的计算机连接'. ...
- Nibbles PG walkthrough Intermediate
nmap nmap -p- -A 192.168.239.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-15 02:26 UTC Nmap ...
- 2025春秋杯部分wpDAY1
2025春秋杯 DAY1 WEB easy_flask 直接fenjing一把梭 file_copy 下载github上的脚本 MISC 简单算术 题目提示了异或 简单镜像提取 formost提取到镜 ...
- 00-串口和SSH方式登录
登录 1.板载LED灯状态说明 USB转TTL模块准备(安装ch340驱动) a.USB转TTL模块的GND接到开发板GND b.USB转TTL模块的RX接到开发板TX c.USB转TTL模块的TX接 ...
- java线上问题跟踪工具Arthas的第一次使用
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参.异常,监测方法执行耗时 ...
- protocol buffers(protobuf)安装教程
本文按照mac讲解protobuf的安装,windows上比较好安装按照mac的基本流程就可以安装成功,mac上的安装有的时候比较容易出现问题 一.通过brew的方式安装(仅Mac) 需要mac中存在 ...
- Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]
转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题. 贪心 破环成链的 trick 自然不用多说. 首先观察题目,很容易发现一个性质:只走一圈的方案一定最优.这个很容易证,因为再绕一圈回来标记前 ...
- .NET程序员AI开发基座:Microsoft.Extensions.AI
大家好,我是Edison. 微软在2024年11月就发布了新的AI核心库Microsoft.Extensions.AI,虽然目前还是一个预览版,但其可以大大简化我们的AI集成和开发工作. Micros ...
- GridControl 给选中的行添加边框显示
实现方式,通过自定义 RowControl 的样式实现. 参考:https://supportcenter.devexpress.com/ticket/list?searchString=RowCel ...
- mac电脑安装python配置系统环境变量
首先安装对应的python版本 这边我安装的是python3.11.6版本 安装包地址:macOS 64-bit universal2 installer 安装包安装完成之后执行该安装包 一直点击继续 ...