
本文定位AI 应用基础设施 / 协议选型 / Java 后端示例环境Java 21、Spring Boot 3.3、JSON Schema、Function Calling、MCP。协议字段以实际 SDK 和模型供应商文档为准。摘要结构化输出、Function Calling 和 MCP 经常被放在一起讨论因为它们都能让模型输出比普通文本更容易被程序处理的结果。但三者解决的问题并不相同结构化输出约束结果格式Function Calling 表达模型希望应用执行某个函数MCP 解决模型与外部工具、资源和提示之间的标准化连接。如果把它们混为一谈就会出现“为了返回 JSON 接入 MCP”“把一个普通 DTO 做成工具”“给模型暴露一个万能函数”等设计问题。本文用一个 Java 业务系统拆解三者的输入输出、职责边界、组合方式、测试重点和选型建议。一、先给结论能力解决的问题是否执行代码典型用途结构化输出最终结果符合 Schema否分类、抽取、表单、报告Function Calling模型请求应用执行工具应用决定查订单、创建工单、调用服务MCP工具/资源的标准化发现与调用Server 执行跨应用复用工具和资源三者可以组合但没有谁能够替代另两个Function Calling 的结果可以要求结构化MCP 工具可以被 Function Calling 方式调用最终回答也可以再用结构化 Schema 输出。二、三条不同的调用链用户问题模型结构化输出Java DTOFunction Call应用工具路由业务服务MCP Tool CallMCP Gateway/ClientMCP Server结构化输出的终点是 DTOFunction Calling 的中间结果是工具调用MCP 的重点是“工具在哪里、如何发现、如何通过统一协议调用”。工程设计要先看最终需要什么行为而不是追逐名词。三、结构化输出约束模型回答假设要从用户反馈中抽取分类、严重程度和是否需要人工处理可以定义一个 DTOpublicrecordFeedbackClassification(Stringcategory,Severityseverity,ListStringkeyFacts,booleanneedsHumanReview){}publicenumSeverity{LOW,MEDIUM,HIGH,UNKNOWN}模型输出 JSON 后服务端仍然要做 Schema 和业务校验。合法 JSON 不代表内容合理例如severityLOW但描述里出现生产删除风险。结构化输出解决格式稳定不解决事实正确和权限安全。适合结构化输出的场景信息抽取、分类、字段补全、评测结果、界面渲染数据和流程分支。它不适合代替真正的业务事务不能让模型直接输出“扣款成功”就更新数据库。四、Function Calling模型提出执行请求Function Calling 通常包含工具名称和参数。应用收到后要完成查找、校验、授权、执行和结果回传。publicToolResultroute(FunctionCallcall,AuthContextauth){ToolExecutorexecutorregistry.require(call.name());schemaValidator.validate(call.arguments(),executor.spec().inputSchema());authorization.require(auth,executor.spec().permissions());if(executor.spec().riskLevel().atLeast(RiskLevel.HIGH)){returnToolResult.confirmationRequired(call.id());}returnexecutor.execute(call.arguments(),auth);}Function Calling 的关键边界是“模型请求调用不等于应用必须调用”。后端可以拒绝、要求补充参数、请求确认或直接转人工。工具结果回传模型后模型可能继续推理但最终业务状态仍由后端决定。五、MCP标准化工具和资源接入如果一个组织有多个 AI 应用每个应用都手写一套数据库查询、知识库读取和工单工具维护成本会越来越高。MCP 可以提供统一的工具发现、资源访问和调用协议让多个客户端复用同一类能力。AI应用 - MCP Client/Gateway - MCP Server - 业务服务MCP Server 仍然需要认证、授权、参数校验、租户隔离、输出脱敏和审计。协议标准化的是连接方式不是业务规则。不要因为工具通过 MCP 暴露就把它当成公开接口。六、如何组合三者一个“查询工单并生成处理建议”的流程可以这样设计模型通过 Function Calling 请求findTickets。findTickets实际通过 MCP Client 调用统一的工单 MCP Server。MCP Server 返回结构化工单列表。模型根据工单和知识库证据生成结构化DiagnosticReport。Java 服务校验引用、权限和报告字段后展示给用户。这种组合让工具连接、工具执行和最终输出各司其职。也可以不使用 MCP直接在 Java 内部注册 Function关键是根据复用范围和治理成本做选择。七、选型决策表问题推荐只需要让模型返回固定字段结构化输出需要调用本应用里的少量业务方法Function Calling多个 AI 客户端要复用一套工具MCP工具有高风险副作用任意方案都必须加后端授权和确认需要严格事务和幂等由业务服务实现不能交给协议需要最终答案可渲染结构化输出 程序校验不要因为“用了 MCP”就认为系统已经具备 Agent 能力也不要因为使用了 Function Calling 就忽略工具版本和权限。八、版本与兼容性结构化输出要管理 Schema 版本Function Calling 要管理工具参数兼容MCP 要管理协议和 Server 能力版本。工具增加可选字段通常向后兼容删除字段和改变含义则需要新版本或灰度。publicrecordToolVersion(Stringname,Stringversion,SetStringsupportedClients,booleanbackwardCompatible){}每次请求记录实际使用的 Schema、工具目录、MCP Server 和模型版本。出现错误时先确认是不是版本错配而不是立即修改 Prompt。九、测试重点不同结构化输出字段缺失、枚举非法、嵌套结构错误、超长文本和业务矛盾。Function Calling工具选择、参数校验、权限、幂等、重试、最大轮次和异常回传。MCP初始化、能力发现、超时、断线重连、工具投毒、权限和输出大小。TestvoidhighRiskToolMustNotExecuteWithoutConfirmation(){ToolResultresultrouter.route(call(deleteTicket,Map.of(id,T-1)),userWithoutConfirmation());assertThat(result.status()).isEqualTo(CONFIRMATION_REQUIRED);verify(ticketService,never()).delete(any(),any());}测试不能只验证“模型输出正确”还要验证模型输出错误时后端不会产生危险副作用。十、常见误区用结构化输出模拟事务模型返回successtrue不代表数据库事务成功。业务服务必须根据真实返回结果决定状态。把所有 DTO 都注册成工具工具应代表可执行能力不是为了让 JSON 看起来更漂亮。普通输出用 Schema 即可。MCP Server 暴露万能查询通用 SQL、任意 URL 和任意 Shell 都会扩大攻击面。工具应按业务能力拆分参数和权限最小化。认为协议能替代安全无论 Function Calling 还是 MCP模型都不应拥有直接绕过认证授权的能力。十一、用一个诊断报告串起三种能力假设系统需要根据用户问题查询设备信息、检索维修手册并返回一份诊断报告。可以按下面的顺序设计先用结构化输出抽取设备编号、时间范围和问题类型。Java 服务校验设备是否属于当前租户并生成只读查询上下文。模型通过 Function Calling 请求findDeviceEvents。如果工单系统由多个 AI 应用共用则由 MCP Gateway 发现并调用统一工具。检索结果带上文档版本、页码和引用编号。最终用DiagnosticReportSchema 返回结论、证据、风险和下一步。这个流程里结构化输出负责“抽取和呈现”Function Calling 负责“请求动作”MCP 负责“跨应用连接”。权限、事务和引用校验仍然在 Java 服务中完成。把职责写清楚后任何一层替换都不会影响全部系统。十二、接口契约与演进建议为每个工具和最终 DTO 保存 JSON Schema并在 CI 中做兼容性检查。新增可选字段通常可以向后兼容删除必填字段、改变枚举含义和调整单位则需要新版本。模型供应商更换时也要验证它是否稳定遵守 Schema而不是只测试几个成功样例。工具调用的审计记录应能关联到最终报告用户是谁、模型提出了什么调用、后端为什么允许、MCP Server 返回了什么、最终报告引用了哪些证据。这样出现异常时才能判断是格式问题、工具问题还是业务授权问题。十三、总结结构化输出管“返回什么格式”Function Calling 管“模型希望应用做什么”MCP 管“工具和资源如何以标准方式接入”。清楚区分三者后系统边界、测试方式和安全责任都会更明确。在 Java AI 应用中最稳妥的组合通常是结构化输出承载稳定 DTOFunction Calling 连接少量本地业务工具MCP 负责跨应用复用和标准接入所有真正的权限、事务、幂等和审计都由后端掌控。读者讨论选型时可以先问一句这个能力是“返回结构”还是“执行动作”还是“跨应用复用工具”通常答案就能决定技术方案。