起因
昨天想要复现黄老师的一篇公众号文章里的操作:
AI产品黄叔:https://mp.weixin.qq.com/s/LbWsik3oh1V1YFgOwNvxfg
复现:https://cpcfxio4kb.feishu.cn/wiki/PAlPwFfbOi0uCukkAUMcR6YPnjg
复现过程遇到了一点问题。
高德MCP添加成功,显示“可使用”

在运行过程中却总是出现(HTTP 504)错误:

我在网上搜了很多解决方案,

CSDN:504 Gateway Timeout: 网关超时的完美解决方法
https://blog.csdn.net/qq_42055933/article/details/141760595

但都解决不了我的问题。服务器问题我解决不了,网络问题我没有,不知道怎么办。。。
后来请教了黄老师,他说可能是高德的问题

那没办法了,就先不管它了。
我不喜欢在自己控制不了的事情上浪费时间,就想着睡一觉起来服务器应该就没问题了吧?
今天早晨起来我再次尝试,依然显示 504错误,那如果真是服务器问题的话,这也太久了~
而且我在搜索的过程中也没见其他人问过这个问题
那就只能在自己身上找原因了~
尝试解决
我做了两件事:
-
1. 把之前创建的 高德key 删除,重新创建了一个key。 -
2. 尝试使用 mcp.so 提供的代码进行配置。
(后来我才发现高德官网写了两种配置代码,第二种和
![]() |
高德官网:https://lbs.amap.com/
在高德官网创建 key
然后根据官网指引接入 MCP 配置。
第一种配置代码:

{ "mcpServers": { "amap-amap-sse": { "url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key" } }}
第二种配置代码:
https://mcp.so/server/amap-maps/amap?tab=content

{ "mcpServers": { "amap-maps": { "command": "npx", "args": [ "-y", "@amap/amap-maps-mcp-server" ], "env": { "AMAP_MAPS_API_KEY": "您在高德官网上申请的key" } } }}
这两个操作做完之后,高德MCP就调用成功了!

OK,问题已经解决了,但是,问题到底出在哪了呢?
我太着急解决问题,直接同时修改了 Key 和 MCP配置代码,所以现在没办法判断到底是哪里出了问题。
(现在Trae正在跑任务,稍后我会把 MCP配置代码改回去,看看还能不能成功,如果成功了,就说明是 key 的问题,如果失败了,就说明是配置代码的问题)
问题分析
把这两段配置代码发给【豆包】,让它进行对比分析:
{ "mcpServers": { "amap-amap-sse": { "url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key" } }}
{ "mcpServers": { "amap-maps": { "command": "npx", "args": [ "-y", "@amap/amap-maps-mcp-server" ], "env": { "AMAP_MAPS_API_KEY": "您在高德官网上申请的key" } } }}
这两段代码都是用来调用高德mcp的配置代码,它们的区别是什么?并分析优劣
配置内容和用途区别
- 第一段代码
- 结构上,定义了 mcpServers 对象,其下有 amap - amap - sse 子对象 。
- 功能上,主要配置了一个 url 字段,值为 https://mcp.amap.com/sse?key=您在高德官网上申请的key ,推测是用于向指定的高德服务器地址发起Server - Sent Events(SSE,服务器发送事件)请求,可能用于获取服务器推送的实时数据等,比如地图相关的实时更新信息等。
- 结构上,同样定义了 mcpServers 对象,其下是 amap - maps 子对象 。
- 功能上,配置更为复杂。command 字段值为 npx ,表明要使用 npx 工具执行命令 ;args 数组指定了执行命令时的参数 ["-y", "@amap/amap - maps - mcp - server"] ,可能是在安装或运行与高德地图相关的 mcp - server 包;env 对象中设置了环境变量 AMAP_MAPS_API_KEY ,值为 您在高德官网上申请的key ,用于在执行相关命令时提供高德地图API密钥,供相关脚本或工具使用。
调用方式和执行动作区别
- 第一段代码:主要是配置一个用于数据获取的URL,侧重于数据获取的地址配置,不涉及命令执行相关操作。
- 第二段代码:围绕使用 npx 执行特定命令展开配置,涉及到命令执行工具、参数以及所需的环境变量设置,是在进行与高德地图相关的工具或服务的安装、启动等操作配置 。
第一段代码是远程服务器方式(sse),第二段代码是本地服务器方式(stdio) ,二者优劣如下:
远程服务器方式(第一段代码)
- 优点
- 技术复杂度低:只需配置URL和参数,不用维护本地环境、安装相关命令和依赖包 ,对开发者技术要求相对较低,上手快。
- 不占本地资源:服务运行在远程服务器,不占用本地计算资源,不会影响本地设备性能。
- 维护简便:由服务提供方负责维护和更新,开发者无需操心服务端运维。
- 缺点
- 可能有延迟:与本地服务器相比,远程请求存在网络传输耗时,可能导致数据获取延迟 ,影响实时性要求高的应用场景。
- 依赖网络:网络不稳定时,服务调用易受影响,出现连接失败、数据传输中断等问题 。
本地服务器方式(第二段代码)
- 优点
- 低延迟:本地运行,数据交互在本地完成,无网络传输耗时,能实现快速响应 ,适合对实时性要求极高的场景。
- 自主性高:开发者可完全掌控本地环境,按需定制和优化服务,调整参数、配置依赖等 。
- 缺点
- 技术复杂度高:需维护本地环境,安装Node.js、相关依赖包等 ,出现问题时排查和解决难度大。
- 占用本地资源:运行服务会占用本地计算资源,影响本地设备性能,资源紧张时可能导致服务不稳定 。
- 维护成本高:自行负责本地服务器维护、更新,耗费精力和时间 。
这么看来有可能是配置代码的原因,用 SSE 方式接入“与本地服务器相比,远程请求存在网络传输耗时”,504错误就是网络超时问题。
测试
下面通过测试验证猜想。
为了提高测试效率,我又单独创建了一个 智能体,它的角色就是 高德MCP测试员
智能体prompt
你是高德MCP调用测试员,目的是测试高德MCP是否可以成功被调用,优先采用最简单的实现路径,跑通即可。如果无法成功调用,返回错误信息,并给出原因和解决方案。

依然显示“可使用”

改回 SSE 方式接入MCP服务
{ "mcpServers": { "amap-amap-sse": { "url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key" } }}
第一次测试结果:失败 (400错误)

重新确认配置无误,
第二次测试结果:失败(504错误)

再改为 Node.js I/O 模式接入 MCP 服务 (跟 mcp.so 的代码是一样的)

https://lbs.amap.com/api/mcp-server/gettingstarted#t1
{ "mcpServers": { "amap-maps": { "command": "npx", "args": ["-y", "@amap/amap-maps-mcp-server"], "env": { "AMAP_MAPS_API_KEY": "您在高德官网上申请的key" } } }}
测试结果:成功

结论
本次 Trae 接入 高德MCP服务 出现504错误的问题,是接入方式的问题。
把 SSE方式接入 改成 Node.js I/O 模式接入就解决了。
SSE方式(Server - Sent Events,服务器推送事件 )
- 定义:一种轻量级的基于HTTP协议的实时通讯技术,实现服务器向客户端的单向数据流推送 。借助HTML5中的EventSource API,服务器能通过持久化HTTP连接,将事件流数据推送给浏览器端 。
- 工作原理:
- 客户端发起HTTP请求,请求头携带 Accept: text/event-stream ,向服务器表明接收SSE数据的意愿 。
- 服务器响应请求后,维持HTTP连接,不断向客户端推送事件流 。
- 客户端利用EventSource API接收事件,并按需求处理 。
- 特点:
- 单向通信:仅服务器可向客户端发送数据,客户端无法主动向服务器发数据 。
- 实现简单:基于HTTP协议,无需额外协议或库,服务端返回特定格式事件流,客户端用EventSource对象处理 。
- 低延迟高效:持久化连接,避免传统轮询频繁的连接断开,减少延迟与带宽消耗 。
- 自动重连:连接中断时,客户端自动重连 。
- 兼容性好:基于标准HTTP协议,能融入现有Web应用架构,支持跨域请求 。
- 应用场景:适合服务器频繁更新数据推送给客户端,如实时新闻推送、股票行情更新、服务器日志实时展示、社交通知等 。
Node.js I/O模式
Node.js采用异步式I/O(非阻塞式I/O) ,基于事件驱动架构 ,具体如下:
- I/O操作概念:线程执行磁盘读写或网络通信等操作统称I/O操作 。
- 阻塞与非阻塞对比:
- 阻塞式I/O:I/O操作耗时久,操作系统剥夺线程CPU控制权使其暂停,I/O完成后恢复控制权 ,即同步式I/O 。比如传统文件读取,读操作时程序等待数据返回,期间不执行其他任务 。
- 异步式I/O(Node.js采用):不等待I/O完成,将请求交操作系统后继续执行后续代码,I/O完成后以事件通知相关线程 。例如Node.js处理网络请求,接收到请求发起I/O操作后,不阻塞等待结果,可继续处理其他请求,结果返回时通过事件机制处理 。
- 事件驱动机制:Node.js启动后初始化变量和函数,等待事件。检测到事件,分配回调函数处理 。单线程处理事件,事件循环不断从事件队列取事件执行 。像HTTP服务器接收客户端请求是事件,触发对应回调函数处理请求并返回响应 。
- 优势:
- 高效处理并发:单线程非阻塞模型,无需多线程开销,能高效处理大量并发请求 。
- 资源占用少:较少资源和内存消耗 。
最终成果展示:
https://static-host-x4o0qwe4-yunnantravel.sealoshzh.site/
再复习一下瑞·达利欧在《原则》中说的“五步流程实现你的人生愿望”

- 有明确的目标。
- 找到阻碍你实现这些目标的问题,并且不容忍问题。
- 准确诊断问题,找到问题的根源。
- 规划可以解决问题的方案。
- 做一切必要的事来践行这些方案,实现成果。
凡墙皆是门
解决问题是一件很快乐的事?