接入说明
推荐通过同域网关调用/api/panSeo/openApi/*。所有 OpenAPI 请求都必须通过 x-token 请求头发送由 GVA 签发的 SysApiToken,不支持使用 Authorization Bearer 替代。
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /panSeo/openApi/search | 搜索并返回有效链接 |
| POST | /panSeo/openApi/resources/upsert | 单条幂等录入 |
| POST | /panSeo/openApi/resources/batch-upsert | 批量幂等录入 |
| GET | /panSeo/openApi/enrichment/candidates | 查询当前用户待补全资源 |
| GET | /panSeo/openApi/resources/:id/enrichment-context | 读取安全补全上下文 |
| GET | /panSeo/openApi/taxonomies | 查询分类或标签 |
| POST | /panSeo/openApi/tags/ensure | 幂等获取或创建标签 |
| PATCH | /panSeo/openApi/resources/:id/metadata | 局部回写元数据 |
| GET | /panSeo/access/verify | 验证 Token 与接口权限 |
| GET | /panSeo/public/integrations/pan-seo-mcp.skill | 公开下载 Skill,不含 Token |
| GET | /panSeo/public/integrations/pan-seo-mcp.zip | 手动下载 ZIP 压缩包,不含 Token |
Token 仅应保存在调用方服务端的密钥管理或环境变量中,不要写入浏览器代码、URL 或日志。
搜索资源
/panSeo/openApi/search受权搜索只返回已发布资源,并包含每条资源的有效链接和提取码。匿名 SEO 搜索请改用 /panSeo/public/search。
| 参数 | 类型 | 说明 |
|---|---|---|
| q | string | 搜索标题、标签、SEO 关键词、摘要和正文 |
| category | string | 分类 slug 精确过滤 |
| platform | string | 平台 slug 精确过滤 |
| tag | string | 标签 slug 精确过滤 |
| sort | string | latest 为最新发布,默认按相关度 |
| page | integer | 页码,默认 1 |
| pageSize | integer | 每页数量,默认 20,最大 100 |
curl -sS --get "$BASE_URL/panSeo/openApi/search" \
-H "Accept: application/json" \
-H "x-token: $TOKEN" \
--data-urlencode "q=Go 教程" \
--data-urlencode "platform=quark" \
--data-urlencode "page=1" \
--data-urlencode "pageSize=20"新增或更新资源
/panSeo/openApi/resources/upsert完整模式按 source + externalId、resourceKey 或数据库 ID 幂等新增/更新。爬虫最简模式按 Token 所属用户和规范化资源名称归并父资源,分享链接保存在子表中。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ID | integer | 否 | 数据库资源 ID,仅后台或可信内部系统使用 |
| name | string | 最简模式是 | 爬虫资源名称;与 title 至少提供一个 |
| url | string | 最简模式是 | 顶层分享链接;同一父资源内按 URL 去重 |
| extractionCode | string | 否 | 与顶层 url 对应的提取码;最简模式为空时保留已有非空值 |
| available | boolean | 否 | 顶层链接是否可用,默认 true |
| lastCheckedAt | string/null | 否 | 顶层链接最近检测时间,RFC 3339 |
| resourceKey | string | 条件必填 | 完整模式全局唯一键;可由 source + externalId 自动生成 |
| source | string | 条件必填 | 完整模式来源系统稳定标识 |
| externalId | string | 条件必填 | 完整模式来源系统内唯一 ID |
| title | string | 完整模式是 | 完整模式资源标题;与 name 至少提供一个 |
| slug | string | 否 | 公开 URL 标识;为空时自动生成,发布后保持稳定 |
| summary | string | 否 | 资源摘要和默认 SEO 描述 |
| contentMarkdown | string | 否 | 资源 Markdown 正文 |
| coverUrl | string | 否 | 资源封面绝对 URL |
| categoryId | integer/null | 否 | 已存在的分类 ID |
| status | string | 否 | draft、published 或 offline;最简模式默认 published |
| publishedAt | string/null | 否 | 发布时间,RFC 3339 |
| seoTitle | string | 否 | 详情页 SEO 标题覆盖 |
| seoDescription | string | 否 | 详情页 SEO 描述覆盖 |
| seoKeywords | string | 否 | SEO 关键词,也参与搜索 |
| tagIds | integer[] | 否 | 已存在的标签 ID 数组 |
| links | object[] | 否 | 资源子链接数组,字段见下表 |
| replaceLinks | boolean | 否 | 是否删除本次未提交的旧链接,默认 false |
links 子项参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| platformId | integer | 否 | 平台 ID;省略时根据 URL 自动识别或创建 |
| url | string | 是 | 绝对 HTTP/HTTPS 分享链接 |
| extractionCode | string | 否 | 提取码;最简模式为空时不清除相同 URL 的已有非空值 |
| remark | string | 否 | 链接备注 |
| sort | integer | 否 | 升序排序值,默认 0 |
| enabled | boolean | 否 | 人工启停状态,默认 true |
| available | boolean | 否 | 实际可用状态,默认 true |
| lastCheckedAt | string/null | 否 | 最近检测时间,RFC 3339 |
最简爬虫请求
{
"name": "Go Web 开发资料",
"url": "https://pan.quark.cn/s/demo-resource",
"extractionCode": "1234",
"available": true,
"lastCheckedAt": "2026-08-18T17:30:00+08:00"
}curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/upsert" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "x-token: $TOKEN" \
--data '{"name":"Go Web 开发资料","url":"https://pan.quark.cn/s/demo-resource","extractionCode":"1234","available":true}'最简请求按 Token 所属用户和规范化资源名称归并父资源。先提交百度链接、后提交迅雷链接会追加到同一资源;相同 URL 只刷新子链接,不会重复插入。定时重复提交不会清空人工补录内容或重新发布已下架资源。
完整资源请求
{
"source": "partner-crawler",
"externalId": "go-web-20260818-001",
"title": "Go Web 开发资料",
"slug": "go-web-guide",
"summary": "包含 Gin、数据库和部署相关资料。",
"contentMarkdown": "## 内容介绍\n\n这是一份持续更新的 Go Web 学习资料。",
"coverUrl": "https://cdn.example.com/covers/go-web.webp",
"categoryId": 3,
"status": "published",
"publishedAt": "2026-08-18T15:20:00+08:00",
"seoTitle": "Go Web 开发资料下载与学习指南",
"seoDescription": "检索 Go、Gin、数据库与部署相关学习资料。",
"seoKeywords": "Go,Gin,Web开发",
"tagIds": [8, 12],
"links": [
{
"url": "https://pan.quark.cn/s/demo-resource",
"extractionCode": "1234",
"remark": "夸克主链接",
"sort": 10,
"enabled": true,
"available": true,
"lastCheckedAt": "2026-08-18T17:30:00+08:00"
},
{
"url": "https://pan.xunlei.com/s/demo-resource",
"extractionCode": "5678",
"remark": "迅雷备用链接",
"sort": 20,
"enabled": true,
"available": true
}
],
"replaceLinks": false
}curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/upsert" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "x-token: $TOKEN" \
--data-binary @resource.json成功响应
{
"code": 0,
"data": {
"resource": {
"ID": 101,
"resourceKey": "partner-crawler:go-web-20260818-001",
"source": "partner-crawler",
"externalId": "go-web-20260818-001",
"title": "Go Web 开发资料",
"slug": "go-web-guide",
"status": "published"
},
"created": true
},
"msg": "录入成功"
}批量录入
/panSeo/openApi/resources/batch-upsert请求体使用 { "items": [...] },每次最少 1 条、最多 100 条。批量接口逐条执行,调用方必须继续检查data.failed 和data.errors。同一批次可以混用最简模式和完整模式。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| items | object[] | 是 | 资源数组,最少 1 条、最多 100 条 |
| items[].name | string | 条件必填 | 最简模式资源名称 |
| items[].url | string | 条件必填 | 最简模式分享链接 |
| items[].extractionCode | string | 否 | 最简模式提取码 |
| items[].available | boolean | 否 | 最简模式链接可用状态 |
| items[].lastCheckedAt | string/null | 否 | 最近检测时间,RFC 3339 |
| items[].source | string | 条件必填 | 完整模式来源标识 |
| items[].externalId | string | 条件必填 | 完整模式外部唯一 ID |
| items[].title | string | 条件必填 | 完整模式资源标题 |
| items[].links | object[] | 否 | 完整模式子链接,结构与单条接口一致 |
完整批量请求
{
"items": [
{
"name": "Go Web 开发资料",
"url": "https://pan.quark.cn/s/go-web-resource",
"extractionCode": "1234",
"available": true,
"lastCheckedAt": "2026-08-18T17:30:00+08:00"
},
{
"name": "Go Web 开发资料",
"url": "https://pan.xunlei.com/s/go-web-resource",
"extractionCode": "5678",
"available": true
},
{
"source": "partner-crawler",
"externalId": "python-course-001",
"title": "Python 入门课程",
"summary": "Python 基础与实战课程资料。",
"status": "published",
"links": [
{
"url": "https://pan.baidu.com/s/python-course-001",
"extractionCode": "9abc",
"remark": "百度网盘",
"sort": 10,
"enabled": true,
"available": true
}
]
}
]
}curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/batch-upsert" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "x-token: $TOKEN" \
--data-binary @batch-resources.json示例前两项名称相同且使用同一 Token:第一项创建父资源和夸克链接,第二项把迅雷链接追加到同一父资源。批量接口固定使用链接合并模式,不支持删除本次未提交的旧链接。
全部成功响应
{
"code": 0,
"data": {
"created": 2,
"updated": 1,
"failed": 0,
"errors": []
},
"msg": "批量录入完成"
}部分失败响应
{
"code": 0,
"data": {
"created": 1,
"updated": 1,
"failed": 1,
"errors": [
"row 4: invalid resource status"
]
},
"msg": "批量录入完成"
}外层 code=0 只表示批量请求已执行,不代表每一项成功。errors 中第一条 item 从row 2 开始编号。
MCP 工具接入
MCP 是实时调用接口的连接层,负责工具发现、参数校验、Token 透传和权限执行;Skill 是给编程工具使用的工作流说明,不包含连接凭证,也不会替代 MCP。要完成自动补全,需要同时配置 MCP 并安装 Skill。
/mcpPanSEO 本身不调用任何模型,也不需要模型供应商密钥。内容由 Codex、Claude Code、Cursor 等外部工具生成;服务端只提供受限读写接口。
七个 PanSEO 工具
| MCP 工具 | 后端接口 | 用途 |
|---|---|---|
| panseo-search-resources | GET /panSeo/openApi/search | 受权搜索,返回有效链接与提取码 |
| panseo-add-resource | POST /panSeo/openApi/resources/upsert | 仅暴露 name、url、extractionCode 的简易录入 |
| panseo-list-enrichment-candidates | GET /panSeo/openApi/enrichment/candidates | 默认查询待补全文本;includeCoverOnly=true 时纳入仅缺封面的资源 |
| panseo-get-enrichment-context | GET /panSeo/openApi/resources/:id/enrichment-context | 获取含当前封面且不含分享链接和提取码的安全上下文 |
| panseo-list-taxonomies | GET /panSeo/openApi/taxonomies | 查询可用分类或标签 |
| panseo-ensure-tag | POST /panSeo/openApi/tags/ensure | 幂等获取或创建标签,不能创建分类 |
| panseo-update-metadata | PATCH /panSeo/openApi/resources/:id/metadata | 只更新文本、封面、分类和标签 |
候选查询默认设置 includeCoverOnly=false,因此仅缺封面的资源不会在普通补全批次中重复出现。只有执行封面专项补全时才设置为true。
Token 权限清单
在 /layout/permission/apiToken 签发 SysApiToken,并确保 Token 所属角色已通过 Casbin 授权所需接口。只做补全时不必授予搜索和新增接口;只做爬虫录入时也不必授予补全写接口。
| 方法 | Casbin API 路径 | 建议 |
|---|---|---|
| GET | /panSeo/openApi/search | 需要搜索链接时授权 |
| POST | /panSeo/openApi/resources/upsert | 需要简易录入时授权 |
| GET | /panSeo/openApi/enrichment/candidates | 补全工作流必需 |
| GET | /panSeo/openApi/resources/:id/enrichment-context | 补全工作流必需 |
| GET | /panSeo/openApi/taxonomies | 补全分类标签时必需 |
| POST | /panSeo/openApi/tags/ensure | 允许新建标签时授权 |
| PATCH | /panSeo/openApi/resources/:id/metadata | 确认后回写时必需 |
一键添加连接
安装链接只写入 MCP 地址,不携带 Token。安装后按下方配置添加x-token。
客户端配置
Codex / ChatGPT Desktop / Codex IDE
写入用户级 ~/.codex/config.toml,或可信项目中的 .codex/config.toml;客户端原生支持 Streamable HTTP。
[mcp_servers.panseo]
url = "https://yps.ppru.cn/mcp"
env_http_headers = { "x-token" = "PANSEO_API_TOKEN" }
default_tools_approval_mode = "writes"Claude Code
写入项目级 .mcp.json 或用户级配置。把占位符替换为从密钥管理加载的值。
{
"mcpServers": {
"panseo": {
"type": "http",
"url": "https://yps.ppru.cn/mcp",
"headers": {
"x-token": "YOUR_SYS_API_TOKEN"
}
}
}
}Claude Desktop
若当前版本不能直接添加远程 HTTP 服务,可通过 mcp-remote 桥接;Token 仍只保存在本机配置中。
{
"mcpServers": {
"panseo": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://yps.ppru.cn/mcp",
"--transport",
"http-only",
"--header",
"x-token:YOUR_SYS_API_TOKEN"
]
}
}
}Cursor
写入项目级 .cursor/mcp.json 或全局 ~/.cursor/mcp.json。
{
"mcpServers": {
"panseo": {
"url": "https://yps.ppru.cn/mcp",
"headers": {
"x-token": "YOUR_SYS_API_TOKEN"
}
}
}
}VS Code / GitHub Copilot
写入 .vscode/mcp.json;password 输入不会写入配置文件。
{
"inputs": [
{
"type": "promptString",
"id": "panseo-token",
"description": "PanSEO SysApiToken",
"password": true
}
],
"servers": {
"panseo": {
"type": "http",
"url": "https://yps.ppru.cn/mcp",
"headers": {
"x-token": "${input:panseo-token}"
}
}
}
}Trae
在 Trae 设置 → MCP 中粘贴;保存后重新加载工具列表。
{
"mcpServers": {
"panseo": {
"url": "https://yps.ppru.cn/mcp",
"headers": {
"x-token": "YOUR_SYS_API_TOKEN"
}
}
}
}Cline
在 MCP Servers 配置中粘贴,远程传输类型使用 streamableHttp。
{
"mcpServers": {
"panseo": {
"type": "streamableHttp",
"url": "https://yps.ppru.cn/mcp",
"headers": {
"x-token": "YOUR_SYS_API_TOKEN"
},
"disabled": false,
"autoApprove": []
}
}
}元数据 PATCH 示例
{
"summary": "根据资源标题整理的简短说明。",
"contentMarkdown": "## 资源说明\n\n仅描述当前上下文能够确认的信息。",
"seoTitle": "资源名称与检索说明",
"seoDescription": "资源页面的克制、可验证描述。",
"seoKeywords": "资源名称,主题关键词",
"coverUrl": "https://images.example.com/covers/resource.webp",
"categoryId": 3,
"tagIds": [8, 12]
}所有字段均可选,但至少提交一个。文本字段提交时必须非空;coverUrl 必须是公开可访问、无内嵌账号信息且最多 1024 字符的 HTTP(S) 图片绝对 URL;categoryId=0 清空分类,tagIds=[] 清空标签。未提交字段保持原值。
安装 pan-seo-mcp Skill
Skill 规定“查询候选 → 读取上下文 → 有联网工具时必须联网核验 → 查询分类标签 → 生成带来源的克制草稿 → 用户确认 → 写入 → 重新读取验证”的操作顺序。缺少封面时允许豆瓣、IMDb、TMDB 等稳定的非 bkimg 图片直链,但必须核验资源匹配、图片尺寸和链接稳定性;找不到可靠图片则保持为空。没有联网工具时必须在预览中说明,不能假装完成核验。下载内容不含 Token,MCP 地址来自后台首页 SEO 配置中的规范域名。
.skill本质上也是 ZIP 归档,适合安装器直接导入;手动安装可下载https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.zip,解压后把pan-seo-mcp目录复制到客户端的 Skills 目录。
| 客户端 | 一键安装命令 |
|---|---|
| Codex | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a codex -y |
| Claude Code | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a claude-code -y |
| Cursor | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a cursor -y |
| Cline | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a cline -y |
| Trae | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a trae -y |
| GitHub Copilot | npx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a github-copilot -y |
也可以把同一个地址交给支持 Agent Skills 的安装器。安装完成后重启或重新加载编程工具,确认pan-seo-mcp 已出现在 Skill 列表中。
示例提示词
下面的案例可以直接复制。普通补全默认排除“仅缺封面”的资源;封面专项必须显式设置includeCoverOnly=true。
普通补全:先处理 10 条
适合首次使用。只生成可审阅草稿,确认后才写入。
使用 $pan-seo-mcp 做一次普通元数据补全。
调用 panseo-list-enrichment-candidates,参数设为 page=1、pageSize=10、includeCoverOnly=false。
逐条读取补全上下文;如果当前工具支持联网搜索,必须逐条联网核验,并在草稿中列出来源页面。
只根据 PanSEO 上下文和已核验信息生成摘要、Markdown 正文、SEO 字段、分类和标签建议,不要虚构剧情、文件内容或版本信息。
仅在找到稳定且可直接访问的图片时建议 coverUrl;允许使用豆瓣、IMDb、TMDB 等非 bkimg 稳定图源。
先展示这 10 条的字段级变更草稿,不要写入。等我确认后再更新,并逐条重新读取验证。普通补全:处理全部直到队列为空
明确授权连续写入;每轮重新读取第一页,并设置去重和无进展停止条件。
使用 $pan-seo-mcp 补全我名下全部普通待补全资源。我明确授权你在本次任务中连续写入符合下列规则的结果,不需要逐批等待确认。
每轮调用 panseo-list-enrichment-candidates,固定使用 page=1、pageSize=10、includeCoverOnly=false。
逐条读取上下文;有联网搜索工具时必须逐条联网核验并记录来源。只写入可验证的摘要、Markdown 正文、SEO 字段、分类和标签,不得覆盖标题、slug、链接、提取码、状态或发布时间。
每次写入后重新读取该资源验证;一轮结束后重新查询 page=1。持续处理,直到返回的 list 为空。
维护 processedIds 和 failedIds,同一资源本次最多处理一次。单轮没有任何成功更新,或返回结果全部已在 processedIds/failedIds 中时,立即停止,避免死循环。
不要把 includeCoverOnly 改为 true。最后汇总成功、跳过、失败数量及失败原因。封面专项:先找 10 条
跨页筛选缺封面的资源,只预览可靠图片来源,不改其他字段。
使用 $pan-seo-mcp 为我名下缺少封面的资源准备前 10 条候选草稿,不要写入。
从 page=1、pageSize=10、includeCoverOnly=true 开始查询;只选择 missingFields 包含 coverUrl 的资源,必要时继续翻页,按资源 ID 去重,收集满 10 条或查完全部候选后停止。
逐条读取上下文并联网搜索。必须同时核验来源页面和图片直链确实对应当前资源;允许使用豆瓣、IMDb、TMDB(包括 image.tmdb.org)等稳定的非 bkimg 图源,不要求必须是官方图片。
只建议 coverUrl,不覆盖已有文本、分类、标签或身份字段。找不到可靠封面时保持为空,并说明已检查的来源和跳过原因。
展示资源 ID、标题、建议图片 URL、来源页面和核验结果,等我确认后再写入。封面专项:处理全部缺封面资源
先只读快照,再处理固定 ID,避免写入导致分页变化后漏项或重复。
使用 $pan-seo-mcp 补全我名下全部缺失封面的资源。我明确授权你在本次任务中连续写入已核验的 coverUrl,不需要逐条等待确认。
第一阶段只读,不要写入:用 pageSize=100、includeCoverOnly=true 从 page=1 开始分页,直到 list 为空或已读取 total;只收集 missingFields 包含 coverUrl 的资源 ID,并去重形成固定快照。
第二阶段只处理这份固定 ID 列表:逐条读取上下文并联网搜索,同时核验来源页面与图片直链。允许豆瓣、IMDb、TMDB(包括 image.tmdb.org)等稳定的非 bkimg 图源,不要求官方图片。
每条只写入 coverUrl,随后重新读取验证。没有可靠图片、图片无法直接访问或无法确认对应关系时,跳过并记录原因,本次运行不要再次尝试该 ID。
处理完固定列表后停止,不要反复查询第一页。最后汇总快照总数、成功、跳过、失败数量,并列出跳过和失败的资源 ID。失败项:按 ID 定向重试
只重试上次失败或跳过的资源,不重新扫描整个候选队列。
使用 $pan-seo-mcp 只复核以下资源 ID:RESOURCE_ID_1、RESOURCE_ID_2。不要重新查询或处理整个待补全队列。
逐条获取 enrichment-context,并根据 missingFields 决定可更新字段。有联网搜索工具时必须联网核验;若没有联网能力,请明确说明并只输出草稿,不要写入无法核实的内容。
封面可使用豆瓣、IMDb、TMDB 等稳定图片直链,但必须核验与当前资源匹配且可以直接访问。文本不得根据标题猜测具体剧情、集数、文件清单或版本。
先列出每条资源的新证据、拟修改字段和仍无法补全的字段,不要写入。等我确认后再更新并重新读取验证。统一响应与错误处理
{
"code": 0,
"data": {},
"msg": "成功"
}| HTTP | 业务 code | 说明 |
|---|---|---|
| 200 | 0 | 成功,使用 data |
| 200 | 7 | 参数、业务或权限错误,读取 msg |
| 401 | 7 | Token 缺失、无效、过期或作废 |
| 429 | 7 | 超过 IP 或 Token 限流,稍后重试 |
| MCP tool error | - | Gin 参数、Token 或 Casbin 错误会映射为可读工具错误 |