MCP Server开发实战:从协议核心到生产环境避坑指南
最近好几个开发者朋友在聊同一个话题MCP Server 到底怎么开发。看了协议文档但不知道代码从哪写起、本地能跑但换到别的客户端就连不上、部署上线后工具调用经常超时——这些问题我在自己实践过程中基本都踩过一遍。这篇文章直接把 MCP Server/Tool 的开发脉络捋清楚从协议核心机制到第一个能跑的 Server再到接入真实应用、处理生产环境的硬问题全是验证过的路径。如果你在做 AI 应用或者正在给现有系统开放 AI 可调用的接口这篇内容可以帮你少走很多弯路。1. MCP 出现的时机和它到底解决了什么问题1.1 工具接入的“N×M”困境先想一个老问题AI 应用要访问外部系统怎么做早期做法是 function calling。模型在对话中决定调用某个函数应用根据函数定义把参数解析出来再调后端服务。这听起来很直接但实际项目里很快会失控你的应用要接订单系统、要接知识库、要接内部审批流、要接外部 API……每接一个系统就要写一套函数定义和调用路由。如果以后换个 AI 应用或者同时在用多个客户端那就得把同样的事情重复做很多遍。这就像每家电器都自带专用插座不仅浪费空间还互相不兼容。MCP 就是来统一这个“插座”的它对 AI 应用和外部服务之间的交互方式做了标准化让服务方只需要实现一套接口所有支持 MCP 的客户端都能直接使用。社区里常把它比作“AI 应用界的 USB-C”我觉得这个类比很准确。1.2 协议标准化带来的连锁反应MCPModel Context Protocol做的事情其实不复杂它定义了一个模型上下文协议的通信边界把“外部能力”抽象成标准化的工具、资源和提示词让模型通过一套统一的客户端接口去调用。对服务提供方来说实现一个 MCP Server 只需要关注业务逻辑本身对应用方来说接入了 MCP 协议就等于打通了无数个服务。这里要澄清一个经常被混淆的点MCP 不是 RAG 的替代品。RAG 解决的是“模型如何获取知识库中的信息”MCP 解决的是“模型如何调用外部实时数据和服务”。知识库查询也可以封装成一个 MCP 工具但它是 MCP 的用例之一而不是协议的全部目的。2. 开发前必须吃透的核心概念角色、原语与传输方式2.1 角色模型Server、Client、Host 谁负责什么动手写代码前先把 MCP 架构里的三个角色搞清楚Host运行 AI 应用的宿主程序比如对话客户端、IDE 插件或你的 Web 后端。ClientHost 内部负责与 MCP Server 通信的组件在同一进程内维护连接状态。Server暴露工具、资源和提示词的服务进程可能是本地的子进程也可能是远程 HTTP 服务。实际开发中你写的 MCP Server 只需要关心协议行为大部分客户端逻辑已经被 SDK 封装好不需要重复写。但理解这个分层很重要以后排查问题的时候你得知道报错出在哪一层。2.2 三大原语Tool、Resource、Prompt 的边界MCP 对外暴露三种不同类型的“上下文能力”Tool可执行的操作比如查询订单、发通知、执行计算。Tool 是模型主动选择调用的会有副作用。Resource只读数据源比如数据库表、配置文件、业务文档供模型获取上下文。Prompt可复用的提示词模板帮客户端快速生成特定任务的对话结构。很多刚上手的人容易把所有功能都塞进 Tool但资源类数据用 Resource 表达更合理比如“把最新的销售报表暴露成 Resource让模型在回答时自动读取”这比让模型去调一个“获取报表工具”更自然。文章后面主要以 Tool 开发为主线但建议你对另外两个原语也有基本印象。2.3 传输方式stdio 与 Streamable HTTP 怎么选MCP 支持两种传输方式传输方式适用场景关键特点stdio本地单用户、客户端与 Server 同机通过标准输入输出通信无需网络配置启动快Streamable HTTP远程多用户、云端部署基于 HTTP支持流式响应需要鉴权与网络暴露本地开发阶段用 stdio 足够一旦要考虑多人访问或触达移动端就必须用 HTTP 方式。选择逻辑其实很简单这个 Server 只给这一台机器上的一个客户端用还是给多个人/多个应用共享无论哪种传输方式协议层都用 JSON-RPC 2.0 传递消息请求和响应通过 id 对应方法名和参数是固定结构。SDK 会处理这些细节但你至少应该知道 initialize、tools/list、tools/call 这三个方法名的含义。2.4 三段式握手初始化、列工具、调工具MCP 的通信流程可以概括为三个阶段初始化协商Client 发 initialize 请求双方协商协议版本和能力列表Server 返回支持的功能。工具枚举Client 调 tools/list 拿到服务端所有工具的定义包括名称、描述、参数 schema然后缓存下来。工具调用模型根据用户的自然语言请求选出合适的工具Client 发 tools/call 带上参数Server 执行并返回结果。这个流程会让新手踩一个坑Client 通常会缓存工具列表你在 Server 里新增或修改了工具客户端可能不会立即刷新。调试时经常出现“明明 Server 更新了客户端还是看不到新工具”的现象通常需要重启客户端或手动触发重新加载。3. 快速实现第一个 MCP Tool从项目初始化到本地验证3.1 项目脚手架与 SDK 选型我平时写 MCP Server 首选 Python生态比较成熟mcp 这个官方 SDK 封装得很干净。TypeScript 也可以思路完全一致只是装饰器语法换成注册函数。下面以 Python 为例。创建项目时用虚拟环境隔离依赖避免污染系统 Pythonmkdir trade-mcp-server cd trade-mcp-server python -m venv .venv source .venv/bin/activate pip install mcp这里安装的 mcp 包里自带 FastMCP 封装类它可以让你用最少的代码暴露标准 MCP 接口。底层通信逻辑、JSON-RPC 序列化、工具 schema 生成这些琐碎工作都被处理好了。3.2 业务工具的代码实现我以一个交易订单场景做演示这是很多企业做 AI 集成时的典型需求模型收到用户的提问“查一下订单 20250101 的状态”需要主动去调用订单服务。from mcp.server.fastmcp import FastMCP # 创建一个 MCP Server 实例名字建议用业务域的可读名称 mcp FastMCP(trade-ops) mcp.tool() def query_trade_order(order_id: str) - dict: 根据订单号查询订单当前状态、金额和物流信息。 参数: order_id: 订单号例如 202501010001。 返回: dict: 包含订单状态、支付金额、物流单号等信息。 mock_db { 202501010001: { status: shipped, amount: 128.00, logistics_no: SF1234567890 } } result mock_db.get(order_id) if not result: return {error: order_not_found, message: f未找到订单 {order_id}} return result mcp.tool() def validate_order(order_id: str, action: str) - dict: 对订单执行审核、取消或发货操作。 参数: order_id: 订单号。 action: 操作类型可选值audit(审核)、cancel(取消)、ship(发货)。 allowed [audit, cancel, ship] if action not in allowed: return {error: invalid_action, message: faction 只能为 {allowed}} return {order_id: order_id, action: action, result: ok} if __name__ __main__: mcp.run()代码核心就是mcp.tool()装饰器它把普通函数变成协议中的一个工具函数签名自动转换成 JSON Schema函数 docstring 自动变成工具的 description。这个 design 带来的直接好处是你不需要额外维护一份“工具清单”代码结构与协议结构天然对齐。3.3 工具描述的艺术写给人也写给模型上面代码里docstring 信息量看起来不大其实就是几句业务说明。但实际开发中工具的 description 是模型进行工具选择的依据。模型会读这个描述来决定要不要调用它。描述写得含糊模型可能在你需要它调用的时候选错工具描述写得太泛模型也可能在不该调的时候乱调。我的习惯写法是第一句这个工具做什么动词开头一句话。第二句什么场景下应该用这个工具。参数说明明确每个参数的含义枚举类型必须把可选值列全。例如mcp.tool() def query_trade_order(order_id: str) - dict: 查询订单的实时状态。当用户询问订单物流、付款或发货状态时使用。 参数: order_id: 完整订单号不含前缀符号例如 202501010001。 模型不是人但它做决策时依赖的信息形态跟人做判断非常相似。描述精准选择准确率会高非常多。3.4 跑起来并验证用官方调试面板测试代码写完后直接运行python server.pyFastMCP 默认用 stdio 传输进程会一直在后台等客户端连接。这时候没法像普通 Web 服务一样在浏览器里看到东西需要借助 MCP Inspector这是官方提供的可视化调试工具npx modelcontextprotocol/inspector python server.py启动后浏览器会打开一个调试面板。在面板里你可以查看所有已注册工具的列表和参数定义确认 schema 是否正确。手动调用某个工具传入测试参数观察返回值。模拟完整的 MCP 握手流程看每一步的请求和响应报文。我强烈建议不要跳过这一步。很多人直接在客户端里调一旦失败很难判断是 Server 的问题还是客户端配置的问题。先用 Inspector 把 Server 侧验证通过再去接客户端会省去大量排查时间。4. 把 Server 接进真实应用客户端配置、校验与定位问题4.1 在 AI 客户端中注册本地 Server现在把你的 MCP Server 接进日常使用的 AI 应用。目前主流 AI 客户端基本都支持 MCP 服务配置一般是在设置里找到“MCP 服务器”或“开发者设置”入口然后编辑一个 JSON 配置。本地 stdio 方式的配置长这样{ mcpServers: { trade-ops: { command: python, args: [/absolute/path/to/server.py], env: { LOG_LEVEL: debug } } } }配置完成后重新加载客户端它会自动拉起你的 server 进程并完成初始化。之后你在对话里问“查一下订单 202501010001 的物流情况”模型就知道该去调用 query_trade_order然后把结果整理成自然语言回复你。4.2 实际接入时的常见故障与定位技巧接入过程中遇到最多的三类问题我列一个速查表现象可能原因排查步骤客户端看不到任何工具stdio 进程没起来先本地python server.py确认能运行再看客户端日志是否有启动错误initialize 慢或超时Server 启动时做了重操作看日志里初始化阶段有没有连接数据库、加载大型文件改成懒加载或异步初始化调用工具后报解析错误返回了非 JSON 结构用 Inspector 手动调用同一个参数看 response 能否被 JSON 反序列化这里补充一个很实际的经验stdio 配置里的路径必须写绝对路径。很多开发者在本地目录下能跑通但客户端是从其他地方启动 server 进程的相对路径经常解析失败。还有一点要提醒MCP 客户端与应用框架通常会把模型和客户端的日志混在一起输出。遇到问题先去看 Server 的 stderr再去看客户端的服务日志按顺序分步确认别一上来就怀疑协议实现有 BUG。4.3 多客户端兼容的一个隐藏坑不同客户端对 MCP 的支持程度不一样我实测下来收到的反馈集中在两处。一是某些客户端只实现了 Tool 调用还没实现 Resource 或 Prompt二是不同客户端的超时配置差异很大有的给调用方只有 30 秒有的可以到 5 分钟。如果你的 Server 里某个工具业务耗时较长建议把它设计成“异步任务 查询结果”两个工具先提交任务再轮询结果避免被客户端超时掐断。这是把本地 Demo 变成生产可用服务时必须考虑的一步。5. 生产环境中最常见的硬问题超时、错误码、鉴权与并发5.1 启动超时初始化越重越容易翻车很多 MCP Server 在启动时会连接数据库、加载配置文件、初始化日志系统本地跑没问题但客户端在拉起来的时候如果超过它的握手超时时间就会迅速断连并报错。解决方案不是缩短初始化流程而是把重操作移到工具内部采用懒加载不要在模块加载阶段创建数据库连接放在工具函数内部用全局缓存。配置文件读取保持轻量大型模型或规则文件按需加载。如果确实必须在初始化时完成某些前置任务尽量异步执行不要让握手请求阻塞等待。这个调整在生产场景尤其重要因为一个 MCP Server 可能会被多个客户端同时拉起只要有一方超时后面就是一连串重试整体体验非常差。5.2 工具调用失败时的错误信息怎么返给模型才算友好写工具时你一定遇到过这种情况服务端异常直接 throw 一个 Exception结果客户端那边只收到了一个晦涩的栈信息模型完全不知道该怎样向用户解释。正确做法是工具内部对异常做分类捕获并返回结构化的错误信息mcp.tool() def query_trade_order(order_id: str) - dict: 查询订单状态。当用户询问订单物流或发货状态时使用。 if not order_id or not order_id.isdigit(): return {success: False, code: PARAM_INVALID, message: 订单号应为纯数字} result db_lookup(order_id) if result is None: return {success: False, code: NOT_FOUND, message: f订单 {order_id} 不存在} return {success: True, data: result}模型拿到这种返回后可以精确地告知用户“订单号格式错误”还是“订单不存在”而不是含糊地说“查询失败”。你可以把success、code、message当作一种“模型可读的错误协议”它减轻了模型猜测的负担。5.3 鉴权与数据权限远程部署前的最后一道门槛当你的 Server 从本地 stdio 切换到 Streamable HTTP 部署时第一个要解决的问题就是鉴权。MCP 协议本身不强制鉴权方式但远程服务必须自己校验身份否则任何人都能枚举你的工具并随意调用。我建议在 Server 前面加一层中间件或网关开发阶段使用固定 API Key要求客户端请求头带Authorization: Bearer token。生产阶段接入正式 OAuth 流程由网关签发短期令牌MCP Server 只验证令牌有效性。与此同时要关注数据权限的粒度。AI 应用一旦接入用户完全可以诱导模型去调用工具、读取数据。一个工具返回的字段应该是最小集不要因为“顺手”就把数据库整行返回涉及金额、隐私信息时更要做字段级裁剪。5.4 并发与状态Server 内部不要存会话态很多初学者会把“当前用户”“当前会话”这种状态存在 MCP Server 的全局变量里这在本地单客户端场景下没问题但一旦有多个客户端同时连接同一个远程 Server状态就会互相污染。一个健壮的 MCP Server 应该是无状态的所有业务上下文要么由客户端在参数里传入要么放到外部的共享存储中。每个工具调用都是独立的、可重复执行的请求。这样设计的好处是既方便横向扩展也方便你将来做请求级追踪和审计。6. MCP Server 的进阶设计与更长的路6.1 动态工具注册工具数量多起来之后怎么办业务复杂了以后一个 Server 可能要提供几十甚至上百个工具。这时会出现两个问题一是 tools/list 的返回体积变大模型在每次调用前都要处理一大串工具定义二是工具名和描述容易冲突选择准确率下降。解决思路有几种。一种是动态注册Server 启动时先暴露一组基础工具根据请求参数或用户身份运行时再注册该用户可用的工具集这样可以缩小工具列表。另一种是分组命名空间把工具名设计成order.query、order.update、warehouse.check这样有前缀的形式让模型更容易区分职责。但如果工具逻辑高度相似只是参数不同与其膨胀工具数量不如合并成一个通用执行工具通过 action 参数来区分行为。这个设计要遵循“工具列表对模型友好”的原则数量在 20 个以内通常是比较好控制的。6.2 可观测性与日志模型调用不可见怎么 DebugMCP 工具调用和传统 API 调用有一个明显区别API 调用被谁调、什么时候调都很直观但模型的工具选择结果是内部行为很多时候只看到用户问题根本不知道模型有没有想过去调工具、选了哪个工具、传了什么参数。为了让调试不至于靠猜我在每个工具函数里统一加日志import logging logger logging.getLogger(mcp.trade) mcp.tool() def query_trade_order(order_id: str) - dict: logger.info(call query_trade_order, order_id%s, order_id) result ... logger.info(query_trade_order done, result_size%d, len(str(result))) return result每次调用记录三件事入参摘要、返回体大小、耗时。这样配合客户端侧的对话记录你可以完整还原“模型接收用户问题 → 决定调用工具 → 拿到结果 → 组织回答”的链路。没有这一步等上了生产再排查问题会非常痛苦。6.3 下一步可以扩展什么等你把工具跑通了有几个方向值得继续深挖把 Resource 用起来把业务中经常需要的最新状态、统计数据暴露成资源减少模型对工具调用的依赖。封装 Prompt 模板把一些复杂任务的标准指令封装成 MCP Prompt让客户端一键复用。做一套合规审计MCP Server 每次被调用都记录到日志服务沉淀成操作审计数据这在企业环境里几乎必然会被问到。另外可以尝试把 Server 部署成无状态的容器服务配上健康检查和请求超时让它成为一个标准化的后端组件。MCP 的魅力在于它把 AI 工具接入从“写一堆定制代码”变成“实现一次协议”之后剩下的工作重心全部回到业务本身。最后分享一个我自己的习惯每加一个工具我会先在 Inspector 里手动把正常流程和异常流程各跑一遍再到真实客户端里用自然语言验证一次。你会发现很多问题不是在代码层面而是在模型的工具选择策略上。多试几次把工具描述调整到模型一眼就能看明白的程度。这个打磨过程虽然琐碎但一套几个工具调一个叫 query_trade_order 的函数运行状态、错误处理、日志逻辑全都清楚远比堆功能有意义——MCP 协议上手很快真正的门槛是你能不能把业务边界梳理干净。

