Skip to main content
不依赖 SpringAI 和其他重量级框架,采用轻量声明式方式即可启动。
本指南演示如何用 Java 快速构建符合 MCP(Model Context Protocol)的 Server,并通过 HTTP(SSE) 或 Stdio 暴露工具(Tools)与资源(Resources),供 LangChat Pro/Agent 在对话中按需调用。

概览

  • 协议兼容:兼容 MCP 标准,支持 Tools/Prompts/Resources 三类能力
  • 双传输:一套代码同时支持 HTTP(SSE) 与 Stdio 启动
  • 零侵入:通过注解声明能力,隐藏 MCP SDK 细节
  • 易集成:与 LangChat Pro MCP 管理无缝对接

执行流程(高层)

演示

langchat-mcp-server 模块下找到 mcp-server-filesystem,启动 McpSseServer.java 中的 main 函数: image-20250523153745524 启动 SSE 服务后,默认端口地址示例:http://localhost:8900/sse 在 LangChat 客户端平台中这样配置: image-20250523154008804

测试使用

本地启动服务后,示例 Tool 可访问本机指定目录的文件列表: image-20250523154217763

快速接入(最小代码)

只需在 main 方法中放入如下代码,即可在 Java 中快速启动 MCP Server:
import com.github.codeboyzhou.mcp.declarative.McpServers;

// 你可以使用这个注解来指定扫描MCP资源、提示和工具的基础包
// 这是可选的。如果未指定,它将扫描main方法所在的包
@McpComponentScan(basePackage = "com.github.codeboyzhou.mcp.server.examples")
public class MyMcpServer {

    public static void main(String[] args) {
        // 启动一个STDIO MCP服务器
        McpServers.run(MyMcpServer.class, args).startSyncStdioServer(
            McpServerInfo.builder().name("mcp-server").version("1.0.0").build()
        );
        // 或者启动一个HTTP SSE MCP服务器
        McpServers.run(MyMcpServer.class, args).startSyncSseServer(
            McpSseServerInfo.builder().name("mcp-server").version("1.0.0").port(8080).build()
        );
        // 或者使用yaml配置文件启动(兼容Spring AI框架)
        McpServers.run(MyMcpServer.class, args).startServer();
        // 或者使用特定的配置文件启动(兼容Spring AI框架)
        McpServers.run(MyMcpServer.class, args).startServer("my-mcp-server.yml");
    }

}

YAML 配置(可选)

当使用 startServer() 时,会读取默认 mcp-server.yml|yaml
enabled: true
stdio: false
name: mcp-server
version: 1.0.0
instructions: mcp-server
request-timeout: 30000
type: SYNC
resource-change-notification: true
prompt-change-notification: true
tool-change-notification: true
sse-message-endpoint: /mcp/message
sse-endpoint: /sse
base-url: http://localhost:8080
sse-port: 8080

声明式开发(注解)

无需关心原生 MCP Java SDK 的底层细节,直接注解声明即可:
public class MyMcpResources {

    // 这个方法定义了一个MCP资源来暴露操作系统环境变量
    @McpResource(uri = "env://variables", description = "OS env variables")
    public String getSystemEnv() {
        // 只需在这里放入你的业务逻辑代码,忘记MCP SDK的细节
        return System.getenv().toString();
    }

    // 在这里添加你的其他MCP资源...
}
public class MyMcpPrompts {

    @McpPrompt(description = "A simple prompt to read a file")
    public String readFile(
        @McpPromptParam(name = "path", description = "filepath", required = true) String path) {
        // 只需在这里放入你的业务逻辑代码,忘记MCP SDK的细节
        return String.format("What is the complete contents of the file: %s", path);
    }

}
public class MyMcpTools {

    // 这个方法定义了一个MCP工具来读取文件
    @McpTool(description = "Read complete file contents with UTF-8 encoding")
    public String readFile(
        @McpToolParam(name = "path", description = "filepath", required = true) String path) {
        // 只需在这里放入你的业务逻辑代码,忘记MCP SDK的细节
        return Files.readString(Path.of(path));
    }

    // 在这里添加你的其他MCP工具...
}

传输方式对比

维度HTTP(SSE)Stdio
部署形态远程服务/容器/网关治理本地进程/内网可信环境
网络要求需 HTTP 通路与 SSE 支持无网络要求(进程间)
延迟取决于网络与基础设施延迟低、稳定
可观测性易于接入网关与日志平台需本地日志与监控接入
适用场景云端服务、跨网络调用内网私有化、低延迟调用

与 LangChat Pro 集成

  1. 在 LangChat Pro 的 MCP 管理中新增授权,选择 HTTP(SSE) 或 Stdio
  2. 同步 Tools 列表,校验描述/参数/错误码
  3. 在 Agent 中启用 MCP 能力,与 Function Call/插件等组合使用

最佳实践

  • 安全治理:为 MCP Server 设置鉴权、速率限制;隔离敏感资源
  • 错误规范:为 Tools 定义统一错误码/错误消息,便于模型处理
  • 幂等设计:避免重复调用造成副作用,必要时引入重试与超时
  • 可观测性:输出调用日志(耗时/失败率),便于问题定位与容量规划
  • 契约稳定:保持工具命名、参数与返回结构的一致性与可演进性

故障排查(FAQ)

  • Tools 列表拉取超时?
    • SSE:检查 CORS/网关代理/心跳头;Stdio:检查命令可执行性与环境变量
  • 能连通但工具不被调用?
    • 检查 Agent 的提示词策略与工具优先级;确认工具输出结构与约定一致
  • SSE 日志显示断流?
    • 检查代理/负载均衡超时;对长连接开启心跳与重连机制

现在一切就绪,运行你的 MCP 服务器,选择你喜欢的 MCP 客户端,开始你的 MCP 探索之旅。