sophhub 0.4.63 → 0.4.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agents/ai-cs-qa/.config.json +59 -1
- package/package.json +1 -1
- package/skills/agent-install/skill.json +9 -2
- package/skills/agent-install/src/scripts/common.py +8 -1
- package/skills/agent-install/src/scripts/update_openclaw.py +5 -1
- package/skills/agent-install/src/tests/test_bot_api_exec.py +116 -0
- package/skills/claw-agent-get-send/skill.json +18 -4
- package/skills/claw-agent-get-send/src/SKILL.md +103 -27
- package/skills/claw-agent-get-send/src/pyproject.toml +2 -2
- package/skills/claw-agent-get-send/src/reference-http.md +296 -0
- package/skills/claw-agent-get-send/src/references/auth.md +115 -0
- package/skills/claw-agent-get-send/src/references/creator-delegate-api.md +90 -0
- package/skills/claw-agent-get-send/src/references/overview-api.md +47 -0
- package/skills/claw-agent-get-send/src/references/query-api.md +109 -0
- package/skills/claw-agent-get-send/src/references/rooms-api.md +79 -0
- package/skills/claw-agent-get-send/src/references/session-flow.md +61 -0
- package/skills/claw-agent-get-send/src/references/write-api.md +38 -0
- package/skills/claw-agent-get-send/src/scripts/appia_claw.py +290 -2
- package/skills/claw-agent-get-send/src/scripts/appia_common.py +258 -0
- package/skills/claw-agent-get-send/src/scripts/appia_extensions.py +370 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# Claw HTTP API(curl 参考)
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## `GET /api/v1/claw/agent.groups.get`
|
|
7
|
+
|
|
8
|
+
用于按 `agentId` + `userId` 查询该机器人所在的所有群聊,返回 `rid` 和群名称。
|
|
9
|
+
|
|
10
|
+
### 鉴权方式
|
|
11
|
+
|
|
12
|
+
与 `mcpToDos` 一致:
|
|
13
|
+
|
|
14
|
+
- `authRequired: false`
|
|
15
|
+
- 通过请求头 `Authorization: Bearer <JWT>` 校验
|
|
16
|
+
- 校验规则受以下设置控制:
|
|
17
|
+
- `Appia_Antagent_JWT_Enable`
|
|
18
|
+
- `APPIA_JWT_SECRET`
|
|
19
|
+
|
|
20
|
+
### 请求示例
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl -sS -G 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.groups.get' \
|
|
24
|
+
-H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
|
|
25
|
+
--data-urlencode 'agentId=AGENT_BOT_USER_ID' \
|
|
26
|
+
--data-urlencode 'userId=CREATOR_USER_ID'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 参数
|
|
30
|
+
|
|
31
|
+
- `agentId`(query,必填):OpenClaw 侧 Agent ID(会映射到机器人用户)
|
|
32
|
+
- `userId`(query,必填):创建者 / 调用方用户 ID(脚本由凭证 `creator_user_id` 等提供)。缺失返回 `userId is required`。
|
|
33
|
+
|
|
34
|
+
### 成功返回示例
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"success": true,
|
|
39
|
+
"data": {
|
|
40
|
+
"agentId": "AGENT_BOT_USER_ID",
|
|
41
|
+
"groups": [
|
|
42
|
+
{
|
|
43
|
+
"rid": "ROOM_ID_1",
|
|
44
|
+
"name": "群聊A"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"rid": "ROOM_ID_2",
|
|
48
|
+
"name": "群聊B"
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"total": 2
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 常见失败
|
|
57
|
+
|
|
58
|
+
- `{"success":false,"message":"401"}`:JWT 无效或过期
|
|
59
|
+
- `{"success":false,"message":"agentId is required"}`:缺少 `agentId`
|
|
60
|
+
- `{"success":false,"message":"userId is required"}`:缺少 `userId`
|
|
61
|
+
- `{"success":false,"message":"agent not found by agentId"}`:找不到对应 agentId 的机器人
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## `POST /api/v1/claw/agent.message.send`
|
|
66
|
+
|
|
67
|
+
用于根据 **`userId` + `rid` + `agentId`** 向指定群聊发送消息。
|
|
68
|
+
|
|
69
|
+
接口会校验:
|
|
70
|
+
|
|
71
|
+
1. `rid` 对应房间存在
|
|
72
|
+
2. `agentId` 对应用户存在、为 bot、且 active
|
|
73
|
+
3. 该 `agentId` 确实在该 `rid` 的订阅列表里
|
|
74
|
+
|
|
75
|
+
满足后,走后端正常发消息逻辑(`executeSendMessage`)。
|
|
76
|
+
|
|
77
|
+
### 鉴权方式
|
|
78
|
+
|
|
79
|
+
与 `mcpToDos` 一致:
|
|
80
|
+
|
|
81
|
+
- `authRequired: false`
|
|
82
|
+
- 通过请求头 `Authorization: Bearer <JWT>` 校验
|
|
83
|
+
- 校验规则受以下设置控制:
|
|
84
|
+
- `Appia_Antagent_JWT_Enable`
|
|
85
|
+
- `APPIA_JWT_SECRET`
|
|
86
|
+
|
|
87
|
+
### 请求示例
|
|
88
|
+
|
|
89
|
+
#### 示例一:发送纯文本
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
curl -sS -X POST 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.message.send' \
|
|
93
|
+
-H 'Content-Type: application/json' \
|
|
94
|
+
-H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
|
|
95
|
+
-d '{
|
|
96
|
+
"userId": "CREATOR_USER_ID",
|
|
97
|
+
"rid": "TARGET_ROOM_RID",
|
|
98
|
+
"agentId": "AGENT_BOT_USER_ID",
|
|
99
|
+
"msg": "这是一条由 Claw 机器人发送的消息"
|
|
100
|
+
}'
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### 示例二:发送 Markdown(`md`)
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
curl -sS -X POST 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.message.send' \
|
|
107
|
+
-H 'Content-Type: application/json' \
|
|
108
|
+
-H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
|
|
109
|
+
-d '{
|
|
110
|
+
"userId": "CREATOR_USER_ID",
|
|
111
|
+
"rid": "TARGET_ROOM_RID",
|
|
112
|
+
"agentId": "OPENCLAW_AGENT_ID",
|
|
113
|
+
"md": [
|
|
114
|
+
{
|
|
115
|
+
"type": "PARAGRAPH",
|
|
116
|
+
"value": [
|
|
117
|
+
{ "type": "PLAIN_TEXT", "value": "这是一条 *Markdown* 消息" }
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 参数
|
|
125
|
+
|
|
126
|
+
- `userId`(body,必填):创建者 / 调用方用户 ID(与 `agent.groups.get` 的 query `userId` 同源;脚本由凭证 `creator_user_id` 等提供)
|
|
127
|
+
- `rid`(body,必填):目标群聊房间 ID
|
|
128
|
+
- `agentId`(body,必填):OpenClaw 侧 Agent ID(会映射到机器人用户)
|
|
129
|
+
- `msg`(body,可选):消息文本
|
|
130
|
+
- `md`(body,可选):Markdown AST(Rocket.Chat `md` 结构)
|
|
131
|
+
- 约束:`msg` 和 `md` 至少提供一个
|
|
132
|
+
|
|
133
|
+
### 成功返回示例
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"success": true,
|
|
138
|
+
"data": {
|
|
139
|
+
"rid": "TARGET_ROOM_RID",
|
|
140
|
+
"agentId": "AGENT_BOT_USER_ID",
|
|
141
|
+
"status": "sent"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 常见失败
|
|
147
|
+
|
|
148
|
+
- `{"success":false,"message":"401"}`:JWT 无效或过期
|
|
149
|
+
- `{"success":false,"message":"userId, rid and agentId are required, and either msg or md must be provided"}`:缺少 `userId`/`rid`/`agentId` 或未提供 `msg`/`md`
|
|
150
|
+
- `{"success":false,"message":"room not found"}`:房间不存在
|
|
151
|
+
- `{"success":false,"message":"agent not found by agentId"}`:找不到对应 agentId 的机器人
|
|
152
|
+
- `{"success":false,"message":"agent must be a bot user"}`:agent 不是 bot
|
|
153
|
+
- `{"success":false,"message":"agent is inactive"}`:机器人未激活
|
|
154
|
+
- `{"success":false,"message":"agent is not in this room"}`:机器人不在该群里
|
|
155
|
+
|
|
156
|
+
### 带附件发送(`fileIds`)
|
|
157
|
+
|
|
158
|
+
先上传文件拿到 `file._id`,再放入 `send` 的 `fileIds` 数组:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"userId": "CREATOR_USER_ID",
|
|
163
|
+
"rid": "TARGET_ROOM_RID",
|
|
164
|
+
"agentId": "AGENT_BOT_USER_ID",
|
|
165
|
+
"msg": "请查收附件",
|
|
166
|
+
"fileIds": ["uploaded-file-id"]
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## `POST /api/v1/claw/agent.file.upload`
|
|
173
|
+
|
|
174
|
+
上传文件到 Appia 群聊(**不发消息**),返回 `file._id` 供 `agent.message.send` 的 `fileIds` 使用。
|
|
175
|
+
|
|
176
|
+
### 请求示例
|
|
177
|
+
|
|
178
|
+
`multipart/form-data`,字段:
|
|
179
|
+
|
|
180
|
+
| 字段 | 必填 |
|
|
181
|
+
|------|------|
|
|
182
|
+
| userId | 是 |
|
|
183
|
+
| agentId | 是 |
|
|
184
|
+
| rid | 是 |
|
|
185
|
+
| file | 是 |
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
curl -sS -X POST 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.file.upload' \
|
|
189
|
+
-H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
|
|
190
|
+
-F "userId=CREATOR_USER_ID" \
|
|
191
|
+
-F "agentId=AGENT_BOT_USER_ID" \
|
|
192
|
+
-F "rid=TARGET_ROOM_RID" \
|
|
193
|
+
-F "file=@./report.pdf"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 成功返回示例
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"success": true,
|
|
201
|
+
"data": {
|
|
202
|
+
"file": {
|
|
203
|
+
"_id": "uploaded-file-id",
|
|
204
|
+
"name": "report.pdf",
|
|
205
|
+
"type": "application/pdf",
|
|
206
|
+
"size": 102400
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 常见失败
|
|
213
|
+
|
|
214
|
+
- `{"success":false,"message":"401"}`:JWT 无效或过期
|
|
215
|
+
- `{"success":false,"message":"agent is not in this room"}`:机器人不在该群里
|
|
216
|
+
- `{"success":false,"message":"file is required"}`:未上传文件
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## `GET /api/v1/claw/agent.messages.get`
|
|
221
|
+
|
|
222
|
+
读取频道历史消息(倒序),用响应 `nextLatest` 作为 `latest` 翻页。脚本:`appia_claw.py get-messages`。
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
curl -H "Authorization: Bearer $MCP_JWT" \
|
|
226
|
+
"$SITE_URL/api/v1/claw/agent.messages.get?userId=$USER_ID&agentId=$AGENT_ID&rid=$RID&count=20"
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
| 参数 | 必填 | 说明 |
|
|
230
|
+
|------|------|------|
|
|
231
|
+
| userId, agentId, rid | 是 | |
|
|
232
|
+
| count, offset | 否 | 分页 |
|
|
233
|
+
| latest | 否 | ISO 时间,返回此时间之前 |
|
|
234
|
+
| showThreadMessages | 否 | 默认 true |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## `GET /api/v1/claw/agent.announcements.get`
|
|
239
|
+
|
|
240
|
+
读取频道公告,支持类型过滤。脚本:`appia_claw.py get-announcements`。类型:`0/normal` 普通公告、`1/meeting` 会议公告、`2/summary` 会议纪要。
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
curl -H "Authorization: Bearer $MCP_JWT" \
|
|
244
|
+
"$SITE_URL/api/v1/claw/agent.announcements.get?userId=$USER_ID&agentId=$AGENT_ID&rid=$RID"
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## `GET /api/v1/claw/agent.file.fetch`
|
|
250
|
+
|
|
251
|
+
下载频道附件(二进制流)。脚本:`appia_claw.py fetch-file`。
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
curl -H "Authorization: Bearer $MCP_JWT" \
|
|
255
|
+
"$SITE_URL/api/v1/claw/agent.file.fetch?userId=$USER_ID&agentId=$AGENT_ID&fileId=$FILE_ID&rid=$RID" \
|
|
256
|
+
-o ./attachment.pdf
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
| 参数 | 必填 | 说明 |
|
|
260
|
+
|------|------|------|
|
|
261
|
+
| userId, agentId, fileId | 是 | |
|
|
262
|
+
| rid | 否 | 建议传,校验文件属于该频道 |
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## `POST /api/v1/claw/agent.message.recall`
|
|
267
|
+
|
|
268
|
+
撤回 **bot 自己发送** 的消息。脚本:`appia_claw.py recall`。
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
curl -X POST "$SITE_URL/api/v1/claw/agent.message.recall" \
|
|
272
|
+
-H "Authorization: Bearer $MCP_JWT" -H "Content-Type: application/json" \
|
|
273
|
+
-d '{"userId":"'"$USER_ID"'","agentId":"'"$AGENT_ID"'","messageId":"'"$MSG_ID"'"}'
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## `POST /api/v1/claw/agent.group.leave`
|
|
279
|
+
|
|
280
|
+
bot 退出指定群聊。脚本:`appia_claw.py leave`。
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
curl -X POST "$SITE_URL/api/v1/claw/agent.group.leave" \
|
|
284
|
+
-H "Authorization: Bearer $MCP_JWT" -H "Content-Type: application/json" \
|
|
285
|
+
-d '{"userId":"'"$USER_ID"'","agentId":"'"$AGENT_ID"'","rid":"'"$RID"'"}'
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 扩展能力 / 会议纪要 / 总览
|
|
291
|
+
|
|
292
|
+
`scopes.*`、`users.search`、`notifications/todos/unread`、`channels.*`、`channel.*`、`meeting.minutes.*`、`overview.*`、`tool.invoke` 的 curl 与工作流见 `references/` 目录:
|
|
293
|
+
|
|
294
|
+
- [auth.md](references/auth.md) · [creator-delegate-api.md](references/creator-delegate-api.md) · [query-api.md](references/query-api.md) · [write-api.md](references/write-api.md)
|
|
295
|
+
- [rooms-api.md](references/rooms-api.md)
|
|
296
|
+
- [overview-api.md](references/overview-api.md) · [session-flow.md](references/session-flow.md)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# 鉴权与授权
|
|
2
|
+
|
|
3
|
+
## 三句话
|
|
4
|
+
|
|
5
|
+
1. **干活的是机器人**(SophClaw),凭证只有 `MCP_JWT` + `userId` + `agentId`。
|
|
6
|
+
2. **用户 `authToken` 永不给 Agent。**
|
|
7
|
+
3. **「授权」** = 用户在 myAgent 点卡片,允许这个机器人使用某些 **scopes**;之后仍是机器人调接口,服务端查库校验。
|
|
8
|
+
|
|
9
|
+
不是:换用户登录、下发 RC Token、或「创建者本人去操作」。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 配置(USER.md)
|
|
14
|
+
|
|
15
|
+
| 项 | 含义 |
|
|
16
|
+
|----|------|
|
|
17
|
+
| `SITE_URL` | 如 `https://ssc.appia.cn` |
|
|
18
|
+
| `userId` | Agent 创建者 ID(归属校验,不是登录态) |
|
|
19
|
+
| `agentId` | OpenClaw agent ID |
|
|
20
|
+
| `MCP_JWT` | `Authorization: Bearer …` |
|
|
21
|
+
|
|
22
|
+
企业识别码 → 地址(大小写不敏感):SSC → `ssc.appia.cn`;BITMAIN → `appia.cn`;SOPHGO → `sophgo.appia.cn`。
|
|
23
|
+
|
|
24
|
+
### JWT 规则
|
|
25
|
+
|
|
26
|
+
- 开启 `Appia_Antagent_JWT_Enable` 时,Bearer JWT 必须有效且未过期。
|
|
27
|
+
- JWT 的 `sub`(或 `uid`)**必须等于**请求中的 `userId`。
|
|
28
|
+
- 入群、扩展均同一规则。
|
|
29
|
+
|
|
30
|
+
> **本 skill 脚本**:`appia_claw.py` 读 `CLAW_JWT`;`appia_extensions.py`(经 `appia_common.py`)同时接受 `CLAW_JWT` 与 `MCP_JWT`,任一非空即可;`APP_AGENT_ID` / `CLAW_USER_ID` 同理。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 两类能力(都是机器人在调)
|
|
35
|
+
|
|
36
|
+
| | 入群 | 扩展(scopes) |
|
|
37
|
+
|--|------|----------------|
|
|
38
|
+
| 条件 | bot 已在频道 | 服务端 `appiaClawAgentScopes` 通过 |
|
|
39
|
+
| 例子 | 发消息、附件、撤回 | 待办、搜人、建群、总览元数据 |
|
|
40
|
+
| 凭证 | MCP JWT | MCP JWT(同一个) |
|
|
41
|
+
|
|
42
|
+
扩展能力在服务端会按创建者可见范围执行业务,但对 Agent 而言**没有第二条登录线**。
|
|
43
|
+
|
|
44
|
+
总览:**元数据**已落地(`overview.resolve`);**行数据**未落地,见 [overview-api.md](overview-api.md)。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 授权(scopes)
|
|
49
|
+
|
|
50
|
+
### 是什么
|
|
51
|
+
|
|
52
|
+
scopes = 服务端记在该 Agent 上的能力开关。
|
|
53
|
+
创建时默认**只读**;建群 / 改待办等 **write** 要用户点一次卡片。
|
|
54
|
+
|
|
55
|
+
### 流程
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
1. 机器人调写接口(如 channels.create)
|
|
59
|
+
2. 返回 SCOPE_DENIED + missingScope
|
|
60
|
+
3. 机器人 POST claw/agent.scopes.request(说明要哪些 scopes、原因)
|
|
61
|
+
4. 创建者 myAgent 出现卡片 → 用户点「授权」或「拒绝」
|
|
62
|
+
5. 授权成功:服务端合并写入 appiaClawAgentScopes
|
|
63
|
+
6. 机器人 scopes.get 确认,或直接重试原接口
|
|
64
|
+
(全程只有 MCP_JWT,没有 authToken)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
对用户可以说:「请到 Appia 的 myAgent / 我的助手 里点一下授权卡片。」
|
|
68
|
+
不要说:「请把登录密码/验证码/Token 发给我。」
|
|
69
|
+
|
|
70
|
+
### 常用 scopes
|
|
71
|
+
|
|
72
|
+
| Scope | 含义 |
|
|
73
|
+
|-------|------|
|
|
74
|
+
| `users:read` | 搜人(默认有) |
|
|
75
|
+
| `channels:read` / `write` | 搜频道 / 建频道 |
|
|
76
|
+
| `todos:read` / `write` | 待办 |
|
|
77
|
+
| `notifications:read` | 通知 |
|
|
78
|
+
| `meetings:read` | 会议纪要 |
|
|
79
|
+
| `overview:read` | 总览元数据 |
|
|
80
|
+
| `files:read` | 文件元数据 |
|
|
81
|
+
|
|
82
|
+
默认只读:`channels:read`, `todos:read`, `notifications:read`, `meetings:read`, `overview:read`, `files:read`, `users:read`。
|
|
83
|
+
|
|
84
|
+
### 相关接口
|
|
85
|
+
|
|
86
|
+
| 方法 | 路径 | 作用 |
|
|
87
|
+
|------|------|------|
|
|
88
|
+
| GET | `claw/agent.scopes.get` | 查看当前 scopes |
|
|
89
|
+
| POST | `claw/agent.scopes.request` | 申请开权限(发卡片) |
|
|
90
|
+
|
|
91
|
+
完整扩展 API 见 [creator-delegate-api.md](creator-delegate-api.md)。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 调用示例
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 查已授权 scopes
|
|
99
|
+
curl -H "Authorization: Bearer $MCP_JWT" \
|
|
100
|
+
"$SITE_URL/api/v1/claw/agent.scopes.get?userId=$USER_ID&agentId=$AGENT_ID"
|
|
101
|
+
|
|
102
|
+
# 申请写权限(用户去 myAgent 点授权)
|
|
103
|
+
curl -X POST "$SITE_URL/api/v1/claw/agent.scopes.request" \
|
|
104
|
+
-H "Authorization: Bearer $MCP_JWT" -H "Content-Type: application/json" \
|
|
105
|
+
-d '{"userId":"'"$USER_ID"'","agentId":"'"$AGENT_ID"'","scopes":["channels:write"],"reason":"建群"}'
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 明确不做
|
|
111
|
+
|
|
112
|
+
- 向用户要 authToken / 短信码 / 密码
|
|
113
|
+
- 把授权说成「请用你的账号登录给 Agent」
|
|
114
|
+
- 用创建者 ID 冒充提问者读总览行(行接口本身也未落地)
|
|
115
|
+
- 调用不存在的 `agent.overview.read`
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 扩展能力 API
|
|
2
|
+
|
|
3
|
+
调用方:**机器人**。鉴权:`Authorization: Bearer MCP_JWT` + `userId` + `agentId`(JWT `sub` === `userId`)。
|
|
4
|
+
前缀:`{SITE_URL}/api/v1/claw/`。
|
|
5
|
+
|
|
6
|
+
**授权说明**见 [auth.md](auth.md)。此处只列 **scopes 管控** 的端点。
|
|
7
|
+
入群见 [../reference-http.md](../reference-http.md)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 授权相关
|
|
12
|
+
|
|
13
|
+
| 方法 | 路径 | 说明 |
|
|
14
|
+
|------|------|------|
|
|
15
|
+
| GET | `agent.scopes.get` | 当前 scopes |
|
|
16
|
+
| POST | `agent.scopes.request` | 发 myAgent 授权卡片 |
|
|
17
|
+
|
|
18
|
+
缺权限业务响应:`code: SCOPE_DENIED`,`missingScope: "channels:write"` 等。
|
|
19
|
+
|
|
20
|
+
默认只读:`channels:read`, `todos:read`, `notifications:read`, `meetings:read`, `overview:read`, `files:read`, `users:read`。
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl -X POST "$SITE_URL/api/v1/claw/agent.scopes.request" \
|
|
24
|
+
-H "Authorization: Bearer $MCP_JWT" -H "Content-Type: application/json" \
|
|
25
|
+
-d '{"userId":"'"$USER_ID"'","agentId":"'"$AGENT_ID"'","scopes":["channels:write"],"reason":"建群"}'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Agent 收到 `SCOPE_DENIED` 时:`scopes.request` → 请用户去 myAgent 点授权 → `scopes.get` 或重试。**不要**要 authToken。
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 人员
|
|
33
|
+
|
|
34
|
+
| 方法 | 路径 | Scope |
|
|
35
|
+
|------|------|-------|
|
|
36
|
+
| GET | `agent.users.search` | `users:read` |
|
|
37
|
+
|
|
38
|
+
Query:`q`(或 `name`/`text`/`keyword`)、`limit`(默认 20,上限 50)。
|
|
39
|
+
返回:`users[]` 仅 `_id`、`username`。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 通知 / 待办 / 未读
|
|
44
|
+
|
|
45
|
+
| 方法 | 路径 | Scope |
|
|
46
|
+
|------|------|-------|
|
|
47
|
+
| GET | `agent.notifications.list` | `notifications:read` |
|
|
48
|
+
| GET | `agent.todos.list` | `todos:read` |
|
|
49
|
+
| GET | `agent.unread.summary` | `channels:read` |
|
|
50
|
+
| POST | `agent.todos.update-status` | `todos:write` |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 频道
|
|
55
|
+
|
|
56
|
+
| 方法 | 路径 | Scope |
|
|
57
|
+
|------|------|-------|
|
|
58
|
+
| GET | `agent.channels.search` | `channels:read` |
|
|
59
|
+
| GET | `agent.channel.info.get` | `channels:read` |
|
|
60
|
+
| GET | `agent.channel.messages.list` | `channels:read` |
|
|
61
|
+
| GET | `agent.channel.messages.search` | `channels:read` |
|
|
62
|
+
| GET | `agent.channel.members.list` | `channels:read` |
|
|
63
|
+
| GET | `agent.channel.attachments.list` | `channels:read` |
|
|
64
|
+
| GET | `agent.channel.announcements.list` | `channels:read` |
|
|
65
|
+
| GET | `agent.file.metadata.get` | `files:read` |
|
|
66
|
+
| POST | `agent.channels.create` | `channels:write` |
|
|
67
|
+
|
|
68
|
+
建频道:`members` 按需加人,不要默认加 Claw 创建者。见 [rooms-api.md](rooms-api.md)。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 会议纪要 / 总览元数据
|
|
73
|
+
|
|
74
|
+
| 方法 | 路径 | Scope |
|
|
75
|
+
|------|------|-------|
|
|
76
|
+
| GET | `agent.meeting.minutes.list` | `meetings:read` |
|
|
77
|
+
| GET | `agent.meeting.minutes.ingest.list` | `meetings:read` |
|
|
78
|
+
| GET | `agent.overview.resolve` | `overview:read` |
|
|
79
|
+
| GET | `agent.channel.overview.links.list` | `overview:read` |
|
|
80
|
+
|
|
81
|
+
> 预定会议(`agent.meeting.book`)暂未纳入本 skill。
|
|
82
|
+
总览**行**接口未落地,见 [overview-api.md](overview-api.md)。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 聚合
|
|
87
|
+
|
|
88
|
+
| 方法 | 路径 | 说明 |
|
|
89
|
+
|------|------|------|
|
|
90
|
+
| POST | `agent.tool.invoke` | `{ userId, agentId, tool, args }` |
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 项目总览表 API
|
|
2
|
+
|
|
3
|
+
读取**普通项目总览表**(`type=overview`)。
|
|
4
|
+
|
|
5
|
+
**不要**直连 `projects.appia.vip/.../overview-rows`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 已落地:总览元数据
|
|
10
|
+
|
|
11
|
+
不拉行数据,只解析链接 / id → 元数据。Scope:`overview:read`。
|
|
12
|
+
调用方:机器人 + MCP JWT。
|
|
13
|
+
|
|
14
|
+
| 方法 | 路径 |
|
|
15
|
+
|------|------|
|
|
16
|
+
| GET | `claw/agent.overview.resolve` |
|
|
17
|
+
| GET | `claw/agent.channel.overview.links.list` |
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
curl -G "$SITE_URL/api/v1/claw/agent.overview.resolve" \
|
|
21
|
+
-H "Authorization: Bearer $MCP_JWT" \
|
|
22
|
+
--data-urlencode "userId=$USER_ID" \
|
|
23
|
+
--data-urlencode "agentId=$AGENT_ID" \
|
|
24
|
+
--data-urlencode "url=https://projects.appia.vip/671b5197d786b2b857af5e60?doc=LbU1uE"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
参数与 C3A `appia.overview.resolve` 一致(另加 `userId`+`agentId`)。详见 [query-api.md](query-api.md)、[creator-delegate-api.md](creator-delegate-api.md)。
|
|
28
|
+
|
|
29
|
+
### 如何拿到 overview 链接
|
|
30
|
+
|
|
31
|
+
1. 入群:`GET agent.announcements.get?rid=...`
|
|
32
|
+
2. 扩展:`agent.channel.overview.links.list`
|
|
33
|
+
3. 从 URL 提取 24 位 hex:`https://projects.appia.vip/{overviewId}?doc={docKey}`
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 行级读取:未落地
|
|
38
|
+
|
|
39
|
+
`agent.overview.read` / `agent.overview.permission` **当前未注册**。
|
|
40
|
+
|
|
41
|
+
用户要看延期行 / 周报时:
|
|
42
|
+
|
|
43
|
+
1. 用 `overview.resolve` 确认链接与元数据;
|
|
44
|
+
2. 告知用户「行级数据接口尚未开通,请在网页打开该总览查看」;
|
|
45
|
+
3. **不要**猜测调用 `overview.read`,也**不要**用创建者身份冒充提问者去读。
|
|
46
|
+
|
|
47
|
+
将来若落地,须按提问者 `requestUserId`(来自 stream)鉴权,不能用创建者 `userId` 顶替。
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# 查询 API(Agent 扩展能力)
|
|
2
|
+
|
|
3
|
+
**调用方是机器人**,MCP JWT。完整端点见 [creator-delegate-api.md](creator-delegate-api.md)。鉴权见 [auth.md](auth.md)。
|
|
4
|
+
|
|
5
|
+
群聊代发:见 [claw-api.md](../reference-http.md)。
|
|
6
|
+
总览**元数据**:见 [overview-api.md](overview-api.md)(行数据未落地)。
|
|
7
|
+
|
|
8
|
+
只有**频道名**时:先 `agent.channels.search`(参数 `name`),不要把频道名当 rid。
|
|
9
|
+
只有**人名**时:先 `agent.users.search`(参数 `q`),再用返回的 `username`。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 鉴权(所有 claw 查询)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Authorization: Bearer <MCP_JWT>
|
|
17
|
+
Query/Body: userId=<创建者> & agentId=<agentId>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
JWT 的 `sub`/`uid` 必须等于 `userId`。对应 scope 见下表。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 0. 搜人
|
|
25
|
+
|
|
26
|
+
| 做什么 | 方法 | 路径 | Scope |
|
|
27
|
+
|--------|------|------|-------|
|
|
28
|
+
| 按姓名/username 搜人 | GET | `claw/agent.users.search` | `users:read` |
|
|
29
|
+
|
|
30
|
+
Query:`q`(或 `name`/`text`/`keyword`)、`limit`。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. 通知 / 待办 / 未读
|
|
35
|
+
|
|
36
|
+
| 做什么 | 方法 | 路径 | Scope |
|
|
37
|
+
|--------|------|------|-------|
|
|
38
|
+
| 通知列表 | GET | `claw/agent.notifications.list` | `notifications:read` |
|
|
39
|
+
| 待办列表 | GET | `claw/agent.todos.list` | `todos:read` |
|
|
40
|
+
| 未读汇总 | GET | `claw/agent.unread.summary` | `channels:read` |
|
|
41
|
+
|
|
42
|
+
常用 query:`limit`、`status`(待办)、`since`(通知)。
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
curl -H "Authorization: Bearer $MCP_JWT" \
|
|
46
|
+
"$SITE_URL/api/v1/claw/agent.todos.list?userId=$USER_ID&agentId=$AGENT_ID&limit=20"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 2. 频道发现与消息
|
|
52
|
+
|
|
53
|
+
| 做什么 | 方法 | 路径 | Scope |
|
|
54
|
+
|--------|------|------|-------|
|
|
55
|
+
| 按名搜频道 | GET | `claw/agent.channels.search` | `channels:read` |
|
|
56
|
+
| 频道信息 | GET | `claw/agent.channel.info.get` | `channels:read` |
|
|
57
|
+
| 成员 | GET | `claw/agent.channel.members.list` | `channels:read` |
|
|
58
|
+
| 最近消息 | GET | `claw/agent.channel.messages.list` | `channels:read` |
|
|
59
|
+
| 频道内搜索 | GET | `claw/agent.channel.messages.search` | `channels:read` |
|
|
60
|
+
| 附件列表 | GET | `claw/agent.channel.attachments.list` | `channels:read` |
|
|
61
|
+
| 公告 | GET | `claw/agent.channel.announcements.list` | `channels:read` |
|
|
62
|
+
| 文件元数据 | GET | `claw/agent.file.metadata.get` | `files:read` |
|
|
63
|
+
|
|
64
|
+
频道类参数:`rid` 或 `name`/`channelName`;搜索另需 `keyword`。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 3. 会议纪要 / 总览元数据
|
|
69
|
+
|
|
70
|
+
| 做什么 | 方法 | 路径 | Scope |
|
|
71
|
+
|--------|------|------|-------|
|
|
72
|
+
| 纪要列表 | GET | `claw/agent.meeting.minutes.list` | `meetings:read` |
|
|
73
|
+
| 纪要入库记录 | GET | `claw/agent.meeting.minutes.ingest.list` | `meetings:read` |
|
|
74
|
+
| 总览链接→元数据 | GET | `claw/agent.overview.resolve` | `overview:read` |
|
|
75
|
+
| 扫频道总览链接 | GET | `claw/agent.channel.overview.links.list` | `overview:read` |
|
|
76
|
+
|
|
77
|
+
行级总览(延期/周报)须 `requestUserId`,见 [overview-api.md](overview-api.md)。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. 聚合调用
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
POST /api/v1/claw/agent.tool.invoke
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"userId": "<creator>",
|
|
90
|
+
"agentId": "<agentId>",
|
|
91
|
+
"tool": "appia.channels.search",
|
|
92
|
+
"args": { "name": "产品周会", "limit": 5 }
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`tool` 为对应 C3A 名(如 `appia.todos.list`);仅支持上表已映射工具。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 5. 推荐链路
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
「某某频道最近聊什么」→ agent.channels.search → channel.messages.list / search
|
|
104
|
+
「我的待办 / 通知」 → agent.todos.list / notifications.list
|
|
105
|
+
「会议纪要」 → agent.meeting.minutes.list
|
|
106
|
+
「总览链接是啥」 → agent.overview.resolve(行数据未落地,勿调 overview.read)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
写操作(改待办、建频道)见 [write-api.md](write-api.md)、[rooms-api.md](rooms-api.md)。预定会议暂未纳入本 skill。
|