相关新闻

DVWA靶场实战:文件包含漏洞从入门到绕过全解析

DVWA靶场实战:文件包含漏洞从入门到绕过全解析

搞Web安全的人,十有八九都在DVWA上练过手。这个专门用来演示漏洞原理的靶场,不少新手第一次接触文件包含、SQL注入都是从这里起步的。我这次重新把DVWA完整部署了一遍,专门针对文件包含漏洞的低、中、高三个级别做了一次从头到尾的实测。这篇…

2026/10/19 3:55:26 阅读更多 →
AI辅助教材编写全流程:从框架搭建到低查重原创化实战

AI辅助教材编写全流程:从框架搭建到低查重原创化实战

最近和几位老师一起推进一门专业课的新教材,评审那边明确要求查重率必须控制在较低水平,最严的一章甚至要求低于某个很紧的比例。有人第一反应是:那就不用AI写了,AI生成的内容肯定查重高、机器味重、没法用。这个判断我以前也信&a…

2026/10/19 3:55:26 阅读更多 →
open-code-review:一种嵌入Git工作流的AI代码评审范式

open-code-review:一种嵌入Git工作流的AI代码评审范式

1. “open-code-review”不是工具名,而是一类新型代码评审范式的代号你搜“open-code-review”,首页跳出的全是零散的 CLI 工具安装报错、飞书接入失败、codex cli找不到二进制文件、chatgpt failed to start这类报错日志——但没人告诉你:“…

