WeKnora MCP Dispatch
Multi-user MCP gateway for WeKnora v0.7.1 that accepts per-request WeKnora API keys, enabling client-scoped access to spaces and knowledge bases through a single Streamable HTTP MCP endpoint.
README
WeKnora MCP Dispatch
面向 WeKnora v0.7.1 的多用户 MCP 网关。一个 Streamable HTTP MCP 服务实例可以接收多个客户端请求,并以客户端提交的 WeKnora API Key 决定其可访问的空间和知识库。
本项目基于 WeKnora MCP Server 改造,重点解决单个服务端静态 API Key 无法实现客户端权限隔离的问题。
鉴权链路
MCP client
├─ 可选:Cloudflare Access Service Token
└─ Authorization: Bearer <WeKnora API Key>
↓
WeKnora MCP Dispatch
├─ 使用只读 /knowledge-bases 请求验证 API Key
├─ 将 Key 绑定到当前异步请求上下文
└─ 以 X-API-Key 转发到 WeKnora API
↓
WeKnora v0.7.1
不同客户端不共享静态 WeKnora Key。请求级 Key 使用 Python ContextVar
隔离,即使请求重叠执行,也不会把一个客户端的身份转发给另一个客户端。
安全特性
- 公网 MCP 只接受
Authorization: Bearer <WeKnora API Key>。 - 不接受外部
X-API-Key作为第二条认证通道。 - API Key 通过 WeKnora 的只读接口验证。
- 验证缓存只保存 SHA-256 指纹,不保存原始 Key。
- 缓存条目数、TTL 和验证并发均有上限。
- 上游临时限流或不可用返回
503,不会误判 Key 永久无效。 MCP_READ_ONLY=true时只注册/允许知识库查询工具。MCP_HTTP_PATH=/mcp时仅接受/mcp与/mcp/。- 动态 Key 模式不会回退到
WEKNORA_API_KEY静态环境变量。
只读工具
生产只读模式允许:
list_knowledge_basesget_knowledge_basehybrid_searchlist_knowledgeget_knowledgelist_chunkslist_agentsget_agentwiki_searchwiki_read_pagewiki_index_view
Docker 运行
docker build -t weknora-mcp-dispatch:0.1.0 .
docker run --rm \
--name weknora-mcp-dispatch \
-p 127.0.0.1:18082:8000 \
-e WEKNORA_BASE_URL=http://app:8080/api/v1 \
-e MCP_AUTH_MODE=weknora_api_key \
-e MCP_READ_ONLY=true \
-e MCP_HTTP_PATH=/mcp \
-e MCP_API_KEY_VALIDATION_TTL_SECONDS=60 \
-e MCP_API_KEY_VALIDATION_CACHE_MAX_ENTRIES=2048 \
-e MCP_API_KEY_VALIDATION_MAX_CONCURRENCY=16 \
-e WEKNORA_API_KEY= \
-e MCP_SERVER_AUTH_TOKEN= \
weknora-mcp-dispatch:0.1.0
如使用 WeKnora 官方 Compose,可参考
production.request-scoped.override.yml
为现有 mcp 服务启用请求级鉴权。
客户端请求头
直接访问 MCP:
Authorization: Bearer <WEKNORA_SPACE_API_KEY>
如果外层使用 Cloudflare Access Service Token:
CF-Access-Client-Id: <CLOUDFLARE_SERVICE_TOKEN_CLIENT_ID>
CF-Access-Client-Secret: <CLOUDFLARE_SERVICE_TOKEN_CLIENT_SECRET>
Authorization: Bearer <WEKNORA_SPACE_API_KEY>
Cloudflare 负责公网入口鉴权,WeKnora API Key 负责用户/空间权限控制;两层可以同时启用。
WorkBuddy 配置示例
WorkBuddy 支持用户级 ~/.workbuddy/mcp.json 和项目级
<项目目录>/.workbuddy/mcp.json。以下示例通过环境变量保存凭据:
{
"mcpServers": {
"weknora": {
"type": "http",
"url": "https://kb.example.com/mcp",
"headers": {
"Authorization": "Bearer ${WEKNORA_SPACE_API_KEY}",
"CF-Access-Client-Id": "${CF_ACCESS_CLIENT_ID}",
"CF-Access-Client-Secret": "${CF_ACCESS_CLIENT_SECRET}"
}
}
}
}
将 url 替换为实际 MCP 地址,并在启动 WorkBuddy 前设置三个环境变量。
如果没有启用 Cloudflare Access Service Token,删除两个 CF-Access-* 请求头即可。
保存配置后,在 WorkBuddy 的 MCP 页面确认服务状态为绿色。
参考:WorkBuddy MCP 配置说明、 HTTP MCP 配置字段。
Codex 配置示例
在 ~/.codex/config.toml 中加入:
[mcp_servers.weknora]
url = "https://kb.example.com/mcp"
bearer_token_env_var = "WEKNORA_SPACE_API_KEY"
env_http_headers = { "CF-Access-Client-Id" = "CF_ACCESS_CLIENT_ID", "CF-Access-Client-Secret" = "CF_ACCESS_CLIENT_SECRET" }
Codex 会从 WEKNORA_SPACE_API_KEY 读取 Bearer Token,并从另外两个环境变量
生成 Cloudflare Access 请求头。未启用 Cloudflare Access Service Token 时,删除
env_http_headers 这一行即可。设置环境变量后重启 Codex,再通过 codex mcp list
确认服务已加载。
不建议把 WeKnora API Key 或 Cloudflare Client Secret 明文提交到配置仓库。
环境变量
| 变量 | 推荐值 | 说明 |
|---|---|---|
WEKNORA_BASE_URL |
http://app:8080/api/v1 |
WeKnora API 地址 |
MCP_AUTH_MODE |
weknora_api_key |
启用请求级 WeKnora Key |
MCP_READ_ONLY |
true |
禁止写入类 MCP 工具 |
MCP_HTTP_PATH |
/mcp |
对外 MCP 路径 |
MCP_API_KEY_VALIDATION_TTL_SECONDS |
60 |
Key 验证缓存 TTL |
MCP_API_KEY_VALIDATION_CACHE_MAX_ENTRIES |
2048 |
最大缓存指纹数 |
MCP_API_KEY_VALIDATION_MAX_CONCURRENCY |
16 |
最大并发验证数 |
WEKNORA_VERIFY_SSL |
true |
验证 WeKnora HTTPS 证书 |
请求级模式下应保持 WEKNORA_API_KEY 和 MCP_SERVER_AUTH_TOKEN 为空。
HTTP 结果
| 状态码 | 含义 |
|---|---|
401 |
缺少 WeKnora API Key |
403 |
Key 无效或不可用于 WeKnora API |
404 |
请求路径不在配置的 MCP 精确路径内 |
503 |
WeKnora Key 验证暂时不可用或并发受限 |
本地测试
python -m pip install -e ".[test]"
pytest
测试覆盖缺失/无效 Key、外部 X-API-Key 拒绝、重叠请求身份隔离、
缓存不保存原始 Key、临时限流、Streamable HTTP 任务上下文继承和精确路径限制。
兼容模式
项目仍保留上游 shared_secret 模式,便于兼容旧客户端;多用户生产部署应使用
MCP_AUTH_MODE=weknora_api_key。
上游与许可证
本项目基于 WeKnora MCP Server 及其 MIT 许可代码改造。原始项目资料和兼容说明 保留在仓库文档中;本仓库的生产入口重点面向 WeKnora v0.7.1 多用户派发场景。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。