1. MCP服务开发中的JsonParseException问题深度解析
在MCP(Model Context Protocol)服务开发过程中,JsonParseException是一个常见但容易被误解的错误。很多开发者第一反应是"服务崩溃了",但实际上这往往只是协议通信层面的问题。让我们深入分析这个问题的本质。
1.1 错误现象与初步诊断
当你在控制台看到类似以下的错误堆栈时:
code复制com.fasterxml.jackson.core.JsonParseException: Unexpected character ('2' (code 50)):
was expecting double-quote to start field name
at [Source: (String)"2023-03-15 12:00:00.123 INFO ..."; line: 1, column: 2]
这明确告诉我们:Jackson解析器期望得到一个JSON格式的字符串(以双引号开头),但实际收到的却是以数字"2"开头的内容。这个"2"正是Spring Boot日志时间戳的开头字符。
1.2 MCP协议通信机制剖析
MCP协议的核心设计要点:
- 进程间通信模型:父进程通过StdioClientTransport与子进程(csdn-mcp)通信
- 数据格式约定:严格使用JSON作为通信协议格式
- IO流控制:stdout专用于协议通信,stderr用于错误输出
问题的根本原因在于:Spring Boot默认会将启动日志输出到stdout,这与MCP协议要求相冲突。任何非JSON内容出现在stdout中,都会被父进程的Jackson解析器尝试解析,导致JsonParseException。
1.3 三种解决方案的深度对比
方案1:日志重定向配置(推荐)
这是最彻底的解决方案,通过修改日志配置确保stdout的纯净性:
yaml复制# application.yml配置示例
logging:
file:
name: mcp-service.log
level:
root: WARN
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 7
关键配置项说明:
file.name:将日志强制输出到文件root: WARN:减少不必要的日志输出- 滚动策略:避免日志文件过大
提示:在Spring Boot 2.4+版本中,推荐使用logback-spring.xml进行更精细的日志控制,可以完全禁用ConsoleAppender。
方案2:命令行重定向(快速方案)
对于临时调试或快速验证,可以使用系统级重定向:
json复制{
"command": "java",
"args": [
"-jar",
"csdn-mcp.jar",
">", "/dev/null",
"2>", "mcp-error.log"
]
}
这种方式的优缺点:
- 优点:无需修改代码,立即生效
- 缺点:丢失了所有日志,不利于问题排查
方案3:代码级解决方案(适用于框架开发)
如果你有框架的控制权,可以在Main类中添加:
j复制
