diff --git a/SKILL.md b/SKILL.md index f399283..37dd889 100644 --- a/SKILL.md +++ b/SKILL.md @@ -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` 数组属于预期行为,因为外部接口尚未接入 - 后续新增或调整工具时,需要同步更新本文件