工具包结构:目录条目字段级说明
能力市场的目录是一个 registry.json(https 托管),你的工具作为 packages 数组的一项上架。本文每个字段都对照市场目录真实数据与 app 端解析代码(McpMarket.kt)编写。在线目录:/market/registry.json(本站域名下,链接可直接打开)。
要点(30 秒)
- 市场目录 = registry.json(https 托管);你的工具是 packages 数组中的一项。
- 两类形态:byo(自带服务器)与 declarative(声明式剧本);builtin 为内建保留。
- byo 条目字段级说明(服务地址 / 工具清单 / 类目等)。
- declarative 条目(workflow 剧本)字段与执行入口。
- 含保留名提醒——命名前先对照。
展开全文(完整表格 / 代码 / 细节)
一、目录整体结构
{
"version": 1,
"updatedAt": "2026-08-25T06:21:03.000Z",
"packages": [ { ...你的条目... }, ... ]
}
二、工具包两类形态(kind)
| kind | 形态 | 说明 |
|---|---|---|
byo(缺省) | 自带服务器 | 你在自己的服务器上跑 MCP over HTTP 服务(快速开始的 hello world 就是这种)。条目带 server 对象。网页提交只支持这一类。 |
declarative | 声明式剧本 | 零服务器:条目带顶层 declarative 对象(工作流剧本 + 字段映射),安装后由 app 内 workflow.run 工具族执行。剧本为公开内容,提交/审核链路会深度检查并拒绝含 token/apiKey/secret/password 类键的剧本。仅通过 app 内对话提交。 |
builtin | 官方内置 | MOV 官方内置能力,暂不对创作者开放提交。 |
三、byo(自带服务器)条目字段
{
"id": "weather-demo",
"name": "天气示例",
"desc": "查询城市天气(只读工具 × 2)",
"cat": "life",
"paid": false,
"author": "onlywmw",
"contact": "you@example.com",
"homepage": "https://github.com/onlywmw/xxx",
"kind": "byo",
"server": { "url": "https://mcp.example.com/weather", "token": "" },
"toolPreview": ["weather.now", "weather.forecast"],
"minAppVersion": "0.1.0",
"ui": "https://weather-ui.example.com"
}
| 字段 | 必填 | 约束 |
|---|---|---|
id | ✅ | 全局唯一,上架后不可改(会成为用户本地服务器配置 id,market.install 撞 id 拒绝)。网页提交口径:小写字母/数字/短横线,且以字母或数字开头(提交表单按此校验;服务端更宽,但按表单口径准备最稳)。 |
name | ✅ | 展示名。安装后还决定工具前缀 ext.<name>.<工具>,非字母数字字符会转下划线。 |
desc | ✅ | 一句话简介 ≤ 20 字(码点计):市场卡片等宽展示的前提,超限由提交校验直接拒绝。 |
cat | ✅ | 分类,自由字符串(市场前端按它分组),缺省归 other。 |
author | ✅ | 作者名/团队名,公开展示。 |
contact | ✅ | 联系方式(邮箱等),审核沟通用。 |
paid | — | 付费标记,仅展示;当前市场不做账号/支付。 |
homepage | — | 你的主页/仓库链接。 |
server.url | ✅ | 你的 MCP 端点,必须 https(提交时现场健康检查:空 POST,200/405 即通)。 |
server.token | — | 必须留空。需要鉴权的服务由用户安装后在 app 里自填 token(每个请求带 Authorization: Bearer);目录中出现 token 结构直接拒收。 |
toolPreview | — | 展示用预览清单;真实工具清单以安装后 tools/list 发现为准。 |
minAppVersion | — | 最低 app 版本。 |
ui | — | 可选:工具自带 UI 页面入口 URL。用户把它钉到侧边栏后,点击直接打开这个页面;缺省则点击行为降级为回填聊天输入框。 |
保留名提醒:
tools/list 返回的工具名命中保留黑名单(sms.read / pay.query / identity.read / a2a.message / contact.read / call.log / location.read)不会被挂出——声明了也白搭,命名时就避开。四、declarative(声明式剧本)条目
{
"id": "wx-merchant-onboard",
"kind": "declarative",
"name": "微信商户入驻助手",
"desc": "对话式跑完入驻填表",
"cat": "onboarding",
"author": "MOV 官方",
"declarative": {
"workflowId": "demo-onboard",
"version": "0.1.0",
"workflow": { "id": "demo-onboard", "version": "0.1.0",
"steps": [ { "id": "open_page", "action": "open", "url": "..." },
{ "id": "fill_user", "action": "fillForm", "fields": [...] },
{ "id": "pause_captcha", "action": "waitUser", "reason": "..." } ] }
},
"toolPreview": ["workflow.run", "workflow.status"]
}
- 无
server、无健康检查/发现;toolPreview展示workflow.*工具族; - 安装 = 把
workflow落盘用户设备filesDir/workflows/<workflowId>.json,卸载即删除; - 仅通过 app 内对话提交(见上架流程)。