客户端调用MCP-Server服务时无法初始化对应的server问题原因之一

客户端调用MCP-Server服务时无法初始化对应的server问题原因之一

背景知识:MCP 是什么?

MCP(Model Context Protocol)是一种基于 JSON-RPC over stdio 的协议,用于 LLM 工具调用。它要求:

  • 客户端(如 Spring AI)通过 stdin/stdout 与一个 独立的 MCP 服务进程 通信;
  • 所有通信内容必须是 严格的 JSON-RPC 2.0 格式;
  • 不能混入任何非 JSON 内容(比如日志、堆栈跟踪、启动信息等)。

问题详情

问题:遇到客户端调用MCP-Server服务时无法初始化对应的server,报错信息如下

arduino 复制代码
25-12-02.14:22:58.428 [pool-2-thread-1 ] ERROR StdioClientTransport   - Error processing inbound message for line: 2025-12-02T14:22:58.425+08:00  INFO 72396 --- [okk-mcp-server-article] [           main] c.o.m.server.article.McpServerApplication   : Starting McpServerApplication v1.0-SNAPSHOT using Java 17.0.12 with PID 72396 (/Users/repository/com/okkform/api/mcp-server-article-job/1.0-SNAPSHOT/mcp-server-article-job-1.0-SNAPSHOT.jar started by vector in /Users/okk-mcp)
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): Expected space separating root-level values
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 5]
        at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2660)

表示客户端在启动时尝试解析日志输出为 JSON-RPC 消息失败,从而导致整个 Spring Boot 应用上下文初始化失败。其中关键信息在于

sql 复制代码
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): Expected space separating root-level values
...
at io.modelcontextprotocol.spec.McpSchema.deserializeJsonRpcMessage(McpSchema.java:153)

说明客户端(StdioClientTransport) 正在从标准输入/输出流中读取数据,并试图将其解析为JSON-RPC 格式的消息 ,但是接收到的确实普通的Spring Boot启动日志 ,(例如 2025-12-02T14:22:58.425+08:00 INFO ...),这显然不是合法的 JSON。

✅结论 :你MCP 客户端被错误地连接到了 应用自身的 stdout/stderr 日志流 ,而不是一个真正的 MCP 服务进程的标准输入/输出,又或者说MCP服务的相关日志输出设置不符合 JSON-RPC over stdio 的协议。

首先是设置MCP客户端本身的logback-spring.xml尝试禁用日志对 stdout 的干扰,禁止将日志打印到控制台(console appender) ,只写入文件:

xml 复制代码
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/mcp-server.log</file>
    <encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
  </appender>
​
  <!-- 不要添加 CONSOLE appender -->
​
  <root level="INFO">
    <appender-ref ref="FILE" />
  </root>
</configuration>

这样,MCP 服务启动时就不会往 stdout 输出日志,客户端也就不会误解析。

但是还是无法解决,那么就可以基本确定问题在于MCP服务输出的有问题,因此去查看一下对应MCP服务的application.yml确定了问题所在,因为使用的是stdio模式调用,因此需要保证只输出 JSON-RPC,需要在application.yml中开启spring.main.web-application-type: none,否则会默认值为servlet,默认启用 Web 应用,会启动内嵌服务器(如 Tomcat) ,就会打印出启动相关日志、Web 特有组件日志等,导致MCP客户端解析失败。同时还需要在MCP服务中设置logging.pattern.console:日志格式配置,表示设置为空值表示不使用自定义的控制台日志格式,简化日志输出格式,适配 stdio 模式运行环境。

正确配置如下

yaml 复制代码
spring:
  ...
  main:
    banner-mode: off
    web-application-type: none
​
logging:
  pattern:
    console:
  file:
    name: data/log/${spring.application.name}.log
相关推荐
跨境Jacky21 小时前
亚马逊选品排名监控改造记:从手抄表格到MCP自动监控
跨境电商·mcp·sorftime
keren21 天前
SceneDock:Windows 场景化工作台——一键启动工作链,还能被 AI Agent 调用(CLI / MCP)
windows·开发工具·效率工具·mcp
光依旧1 天前
多实例治理一致性深潜:Redis与本地缓存降级(MCP实战手记·篇12 延伸)
redis·caffeine·高可用·缓存一致性·mcp·多实例
古法老登瞎折腾2 天前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
用户8813034824072 天前
给 MCP Server 加调用链日志和大输出落盘:一个装饰器搞定,附 3 个实测踩坑(Python SDK v2)
mcp
TickDB2 天前
美股历史数据下载:用 Codex 取数,Python 导出 CSV
python·websocket·mcp·行情数据 api
光依旧3 天前
工具权限与评分实战:scope拦截+健康度指标(MCP实战手记·篇12 延伸)
零信任·可观测性·权限控制·scope·sre·mcp
南归北隐3 天前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾3 天前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
李小轰_Rex3 天前
用一个小项目,学会开发 MCP
aigc·mcp