2026/10/19 3:54:25 阅读更多 →

最新新闻

美赛B题O奖论文复盘:贝叶斯更新与动态路径规划搜索模型

美赛B题O奖论文复盘:贝叶斯更新与动态路径规划搜索模型

1. 从“失联”到“寻回”:这道题在解决什么问题1.1 2024年美赛B题到底想让你做什么2024年美赛B题“Searching for Submersibles”的场景,很多参赛者看到第一反应是“这不是给搜救队做的吗?”。题目描述的是一艘载人潜水器在某海域执行作业时失…

2026/10/19 4:44:00 阅读更多 →
open-code-review:将代码评审标准固化为自动化流程的工程实践

open-code-review:将代码评审标准固化为自动化流程的工程实践

1. 这个项目到底在解决什么问题先提个问:你上一次认真review别人的代码,是什么时候?我猜大部分人嘴上说着“好的马上看”,实际上就是打开MR页面滑两下,看见CI是绿的、冲突已解决、Commit信息写得像人话,就直…

2026/10/19 4:44:00 阅读更多 →
MCP实战复盘:从协议原理、工具配置到避坑指南

MCP实战复盘:从协议原理、工具配置到避坑指南

直接输入了“MCP浅记”这个标题,我一看就明白,这大概率是最近写AI应用、写智能体的人绕不开的一个话题。MCP(Model Context Protocol)在社区里讨论度极高,很多人把它当成AI界的“USB-C接口”,但真要落地用起…

