API
DSH Marketplace API
1,837 个 DeepSeek Harness 插件的公开 JSON API。不用 key,不用注册,CORS 全开 —— 本站、CLI、Python 包和 harness 内嵌插件读的都是这两个接口。
两个接口
| 接口 | 回答什么 |
|---|---|
GET /api/v1/plugins | 这个插件是干嘛的。 |
GET /api/v1/index | 这一千个仓库里,哪些才是插件。 |
两个都开了 CORS,不需要鉴权。你要做目录站、做聊天工具、或者写一个会自己装插件的 agent,直接拿去用——它们就是为这个存在的,比你再爬一遍 GitHub topic 划算。
GET /api/v1/plugins
curl -s 'https://dshmarketplace.dev/api/v1/plugins?q=memory&limit=5'| 参数 | |
|---|---|
q | 自由文本,匹配仓库名、中英文摘要和描述 |
category | 14 个分类 id 之一 |
limit | 1–100,默认 20 |
page | 从 1 开始 |
每条结果都带中英文摘要、解析好的安装命令、检测到的风险项和源码仓库:
{
"fullName": "liustack/modlens",
"summary": "…",
"summaryZh": "…",
"category": "vision",
"stars": 2325,
"license": "MIT",
"npmPackage": "@liustack/modlens",
"installKind": "npm",
"install": "dsh plugin --profile web add @liustack/modlens",
"installable": true,
"installOptions": [{ "label": "npm", "cmd": "…", "note": "…" }],
"riskFlags": ["terminal surface"],
"repoUrl": "https://github.com/liustack/modlens",
"url": "https://dshmarketplace.dev/plugins/liustack-modlens"
}install 这个字段的约定
没有命令能装得上的时候,install 是 null,不是一个占位串。 写 agent 的话这段值得看两遍。会直接执行这个字段的调用方,不能拿到一条跑不通的命令, 所以宁可留空——installable 这个布尔值说的是同一件事。
两种情况会出现,而且都是真实存在的:
- 插件在 monorepo 的子目录里。
dsh plugin add是转发给 pnpm 的,而 pnpm 把#后面的东西当 git ref,所以github:owner/repo#packages/thing根本解析不了。没有一行命令能装,那就不给命令。 - 插件哪儿都没发。既没有 npm 包,仓库根目录也装不了。
凡是返回了的命令,都带着 --profile web。dsh plugin 只是把参数转发给 profile 目录里的 pnpm,所以这个 flag 是必填的——不带它 CLI 会直接报 required option '--profile <name>' not specified,什么都装不上。你用的是别的 profile,把 web 换掉即可。
GET /api/v1/index
curl -s 'https://dshmarketplace.dev/api/v1/index'一个请求拿走整份目录。给那种需要判断"这一页仓库里有没有插件"、又不可能一个一个问的调用方用。 为了小,行是位置数组,压过去大概 22 KB,列名跟着 payload 一起发:
{
"generated": "2026-08-17T09:12:44.108Z",
"count": 1837,
"site": "https://dshmarketplace.dev",
"fields": ["fullName", "category", "install", "path", "npm"],
"plugins": [
["liustack/modlens", "vision", "dsh plugin --profile web add @liustack/modlens", "/plugins/liustack-modlens", "@liustack/modlens"]
]
}条目还没有独立页面的时候 path 是 null,插件没发包的时候 npm 是 null。和 install 一样,这几个字段永远不会塞占位符。
目录里收了什么
1,837 条,来自社区精选库和 GitHub 上的 dsh-plugin topic。topic 不是注册表,所以收录有门槛——门槛写在这里,因为一道没人能核对的筛选不算筛选:
- 它得声明自己是 DSH 插件。
package.json里有dshmanifest、依赖了@deepseek-ai/*或 cordis、或者有cordis.patch.yml。别的 harness、agent 客户端也会挂dsh-plugin标签蹭曝光,那些在这里装不上,也就不收。 - 提交数不少于 10 次。这个数不是我们定的,取自 awesome-dsh-plugin 自己的收录门槛,所以这条标准你可以拿别人的规则来核对。脚手架在第一次提交时 manifest 就是合法的,能把它和真活分开的是提交数。
- 它得说清自己干嘛的。一句描述都没有的仓库,收进来就只是一个链接,而链接每家目录都能给你。
这道门槛跑下来一次删掉了 1,415 条,其中 754 条提交数不到 5 次。一个目录的价值在于它排除了什么。
缓存与合理使用
响应带 Cache-Control,走 Cloudflare 边缘缓存。没有限流也没有 key,这件事能成立的前提是调用方守规矩:把 index 缓存起来,别每次页面渲染都拉一遍; 能用一次 /api/v1/index 解决的,别打一千次 /api/v1/plugins。下面那个油猴脚本最多六小时刷新一次,那就是我们期望的用法。
四个参考实现
下面每一个读的都是上面那两个接口,而且全部 MIT 开源在 GitHub。你要接进自己的东西,大概率其中一个已经踩过你要踩的坑:
| 客户端 | |
|---|---|
| npm | npx dshmarketplace-cli find memory —— 给 agent 用的稳定 --json 契约 |
| PyPI | pip install dshmarketplace —— 零依赖,同步异步都有 |
| DSH 里 | dsh plugin --profile web add dshmarketplace-plugin —— /store,另带两个可供 agent 调用的工具 |
| 油猴脚本 | 逛 GitHub 和 npm 时标出插件 —— 一个文件,无构建,无依赖 |
使用条款
免费,商用也可以。不用 key,不用注册,不强制署名——留个链接我们会很高兴,但从不作为条件。 数据是公开的仓库元信息加上这里写的摘要,不提供任何担保,收录也不等于做过安全审查。见 这个站不是什么。
发现哪条收录错了,或者想把自己的撤下来,说一声就会改。