使用 Semantic Kernel Python 将 Kernel 与 Agent 暴露为 MCP Serverstdio / SSE 实战指南【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel本文以 Semantic Kernel 官方 Python 示例 mcp_server 为核心系统讲解如何把 Semantic Kernel 实例Kernel或 Azure AI Agent 封装为 MCPModel Context Protocol服务器并接入 Claude Desktop、VSCode Copilot Agents 等 MCP 主机。读完本文你将掌握kernel.as_mcp_server()/agent.as_mcp_server()的完整用法、stdio 与 SSE 两种传输方式的配置与启动方法、函数Tools与 Prompt 的暴露机制以及本地 MCP 服务器必须遵守的 Host/Origin 安全约束。一、示例背景为什么要把 Semantic Kernel 变成 MCP ServerMCPModel Context Protocol是客户端MCP Host如 Claude Desktop、VSCode GitHub Copilot Agents与大模型工具之间的一种标准化协议。Semantic Kernel 将 Kernel 中的插件函数Plugin Function与 Agent 抽象为可复用的能力单元通过as_mcp_server()这些能力可以被自动映射为 MCP 协议中的Tools从而让任意 MCP 主机直接调用 Semantic Kernel 已经编排好的函数、Prompt 与模型服务。本示例存放于 python/samples/demos/mcp_server包含 4 个可直接运行的脚本sk_mcp_server.py把 Kernel 实例暴露为 MCP 服务器agent_as_server.py把 Azure AI Agent 暴露为 MCP 服务器mcp_server_with_prompts.py演示在 MCP 服务器上挂载 Promptmcp_server_with_sampling.py演示通过 MCP Sampling 能力由客户端侧模型生成内容。这些脚本头部都带有# /// script形式的 PEP 723 内联依赖声明dependencies [semantic-kernel[mcp]]意味着你可以直接用uv run执行uv会自动在临时虚拟环境中安装带mcpextra 的semantic-kernel无需手动建环境。二、基于 stdio 传输的快速开始默认方式stdio 是默认传输方式MCP 主机以子进程方式启动服务器通过标准输入/输出与服务器通信适合本地桌面客户端。在 MCP 主机如 Claude Desktop 或 VSCode GitHub Copilot Agents的配置文件中注册以下两个服务器{ mcpServers: { sk: { command: uv, args: [ --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server, run, sk_mcp_server.py ], env: { OPENAI_API_KEY: your_openai_api_key, OPENAI_CHAT_MODEL_ID: gpt-4o-mini } }, agent: { command: uv, args: [ --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server, run, agent_mcp_server.py ], env: { AZURE_AI_AGENT_PROJECT_CONNECTION_STRING: your azure connection string, AZURE_AI_AGENT_MODEL_DEPLOYMENT_NAME: your azure model deployment name } } } }要点说明command使用uvargs中通过--directory指定示例目录后执行对应脚本。脚本头部的内联依赖声明会让uv run自动完成semantic-kernel[mcp]的安装如果uv不在 PATH 中需要填写其完整路径示例源码注释中也给出了这一提醒见 sk_mcp_server.py。sk服务器使用 OpenAI 服务需要OPENAI_API_KEY与OPENAI_CHAT_MODEL_ID示例默认值为gpt-4o-mini。agent服务器使用 Azure AI Agent 服务需要AZURE_AI_AGENT_PROJECT_CONNECTION_STRING与AZURE_AI_AGENT_MODEL_DEPLOYMENT_NAME。也可以在终端中直接以子进程方式启动服务器验证是否正常uv --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server run sk_mcp_server.py或uv --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server run agent_mcp_server.py三、基于 SSE 传输的快速开始如果 MCP 主机支持远程 HTTP 连接Server-Sent Events可以以 SSE 模式启动服务器。设置与上文相同的环境变量后执行uv --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server run sk_mcp_server.py --transport sse --port 8000或uv --directorypath to sk project/semantic-kernel/python/samples/demos/mcp_server run agent_mcp_server.py --transport sse --port 8000启动后服务器会在8000端口监听请求。命令行参数解析从 sk_mcp_server.py 的parse_arguments()可以看出三个核心参数及其默认值参数可选值默认值说明--transportsse/stdiostdio传输方式--port整数NoneSSE 模式端口使用sse传输时必须显式指定否则解析器会直接报错退出--host字符串127.0.0.1SSE 模式绑定的网卡地址其中--port的强校验逻辑为if args.transport sse and args.port is None: parser.error(--port is required when --transport is sse.)。四、安全约束本地 MCP 服务器不是通用 Web 服务器SSE 模式默认绑定127.0.0.1回环地址并且只接受回环Host头与若存在回环Origin头的请求。原因很直接本地 MCP 服务器暴露的是基于你自己凭据的工具、插件与模型服务理应只允许本机访问。MCP 规范也建议服务器校验Origin并绑定回环以防御DNS RebindingDNS 重绑定攻击——恶意网页可以通过浏览器访问受害者的回环监听端口并调用其暴露的 MCP 工具。如需覆盖绑定地址可传入--host例如--host 0.0.0.0将服务器暴露到网络。请仅在可信网络上这样做内置的 Host/Origin 校验只放行回环调用方非回环部署必须自行补充身份认证建议参考 python/samples/demos/mcp_with_oauth 示例中面向生产环境、带认证的 Streamable-HTTP 模式。从源码看这套防护由两部分组成见 sk_mcp_server.py 与 agent_as_server.pyTrustedHostMiddleware仅放行localhost、127.0.0.1、[::1]及其带端口的组合自定义OriginValidationMiddleware当请求携带Origin头时校验其是否属于上述回环来源否则返回403 Forbidden: invalid Origin header。此外脚本通过is_loopback_host()判断绑定地址当绑定到非回环地址时会输出警告日志提示非回环部署需要认证对应 README 中指向mcp_with_oauth的建议。五、示例暴露的能力与背后实现1.sk_mcp_server.pyKernel 级 MCP 服务器该示例创建了一个 Kernel 并暴露两个函数对应 README 的说明echo-echo_function简单的回显函数echo_function(message, extra)返回Function echo: {message} {extra}prompt-prompt一个使用 Semantic Kernel Prompt 模板生成响应的函数模板为Please repeat this: {{$message}} and this: {{$extra}}并通过InputVariable声明了message必填与extra可选默认值default两个输入变量及各自的 JSON Schema。关键代码路径为kernel Kernel() kernel.add_service(OpenAIChatCompletion(service_iddefault)) kernel.add_function(echo, echo_function, echo_function) kernel.add_function(plugin_nameprompt, function_nameprompt, prompt_template_config...) server kernel.as_mcp_server(server_namesk)kernel.as_mcp_server()在 kernel.py 中定义标注为experimental最终委托给create_mcp_server_from_kernel()实现于 python/semantic_kernel/connectors/mcp.py。其核心逻辑是默认将 Kernel 中所有函数暴露为 MCP Tools可通过excluded_functions参数按函数名不含插件名排除部分函数通过prompts参数挂载 Prompt 模板返回mcp.server.lowlevel.Server实例可继续扩展 resources、prompts 等能力。值得注意的细节functions_to_expose [func for func in kernel.get_full_list_of_function_metadata() if func.name not in (excluded_functions or [])]即排除逻辑按函数名匹配。2.agent_as_server.pyAgent 级 MCP 服务器该示例创建了一个基于 Azure AI Agent 的简单代理用于回答菜单相关问题并为其挂载了MenuPlugin提供get_specials与get_item_price两个函数随后通过agent.as_mcp_server()暴露。README 说明它暴露单个函数mcp-host使用 Azure OpenAI 服务生成响应的函数本质上是 Agent 本身作为唯一 Tool 被暴露。核心代码路径为agent AzureAIAgent( clientclient, definitionawait client.agents.create_agent(model..., nameHost, instructionsAnswer questions about the menu.), plugins[MenuPlugin()], ) server agent.as_mcp_server()agent.as_mcp_server()在 python/semantic_kernel/agents/agent.py 中定义它调用create_mcp_server_from_functions()见 python/semantic_kernel/connectors/mcp.py把一个 Agent 作为唯一 Tool 暴露服务器名称默认为 Agent 名称可通过server_name覆盖。create_mcp_server_from_functions还接受函数、插件或任意可解析为插件的对象并统一归入plugin_name默认mcp命名空间。另外注意agent_as_server.py的入口通过anyio.run(run, args.transport, args.port, args.host)驱动异步run()且由于 Azure 凭据基于AzureCliCredential运行前需要先通过 Azure CLI 完成登录。3.mcp_server_with_prompts.py在 MCP 服务器上挂载 Prompt该脚本展示了如何在kernel.as_mcp_server()时通过prompts参数把KernelPromptTemplate暴露为 MCP Prompt它定义了一个根据 PR 消息生成分类化发布说明release notes的模板并以server kernel.as_mcp_server(server_namesk_release_notes, prompts[prompt])的方式注册。MCP 主机随后即可通过 Prompt 协议调用该模板。4.mcp_server_with_sampling.py使用 MCP Sampling 能力该脚本进一步演示 MCP 的Sampling概念sampling_function作为被暴露的 Tool通过注入的server.request_context.session.create_message(...)向 MCP 主机请求模型生成内容并支持temperature、max_tokens与model_preferences示例 hint 为gpt-4o-mini等参数。其函数签名中server参数被标记为{include_in_function_choices: False}因此不会进入函数选择列表而是由消费该服务器的 MCPPlugin 注入服务器实例——这展示了在 MCP 工具内部访问服务器会话上下文的典型写法。六、在 MCP 主机中消费与进一步扩展服务器创建完成后得到的是mcp.server.lowlevel.Server对象。你可以在它基础上继续扩展注册更多 Tools通过server.list_tools()/server.call_tool()添加 resources、prompts 等 MCP 能力组合create_mcp_server_from_functions()将函数、插件与 Agent 混合打包进同一个服务器。server kernel.as_mcp_server(server_namesk) # server 为 mcp.server.lowlevel.Server可继续添加资源、Prompt 等功能七、常见问题与前置条件小结uv未找到在 MCP 主机配置的args中改用uv的完整路径。环境变量缺失sk服务器需要 OpenAI 凭据agent服务器需要 Azure AI 凭据两套服务器相互独立按需配置即可。SSE 模式必须指定端口--transport sse下缺省--port会直接报错。依赖自动安装两种传输方式下uv都会在临时虚拟环境中安装带mcpextra 的semantic-kernel无需手动pip install。非回环部署务必在可信网络中进行并参考 python/samples/demos/mcp_with_oauth 添加认证否则内置校验会拒绝非回环调用方。如果你希望进一步深入 MCP 在 Semantic Kernel 中的完整实现客户端插件、SSE/Streamable HTTP/WebSocket 支持等可以从 python/semantic_kernel/connectors/mcp.py 及其单元测试 python/tests/unit/connectors/mcp/test_mcp.py 继续阅读。【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考