协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
kingdee-skill-publisher【开发与工程】 金蝶云苍穹业务Skill快速发布工具。这是一个元Skill,用于基于金蝶苍穹开放平台已发布的API和MCP服务,快速创建和发布财务凭证查询、供应链订单查询等业务Skill。 使用此Skill时: 1. 用户需要配置金蝶苍穹服务器URL和API认证凭证,支持两种认证方式: - 经典认证(默认):user、appId、appSecret、accountId,通过 `POST {baseUrl}/api/login.do` 获取Token - 增强型Token认证:client_id、client_secret、username、accountId,通过 `POST {baseUrl}/kapi/oauth2/getToken` 获取Token 2. Skill自动根据 auth_ty…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: kingdee-skill-publisher description: |
金蝶云苍穹业务Skill快速发布工具。这是一个元Skill,用于基于金蝶苍穹开放平台已发布的API和MCP服务,快速创建和发布财务凭证查询、供应链订单查询等业务Skill。
使用此Skill时:
POST {baseUrl}/api/login.do 获取TokenPOST {baseUrl}/kapi/oauth2/getToken 获取Tokenaccess_token这是一个元Skill(Meta Skill),用于快速发布基于金蝶云苍穹开放平台的业务Skill。它简化了从API集成到Skill发布的全流程。
本 Skill 的所有操作(凭证验证、API 查询、API 详情获取、Skill 生成)都必须通过执行 Python 脚本完成。AI 不得自行编写、猜测或拼凑任何业务文件内容。
publisher.setup_credentials() Python 代码publisher.search_apis() Python 代码publisher.api_client.get_api_detail() Python 代码publisher.create_skill_from_api() 或 SkillGenerator.generate_skill() Python 代码getDetail 接口返回的 urlformat 字段,禁止猜测或拼凑所有 Python 代码必须通过 execute_command 工具执行,示例:
cd /path/to/kingdee-skill-publisher && python3 -c "
from scripts import KingdeeSkillPublisher
publisher = KingdeeSkillPublisher()
publisher.setup_credentials(server_url=..., app_id=..., app_secret=..., account_id=..., user=...)
result = publisher.search_apis(appid_number='xxx', keyword='yyy')
print(result)
"
login.do 协议获取并缓存 access_token┌─────────────────────────────────────────┐
│ 1. 配置凭证与连接 │
│ - Server URL │
│ - user / appId / appSecret / accountId│
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 2. 询问 appid_number │
│ - 必须询问用户提供应用编码 │
│ - 未提供则停止执行 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 3. 搜索API列表 │
│ - 调用 queryByApp 获取API清单 │
│ - 展示API名称、编码、描述 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 4. 用户选择API │
│ - 展示API列表供用户选择 │
│ - 必须等待用户明确选择 │
│ - 未选择则停止执行 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 5. 获取API详情 (getDetail) │
│ - 使用API ID调用详情接口 │
│ - 获取请求头、请求参数、返回参数 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 6. 封装Skill │
│ - 根据详情生成请求头处理代码 │
│ - 生成参数验证和响应解析逻辑 │
│ - 生成完整Skill结构 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 7. 测试与发布 │
│ - 生成测试用例 │
│ - 打包 Skill │
│ - 提供安装指引 │
└─────────────────────────────────────────┘
当用户开始使用此Skill时,引导进行以下操作:
需要收集的信息(根据认证方式选择):
经典认证(默认,auth_type="login_do"):
金蝶服务器配置:
├─ 服务器 URL(必须)
│ 示例:https://xxx.kingdee.com/ierp
│
├─ appId(必须)
│ 由金蝶开放平台第三方应用申请
│
├─ appSecret(必须)
│ 需妥善保管,不应暴露
│
├─ accountId(必须)
│ 租户账套ID
│
└─ user(可选,默认admin)
当前操作用户
增强型Token认证(auth_type="oauth2"):
金蝶服务器配置:
├─ 服务器 URL(必须)
│
├─ client_id(必须)
│ 示例:${YOUR_CLIENT_ID}
│
├─ client_secret(必须)
│ AccessToken认证密钥,示例:${YOUR_CLIENT_SECRET},需妥善保管
│
├─ username(必须)
│ 用户名或手机号,示例:${YOUR_USERNAME}
│
├─ accountId(必须)
│ 租户账套ID
│
└─ language(可选,默认zh_CN)
语言设置
nonce和timestamp由客户端自动生成,无需配置。
配置验证步骤:
auth_type 调用对应的Token接口获取 access_tokenAuthorization: Bearer {access_token} 调用测试接口验证权限⛔ 必须通过
execute_command执行publisher.search_apis()Python 代码查询,禁止 AI 自行构造 HTTP 请求。
本Skill使用金蝶官方的 queryByApp 接口按应用编码查询API列表,确保返回结果与当前应用实际发布的API保持一致。
接口路径: GET /kapi/v2/open/openapi_apilist/queryByApp
⚠️ 重要:查询前必须获取 appid_number
在调用API查询前,必须在对话框中询问用户提供 appid_number(应用编码)。
appid_number:继续执行查询appid_number:停止执行,不再进行后续任务询问示例:
我需要查询API列表,请提供应用编码(appid_number)。
例如:basedata、ar、ap、pm 等
用户可以通过多种方式查询API:
方式1:按应用编码获取完整列表
appid_numberpageNo 默认值为 1pageSize 默认值为 10方式2:对结果做本地过滤
查询返回信息:
示例查询结果:
# 注意:appid_number 必须询问用户提供
result = publisher.search_apis(
appid_number="basedata", # 用户提供的应用编码
keyword="凭证"
)
# 输出示例:
{
"success": True,
"total": 5,
"apis": [
{
"apiCode": "ar_getBillDetail",
"apiName": "应收凭证详情",
"method": "GET",
"module": "ar",
"apiDescription": "查询应收凭证的详细信息",
"requestParams": [
{"name": "billId", "type": "String", "required": True, "description": "凭证ID"}
],
"returnParams": [
{"name": "id", "type": "String", "description": "凭证ID"},
{"name": "billNo", "type": "String", "description": "凭证号"}
]
},
# ... 更多API
]
}
⚠️ 重要:必须等待用户选择API
返回API列表后,必须在对话框中展示API列表并询问用户选择,示例如下:
找到以下API,请选择一个继续:
1. ar_getBillDetail - 应收凭证详情
描述:查询应收凭证的详细信息
2. ar_getBillList - 应收凭证列表
描述:查询应收凭证列表
请输入序号(1-2)或直接告诉我API名称:
执行规则:
⛔ 必须通过
execute_command执行publisher.api_client.get_api_detail(api_id)Python 代码获取详情,禁止 AI 自行猜测 API 的 URL、参数和返回值。
前置条件:用户已明确选择了一个API
用户选择API后,Claude必须通过执行Python代码调用详情接口获取完整的API定义(包括真实URL):
接口信息:
GET /v2/open/openapi_apilist/getDetailContent-Type: application/jsonaccesstoken: {access_token}id: API主键ID(必填,从第二步API列表中获取)pageSize: 分页大小(必填,即使只查询单条记录,默认10)pageNo: 查询页码(可选,默认1)⚠️ 重要提示: 此查询接口必须传递分页参数 pageSize 和 pageNo,即使只查询单条记录。
返回内容 (data.rows[0]):
{
"success": true,
"api_detail": {
"id": "API主键ID",
"api_code": "API编码",
"api_name": "API名称",
"api_description": "API描述",
"method": "GET/POST",
"url": "/v2/open/...",
"request_headers": [
{"name": "Content-Type", "value": "application/json", "description": "内容格式", "required": true},
{"name": "accesstoken", "value": "...", "description": "请求令牌", "required": true}
],
"request_query_params": [
{"name": "id", "type": "Long", "description": "主键ID", "required": true, "example": ""}
],
"request_body_params": [
{"name": "param1", "type": "String", "description": "参数说明", "required": true, "example": "..."}
],
"response_params": [
{"name": "field1", "type": "String", "description": "字段说明", "required": true, "level": "1"}
],
"error_codes": [
{"code": "400", "description": "参数错误"}
]
}
}
参数来源说明(根据金蝶OpenAPI文档):
| 规范化字段 | 原始字段 | 说明 |
|---|---|---|
request_headers | headerentryentity | 请求头参数 |
request_query_params | urlparamentryentity | URL查询参数 |
request_body_params | bodyentryentity | 请求体参数 |
response_params | respentryentity | 返回参数 |
error_codes | errorcodeentity | 错误码定义 |
orderby_rules | orderby_entry | 排序规则 |
save_params | saveparamentryentity | 操作参数 |
### 第四步:封装Skill(⚠️ 必须通过 Python 代码生成)
**⚠️⚠️⚠️ 关键原则:必须通过执行 Python 代码生成 Skill,禁止手动编写文件内容**
获取到完整的API详情后,Claude **必须调用项目中的 Python 代码**来生成 Skill,而**不是自己直接编写文件内容**。Python 代码内置了 YAML 描述头生成和验证逻辑,能确保生成的 SKILL.md 格式正确。
**方式1(推荐):使用 `KingdeeSkillPublisher.create_skill_from_api_id()`**
```python
from scripts import KingdeeSkillPublisher
publisher = KingdeeSkillPublisher()
publisher.setup_credentials(
server_url=server_url,
app_id=app_id,
app_secret=app_secret,
account_id=account_id,
user=user
)
# 使用用户选择的 API 的主键 ID 直接生成 Skill
result = publisher.create_skill_from_api_id(
api_id=selected_api['id'], # 用户选择的 API 主键 ID
skill_name="ar-bill-detail-query", # 可选,默认使用 API 编码
skill_description="查询应收凭证详情" # 可选
)
if result['success']:
print(f"✅ Skill 已生成: {result['skill_path']}")
else:
print(f"❌ 生成失败: {result['message']}")
方式2:使用 KingdeeSkillPublisher.create_skill_from_api()
# 使用 search_apis 返回的 api_info + use_detail=True 自动获取详情
result = publisher.create_skill_from_api(
api_info=selected_api, # 用户选择的 API(包含 id 字段)
skill_name="ar-bill-detail-query",
skill_description="查询应收凭证详情",
use_detail=True # 自动调用 getDetail 获取完整详情
)
方式3:直接使用 SkillGenerator
from scripts.skill_generator import SkillGenerator
generator = SkillGenerator(output_dir="./outputs")
skill_dir = generator.generate_skill(
api_info=api_detail, # 完整的 API 详情字典
custom_name="ar-bill-detail-query",
custom_description="查询应收凭证详情"
)
print(f"✅ Skill 已生成: {skill_dir}")
Python 代码会自动完成以下工作:
name: 和 description: | 字段完整)request_headers 生成请求头处理代码(scripts/api_call.py)scripts/api_client.py,含 Token 管理)request_query_params 和 request_body_params 生成参数验证逻辑response_params 生成 API schema(references/api_schema.json)error_codes 生成错误码对照表(references/error_codes.json)references/examples.json)生成的 Skill 目录结构:
${skill_name}/
├─ SKILL.md(包含 YAML 描述头,由 Python 代码自动生成并验证)
├─ scripts/
│ ├─ __init__.py
│ ├─ api_call.py(API 调用逻辑)
│ ├─ api_client.py(API 客户端,Token 管理)
│ └─ utils.py(工具函数)
├─ references/
│ ├─ api_schema.json(API 参数 schema)
│ ├─ error_codes.json(错误码对照)
│ └─ examples.json(使用示例)
├─ README.md
└─ LICENSE.txt
⚠️ 禁止事项:
API 详情字段说明(Python 代码内部使用):
| 规范化字段 | 原始字段 | 说明 |
|---|---|---|
request_headers | headerentryentity | 请求头参数 |
request_query_params | urlparamentryentity | URL 查询参数 |
request_body_params | bodyentryentity | 请求体参数 |
response_params | respentryentity | 返回参数 |
error_codes | errorcodeentity | 错误码定义 |
orderby_rules | orderby_entry | 排序规则 |
save_params | saveparamentryentity | 操作参数 |
自动生成的测试用例包括:
发布输出:
.skill 打包文件用户输入:我想创建一个财务凭证查询的Skill
告诉我有哪些相关的API
Claude执行:
1. 查询API清单(执行 Python 代码)
from scripts import KingdeeSkillPublisher
publisher = KingdeeSkillPublisher()
publisher.setup_credentials(
server_url=server_url,
app_id=app_id,
app_secret=app_secret,
account_id=account_id,
user=user
)
# 搜索API
apis_result = publisher.search_apis(appid_number="basedata", keyword="凭证")
2. 展示API列表供用户选择:
- ar.getBillDetail(应收凭证详情)
- ar.getBillList(应收凭证列表)
用户选择:选择 ar.getBillDetail
Claude执行:
3. 通过 Python 代码生成 Skill(⚠️ 禁止手动编写文件)
# 使用 Python 代码生成 Skill(自动包含 YAML 描述头)
result = publisher.create_skill_from_api_id(
api_id=selected_api['id'],
skill_name="ar-bill-detail-query",
skill_description="查询应收凭证详情"
)
if result['success']:
print(f"✅ Skill 已生成: {result['skill_path']}")
# Python 代码自动生成的 SKILL.md 包含完整的 YAML 描述头
# Python 代码自动处理了 Token 管理、参数验证、错误处理等
用户输入:我需要查询供应链的订单信息
Claude执行:
1. 搜索相关API(执行 publisher.search_apis)
2. 展示列表供用户选择
用户选择:选择 pm.getPurchaseOrderDetail
Claude执行:
3. 通过 Python 代码生成 Skill(⚠️ 禁止手动编写文件)
result = publisher.create_skill_from_api_id(
api_id=selected_api['id'],
skill_name="purchase-order-detail",
skill_description="查询采购订单详情"
)
此Skill基于金蝶云苍穹OpenAPI开放平台的规范实现:
/kapi/v2/{isv}/{appId}/{formId}/{apiCode}支持两种认证方式,通过 auth_type 参数选择:
POST {baseUrl}/api/login.do{
"user": "${config.user}",
"appId": "${config.appId}",
"appSecret": "${config.appSecret}",
"accountId": "${config.accountId}"
}
所需凭证:server_url、app_id、app_secret、account_id、user(可选)
POST {baseUrl}/kapi/oauth2/getToken{
"client_id": "${config.client_id}",
"client_secret": "${config.client_secret}",
"username": "${config.username}",
"accountId": "${config.accountId}",
"nonce": "{{自动生成UUID}}",
"timestamp": "{{自动生成当前时间,格式:yyyy-MM-dd HH:mm:ss}}",
"language": "${config.language}"
}
所需凭证:server_url、account_id、client_id、client_secret、username、language(可选,默认 zh_CN)
nonce和timestamp由客户端自动生成,无需用户提供。
data.access_token 读取访问令牌Authorization: Bearer {access_token} 传递Tokenaccesstoken: {access_token} 传递Tokendata.expire_time 反推剩余有效期;未返回时按120分钟处理0-999 OpenAPI引擎错误(0正常、400参数无效、401未授权、403禁止、404不存在、500服务异常)
appId.100001+ 应用业务错误
两种方案支持:
Skill发布器将来支持基于金蝶MCP服务创建Skill,允许:
支持在一个Skill中包装多个相关API:
示例:订单完整流程Skill
├─ 订单查询(API)
├─ 订单详情(API)
├─ 订单状态变更(MCP)
└─ 库存扣减(MCP)
自动处理参数映射:
完整的错误处理链:
生成的Skill遵循以下结构:
${skill_name}/
├── SKILL.md # ⚠️ Skill定义(必须包含 YAML 描述头)
├── scripts/
│ ├── __init__.py
│ ├── api_client.py # API客户端(Token管理、请求)
│ ├── api_call.py # 主要API调用逻辑
│ └── utils.py # 工具函数
├── references/
│ ├── api_schema.json # API请求/返回schema
│ ├── error_codes.json # 错误码对照表
│ ├── examples.json # 使用示例
│ └── kingdee_api_spec.md # API文档快速参考
├── README.md # 使用说明
└── LICENSE.txt # 许可证
auth_type)HEAD {baseUrl}/kapi 验证基础连通性auth_type 调用对应Token接口:
login_do(默认):POST {baseUrl}/api/login.dooauth2:POST {baseUrl}/kapi/oauth2/getToken(nonce/timestamp自动生成)getUserInfo 等轻量接口验证认证和权限access_tokenGET /kapi/v2/open/openapi_apilist/queryByApp 按 appid_number 查询当前应用APIaccesstoken 请求头和分页参数 pageNo/pageSizeapi_code/api_name/api_description)publisher.create_skill_from_api_id(api_id) 或 publisher.create_skill_from_api(api_info, use_detail=True)scripts/api_call.py)references/)生成的Skill可以进一步手动调整:
修改 scripts/api_call.py 中的参数转换逻辑
在 references/error_codes.json 中添加业务特定的错误处理规则
组合多个API实现更复杂的业务流程
补充业务场景说明和最佳实践
Q: 如何管理多个Skill的凭证? A: 每个Skill可以有独立的凭证配置,或者共享一个中央配置库。建议使用环境变量隔离凭证。
Q: Skill支持哪些金蝶API? A: 所有金蝶云苍穹开放平台已发布的API都支持,包括标准预置API和ISV二开API。
Q: 如何处理Token过期?
A: 生成的Skill会优先复用内存中的Token;如果本地判断已过期,或接口返回HTTP 401/业务401,则自动重新调用 POST {baseUrl}/api/login.do 获取新Token。用户无需手动处理。
Q: 可以同时调用多个API吗? A: 可以。生成的Skill支持组合调用多个API实现复杂业务流程。
Q: 如何处理大数据量? A: 自动分页处理,单次查询最多1万条,保存2000条。
如有建议或问题,请提出反馈,我们会持续改进此元Skill的功能和易用性。