凡墙皆是门:展示一个从发现问题到解决问题的全过程

起因

昨天想要复现黄老师的一篇公众号文章里的操作:


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. 1. 把之前创建的 高德key 删除,重新创建了一个key。
  2. 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的配置代码,它们的区别是什么?并分析优劣


配置内容和用途区别

  1. 第一段代码
  • 结构上,定义了 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/


    再复习一下瑞·达利欧在《原则》中说的“五步流程实现你的人生愿望”

    凡墙皆是门:展示一个从发现问题到解决问题的全过程
    ?

    1. 有明确的目标
    2. 找到阻碍你实现这些目标的问题,并且不容忍问题
    3. 准确诊断问题,找到问题的根源
    4. 规划可以解决问题的方案。
    5. 做一切必要的事来践行这些方案,实现成果。


    凡墙皆是门

    解决问题是一件很快乐的事?


    版权声明:charles 发表于 2025年6月3日 pm2:53。
    转载请注明:凡墙皆是门:展示一个从发现问题到解决问题的全过程 | AI工具大全&导航

    相关文章