尧图精选

企业AI集成实践:自定义MCP服务器接入Gemini Business全流程指南

🕒 发布时间:2026/9/9 9:22:55 📁 来源:尧图网络
如果你的团队正在用 Gemini Business你一定遇到过这个场景同事在对话框里问“我们上个月的续约率到底是多少”AI 给了一堆泛泛的分析框架却拿不到你们 CRM 里的一个真实数字。这不完全是 Gemini 不够聪明更核心的原因是它没有“手”——它碰不到你们内部的业务系统。MCPModel Context Protocol模型上下文协议就是为了打通这一层而出现的。这篇文章我会从协议原理、服务器开发、授权配置到实际排错完整复盘一遍“把自定义 MCP 服务器接入 Gemini Business”这件事目标是让企业 IT 管理员和 AI 应用开发者在看完之后能自己动手把内部系统接进来而不是停留在概念层。适合谁来读如果你是负责企业 AI 落地的管理员可以重点看第 3 章的配置路径和第 5 章的排查思路如果你是开发者第 2 章的选型分析和第 4 章的示例代码可以直接抄作业如果你只是想知道“这东西到底值不值得做”那第 1 章和第 6 章会给你判断依据。我尽可能把实际操作中那些文档不会写的细节也讲清楚包括几个我踩过之后印象深刻的坑。1. MCP 协议到底解决了什么问题从“聊天窗口”到“能动手的数字员工”1.1 没有 MCP 之前AI 与业务系统之间的断层单纯把 Gemini 当聊天机器人用价值其实很有限。企业买 Gemini Business 的核心诉求是让员工用自然语言直接操作内部数据查知识库、建工单、看报表、更新 CRM 记录。但在没有统一协议的情况下每个内部系统都要单独对接一遍CRM 有一套 API内部 Wiki 有一套 API工单系统又有自己的接口。开发团队要针对每个系统写一版“函数调用适配层”维护成本非常高而且随着系统数量增长这种点对点连接很快就会变成一团乱麻。我见过不少团队尝试用 Function Calling 解决这个问题做法是把内部 API 的描述和参数 schema 塞进模型请求里让模型自己决定调哪个函数。这个思路本身没问题但落地时你会遇到一个尴尬情况每一套系统都得单独写函数定义、单独做鉴权、单独处理错误重试换一个 AI 产品又得全部重来。说白了接口标准不统一AI 和业务系统之间始终隔着一层“翻译器”而这层翻译器恰恰是最费人力的地方。1.2 MCP 的核心架构一个统一“插座”MCP 的出现相当于给这个局面定了一个公共标准。你可以把它想象成一个USB-C 接口过去不同的设备需要不同的充电线现在大家都按同一个协议来只要设备支持 USB-C一根线就能通。MCP 做的也是这件事它定义了大模型应用Host和外部数据/工具Server之间通信的标准化方式。在 MCP 的架构里有三个核心角色MCP Host运行大模型应用的环境Gemini Business 客户端就扮演这个角色。MCP Server暴露工具、资源或提示词的独立服务可以理解为“AI 的插件”。客户端的 MCP Client 模块负责在 Host 和 Server 之间转发请求。MCP Server 对外暴露三类能力Tools可执行的操作比如“创建工单”、Resources可读取的数据比如“客户资料列表”、Prompts可复用的提示模板。在 Gemini Business 的实际使用中最常用的是 Tools因为它和 Function Calling 的机制天然契合——你让模型去看一个会议的上下文模型判断“这里需要查一下内部知识库”于是通过 MCP 调用对应的工具再把结果带回来生成回答。1.3 为什么“自定义”连接对 Gemini Business 特别关键Google 官方自己也提供了一些内置扩展但对多数企业来说真正值钱的数据都在自己的系统里。自定义 MCP 服务器的意义在于你可以把内部 API、私有数据库、内部知识库、RPA 流程全部封装成标准的 MCP 工具然后在 Gemini Business 里统一挂载让所有授权用户在同一个对话框里完成原本要在多个系统间来回切换的工作。管理员可以统一控制什么人能用哪个服务器、是否需要鉴权、调用行为怎么审计。这比散装地给每个系统做 AI 插件要可控得多。从开发投入来看一旦团队学会了写 MCP Server后续每接入一个新系统核心工作就变成“写一个工具函数 绑定到内部 API”大量重复的协议对接、鉴权逻辑都可以被框架卡片化处理效率和之前完全是两个量级。2. 准备阶段账号、环境与 MCP 服务器的形态选型2.1 账号和版本先对齐别在配置到一半时发现权限不够动手之前先确认三件事。第一你的域名使用的是 Gemini Business 订阅并且当前账号具备管理员控制台的操作权限——这个很关键普通企业成员通常看不到 MCP 服务器管理入口。第二内部 MCP 服务器的访问需要能被 Gemini 服务访问到这涉及到你们企业网络的出方向和白名单策略。第三确认当前组织使用的 Gemini 版本支持自定义 MCP 服务器连接功能Google 对这个功能的开放是逐步放量到不同版本和区域市场的如果你的管理控制台里暂时看不到对应入口先确认版本和产品更新状态这一点后续排错还会遇到。这里提醒一个容易忽略的点如果你准备用 OAuth 鉴权那你还得提前在身份认证体系里注册一个应用客户端拿到 Client ID 和 Client Secret。没有这两个值后面的配置流程会被卡住。2.2 远程 HTTP 还是本地 stdio两种部署形态怎么选MCP Server 有两种常见运行形态选错后面会很别扭。我先用一张表直接说明区别维度远程 MCP Server本地/进程内 MCP Server通信方式通过 HTTP 端点进行网络通信推荐使用 Streamable HTTP 方式通过标准输入输出stdio与宿主进程通信适合场景团队共享、集中部署、生产环境个人调试、开发机本地测试、安全隔离要求极高的情况是否需要公网/内网可达需要且需要配置网络策略不需要依赖进程启动鉴权复杂度中高涉及 API Key 或 OAuth低通常本机访问维护成本需要部署和运维随宿主启动相对简单我的建议是正式接入 Gemini Business 时优先选择远程 HTTP 形态。因为 Gemini 作为 Host 可能运行在云端侧它需要通过网络访问到你的 MCP Server。如果你只是本地开发调试那用 stdio 形态更轻量。不过请注意当前 Gemini Business 自定义连接的主路径是网络访问也就是说你的服务器必须有一个可以被内网或授权网络访问的 HTTPS 端点。纯本地 stdio 主要适合你自己在测试阶段用 Gemini CLI 或桌面客户端调试生产环境和企业级发布基本还是走远程模式。2.3 语言和 SDK 选型别在协议细节上浪费时间MCP 官方提供了 TypeScript SDK 和 Python SDK社区也有 FastMCP、mcp-rs 等封装库。我的建议很直接如果你主要写 Python直接用fastmcp库如果你处在 TypeScript 技术栈用官方 SDK 或者modelcontextprotocol/sdk都行。不要自己从零实现 JSON-RPC 通信纯属浪费时间。从企业集成角度看Python 上手快、生态好特别是和内部系统对接时请求库、数据库驱动、CI 工具都很成熟。我下面第 4 章的示例代码也会用 Python FastMCP 来写。你需要保证运行 MCP Server 的服务器上有 Python 3.10 以上环境并提前安装依赖。3. 在 Gemini Business 中添加自定义 MCP 服务器的完整流程3.1 整体链路从代码到全员可用要经过哪几步很多第一次接触的人会以为“把服务器跑起来”就算接完了实际上完整的流程比这长得多。按我的实践这条链路至少有六个阶段开发和本地测试 MCP Server用 MCP Inspector 或 curl 验证工具能正常返回。把服务器部署到有固定地址的环境配置好 HTTPS 和鉴权。在 Gemini Business 管理端添加服务器连接。执行连接验证确认 Gemini 服务端能读取到工具列表。先分配给一个测试组织单元测试用真实业务提问验证效果。逐步扩大到全员并持续观察调用日志和准确率。这里最容易被低估的是第 1 步。有些人急着把服务器地址填到管理后台结果连接失败折腾半天才发现是服务器本身返回的 schema 格式不对。3.2 管理员控制台配置路径我先说明一下Google 控制台的管理菜单在不同版本周期里名字可能略有调整所以下面的入口我写的是“常见路径”不要和一两年前的旧教程做硬比对。第一次找的时候我也花了点时间最终是在管理控制台的“应用” - “Google Workspace” - “Gemini”相关设置里找到了 MCP 服务器管理页面。进去之后你会看到一个服务器列表点击添加后一般需要填写服务器名称方便管理员识别的内部名称MCP 服务器 URL远程端点地址鉴权方式无鉴权、API Key、OAuth 2.0权限范围哪些组织单元可以访问鉴权方式这里多说几句。如果你在完全可信的内网里部署并且访问入口本身已经通过企业网络策略做了控制那用 API Key 就够如果你希望走标准一点的企业身份体系建议用 OAuth 2.0这样 Gemini 服务端在调用工具之前会先向你们的身份服务索要访问令牌令牌过期后还能走刷新流程管理上也更符合企业合规要求。我个人在生产环境里不会推荐“无鉴权”的方式即使是内网也不行因为一旦某个工具被其他服务探测到风险不可控。填写保存后系统通常会有一个连接状态校验。如果网络不通、URL 不可达或者协议路径不对页面会直接给错误提示。3.3 面向开发者的 API 方式注册除了界面操作如果你们企业做了自动化配置管理也可以通过 API 来注册 MCP 服务器。这种方式特别适合“基础设施即代码”的团队你可以把服务器配置放在 Git 仓库里走代码评审流程然后通过脚本同步到 Gemini 管理端。以自动化精神来理解这种方式的好处是变更可追溯、可回滚比管理员手工维护 JSON 可靠。一个最小化的注册请求大致长这样不过实际字段名和端点路径要以你们当前使用的 API 版本为准curl -X POST https://admin.googleapis.com/v1/mcp-servers \ -H Authorization: Bearer ${ADMIN_ACCESS_TOKEN} \ -H Content-Type: application/json \ -d { displayName: internal-docs-mcp, url: https://mcp.internal.example.com/docs, authConfig: { apiKeyConfig: { headerName: X-API-Key } }, visibility: { orgUnits: [OU_DEVELOPERS, OU_OPERATIONS] } }注意我上面给的是一个简化示意真实的使用请求必须参考 Google Workspace 管理 API 的官方文档。用这个方式注册时建议同时做好幂等控制同一台服务器不要重复注册否则后面管理列表里会出现一堆相同名称的实体排查问题时会很痛苦。3.4 连接验证与渐进式发布配好 URL 和鉴权之后别急着让全员使用。我的习惯是先做一轮“连接状态确认”再去管理端触发一次工具列表同步。如果管理界面能看到这个 MCP Server 暴露出来的工具名称和描述说明协议链路是通的。然后我建议先创建一个测试组织单元OU把管理员自己或少数种子用户加进去再做真实场景验证。验证点有三个模型在对话里能否根据用户意图准确调用对应工具工具返回的数据能否被模型正确组织和展述调用过程中的鉴权、日志是否正常这层测试过了再扩大范围。渐进式发布的好处是一旦出现意外行为受影响面可控排查也更快。4. 一个可直接复用的 MCP Server 示例把企业内部知识库接进来4.1 设计目标先定义工具再写代码这一节我用真实示例带着你过一遍。假设公司内部有一个 Wiki里面存了大量管理制度和项目文档人工搜索很痛苦我们希望 Gemini 能通过自然语言帮员工查文档。工具设计为search_internal_docs输入是“搜索关键词”和“返回条数”输出是文档标题、摘要、链接和更新时间。在你写代码之前先想清楚一件事工具描述怎么写才能让模型准确调用。刚开始我写的描述很差比如“Search internal docs”模型经常在用户问“报销流程”的时候没有触发调用。后来我把描述改成“在内部知识库中检索公司制度和流程文档适用于报销、请假、采购、项目规范等内部问题”触发准确率一下就上来了。这一点真的值得多花时间工具描述就是模型判断何时使用它的依据。4.2 用 FastMCP 实现一个知识库查询工具下面是一个最小可运行的实现。这里用 FastMCP 库先把管道搭好真正的知识库访问部分我用一个模拟函数代替你只需要把它替换成对内部 Wiki API 的真实请求就行。# requirements: fastmcp from fastmcp import FastMCP mcp FastMCP(internal-docs) def _search_wiki(query: str, top_k: int) - list[dict]: # 此处替换为对内部 Wiki 搜索 API 的真实调用 # 注意只返回检索需要的字段避免把全文大段抛给模型 return [ { title: 2025 Q1 销售管理制度, summary: 规定了季度销售目标的制定、跟踪与考核流程适用于销售全员。, url: https://wiki.internal.example/policies/2025-q1-sales, updated_at: 2025-01-15, } ] if 销售 in query else [] mcp.tool() def search_internal_docs(query: str, top_k: int 5) - list[dict]: 在内部知识库中检索公司制度和流程文档适用于报销、请假、采购、销售、项目规范等内部问题。 result _search_wiki(query, min(top_k, 20)) # 如果知识库返回空结果明确提示避免模型自己脑补 if not result: return [{message: 没有检索到相关文档请尝试更换关键词或咨询行政部门。}] return result if __name__ __main__: mcp.run(transportstreamable-http)启动之后FastMCP 会开一个本地 HTTP 服务默认监听在某个端口。你只需要把它部署到一台内网服务器上前面再套一层 HTTPS 入口和安全认证这个 MCP Server 就具备了被 Gemini Business 访问的基本条件。4.3 用 curl 先验证工具列表别急着去管理端添加调试 MCP Server 最容易犯的错误是一启动就直接去 Gemini 配置。正确做法是先用 curl 手动模拟 MCP 协议确认返回结果符合预期。MCP 基于 JSON-RPC 2.0核心就是发送一个方法为tools/list的请求curl -X POST http://127.0.0.1:8000/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}如果一切正常你应该会在响应中看到search_internal_docs这个工具的描述和输入参数结构。这里有一个很容易踩的细节有时用浏览器直接访问/mcp路径会报 404因为 MCP 端点走的是 JSON-RPC POST不是普通的 GET 页面请求很多人第一次测试时在这卡了很久。4.4 工具返回结果的“反哺”设计模型拿到工具返回结果之后还需要把它们组织成口语化的答案。返回的字段越干净模型的总结效果越好。所以我的建议是MCP Server 侧做字段收敛只返回模型回答问题必需的最小字段集。比如上面的例子我特意没有返回文档全文只给了标题、摘要、链接和更新时间这样模型就不会在长文里抓不住重点你的 Token 消耗也会更低。如果测试时发现模型有时候宁愿编造答案也不调用工具优先检查两件事一是工具描述是否太泛没有说明适用场景二是返回结果里有没有明确“查不到”的状态。第二种情况尤其重要因为模型在文本里没有检索到相关信息时容易用已有知识“平滑”过去。你在返回结果里加一条显式的“没有查询到”信息能很有效地抑制模型幻觉。5. 实测中的典型问题和排查思路5.1 连接失败Gemini 管理端报错但你的服务器已经在运行这是最常见的故障。服务器明明跑着curl 手动测也通了结果在 Gemini 后台一点“测试连接”就报错。优先级最高的排查方向是“网络可达性”。Gemini 服务端访问你的 MCP Server 时要能解析你的域名并建立 HTTPS 连接如果服务器处于一个只允许内网访问的子网而 Gemini 管理端的检测流量从另一个网络进来就会超时。排错链路是这样的你可以照着一路查确认 MCP Server 的进程状态和端口监听状态确保没有只在本机绑定。从一台外部机器执行curl -v https://你的域名/mcp确认证书链完整、服务能响应。用 POST 发一次tools/list请求检查返回的 JSON 是否符合 MCP 协议格式。回到 Gemini 管理端重新触发连接测试。这四步可以定位绝大多数“连接失败”问题。我遇到过最隐蔽的一回是服务器的访问日志显示 Gemini 的请求确实进来了但每次都在 TLS 握手阶段就中断查到最后是公司网关的 TLS 拦截导致证书链不可信。这种问题单看服务器日志很难发现必须抓网络链路来看。5.2 工具调用超时不是协议问题是工具执行太慢协议通了之后第二个高频问题就是“模型已经决定调用工具但迟迟不返回结果最后超时”。这通常不是 MCP 协议本身的问题而是你的工具逻辑太重。比如直接让 MCP Server 去查询一个没有索引的大表、或者调用一个需要十几秒的 RPA 操作那超时几乎是必然的。我的处理方法是把“重操作”拆成两步先由工具创建一个异步任务并立即返回任务 ID再由另一个工具查询任务执行结果。模型可以先拿到状态再根据用户诉求决定是否继续轮询。当然这是成本较高的做法。如果只是查询类工具优先做结果缓存对同样的查询条件在短时间内直接返回缓存结果能明显降低耗时。5.3 鉴权失败或者令牌过期如果你配置了 OAuth过一段时间后会发现工具开始报鉴权失败。大概率是访问令牌过期了而 MCP Server 侧没有实现刷新令牌的逻辑。排查时先看 MCP Server 的日志里有没有收到 401再检查是哪个服务返回的 401。如果是 Gemini 侧的接入凭证有问题去管理端重新授权一遍如果是 MCP Server 自己在调内部 API 时被拒那就是内部 API 的令牌问题。我的习惯是在 MCP Server 里把鉴权逻辑单独封装统一处理令牌获取、使用和刷新不要让每个工具函数自己写一套。这样换密钥、轮换策略都能在一处改完排查时也只需要盯一个模块。5.4 多个 MCP Server 接入后的命名冲突当团队接入的服务器多起来之后你会发现不同服务器之间可能暴露同名工具而 Gemini 侧汇总工具列表时这种冲突有时会导致行为不可预期。规范做法是在定义工具名时加上命名空间前缀比如知识库的docs.search、工单系统的ticket.create、CRM 的crm.update_contact。名称写长一点点换来的是后续排查问题时的极度省心非常值得。6. 企业落地时的权限边界与安全治理6.1 对 MCP Server 做最小权限设计而不是把系统完整能力暴露出去MCP 接入带来的最大风险是“AI 的权限被滥用”。你写一个工具去操作 CRM如果直接给背后的服务账号配了全量写权限那当模型把参数构造歪了或者被恶意指令诱导时就可能产生非预期的数据变更。所以核心原则是工具只暴露必要动作背后的服务账号只授最小权限。比如上面知识库的例子MCP Server 进程使用的数据库账号应该只具备查询权限链接只返回文档标题和摘要不返回未发布草稿等受控内容。如果要做“创建工单”这类写操作服务账号也应该限制只能创建不能删除、不能修改他人工单。这些约束在 MCP 协议层面没有强制完全靠企业侧设计但这恰恰是生产环境和 Demo 的最大区别。6.2 提示注入与输入校验MCP Server 不是一个“可以随便相信输入”的服务当模型调用工具时工具入参往往是由用户的对话内容转化而来的这意味着恶意的用户完全可能欺骗模型让它向工具传递恶意参数。举个简单例子如果工具在做 SQL 查询时直接拼接用户输入的关键词那用户就可以通过精心构造的对话内容来注入 SQL。所以MCP Server 必须像对待外部用户输入一样对待模型传过来的每个参数类型校验、长度限制、内容过滤、白名单控制。同时还要在输出侧做控制。有些工具会返回大量内部原始数据如果模型把这些数据不加处理地完整复述给用户那“AI 助手”就变成了内部数据泄露通道。正确的做法是在返回字段层面做裁剪和脱敏。个人身份证号、手机号、薪资信息等除非真的需要否则一律不放进返回体。6.3 审计日志与连接凭证管理企业环境里审计非常重要。我建议至少从两个层面收集日志Gemini 侧的管理日志记录用户在什么时间调用了哪个 MCP 服务器MCP Server 侧的应用日志记录具体工具名、入参摘要、响应耗时和结果状态。两边结合万一出了问题你可以快速还原调用链。密钥和令牌不要硬编码到 MCP Server 的代码里。哪怕项目仓库是私有的也建议把访问内部系统的 API Key 放到环境变量或专用的密钥管理服务中。MCP Server 本质上是一个新的服务组件它必然会被纳入安全部门的资产清单提前做好这些动作后面走安全评审会顺利很多。我也建议你给每个 MCP Server 一个明显的版本标识在工具描述里直接写明版本号。这样工具行为变更后你很容易从对话历史里判断用户当时用的是哪个版本避免新版本引入了问题却让所有人一起遭殃。最后再分享一个我自己体会最深的技巧MCP Server 里的工具描述写得质量直接决定了模型会不会在合适的时候调用它。第一次接入时我总是草草写两句结果模型要么该调不调要么乱调后来我专门花时间给每一个工具写“触发场景说明书”描述里包含这个工具适合处理的自然语言提问示例模型调用准确率立刻上了一个台阶。接入 MCP 本身不难难的是把工具设计与真实业务语义对齐这一块值得你多花心思打磨。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →