[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f2l303ka2btvcp":3},{"_id":4,"slug":5,"title":6,"subtitle":7,"kind":8,"cards":9,"tags":23,"categories":24,"source":25,"lang":28,"author":29,"audioState":32,"stats":33,"publishedAt":36,"renderer":37},"6abc8243ca21c797c7e9ffce","ai-agent-bc53003e","隔离内网下 AI Agent 工程实战","好长一段时间不写文章了，又到国庆长假，是时候整理下最近对 AI 工程化上的一些心得进行总结和分享； 在 AI 的时代浪潮里写文章的门槛变低了很多，AI渲染、AI 代笔； 能真正愿意花费时间，认真的写点东西，是真的挺难得； 在有 AI 的日子里，人的深度阅读与总结能力也开始慢慢退化了。 回到主题，近期在公司的开发流程中集成 AI 工程化的落地实践的过程中，各端开发人员在开发流程的各个阶段均会有使用…","news",[10,13,18],{"headline":6,"body":11,"imageUrl":12,"sourceImageUrl":12},"好长一段时间不写文章了，又到国庆长假，是时候整理下最近对 AI 工程化上的一些心得进行总结和分享； 在 AI 的时代浪潮里写文章的门槛变低了很多，AI渲染、AI 代笔； 能真正愿意花费时间，认真的写点东西，是真的挺难得； 在有 AI 的日子里，人的深度阅读与总结能力也开始慢慢退化了。 回到主题，近期在公司的开发流程中集成 AI 工程化的落地实践的过程中，各端开发人员在开发流程的各个阶段均会有使用 coding agent 调用内网系统的需求，比如： 需求评审： 获取 tapd prd 需求信息，提供 Agent 了解需求进行脑暴和明确需求细节； 方案设计： 基于需求理解完后 ，让 AI 编写技术方案并同步到 wiki 文档中； 开发阶段： 构造 API 接口文档到 apidoc 平台中、功能开发完成自动 gitlab MR、自动触发发布测试环境； 测试阶段： 获取测试用例信息用于 AI 自测、获取 bug 信息用于 bugfix； 等等，在开发各个阶段，均会使用到内网系统，需要让 Agent 调度获取补充上下文信息，以及特定的功能操作； 前期大家都在探索，不同端（服务端、客户端、前端）各凭本事实现不同内网系统的调用； 当前各端在开发阶段均有内网系统调用需求，并各凭本事重复造轮子，多数解决方案是采用 skills script 去实现内网系统的登录授权，并且携带授权信息去调用 API，复用性差，使用门槛高，安全性差，等问题； 在短时间内想让内网系统（自建、开源搭建、商用搭建）都支持 MCP Tools 能力，也不太现实； 在不改动内网系统的情况下，将内网系统的相关能力封装成 MCP Tools 提供基础通用能力，支持 tools 的授权管理，支持个人账号登录授权管理、支持危险操作的审批机制、支持 Tool 调用审查日志、支持配套的 Skills； 使用个人内网系统账号去调用 Tools 与用户直接登录内网系统去手动操作效果一致，依然是以个人账号权限去调用，不会出现越权问题； 项目： internal-mcp — 让 AI Agent 直接使用内网系统；","https:\u002F\u002Fp3-xtjj-sign.byteimg.com\u002Ftos-cn-i-73owjymdk6\u002F576a0e283d8b48a18fc85db8f8eb178c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgU0ZMWVE=:q75.awebp?rk3s=f64ab15b&x-expires=1791260709&x-signature=u4SSLB1IFQqzh9aFMseq5IG7%2BC8%3D",{"headline":14,"body":15,"imageUrl":16,"images":17},"内网系统接口统一封装成 MCP tools，AI 对话即可调用；写操作走人工审批； 这里仅提供实现的思路，不开源；因为这里接入的 MCP Tools…","内网系统接口统一封装成 MCP tools，AI 对话即可调用；写操作走人工审批； 这里仅提供实现的思路，不开源；因为这里接入的 MCP Tools 均是公司内网系统，不适合对外开源；但是思路是通用的。 内网接口直接给 AI 用： 内网系统的接口按需授权后注册成 MCP tools，AI 客户端连接即可调用。 凭据与授权管理： 管理台录入账号密码、测试登录、逐个接口开授权开关；凭据加密存储，明文不回显。 写操作要过审批： Agent 发起的写操作只生成待执行单，人工在管理台确认后才真正执行；每次调用都留痕可查。 MCP 市场： 把外部 stdio MCP server 接进来，与内置工具一起提供给 AI。 Agent Skills： 随仓库分发成套流程技能(测试环境发布、服务安装管理)，一条命令装进 AI 客户端、，对话里用自然语言触发；管理台 Skills 页可查看全部技能及其用法。 AI Agent： 调用方，通过 MCP tools 调用内网系统能力。 管理台 Vue SPA ： 管理入口，配置系统、授权 API、审批与查日志。 mcpserver： MCP 端点（stdio + HTTP），按授权动态生成 tools 并路由调用。 治理域（apireg + draft + execlog）： 所有 tool 的唯一通路，API 授权开关 → 写操作落审批 → 执行记日志。 adapter ： 核心抽象 SystemAdapter，把各内网系统的登录、校验、调用差异封装在各自实现里。 authcache + credstore： 身份态层——授权缓存与自动重登闭环；凭据 AES-256-GCM 加密存储。 store（ SQLite ）： 单文件库，所有配置、凭据密文、审批、日志的唯一持久化。 治理域：核心管控链。System（内网系统）注册 ApiPermission（API 授权开关，含写类审批标记）；写类调用触发 Draft（待审批单），审批后执行并经 ExecLog 落日志，draft_id 回写闭环。 身份域：System 配置","\u002Fapi\u002Fmedia\u002Fposts\u002Fai-agent-bc53003e\u002F1.webp",{"local":16},{"headline":19,"body":20,"imageUrl":21,"images":22},"Credential（凭据，仅存 AES 密文）；登录产出 AuthToken（令牌密文 + 过期时间），运行时由 AuthCache 缓存并在","Credential（凭据，仅存 AES 密文）；登录产出 AuthToken（令牌密文 + 过期时间），运行时由 AuthCache 缓存并在 401 时自动重登。 服务域：McpTool 是对外交付物，由授权的 API 动态生成（命名 {system}_{api_key}）；ProviderConfig 注入外部 MCP 子进程的工具，走同一治理链。 装好后在 AI 客户端 Agent 对话里输入 \u002Fmy-internal-mcp install，由技能完成：下载最新版本 → 注册常驻服务 → 自动配置本机 MCP 客户端。 打开管理台 http:\u002F\u002F127.0.0.1:6688: 系统总览 › 凭据管理:录入内网系统账号密码,点「测试登录」确认成功。 系统总览 › API 授权:按需打开接口开关,对应接口立刻作为 MCP tool 提供给 AI。 服务地址：管理台 127.0.0.1:6688，MCP 端点 127.0.0.1:6677\u002Fmcp。 支持开启关闭系统，tools 授权管理、登录凭据管理； 考虑到 mcp tools 过多会对模型上下文污染和产生判断干扰，这里做个系统开关和 tools 开关； 使用mcp provider，支持接入开关的 mcp，统一在 internal-mcp 进行管控； 基于 mcp tools 基础能力，编排对应特定标准流程的skills，让执行更稳定、高效； 其中 my-internal-mcp 技能可以对系统进行安装、升级、停止、重启、运行状态，等操作；降低安装升级和使用的门槛； 审批通过、拒绝，支持查看历史，支持可视化对比，比如：apidoc 可视化对比差异，wiki 可视化对比内容变更，等；","\u002Fapi\u002Fmedia\u002Fposts\u002Fai-agent-bc53003e\u002F2.webp",{"local":21},[],[],{"name":26,"url":27},"Juejin","https:\u002F\u002Fjuejin.cn\u002Fpost\u002F7690505279806373931","zh",{"handle":30,"displayName":31},"spots","Spots",null,{"views":34,"likes":35,"saves":35,"shares":35,"completions":35,"opens":35,"skips":35,"depthSum":35},1,0,"2026-09-30T03:30:11.880Z","local"]