YAPI MCP PRO:基于MCP协议将YApi无缝集成AI代码编辑器的实践指南
1. 项目概述与核心价值如果你和我一样每天都要在YApi里翻找接口文档、复制粘贴路径和参数然后切回代码编辑器去写调用逻辑那这个循环一定让你感到疲惫。更别提当后端同事更新了接口你还在用旧参数调试的尴尬场景。YAPI MCP PRO的出现就是为了终结这种低效的“人肉同步”工作流。它本质上是一个遵循Model Context ProtocolMCP标准的服务器能在Cursor、Claude Desktop这类AI代码编辑器里为你提供一个直接操作YApi的“智能副驾”。想象一下你正在写一个用户登录功能只需要在Cursor的聊天框里问一句“请帮我获取用户登录接口的详细信息”AI助手就能直接从你公司的YApi服务器拉取到最新的接口定义包括请求方法、路径、参数、响应体结构甚至还能给你生成调用示例代码。这不仅仅是省去了打开浏览器、登录、查找的步骤更是将API文档从静态的参考手册变成了你编码工作流中一个动态、可查询、可执行的活字典。对于前端、后端、测试工程师而言这意味着接口管理的效率提升是数量级的。2. 核心设计思路与方案选型2.1 为什么选择MCP协议在决定如何将YApi的能力注入AI编辑器时我们面临几个选择开发独立的IDE插件、构建一个Web服务或者采用某种标准协议。最终选择MCP是基于几个关键考量。首先生态兼容性。MCP是Anthropic为Claude等AI助手定义的一套标准协议旨在让AI能够安全、可控地调用外部工具和服务。Cursor作为深度集成AI的编辑器原生支持MCP。这意味着我们不需要为每个编辑器Cursor、Claude Desktop、未来可能支持MCP的VS Code等单独开发适配层一次开发多处运行极大地降低了维护成本并扩大了用户基础。其次安全与沙箱化。MCP协议设计之初就考虑了安全性。AI助手通过MCP服务器访问工具其权限被严格限定在MCP服务器暴露的能力范围内。我们的服务器就像一个“网关”AI只能通过我们定义好的19个工具如yapi_get_api_desc、yapi_save_api来与YApi交互无法进行越权操作。这比直接让AI访问YApi的原始API要安全得多。最后开发体验与性能。MCP支持两种连接模式stdio标准输入输出和SSEServer-Sent Events。stdio模式让我们能够以NPM包的形式分发用户只需一行npx命令即可运行无需关心服务器进程管理体验非常轻量。而SSE模式则为需要高性能、实时数据推送的团队场景提供了可能。这种灵活性是其他方案难以比拟的。2.2 架构设计在轻量与强大之间取得平衡项目的架构核心是“桥接”。一端是标准化的MCP协议负责与AI编辑器通信另一端是YApi的HTTP API负责实际的业务操作。我们的服务器就是这座桥但这座桥并不简单。核心层Core Layer这是大脑。它包含一个YApiService类封装了所有对YApi的HTTP调用。这里处理了认证Cookie/Token、请求重试、错误处理、响应数据格式化等脏活累活。例如当AI请求获取项目列表时YApiService会向YApi的/api/project/list端点发起请求处理可能的网络超时或认证失败并将原始的JSON响应转换为结构更清晰、对AI更友好的数据格式。MCP工具层MCP Tools Layer这是对外暴露的能力清单。我们基于YApiService的能力定义了19个MCP工具。每个工具都是一个独立的函数有明确的输入参数定义使用Zod进行运行时类型校验和输出格式。例如yapi_search_apis工具接收nameKeyword等参数调用YApiService的搜索方法然后将结果包装成MCP协议要求的ToolResult格式返回。这一层的设计至关重要它决定了AI能“看到”和“操作”什么。通信与缓存层Communication Cache Layer这是性能保障。我们实现了两级缓存策略。内存级缓存用于存储短时间内频繁访问的数据如用户信息、项目列表以减少对YApi服务器的重复请求。磁盘级缓存可选则可以将一些不常变动的数据如接口分类结构持久化下来即使服务器重启也能快速恢复。同时我们支持SSE连接这意味着一旦YApi有数据更新虽然需要手动或定时触发同步服务器可以主动向所有连接的AI客户端推送通知实现准实时同步。配置与部署层Configuration Deployment这是易用性关键。项目支持多种配置方式从最简单的环境变量到配置文件。特别是对Cookie认证的支持让用户无需手动收集每个项目的Token只需登录浏览器复制Cookie即可自动发现并管理所有有权限的项目这大大降低了初始配置的复杂度。这个架构确保了工具既足够轻量以便个人开发者快速上手又足够强大和可扩展以满足团队协作和复杂场景的需求。3. 深度配置解析与实操要点3.1 认证机制详解Cookie vs. Token认证是连接YAPI MCP PRO与你的YApi服务器的钥匙。项目支持两种主要方式选择哪一种取决于你的使用场景和安全要求。Cookie认证推荐给绝大多数用户这是最便捷的方式。其原理是利用你浏览器中已存在的YApi登录会话。当你登录YApi后浏览器会保存一个包含_yapi_token和_yapi_uid等字段的Cookie。我们的工具通过这个Cookie来“冒充”你的浏览器向YApi发起请求。实操心得获取Cookie时务必在YApi页面进行任意操作如点击一个项目后再从开发者工具的Network面板复制。直接刷新页面得到的Cookie有时可能不完整。确保复制的字符串包含完整的_yapi_token和_yapi_uid它们通常以分号分隔。配置格式很简单在环境变量或配置文件中直接设置YAPI_TOKEN_yapi_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1...很长一串; _yapi_uid123优势自动发现项目YApi会根据当前登录用户的权限动态返回其可访问的所有项目列表。你无需手动配置项目ID。配置极简只需一个字符串无需维护项目与Token的映射关系。权限同步你在YApi网页端的权限变更如被加入新项目会自动生效。注意事项Cookie有有效期通常与浏览器会话或YApi服务端设置有关。如果长时间不操作YApi网页导致会话过期MCP工具也会报认证错误。此时需要重新登录YApi网页并更新Cookie。Token认证适合自动化场景与生产环境Token是YApi为每个项目生成的长期凭证。你需要在YApi的项目设置中手动生成。配置格式为项目ID:项目Token多个项目用逗号分隔YAPI_TOKEN11:abcde12345,22:fghij67890优势长期有效Token通常没有短期过期限制更适合CI/CD流水线等自动化场景。权限隔离每个Token只针对特定项目权限范围清晰安全性更高。适合生产避免使用个人会话Cookie更适合服务端或团队共享配置。实操要点使用Token认证时工具只能访问你明确配置了Token的那些项目。如果你需要管理多个项目必须收集所有项目的ID和Token并拼接在配置中。3.2 连接模式深度对比与选型建议YAPI MCP PRO提供了三种连接模式适应不同场景。NPM包模式command: “npx”这是开箱即用的推荐方案。你在Cursor的MCP配置中指定npx -y yapi-mcp-pro当Cursor启动时它会自动调用npx命令从npm仓库下载并运行最新版本的yapi-mcp-pro包。{ mcpServers: { yapi-mcp-pro: { command: npx, args: [-y, yapi-mcp-pro], env: { YAPI_BASE_URL: http://yapi.company.com, YAPI_TOKEN: ... } } } }优点无需本地构建、安装自动更新配置极其简单。缺点每次Cursor启动或工具首次调用时可能需要网络下载有缓存进程生命周期与Cursor绑定。适用场景个人开发者、快速尝鲜、希望免维护的用户。本地服务器模式url: “http://localhost:3388/sse”这种模式下你需要先在本地启动一个常驻的YAPI MCP PRO服务器进程通过./start-mcp.sh start然后在Cursor中配置其SSE端点URL。{ mcpServers: { yapi-mcp-pro: { url: http://localhost:3388/sse } } }优点性能最佳服务器常驻内存响应速度最快无冷启动延迟。资源共享多个AI编辑器如同时打开Cursor和Claude Desktop可以连接同一个服务器实例共享缓存和连接。独立进程服务器运行稳定不受单个编辑器崩溃影响。支持SSE可实现服务器向客户端的主动数据推送虽然当前版本主要用于连接。缺点需要手动启动和管理一个后台进程。适用场景团队协作、重度用户、对性能有要求的开发环境。本地构建模式command: “node”, args: [“/path/to/dist/index.js”]这种模式指向你自己从源码构建的本地可执行文件。优点完全掌控可以修改源码、定制功能、调试内部逻辑。缺点需要克隆源码、安装依赖、执行构建维护成本最高。适用场景项目贡献者、需要深度定制或二次开发的高级用户。选型建议对于90%的用户直接从NPM包模式开始。如果发现工具调用有延迟或者需要团队共享再迁移到本地服务器模式。3.3 缓存策略与性能调优缓存是提升工具响应速度和减轻YApi服务器压力的关键。YAPI MCP PRO内置了智能缓存机制。缓存策略解析内存缓存Memory Cache这是主要缓存层。工具会将yapi_list_projects项目列表、yapi_get_categories分类列表等不常变化的数据缓存在内存中。缓存时间由环境变量YAPI_CACHE_TTL默认10分钟控制。请求去重Deduplication在极短时间内如1秒内对同一资源的重复请求只会向YApi发送一次后续请求直接返回缓存结果。这在AI助手可能连续追问多个相关问题时非常有用。强制刷新虽然工具没有直接暴露“强制刷新”的参数但你可以通过重启MCP服务器进程本地服务器模式或修改YAPI_CACHE_TTL为一个很小的值如1来达到类似效果。性能调优实操调整缓存时间如果你的YApi接口变更非常频繁可以将YAPI_CACHE_TTL设为55分钟或更小。如果接口非常稳定可以设为30或60以提升性能。# 在.env文件或环境变量中设置 YAPI_CACHE_TTL30禁用缓存调试用在排查数据不一致问题时可以临时禁用缓存。YAPI_ENABLE_CACHEfalse监控与清理如果运行在本地服务器模式可以定期查看日志或使用./start-mcp.sh status检查内存占用。必要时重启服务以清空缓存。踩坑记录曾经遇到一个案例用户配置了YAPI_CACHE_TTL1440一天结果他在YApi上更新了接口但AI助手一直返回旧数据。这是因为缓存时间设得太长工具认为数据还没过期。解决方案是1. 将YAPI_CACHE_TTL调整为合理值如10-30分钟2. 告知用户在YApi进行重要更新后可以手动重启一下MCP服务如果用的是本地服务器模式或者在Cursor中重新触发一下相关查询NPM包模式会在新进程启动时刷新缓存。4. 19个MCP工具全解析与实战示例YAPI MCP PRO将YApi的核心功能封装成了19个原子化的工具。理解每个工具的用途、参数和返回格式是高效使用它的关键。下面我将它们分组进行深度解析。4.1 接口生命周期管理工具组这是最常用的一组工具覆盖了接口的增删改查。yapi_get_api_desc你的接口“显微镜”这个工具用于获取接口的完整定义。你需要提供projectId和apiId。实战场景当你需要实现某个前端功能或编写接口测试用例时直接询问AI“获取项目123中ID为456的接口详情”。AI会返回该接口的路径、方法、所有请求参数查询参数、请求头、请求体JSON Schema、响应结构、甚至Mock规则。你可以基于这些信息快速生成请求代码。返回数据结构除了基础信息重点关注req_body_form表单参数、req_body_otherJSON等原始请求体、req_headers、res_body响应体结构。这些是正确调用接口的必备信息。yapi_save_api创建与更新的“瑞士军刀”这是一个多功能工具既能创建新接口也能更新现有接口。核心参数是projectId、catid分类ID、title、path、method。当传入id参数时执行更新操作否则执行创建操作。创建接口示例你可以对AI说“在项目123的‘用户模块’分类下catid789创建一个POST接口路径是/api/user/login标题是‘用户登录’描述是‘用于用户身份验证’。” AI会调用此工具并传入相应参数。更新接口技巧更新时通常你需要先通过yapi_get_api_desc获取接口当前的全部数据修改需要变更的字段如给请求体增加一个参数再将完整的数据对象传给yapi_save_api。注意YApi的更新接口通常是全量覆盖而非增量更新。参数详解req_query查询参数数组、req_headers请求头数组、req_body_form表单参数数组、req_body_other原始请求体字符串如JSON Schema是定义接口契约的核心。务必确保它们的格式符合YApi的要求。yapi_search_apis跨项目的“全局搜索”当你不确定接口在哪个项目或者想查找所有包含“用户”关键词的接口时这个工具就派上用场了。它支持按接口名(nameKeyword)、路径(pathKeyword)、项目名(projectKeyword)进行模糊搜索。使用技巧搜索词不必完整。搜索“login”可以匹配“userLogin”、“loginUser”、“login”等。结合limit参数可以控制返回数量避免结果集过大。返回结果返回的是一个包含匹配接口基本信息的列表包括其所属的项目ID和名称方便你进一步定位。yapi_delete_interface与yapi_copy_interface批量操作助手删除工具很简单提供projectId和interfaceId即可。复制工具则非常实用当你需要创建一个与现有接口高度相似的新接口时比如同一个项目的/api/user/{id}的GET和PUT接口可以先复制再修改。catId参数可选用于指定复制到哪个分类不填则复制到原分类。4.2 项目与分类管理工具组yapi_list_projects工作台总览这是你启动工具后第一个可能用到的命令。它返回你有权访问的所有项目列表包括项目ID、名称、描述、基础路径(basepath)和分组信息。这个列表是后续所有需要projectId的操作的基础。yapi_create_project与yapi_update_project项目脚手架用于快速创建新项目或更新项目信息。创建时需要name、basepath和group_id分组ID可以从yapi_get_user_groups获取或询问管理员。color和icon参数可以为项目添加视觉标识。分类管理工具 (yapi_get_categories,yapi_create_category,yapi_update_category,yapi_delete_category)接口分类是YApi组织接口的核心方式。这组工具让你可以在AI中直接管理分类结构。典型工作流1.yapi_get_categories查看现有分类。2.yapi_create_category创建新的逻辑模块如“支付中心”。3. 将相关接口移动或创建到该分类下。4. 后续可用yapi_update_category调整分类名或描述。注意删除分类(yapi_delete_category)通常需要谨慎因为其下的接口可能被一并删除或变为未分类状态具体行为取决于YApi版本和配置。4.3 数据流转与测试工具组yapi_import_swagger从Swagger/OpenAPI一键迁移这是团队从其他API文档工具迁移到YApi或者后端已有Swagger定义时的利器。你需要提供projectId、catId导入到哪个分类和swaggerDataSwagger JSON字符串。merge参数控制冲突处理策略normal普通、good智能合并、merge覆盖。实操心得对于大型Swagger文件建议先在小分类中测试导入确认格式兼容性。YApi对Swagger 2.0和OpenAPI 3.0的支持较好但一些高级特性如oneOf、anyOf可能无法完美转换。yapi_export_project项目备份与分享将整个YApi项目导出为JSON、Markdown或Swagger格式。这对于项目备份、跨环境迁移或生成离线文档非常有用。yapi_get_test_collections与yapi_create_test_collection测试用例管理YApi的测试集合功能允许你将多个接口测试用例组织在一起。这两个工具让你可以查看和创建测试集合为后续的自动化测试或接口联调做准备。yapi_run_interface一键接口测试这是非常强大的工具。你可以在AI中直接触发对某个接口的测试请求。除了interface_id和project_id你还可以指定测试环境(env_id)、覆盖请求域名(domain)、添加自定义请求头(headers)、传入请求参数(params)和请求体(body)。场景示例开发一个登录接口后你可以立即让AI测试“请用测试环境对项目123的登录接口ID456发起一个POST请求请求体是{“username”: “test”, “password”: “123456”}。” AI会调用此工具并返回YApi服务器的响应结果让你快速验证接口是否按预期工作。4.4 用户信息工具组yapi_get_user_info与yapi_get_user_groups这两个工具主要用于获取当前认证用户的上下文信息。yapi_get_user_info返回你的用户ID、邮箱、角色等yapi_get_user_groups返回你所属的团队或分组列表。这在编写一些需要判断用户权限的自动化脚本时有用。5. 集成到日常开发工作流实战案例理解了工具关键在于用起来。下面通过几个真实场景展示如何将YAPI MCP PRO无缝嵌入你的开发流程。5.1 场景一新功能开发——用户管理模块假设你要开发一个用户管理模块包含注册、登录、信息查询、信息更新四个接口。第一步信息收集与规划你可以在Cursor中开启一个新对话直接询问“请列出我所有YApi项目中名称包含‘用户’或‘user’的接口。”AI会调用yapi_search_apis返回现有相关接口避免重复造轮子。然后你可以问“请获取项目‘电商后台’ID: 11的所有接口分类。”AI调用yapi_get_categories你发现有一个“用户中心”分类ID是101。如果没有你可以让AI创建“请在项目11下创建一个名为‘用户中心’的新分类。”第二步创建新接口现在开始创建注册接口“在项目11的分类101下创建一个新的接口。 标题用户注册 路径/api/user/register 方法POST 描述用于新用户注册账号。 请求体类型JSON 请求体JSON Schema如下 { “type”: “object”, “required”: [“username”, “password”, “email”], “properties”: { “username”: {“type”: “string”, “description”: “用户名”}, “password”: {“type”: “string”, “description”: “密码”}, “email”: {“type”: “string”, “format”: “email”, “description”: “邮箱”} } } 响应体类型JSON 成功响应示例{“code”: 0, “message”: “success”, “data”: {“userId”: 123}} ”AI会调用yapi_save_api传入这些参数。创建成功后它会返回新接口的ID比如205。第三步即时测试与迭代接口创建后立即测试“请对刚创建的用户注册接口项目11接口ID 205发起一个测试请求。 使用默认环境请求体为{“username”: “alice”, “password”: “Test123!”, “email”: “aliceexample.com”}”AI调用yapi_run_interface。如果后端已经实现你会看到返回结果。如果返回4xx/5xx错误或参数错误你可以根据错误信息直接让AI更新接口定义“根据测试结果注册接口还需要‘phone’字段。请更新接口ID 205在请求体JSON Schema的required数组和properties对象中添加‘phone’字段。”AI会先调用yapi_get_api_desc获取当前定义修改后再调用yapi_save_api更新。这种“定义-测试-修正”的闭环在AI的辅助下变得极其流畅。第四步生成客户端代码接口定义稳定后你可以让AI基于此接口信息生成前端调用代码“根据项目11中ID为205的用户注册接口定义帮我生成一个React Hooks风格的请求函数使用axios库。”AI会先调用yapi_get_api_desc获取接口的完整细节路径、方法、请求体结构然后生成出高度匹配的TypeScript代码。这比手动对照文档敲代码要准确高效得多。5.2 场景二后端接口变更同步后端同事通知你用户信息查询接口GET/api/user/{id}的响应结构变了新增了avatar头像字段。传统流程打开浏览器 - 登录YApi - 找到项目 - 找到接口 - 查看最新文档 - 回编辑器修改代码 - 可能漏看其他改动。MCP辅助流程快速定位在Cursor中问“搜索项目11中路径包含‘/api/user/’的接口。”获取最新定义“获取项目11中路径为‘/api/user/{id}’、方法为GET的接口的详细信息。”分析差异AI返回的res_body字段中你会清晰地看到新的JSON Schema包含了avatar字段。你可以直接让AI解释变更点。更新前端类型/逻辑基于新的接口定义让AI帮你更新前端的TypeScript类型定义或数据处理逻辑。整个过程无需离开编辑器信息获取是即时的、准确的。5.3 场景三团队协作与知识沉淀新人入职引导新人不需要熟悉YApi的网页界面。你可以告诉他“在Cursor里问AI‘列出所有项目’然后找‘订单服务’项目下的‘发货’相关接口。” 他就能快速了解系统有哪些接口。接口规范检查在代码评审时如果对某个API调用有疑问可以直接让AI调出该接口的官方定义进行比对确保调用方式符合文档约定。生成接口文档片段在编写技术设计文档或周报时需要列举涉及的接口。你可以让AI“将项目11中‘支付模块’分类下的所有接口以Markdown表格形式列出来包含名称、路径、方法。” AI通过组合调用yapi_get_categories和yapi_get_api_desc能快速生成整洁的文档。6. 故障排查与进阶技巧即使工具设计得再完善在实际部署和使用中也可能遇到问题。这里总结一些常见坑点及其解决方案。6.1 连接与认证类问题问题Cursor状态灯为红色或提示“与YApi服务器通信失败”。第一步检查网络与地址# 在终端中测试YApi服务器是否可达 curl -I http://your-yapi-server.com如果curl失败检查YAPI_BASE_URL是否写错多了空格、少了http://、网络是否通畅、公司防火墙是否拦截。第二步验证NPM包与缓存针对NPM包模式这是最常见的问题。NPM的全局缓存可能损坏。# 强制清理npm和npx缓存 npm cache clean --force # 某些系统可能需要额外清理npx缓存 npx clear-npx-cache 2/dev/null || true # 重新测试 npx -y yapi-mcp-pro --version如果看到版本号输出如0.2.1说明包本身正常。如果还是失败尝试临时切换npm镜像源国内用户npm config set registry https://registry.npmmirror.com第三步检查认证信息Cookie认证确保复制的Cookie字符串完整特别是开头的_yapi_token和_yapi_uid两个键值对都存在且没有换行。最简单的方法将配置中的YAPI_TOKEN值粘贴到浏览器的地址栏javascript:开头的控制台或在线URL解码工具中检查是否是一个完整的、用分号和空格连接的字符串。Token认证检查格式是否为项目ID:Token多个项目是否用英文逗号分隔没有多余空格。确认该Token在YApi网页端对应项目的“Token配置”中处于启用状态。问题提示“未配置项目ID”或“请登录”。这几乎肯定是认证信息无效或已过期。对于Cookie在浏览器中打开YApi确认登录状态依然有效。然后按F12在任何一个网络请求的Headers里重新复制完整的Cookie替换掉旧的YAPI_TOKEN值。对于Token登录YApi进入对应项目的“设置”-“Token配置”确认Token是否被重置或禁用。如果是生成新的Token并更新配置。通用检查在配置文件中确保YAPI_BASE_URL的末尾没有多余的斜杠/。6.2 配置与运行类问题问题端口3388被占用本地服务器模式。# 查找占用端口的进程 lsof -i :3388 # macOS/Linux # 或 netstat -ano | findstr :3388 # Windows找到PID后结束进程或者修改.env文件中的PORT环境变量为其他值如3399然后重启服务。问题AI助手无法识别MCP工具。确认配置位置检查你的mcp.json或settings.json文件是否放在了正确的位置项目级.cursor/或全局配置目录。检查JSON语法一个多余的逗号或引号错误都会导致整个配置失效。可以使用在线JSON校验工具检查。重启Cursor修改MCP配置后必须完全关闭并重新启动Cursor配置才会被加载。查看Cursor日志在Cursor中尝试打开开发者工具Help - Toggle Developer Tools查看控制台是否有关于MCP服务器加载的错误信息。问题工具调用缓慢。检查网络延迟YAPI_BASE_URL指向的YApi服务器如果网络延迟高会影响所有操作。启用并调整缓存确保YAPI_ENABLE_CACHEtrue默认并根据数据变更频率调整YAPI_CACHE_TTL。对于几乎不变的项目/分类列表可以设置较长时间如30。切换到本地服务器模式如果使用NPM包模式每次调用都有极小的进程启动开销。切换到常驻的本地服务器模式可以消除这个开销。6.3 高级技巧与最佳实践项目级配置优先将mcp.json放在项目根目录的.cursor文件夹下。这样不同的项目可以连接不同的YApi服务器或使用不同的认证Token配置不会互相干扰也方便将配置纳入版本控制注意忽略敏感信息。使用环境变量文件对于本地服务器模式强烈建议使用.env文件管理配置。在项目根目录创建.env并确保它在.gitignore中防止敏感信息泄露。组合使用工具AI的优势在于串联多个简单操作。例如你可以让它“先搜索所有状态为‘已完成’的接口然后为每个接口生成一个Jest单元测试模板。” 这背后是yapi_search_apis和基于结果的循环处理。为AI提供明确上下文当你需要AI操作特定接口时尽量提供projectId和apiId而不是模糊的名称。你可以先让AI搜索获取ID再执行具体操作。例如“先搜索‘用户登录’接口获取它的ID然后为我生成一个Fetch API的调用示例。”善用yapi_run_interface进行冒烟测试在开发过程中随时利用这个工具对刚更新或关注的接口进行快速测试确保其可用性比打开Postman或浏览器更快。YAPI MCP PRO不是一个炫技的工具它实实在在地解决了一个高频痛点——在编码上下文和API文档上下文之间频繁切换带来的效率损耗和认知负担。将它接入你的工作流初期可能需要一点适应成本但一旦习惯你会发现查阅、创建、测试API都变得像询问一位随时在线的资深同事一样自然。