Genkit Dart 的 MCP 集成指南Host、Client 与 Server 三种模式实战【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills导读本文是 Genkit Dart 生态中genkit_mcp插件的完整接入指南围绕 Model Context ProtocolMCP在 Genkit Dart 中的三种角色展开MCP Host推荐自动聚合多个 MCP 服务器的能力进 Genkit 注册表、MCP Client高级手动控制单个客户端生命周期与MCP Server把 Genkit 的工具、提示词与资源反向暴露为 MCP 服务。读完本文你将掌握如何在 Dart 应用中连接文件系统等现成 MCP 服务器、用通配符动态发现工具、以及如何把自己的 Genkit Action 通过 stdio 或 Streamable HTTP 传输给外部 MCP 客户端消费。关联文档references/genkit_mcp.md配套框架指南见 references/genkit.md。MCP 与genkit_mcp插件定位Model Context ProtocolMCP是连接 AI 应用与外部数据/工具服务的开放协议。genkit_mcp为 Genkit Dart 提供完整的 MCP 集成能力让你在同一个Genkit实例中既能消费外部 MCP 服务器提供的工具也能对外暴露自己定义的 Genkit Action。从 SKILL.md 的插件生态表可以看到genkit_mcp的定位是 Model Context Protocol integration (Server, Host, and Client capabilities)即同时覆盖服务器、主机与客户端三种能力。围绕ai.generate这一核心调用模型生成、结构化输出、工具调用与智能体工作流都经由它展开详见 references/genkit.mdMCP 集成主要回答三个问题Host如何同时连接一个或多个 MCP 服务器并把它们的能力自动并入 Genkit 注册表Client如何用客户端对象精确控制单个 MCP 服务器的连接生命周期Server如何把自己定义的 Tool / Resource / Prompt 通过 MCP 协议暴露出去。下文按这三个角色逐一展开代码示例均可在package:genkit/genkit.dart与package:genkit_mcp/genkit_mcp.dart两个导入下运行。前置准备初始化 Genkit 与模型插件三种模式都要求先初始化 Genkit 实例并通过插件引入模型提供方。下面的最小骨架以 Google AI Gemini 插件为例完整插件用法见 references/genkit_google_genai.mdimport package:genkit/genkit.dart; import package:genkit_google_genai/genkit_google_genai.dart; import package:genkit_mcp/genkit_mcp.dart; void main() async { final ai Genkit(plugins: [googleAI()]); // ... 后续按需选择 Host / Client / Server 模式 }注意当你在 Tool、Flow、Prompt 中定义 schema 映射时必须使用 schemantic 库见 references/schemantic.mdgenkit_mcp中的工具参数 schema 同样遵循这一约定。MCP Host推荐自动聚合多服务器能力MCP Host 是官方推荐的首选接入方式。它的核心价值在于你只需声明一组 MCP 服务器配置genkit_mcp会自动连接它们并把各自暴露的工具自动注册进 Genkit 的注册表随后就能在ai.generate中直接通过toolNames引用无需手动搬运工具对象。import package:genkit/genkit.dart; import package:genkit_mcp/genkit_mcp.dart; void main() async { final ai Genkit(); final host defineMcpHost( ai, McpHostOptionsWithCache( name: my-host, mcpServers: { fs: McpServerConfig( command: npx, args: [-y, modelcontextprotocol/server-filesystem, .], ), }, ), ); // Tools can be discovered and executed dynamically using a wildcard... final response await ai.generate( model: googleAI.gemini(gemini-flash-latest), prompt: Summarize the contents of README.md, toolNames: [my-host:tool/fs/*], ); // ...or by specifying the exact tool name final exactResponse await ai.generate( model: googleAI.gemini(gemini-flash-latest), prompt: Read README.md, toolNames: [my-host:tool/fs/read_file], ); }关键配置项解析配置含义说明McpHostOptionsWithCacheHost 配置带缓存从命名可以推断Host 会缓存已发现/拉取的 MCP 能力避免每次生成调用都重复协商服务器能力name: my-hostHost 命名空间所有由该 Host 引入的工具都会以此作为工具名前缀如my-host:tool/...mcpServers服务器映射表一个 Mapkey 是服务器别名如fsvalue 是McpServerConfig支持同时配置多个服务器McpServerConfig.command服务器启动命令例如npx用于拉起 MCP 服务器进程McpServerConfig.args服务器启动参数例如[-y, modelcontextprotocol/server-filesystem, .]其中.是文件系统服务器允许访问的根目录上面的示例使用了官方文件系统 MCP 服务器modelcontextprotocol/server-filesystem把它挂载到当前目录.后模型便获得了列出目录、读取文件、写入文件等能力。工具命名空间与通配符发现Host 模式最大的便利是工具名是结构化的、可动态发现的。genkit_mcp会把 MCP 工具映射为形如my-host:tool/fs/tool-name的名字命名空间段my-host来自McpHostOptionsWithCache.name能力类型段toolMCP 的 tools 能力服务器段fs来自mcpServers的 key工具名段read_file等来自 MCP 服务器声明的工具名。由此可以产生两种引用策略通配符批量授权toolNames: [my-host:tool/fs/*]表示该 Host 下fs服务器暴露的所有工具都可用适合不确定服务器具体工具名、希望让模型自主挑选的场景精确指定toolNames: [my-host:tool/fs/read_file]只允许调用这一个工具适合需要严格限定工具面的场景如只允许读文件、不允许写文件。什么时候用 Host需要同时接入多个 MCP 服务器如文件系统 数据库 第三方 API希望自动完成工具的发现与注册减少手工搬运工具对象的样板代码工具数量多且会随服务器版本变化希望用通配符保持灵活性。MCP Client高级/单服务器手动管理生命周期MCP Client 模式面向只需要连接单个MCP 服务器、并且希望对客户端生命周期做精细控制的高级场景。与 Host 不同独立 Client 不会自动把工具注册进 Genkit 注册表你必须把从客户端取到的工具列表手动传给ai.generate的tools参数或注册为动态 Action Provider。import package:genkit/genkit.dart; import package:genkit_mcp/genkit_mcp.dart; void main() async { final ai Genkit(); final client createMcpClient( McpClientOptions( name: my-client, mcpServer: McpServerConfig( command: npx, args: [-y, modelcontextprotocol/server-filesystem, .], ), ), ); await client.ready(); // Retrieve the tools from the connected client final tools await client.getActiveTools(ai); final response await ai.generate( model: googleAI.gemini(gemini-flash-latest), prompt: Read the contents of README.md, tools: tools, ); }与 Host 模式的关键差异维度Host 模式Client 模式服务器数量支持多个mcpServersMap单个mcpServer自动注册是工具自动进入注册表否需手动传递工具生命周期控制由 Host 托管由调用方通过createMcpClient获得客户端句柄后自行控制推荐场景默认选择需要手动管理连接生命周期时Client 模式的使用流程分三步创建客户端createMcpClient(McpClientOptions(...))返回客户端对象McpClientOptions的name与mcpServer字段与 Host 配置中的语义一致等待就绪await client.ready()确保客户端已完成与 MCP 服务器的握手之后才能安全地枚举工具取工具并注入await client.getActiveTools(ai)从已连接的客户端获取其当前活跃的工具列表再作为tools参数传入ai.generate。手动注册动态 Action Provider原文档明确指出独立 Client 获取到的工具must be passed intogenerateordefineDynamicActionProvidermanually。也就是说除了每次生成时显式传tools还可以通过defineDynamicActionProvider把 MCP 工具注册为动态 Action Provider使它们像注册表里的普通工具一样按需解析与调用。这种写法适合连接建立一次、长期复用、工具按需动态解析的场景。什么时候用 Client只需要一个 MCP 服务器且不想承担 Host 的自动聚合开销需要亲自掌控ready()、工具刷新、客户端关闭等生命周期节点需要把 MCP 工具与本地定义的工具合并后统一注入生成调用。MCP Server把 Genkit Actions 反向暴露为 MCP第三种角色是把 Genkit 侧定义的能力工具、提示词、资源对外暴露成 MCP 服务供任何支持 MCP 的客户端消费。默认使用stdio 传输即通过标准输入输出与子进程通信同时支持Streamable HTTP 传输。import package:genkit/genkit.dart; import package:genkit_mcp/genkit_mcp.dart; void main() async { final ai Genkit(); ai.defineTool( name: add, description: Add two numbers together, inputSchema: .map(.string(), .dynamicSChema()), fn: (input, _) async (input[a] input[b]).toString(), ); ai.defineResource( name: my-resource, uri: my://resource, fn: (_, _) async ResourceOutput(content: [TextPart(text: my resource)]), ); // Stdio transport by default final server createMcpServer(ai, McpServerOptions(name: my-server)); await server.start(); }暴露 Toolai.defineToolai.defineTool是 Genkit 定义工具的标准入口框架级用法见 references/genkit.md 的 Define Tools 一节。上例定义了一个add工具name: add工具名MCP 客户端将据此调用description工具说明供模型与人类理解用途inputSchemaschemantic 构建的输入 schema(.map(.string(), .dynamicSChema()))表示字符串键到动态值的映射结构这里用于接收{a: ..., b: ...}这类任意键值输入fn执行函数(input[a] input[b]).toString()完成加法并返回字符串结果。提示生产代码建议使用 schemantic 的Schema()注解定义类型安全的输入模型参考 references/schemantic.md例如Schema() abstract class $AddInput { int get a; int get b; }以替代上例中松散的动态 map从而获得编译期类型检查。暴露 Resourceai.defineResourceMCP 协议中的 Resources 对应 Genkit 的ai.defineResource。示例定义了my-resourcename: my-resource与uri: my://resource共同标识该资源fn返回ResourceOutput(content: [TextPart(text: my resource)])其中TextPart是 Genkit 统一的消息/内容数据模型之一该模型的完整介绍见 references/genkit.md 的 Data Models 一节。启动服务器createMcpServercreateMcpServer(ai, McpServerOptions(name: my-server))以默认配置创建服务器name用于标识该 MCP 服务器await server.start()启动服务器未显式传入 transport 时默认走 stdio因此该进程适合被外部 MCP 客户端以子进程方式拉起。Streamable HTTP 传输需要走网络协议时可先绑定StreamableHttpServerTransport再把它传给server.startimport dart:io; final transport await StreamableHttpServerTransport.bind( address: InternetAddress.loopbackIPv4, port: 3000, ); await server.start(transport);关键参数参数含义address监听地址InternetAddress.loopbackIPv4表示仅本机回环外部机器无法访问如需对外提供服务应改为合适的监听地址port监听端口示例为3000绑定成功后server.start(transport)会用该 HTTP transport 替换默认的 stdio 传输使 MCP 客户端可以通过 HTTP 访问你暴露的 Tool 与 Resource。三种模式的选型与协作综合原文档三种模式可以这样选型默认用 Host原文档明确标注 Recommended多服务器、自动聚合、通配符动态发现是它的最大优势单服务器 需要生命周期控制时用 Client原文档标注 Advanced / Single Server手动ready()、手动注入tools或注册动态 Action Provider对外提供能力时用 Server把自己定义的 Tool / Resource以及 Prompt暴露为 MCP 服务选择 stdio 或 Streamable HTTP 传输。三个角色可以共存于同一个Genkit实例一边用 Host/Client 消费外部 MCP 能力一边用 Server 把本地 Action 暴露出去形成中转/网关式架构。运行与调试配合 Genkit CLI 使用开发阶段建议按 SKILL.md 的最佳实践使用 Genkit CLI 运行程序以捕获 trace从而验证 MCP 工具是否真的被调用、模型输入输出是否正确# 用 CLI 包裹启动你的 Dart 程序会捕获所有 Genkit Action 的 trace genkit start -- dart run main.dart # 查看最近的 trace ID 与完整 trace含工具调用细节 genkit trace:list genkit trace:get traceId genkit trace:get traceId --format jsongenkit start会在本地启动 Developer UI默认 http://localhost:4000可在其中运行 flow、浏览模型与工具 playground 以及查看 trace。如果直接dart run main.dart则不会捕获开发期 trace。代码改动后请用dart analyze确认可编译再运行。总结genkit_mcp用三个 API 家族覆盖了 MCP 的全部接入方向API角色一句话总结defineMcpHostMcpHostOptionsWithCacheHost连接多个 MCP 服务器自动注册工具到注册表用my-host:tool/fs/*或精确名引用createMcpClientMcpClientOptionsClient单服务器、手动控制生命周期ready()后经getActiveTools手动注入工具createMcpServerMcpServerOptionsServer把defineTool/defineResource暴露为 MCP 服务默认 stdio可切换 Streamable HTTP从源码结构看references/genkit_mcp.md三者共享McpServerConfigcommand/args作为服务器启动描述Host 与 Client 的差异集中在是否自动注册与生命周期托管上。实际项目中建议优先采用 Host 模式获得开箱即用的聚合体验再按需引入 Client 与 Server 角色扩展边界。【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考