2026/10/19 4:44:00 阅读更多 →
基于open-code-review的自动化代码评审流水线搭建指南

基于open-code-review的自动化代码评审流水线搭建指南

最近在折腾自动化代码评审这件事,网上翻到一个叫 open-code-review 的标题,点进去看了一圈,发现"代码评审"这四个字现在被寄托了太多期望,但真正落地的团队并不多。这篇文章我想把自己基于开源工具搭评审流水线的过程、…

2026/10/19 4:44:00 阅读更多 →
Kendall秩相关系数的意义与计算实现

Kendall秩相关系数的意义与计算实现

1. Kendall秩相关系数 反映的是随机变量X和Y中的有序对的一致性程度。设X和Y同步观测的样本为{xi∣i0,1,…,n}\{x_i|i0,1,\ldots,n\}{xi​∣i0,1,…,n}、{yi∣i0,1,…,n}\{y_i|i0,1,\ldots,n\}{yi​∣i0,1,…,n},∀(xi,xj)\forall (x_i,x_j)∀(xi​,xj​)称为X的一个…

2026/10/19 4:44:00 阅读更多 →
LabVIEW与泰克示波器自动化采集:从SCPI到波形存储

LabVIEW与泰克示波器自动化采集:从SCPI到波形存储

简介:面向电子测试与仪器控制工程师,这份范例展示如何用LabVIEW通过GPIB、USB或VISA等通信方式远程连接并操作泰克示波器,解决信号采集不稳定、数据整理繁琐和重复测试耗时等实际痛点。资源包共包含166个文件,其中153个vi程序构成…

2026/10/19 4:42:59 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →