|
|
|
|
@ -38,6 +38,18 @@ headers = {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`Authorization` 的 header 值直接传 token 原文,不要拼接 `Bearer ` 前缀。例如:
|
|
|
|
|
|
|
|
|
|
```http
|
|
|
|
|
Authorization: xxxxx
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
不要传成:
|
|
|
|
|
|
|
|
|
|
```http
|
|
|
|
|
Authorization: Bearer xxxxx
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
然后在创建 MCP 连接时透传:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
@ -55,7 +67,7 @@ async with streamable_http_client(self.server_url, headers=headers or None) as (
|
|
|
|
|
|
|
|
|
|
1. 在 OpenClaw 运行环境中配置 `EDUCODER_AUTHORIZATION`
|
|
|
|
|
2. 每次创建 MCPClient 或建立 MCP 连接时,从 `os.getenv("EDUCODER_AUTHORIZATION")` 读取最新值
|
|
|
|
|
3. 把读取到的值放进 MCP transport headers 的 `Authorization`
|
|
|
|
|
3. 把读取到的 token 原文放进 MCP transport headers 的 `Authorization`,不要添加 `Bearer ` 前缀
|
|
|
|
|
4. 多个会话可以分别创建 MCPClient 实例,但认证 token 都来自同一个环境变量
|
|
|
|
|
|
|
|
|
|
### 401 Token 过期处理
|
|
|
|
|
@ -92,7 +104,7 @@ export EDUCODER_AUTHORIZATION="new-token"
|
|
|
|
|
2. 在 OpenClaw 运行环境中配置 `EDUCODER_AUTHORIZATION`
|
|
|
|
|
3. 当前用户发起工具调用时,后端创建 MCPClient
|
|
|
|
|
4. MCPClient 建连时从环境变量读取 `EDUCODER_AUTHORIZATION`
|
|
|
|
|
5. MCPClient 把读取到的值放进 MCP headers
|
|
|
|
|
5. MCPClient 把读取到的 token 原文放进 MCP headers,不要添加 `Bearer ` 前缀
|
|
|
|
|
6. 如果调用返回 `401 Unauthorized`,提示用户重新输入 token,更新 `EDUCODER_AUTHORIZATION` 后重新建连并重试
|
|
|
|
|
|
|
|
|
|
参考流程:
|
|
|
|
|
@ -128,6 +140,7 @@ class MCPClient:
|
|
|
|
|
|
|
|
|
|
- 让用户在每个会话里重复输入 `Authorization`
|
|
|
|
|
- 把 `Authorization` 放到工具参数里
|
|
|
|
|
- 给 `Authorization` 自动拼接 `Bearer ` 前缀
|
|
|
|
|
- 在进程启动后只读取一次 token,导致环境变量更新后无法生效
|
|
|
|
|
|
|
|
|
|
## 触发场景
|
|
|
|
|
@ -176,7 +189,7 @@ class MCPClient:
|
|
|
|
|
- 参数名必须严格匹配工具定义
|
|
|
|
|
- 当前查询逻辑还是占位实现,后续会接外部 HTTP 接口
|
|
|
|
|
- `course_id` 和 `exercise_id` 当前按字符串传入
|
|
|
|
|
- 客户端每次连接 MCP 服务时,请从环境变量 `EDUCODER_AUTHORIZATION` 读取 token,并在 transport headers 中传 `Authorization`
|
|
|
|
|
- 客户端每次连接 MCP 服务时,请从环境变量 `EDUCODER_AUTHORIZATION` 读取 token 原文,并在 transport headers 中传 `Authorization`,不要添加 `Bearer ` 前缀
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
@ -315,7 +328,7 @@ async def main():
|
|
|
|
|
|
|
|
|
|
- 当前服务使用 `streamable-http`,不是 SSE
|
|
|
|
|
- 如果客户端使用了 `sse_client`,将无法正常调用当前服务
|
|
|
|
|
- `Authorization` 应从环境变量 `EDUCODER_AUTHORIZATION` 读取,通过 MCP 连接层 headers 传入,不放在工具参数里
|
|
|
|
|
- `Authorization` 应从环境变量 `EDUCODER_AUTHORIZATION` 读取 token 原文,通过 MCP 连接层 headers 传入,不放在工具参数里,也不要添加 `Bearer ` 前缀
|
|
|
|
|
- 调用接口返回 `401 Unauthorized` 时,视为 token 过期或无效,应要求用户重新输入 token,并更新到环境变量 `EDUCODER_AUTHORIZATION`
|
|
|
|
|
- 当前工具返回空 `data` 数组属于预期行为,因为外部接口尚未接入
|
|
|
|
|
- 后续新增或调整工具时,需要同步更新本文件
|
|
|
|
|
|