ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MCP for Beginners 实战解读:基于 Azure Content Safety 与 LangChain4j 的内容安全守护计算器 MCP 调用时序分析

MCP for Beginners 实战解读:基于 Azure Content Safety 与 LangChain4j 的内容安全守护计算器 MCP 调用时序分析 教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载本文以仓库中 sequence-diagram.md 为主线逐行拆解一个「先安检、后调用」的 MCP 计算器示例用户输入经过 Azure Content Safety 双重过滤后才由 LangChain4j 通过 SSE 传输调用运行在 8080 端口的 MCP 计算器服务器。读完本文你将掌握 ContentSafetyController → ContentSafetyService → Azure Content Safety API → LangChain4j → MCP Client → MCP Server 的完整调用链理解 severity 阈值判定、双重重检查与{isSafe, botResponse, safetyResult}结果契约并能在本地复现这一安全增强型 MCP 工作流。该时序图文档位于 Java 示例工程containerapp的静态资源目录中对应源码工程为 04-PracticalImplementation/samples/java/containerapp整体架构可参考 系统架构图该图在 工程 README 中标注为 System Architecture Diagram。一、时序图全貌一次请求的完整生命周期原始文档的核心是一段 Mermaid sequenceDiagram它把「Web 应用 内容安全服务 Azure API LangChain4j MCP 客户端 MCP 计算器服务器」七个参与者串成一条完整调用链。原图如下未做任何删减该图被设计为可被 Mermaid 直接渲染的独立 Markdown 文档同目录下另有 sequence-diagram.puml 的 PlantUML 版本这意味着它可以被直接嵌入 README、文档站或知识库中渲染是一份「文档即图、图即文档」的架构描述资产。二、七个参与者的职责定位对照源码时序图声明的每个参与者都能在工程源码中找到一一对应的实现这也是该图可作为架构真值的原因参与者对应源码职责Web AppContentSafetyControllerContentSafetyController.java接收用户输入、构造PromptRequest、渲染结果视图Content Safety ServiceContentSafetyService.java编排整个流程安检 → 调 Bot → 二次安检 → 组装结果 MapAzure Content Safety API依赖azure-ai-contentsafety见 pom.xml对文本做四类有害内容分析返回逐类 severityLangChain4jlangchain4j-mcp、langchain4j-open-ai-official依赖承载 AI 模型与 Tool Provider负责让模型「决定调用哪个计算器工具」MCP ClientDefaultMcpClientHttpMcpTransport通过 SSE 与 MCP 服务器通信MCP Calculator ServerPort 8080C# 示例 Program.cs 与 CalculatorTool.cs提供 add/subtract/multiply/divide 等计算工具Calculator ServiceCalculatorTool中的各[McpServerTool]方法实际执行算术运算其中 Web 层与 Safety 层是典型的 Spring MVC 分层ContentSafetyController通过Autowired注入ContentSafetyService自身不包含任何业务逻辑仅负责模型属性搬运与视图转发。三、请求生命周期逐步拆解3.1 用户输入与 PromptRequest 构造时序图第一步是User-WebApp: Enter calculation prompt对应控制器中的两个路由GET /渲染index表单页并预先绑定一个空PromptRequestContentSafetyController.java#L21-L25POST /submit及别名POST /process用ModelAttribute PromptRequest接收表单提交的 prompt随后调用contentSafetyService.processPrompt(prompt)ContentSafetyController.java#L27-L55。PromptRequest是 model/PromptRequest.java 中定义的简单 POJO是用户输入与后端之间的传输载体。3.2 输入侧安检analyzeText 与 severity 2 判定时序图的SafetyService-AzureAPI: analyzeText(prompt)对应 ContentSafetyService.processPrompt() 中的第一行调用String safetyResult ContentSafetyUtil.checkContentIsSafe(prompt);而checkContentIsSafe的底层实现在 ContentSafetyUtil.java通过ContentSafetyClientBuilder使用CONTENT_SAFETY_ENDPOINT与CONTENT_SAFETY_KEY构建客户端构造AnalyzeTextOptions(text)并显式设置待分析类别即代码中的常量TEXT_CATEGORIESHATE仇恨、SELF_HARM自残、SEXUAL色情、VIOLENCE暴力四类ContentSafetyUtil.java#L29-L34逐类读取TextCategoriesAnalysis.getSeverity()凡 severity ≥ 2中等级别及以上即判定为不安全全部小于 2 则返回RESULT: Content is safe.否则返回RESULT: Content contains harmful elements.。时序图上的severity 2 for all categories正是这段代码逻辑的可视化浓缩。值得注意 severity 判定是「任一类别命中即不通过」的 OR 语义而非取平均或加权。3.3 安全分支LangChain4j 通过 MCP 调用计算器当输入安检通过safetyResult.contains(RESULT: Content is safe.)时时序图进入alt Content is safe分支对应源码String botResponse bot.chat(prompt);这一行背后是复杂的装配过程全部发生在ContentSafetyService的构造函数中ContentSafetyService.java#L32-L62聊天模型OpenAiOfficialChatModel.builder()以AZURE_OPENAI_ENDPOINT自动去尾斜杠后拼接/openai/v1/、AZURE_OPENAI_API_KEY、AZURE_OPENAI_DEPLOYMENT默认gpt-5.1构建并设置 60 分钟超时MCP 传输层HttpMcpTransport.Builder().sseUrl(http://localhost:8080/sse)—— 这正是时序图中McpServer as MCP Calculator Server (Port 8080)的出处使用 SSEServer-Sent Events作为 MCP 传输协议MCP 客户端DefaultMcpClient.Builder().transport(transport).build()工具提供器McpToolProvider.builder().mcpClients(List.of(mcpClient)).build()把远端 MCP 工具暴露给 AI 模型AI 服务代理AiServices.builder(Bot.class).chatLanguageModel(model).toolProvider(toolProvider).build()生成 Bot.java 接口的动态实现。时序图中LangChain-McpClient: Process prompt、McpClient-McpServer: Call appropriate calculator tool via SSE描述的就是模型在推理过程中判断「该用哪个计算工具」LangChain4j 通过McpToolProvider把工具调用请求经 SSE 转发到 8080 端口的 MCP 服务器。3.4 计算器端的实际执行时序图的McpServer-CalcService: Execute calculation对应仓库中 C# 版计算器示例Program.cs 通过AddMcpServer().WithHttpTransport(o o.Stateless true).WithToolsCalculatorTool()注册 MCP 服务器app.MapMcp(/mcp)挂载端点CalculatorTool.cs 用[McpServerTool]注解暴露Add、Subtract、Multiply、Divide除零会抛ArgumentException以及NextFivePrimeNumbers五个工具并逐一配有Description供模型理解工具语义。这些描述信息会在tools/list握手阶段被 MCP 客户端拉取并注入 LangChain4j 的工具上下文——这就是模型能够「choose the appropriate calculator tool」的原因。3.5 输出侧二次安检与结果契约时序图后半段揭示了该工程最关键的加固设计——对 Bot 响应同样执行内容安全分析ContentSafetyService.java#L93-L103String botResponseSafetyResult ContentSafetyUtil.checkContentIsSafe(botResponse); if (botResponseSafetyResult.contains(RESULT: Content is safe.)) { result.put(botResponse, botResponse); result.put(isSafe, true); } else { result.put(botResponse, The generated response was flagged for safety concerns and cannot be displayed.); result.put(isSafe, false); }这一「输入安检 输出安检」的双层设计使系统在底层模型即使相对开放README 中称 potentially uncensored models时仍能守住安全边界模型生成什么不直接决定用户看到什么最终话语权在 Content Safety 的 severity 判定上。最终processPrompt统一返回一个MapString, String即时序图中的结果契约Key取值说明safetyResult输入安检详情文本始终返回包含逐类 severity 与最终结论botResponseSafetyResult输出安检详情文本仅当输入安全且 Bot 执行成功时存在botResponse模型回复或安全警告文案输出安检通过才放行真实回复isSafetrue/false总体安全标记error异常信息仅处理异常时存在控制器随后把这些 key 一一取出放入ModelContentSafetyController.java#L32-L46由 result.html 渲染给用户。四、两个分支的边界行为时序图用alt/else清晰刻画了两条路径的收敛点安全路径SafetyService--WebApp: {isSafe: true, botResponse: result, safetyResult: details}用户看到计算结果与安全分析信息不安全路径{isSafe: false, safetyResult: details}不进行任何计算直接展示安全警告。一个值得注意的工程细节是异常分支的处理当输入安全但 Bot 调用抛出异常时代码仍将isSafe置为true内容本身安全只是处理失败并通过errorkey 携带错误信息ContentSafetyService.java#L104-L107。这意味着安全判定与处理成功是两个独立维度时序图虽然未画出但阅读源码时不应忽略。五、运行前提与环境变量复现时序图的前提条件时序图描述的完整链路要真实跑通需要满足以下前提全部来自 工程 README 与源码5.1 启动 MCP 计算器服务器8080在运行 Java 客户端之前必须先以 SSE 模式在localhost:8080启动计算器 MCP 服务器对应仓库中的 C# 示例Calculator工程。Java 侧通过HttpMcpTransport.Builder().sseUrl(http://localhost:8080/sse)与之建立连接。5.2 配置环境变量# 模型端点Microsoft Foundry / Azure OpenAI export AZURE_OPENAI_ENDPOINThttps://resource-name.openai.azure.com export AZURE_OPENAI_API_KEYapi-key export AZURE_OPENAI_DEPLOYMENTgpt-5.1 # 内容安全服务 export CONTENT_SAFETY_ENDPOINTyour_content_safety_endpoint export CONTENT_SAFETY_KEYyour_content_safety_key其中内容安全端点与密钥用于构建ContentSafetyClient。源码中有一个明确的降级行为若未设置CONTENT_SAFETY_ENDPOINT/CONTENT_SAFETY_KEYContentSafetyUtil.initializeClient() 会使用占位值继续运行以支持演示但安检功能将无法真正工作——这正是 README 中 the content safety features will not work properly 的来源。5.3 启动 Web 应用Web 应用端口由 application.properties 固定为8087server.port8087与 MCP 服务器的 8080 端口明确分离。运行命令mvn spring-boot:run然后访问http://localhost:8087在文本框中输入如 Calculate the sum of 24.5 and 17.3 之类的计算提示词提交即可。工程基于 Spring Boot 3.4.4、Java 21MCP 相关依赖版本为langchain4j 1.0.0-beta3、azure-ai-contentsafety 1.0.11见 pom.xml。六、无需 Web 界面的验证方式命令行客户端除了时序图中的 Web 路径仓库还提供了独立的命令行验证入口 LangChain4jClient.java在pom.xml中通过exec-maven-plugin绑定为默认 mainClass。它预置了三类典型 promptString[] prompts { Calculate the sum of 24.5 and 17.3 using the calculator service, Go kill yourself!, Show me the help for the calculator service };每一条都先走ContentSafetyUtil.checkContentIsSafe(prompt)安全才调用bot.chat(prompt)否则打印 The prompt was flagged as unsafe. Skipping processing.。这份用例清单恰好是时序图alt/else两分支的可执行测试样本安全数学题走完整调用链攻击性文本在输入安检即被拦截。与 Web 版ContentSafetyService相比此客户端在HttpMcpTransport上额外开启了logRequests(true)与logResponses(true)便于观察模型到底选中了哪个计算器工具。七、小结把时序图当作架构规范来读这份 sequence-diagram.md 的价值不在于「画得好看」而在于它精确刻画了一个生产级安全模式的 MCP 集成范式永不直接信任用户输入——任何 prompt 先经 Azure Content Safety 四类目、severity 2 的阈值过滤永不直接信任模型输出——Bot 响应同样过安检杜绝 potentially uncensored models 带来的输出风险MCP 工具调用与安全层解耦——计算器工具只是被动提供add/subtract/multiply/divide等能力安全策略完全收敛在ContentSafetyService编排层结果以统一 Map 契约返回——{isSafe, botResponse, safetyResult, botResponseSafetyResult, error}让 Controller 层零逻辑即可渲染安全/警告两种视图。对于想要在自己的 MCP 应用中引入内容安全门禁的开发者可直接以该时序图作为组件划分依据对照 ContentSafetyService.java 复刻编排逻辑、对照 ContentSafetyUtil.java 复刻 severity 判定、对照 CalculatorTool.cs 复刻 MCP 工具侧即可在本地完整复现这条「安检—MCP—再安检」的调用链。赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐MCP for Beginners基于 Java、LangChain4j 与 Azure Content Safety 的 MCP 计算器应用实战MCP for Beginners基于 Java、LangChain4j 与 Azure Content Safety 的 MCP 计算器应用实战 导读 本文教程文档人工智能MCP for Beginners 实战用 LangChain4j Azure Content Safety 构建带双层内容安全检查的 MCP 计算器应用MCP for Beginners 实战用 LangChain4j Azure Content Safety 构建带双层内容安全检查的 MCP 计算器应用教程文档人工智能MCP 与 Azure 内容安全集成的请求时序全解析Content Safety Calculator 实战指南MCP 与 Azure 内容安全集成的请求时序全解析Content Safety Calculator 实战指南 本篇文章以 mcp for beginner教程文档人工智能上一篇Office激活工具Ohook保姆级指南4步零修改解锁Microsoft 365订阅版全部功能下一篇PaddleSpeech 流式数据管线 shardlists 模块详解SimpleShardList、MultiShardSample 与分布式分片采样创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表