大厂 MCP 面试实录:基于 Java SDK 与 Docker 沉淀可复用 Prompts 工作流
大厂 MCP 面试实录:基于 Java SDK 与 Docker 沉淀可复用 Prompts 工作流
本文为 MCP 技术岗模拟面试复盘,围绕「团队沉淀可复用 MCP Prompts 工作流」的业务场景展开,考察候选人对 MCP 协议语义、Java SDK 实践、容器化部署及工程化权衡的理解。
面试官:候选人你好,我们团队现在需要给内部 AI 助手沉淀一套可复用的 Prompts 工作流,要求支持多团队隔离、部署运维简单、能和现有 Java 技术栈集成,技术栈限定用 Java MCP SDK 和 Docker,你先说下整体的方案思路?
候选人:整体采用「Docker 打包 MCP Server 作为工作流载体 + Java MCP SDK 实现能力注册与调用 + 统一网关对接多业务团队」的三层架构。具体来说:用 Docker 把 MCP Server 打包成标准镜像,实现一次构建、多环境运行,避免依赖问题;Java MCP SDK 负责实现 Prompts 能力的注册、参数校验、模板渲染逻辑,和现有 Java 业务系统无缝集成;上层通过统一的 MCP Client 网关做身份认证和流量管控,隔离不同团队的访问权限。这个方案既满足多团队调用的隔离性要求,又能复用 MCP 协议的标准化能力,降低各业务系统的对接成本。
面试官:你提到用 Prompts 能力沉淀工作流,和直接用 Tool 比有什么优势?为什么这里选 Prompts 而不是 Tool?
候选人:核心差异是能力语义不同:Prompts 是预定义的模板化工作流,适合固定步骤、标准化输出的场景;Tool 是模型按需调用的原子操作,适合动态、无固定流程的任务。我们沉淀的是代码评审、需求拆解这类有固定步骤、输出格式要求的标准化工作流,用 Prompts 可以把步骤、参数规则、输出模板都预定义好,避免模型每次生成结果不一致,而且业务团队可以显式选择对应的工作流模板,可控性远高于让模型自由调用 Tool。另外根据 MCP 协议定义,Prompts 本身就是为用户/应用提供的模板化消息或工作流,和我们的业务场景完全匹配[资料2]。
面试官:Java MCP SDK 里怎么实现 Prompts 的注册和动态管理?如果后续要加新的工作流,怎么做到不重启服务?
候选人:首先,Java MCP SDK 提供了服务端 Prompt 注册能力,我们可以通过 SDK 提供的 API 封装每个工作流的元数据(名称、描述、参数 Schema、模板内容),注册到 MCP Server 实例中。举个注册的伪代码示例:
// 伪代码:基于 Java MCP SDK 注册 Prompt 的核心逻辑
McpServer server = McpServer.builder()
.addPrompt(new Prompt(
"code-review",
"标准代码评审工作流,自动检查代码规范、安全漏洞和逻辑问题",
Map.of("repoUrl", new PromptParameter("代码仓库地址", true))
))
.build();
动态管理方面,我们可以做一层元数据缓存:把所有工作流的定义存储在内部配置中心,服务启动时全量加载到本地缓存,同时监听配置中心的变更事件,当有新工作流或者工作流更新时,动态刷新缓存,不需要重启服务。模板渲染部分可以集成现有的模板引擎(比如 SpEL 或者 Mustache),运行时把用户传入的参数填充到模板占位符中,生成最终的工作流提示词。这里要注意,Java MCP SDK 支持同步和异步通信模式[资料1],如果工作流执行耗时较长,可以用异步模式避免阻塞请求线程。
面试官:你提到用 Docker 打包,那 MCP Server 的传输方式选什么?stdio 还是 Streamable HTTP?为什么?
候选人:这里选 Streamable HTTP 传输。首先,stdio 传输适合 Host 在本机启动子进程的场景,比如桌面 AI 客户端调用本地的 MCP Server[资料2],而我们的场景是多团队远程调用服务,Streamable HTTP 天生支持远程通信,而且 Java 生态里可以很方便地集成 Spring Boot 等 Web 框架,对接内部的认证、限流、审计等组件。另外,远程部署时 Streamable HTTP 天然支持会话管理、超时控制,比 stdio 更适合服务化部署的场景。
面试官:如果出现异常呢?比如远程部署的时候,怎么防止未授权团队调用其他团队的工作流,还有 Prompt 里的敏感信息泄露?
候选人:安全层面做三层管控:第一层是网关层的身份认证,用内部 SSO 或者 OAuth2 校验请求的用户/团队身份,拦截未认证的请求;第二层是 MCP Server 端的授权校验,每个 Prompt 绑定允许调用的团队 ID 列表,请求到达后先校验调用方的团队 ID 是否有权限访问对应的工作流,不能只依赖客户端的认证信息[资料2];第三层是敏感信息管控,Prompt 模板里的敏感参数(比如内部接口地址、密钥)不要硬编码,运行时从密钥管理服务(比如 HashiCorp Vault)注入,日志和返回值里都要对敏感字段脱敏,审计日志只记录调用方、工作流 ID、结果状态,不记录完整参数和返回内容。这里要注意,Prompt 的参数 Schema 只是结构约束,不能代替服务端的权限和内容校验[资料2],哪怕是参数格式正确,也要校验调用权限,避免不可信输入注入攻击。
面试官:如果某个工作流执行时依赖外部服务,比如调用内部代码仓库接口出现超时,怎么处理?还有什么取舍?
候选人:异常处理方面,我们可以利用 Java MCP SDK 的异步能力,给外部服务调用设置合理的超时时间(具体值根据业务 SLA 和压测结果确定),捕获超时、网络异常等错误,返回给模型明确的错误提示(比如“代码仓库接口超时,请稍后重试”),避免异常直接抛出导致服务崩溃。同时可以做降级逻辑,比如外部服务不可用时,返回预定义的降级结果,保证工作流可以继续执行。可观测性方面,用 Micrometer 埋点统计每个 Prompt 的调用次数、成功率、耗时、错误率,用 OpenTelemetry 做链路追踪,把每个工作流执行的完整链路(包括调用的外部服务、每个环节的耗时)串起来,出错时可以快速定位根因。这里的取舍是:如果追求高可用,可以增加重试机制,但重试可能会增加外部服务的压力,需要根据外部服务的承受能力调整重试策略,避免引发雪崩。
面试官:现在要把这个服务集成到现有 Java 业务系统(比如内部 OA 系统)里,怎么集成?还有什么容易踩坑的细节?
候选人:集成有两种方式:一种是 OA 系统直接作为 MCP Client,通过 Java MCP SDK 提供的客户端 API 对接我们的 MCP Server,只需要配置 Server 地址、认证信息,就可以直接调用对应的 Prompt,传入参数获取结果[资料1];另一种是把 MCP 调用逻辑封装成内部 Java SDK,业务系统不用关心 MCP 协议细节,由 SDK 处理认证、重试、降级等逻辑,对接成本更低。容易踩坑的细节有两个:第一个是 Prompt 模板里的特殊字符(比如 JSON 引号、换行符)要做转义,不然传给模型时会解析失败;第二个是 Docker 部署时,MCP Server 的调试日志一定要写到标准错误(stderr),不能写到标准输出(stdout),否则会破坏 JSON-RPC 协议的通信[资料2]。另外如果是多实例部署,要注意会话信息不要存在本地内存,要用分布式会话存储,避免会话丢失。
面试官点评
考察点
- MCP 核心能力的语义区分:能否准确理解 Tools、Resources、Prompts 的适用边界,不会滥用能力类型;
- Java MCP SDK 实践能力:能否基于 SDK 实现服务端注册、客户端调用、异步通信等基础能力;
- 工程化落地能力:能否结合 Docker、远程部署场景,处理安全、可观测性、动态管理、版本控制等实际问题;
- 技术权衡能力:能否根据业务场景选择合适的传输方式、能力类型,明确方案的取舍和边界。
合格回答
能准确区分 Prompts 和 Tool 的适用场景,知道选择 Streamable HTTP 作为远程部署的传输方式,能做基础的权限控制、异常处理和日志脱敏,理解 MCP 的安全边界要求。
加分项
能提到配置中心动态刷新 Prompt、链路追踪、版本灰度、密钥外部注入等工程化实践,对 MCP 协议的传输细节(比如 stdio 的日志输出要求)、安全要求(比如服务端必须做授权校验、凭据不能入日志)有清晰的理解。
总结
本方案的核心分工是:Docker 负责环境隔离和部署标准化,解决多环境一致性问题;Java MCP SDK 负责 MCP 协议的实现和业务逻辑封装,降低开发成本,和现有 Java 技术栈无缝集成;两者结合既满足了企业内部沉淀标准化 AI 工作流的需求,又保证了隔离性、可扩展性和运维效率。
适用边界
该方案适合企业内部中低频、标准化的 Prompts 工作流场景,如果是高并发、超低延迟的场景,需要额外增加缓存、服务降级等优化手段;如果是动态生成的工作流,需要混合使用 Prompts 和 Tool 能力,不能仅靠 Prompts 实现。
关键取舍
- 能力类型选择:优先用 Prompts 沉淀标准化工作流,保证输出一致性;只有需要模型动态调用的原子操作才用 Tool,避免过度设计;
- 传输方式选择:远程服务优先用 Streamable HTTP,本机子进程场景才用 stdio,避免不必要的网络开销;
- 动态管理方式:优先用配置中心+本地缓存的方案,平衡实时性和性能,不需要每次请求都查数据库。
易踩坑细节
远程 MCP Server 的调试日志必须写到 stderr,否则会破坏 JSON-RPC 通信;Prompt 的参数校验不能只靠前端的 Schema 约束,服务端必须做二次校验和权限控制,避免不可信输入注入攻击[资料2]。
参考资料
更多推荐


所有评论(0)