WeKnora MCP Dispatch

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.

Category
访问服务器

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_bases
  • get_knowledge_base
  • hybrid_search
  • list_knowledge
  • get_knowledge
  • list_chunks
  • list_agents
  • get_agent
  • wiki_search
  • wiki_read_page
  • wiki_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_KEYMCP_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

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选