Skip to main content
Glama
mwe-support

WeKnora MCP Dispatch

by mwe-support
README.md
# WeKnora MCP Dispatch

这是面向 WeKnora v0.7.2 的多用户 MCP 网关,基于官方 MCP Server 1.1.1
(MCP Python SDK 2.x 高层 API)改造。一个 Streamable HTTP 服务实例可以接收
多个客户端请求,并以每个客户端提交的 WeKnora API Key 决定其可访问的空间和知识库。

## 定制能力

- `MCP_AUTH_MODE=weknora_api_key`:将 Bearer Token 作为 WeKnora API Key 验证。
- API Key 仅绑定到当前 MCP 请求上下文,异步任务和同步工具工作线程均保持租户隔离。
- 动态 Key 模式不会回退到服务端静态 `WEKNORA_API_KEY`,上下文丢失时失败关闭。
- 验证缓存只保存 SHA-256 指纹;缓存容量、TTL 和验证并发均有上限。
- `MCP_READ_ONLY=true`:从 MCP 2.x 工具注册表移除写入、会话和聊天工具。
- 保留上游 `shared_secret` 和 stdio 模式,便于兼容原有部署。

请求链路:

```text
MCP client
  ├─ 可选:外层网关鉴权请求头
  └─ Authorization: Bearer <WeKnora API Key>
          ↓
WeKnora MCP Dispatch
  ├─ GET /knowledge-bases 验证 Key
  ├─ 绑定当前请求身份
  └─ X-API-Key 转发至 WeKnora API
```

## 生产 Docker 配置

使用本仓库构建镜像,并参考
[`production.request-scoped.override.yml`](./production.request-scoped.override.yml)
覆盖 WeKnora 官方 Compose 的 `mcp` 服务。请求级模式下应保持
`WEKNORA_API_KEY` 和 `MCP_SERVER_AUTH_TOKEN` 为空。

```bash
docker build -t local/weknora-mcp-dispatch:v0.7.2 .
```

关键环境变量:

| 变量 | 推荐值 | 说明 |
| --- | --- | --- |
| `WEKNORA_BASE_URL` | `http://app:8080/api/v1` | WeKnora API 地址 |
| `MCP_AUTH_MODE` | `weknora_api_key` | 启用请求级空间 Key |
| `MCP_READ_ONLY` | `true` | 仅暴露知识查询工具 |
| `MCP_HTTP_PATH` | `/mcp` | Streamable HTTP 路径 |
| `MCP_API_KEY_VALIDATION_TTL_SECONDS` | `60` | 验证缓存 TTL |
| `MCP_API_KEY_VALIDATION_CACHE_MAX_ENTRIES` | `2048` | 最大缓存指纹数 |
| `MCP_API_KEY_VALIDATION_MAX_CONCURRENCY` | `16` | 最大并发验证数 |

## WorkBuddy 配置示例

写入用户级 `~/.workbuddy/mcp.json` 或项目级 `.workbuddy/mcp.json`:

```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}"
      }
    }
  }
}
```

如果入口没有 Cloudflare Access,删除两个 `CF-Access-*` 请求头即可。

## Codex 配置示例

在 `~/.codex/config.toml` 中加入:

```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" }
```

如果入口没有 Cloudflare Access,删除 `env_http_headers`。不要把 WeKnora API Key
或外层网关 Secret 明文提交到配置仓库。

## 快速开始

> 推荐直接参考 [MCP配置说明](./MCP_CONFIG.md),无需进行以下操作。
> 本节沿用上游 stdio/静态 Key 用法;多用户 HTTP 生产部署请使用上面的请求级配置。

### 1. 安装依赖
```bash
pip install -r requirements.txt
```

### 2. 配置环境变量
```bash
# Linux/macOS
export WEKNORA_BASE_URL="http://localhost:8080/api/v1"
export WEKNORA_API_KEY="your_api_key_here"

# Windows PowerShell
$env:WEKNORA_BASE_URL="http://localhost:8080/api/v1"
$env:WEKNORA_API_KEY="your_api_key_here"

# Windows CMD
set WEKNORA_BASE_URL=http://localhost:8080/api/v1
set WEKNORA_API_KEY=your_api_key_here
```

### 3. 运行服务器

**推荐方式 - 使用主入口点:**
```bash
python main.py
```

**其他运行方式:**
```bash
# 使用原始启动脚本
python run_server.py

# 使用便捷脚本
python run.py

# 直接运行服务器模块
python weknora_mcp_server.py

# 作为 Python 模块运行
python -m weknora_mcp_server
```

### 4. 命令行选项
```bash
python main.py --help                 # 显示帮助信息
python main.py --check-only           # 仅检查环境配置
python main.py --verbose              # 启用详细日志
python main.py --version              # 显示版本信息
```

## 安装为 Python 包

### 从 PyPI 安装

```bash
pip install tencent-weknora-mcp
# 或使用 uvx 直接运行(无需预安装)
uvx --from tencent-weknora-mcp weknora-mcp-server
```

> 官方 PyPI 包名为 **`tencent-weknora-mcp`**(Tencent/WeKnora 维护,Trusted Publishing 发布)。
> 旧社区包 `weknora-mcp` 请不要再使用。
> 安装后命令行入口仍为 `weknora-mcp-server` / `weknora-server`。
> 官方 PyPI 包不包含本仓库的请求级多用户派发功能;生产部署该功能时应构建本仓库。

### 开发模式安装
```bash
pip install -e .
```

安装后可以使用命令行工具:
```bash
weknora-mcp-server
# 或
weknora-server
```

### 生产模式安装
```bash
pip install .
```

### 构建分发包
```bash
# 使用 setuptools
python setup.py sdist bdist_wheel

# 使用现代构建工具
pip install build
python -m build
```

## 测试模组

运行测试脚本验证模组是否正常工作:
```bash
python test_module.py
pytest -q tests
```

## 功能特性

该 MCP 服务器提供以下工具:

### 空间管理
- `create_tenant` - 创建新空间
- `list_tenants` - 列出所有空间

### 知识库管理
- `create_knowledge_base` - 创建知识库
- `list_knowledge_bases` - 列出知识库
- `get_knowledge_base` - 获取知识库详情
- `delete_knowledge_base` - 删除知识库
- `hybrid_search` - 混合搜索

### 知识管理
- `create_knowledge_from_file` - 从本地文件创建知识
- `create_knowledge_from_url` - 从 URL 创建知识
- `create_knowledge_from_text` - 从文本创建知识
- `list_knowledge` - 列出知识
- `get_knowledge` - 获取知识详情
- `delete_knowledge` - 删除知识

### 模型管理
- `create_model` - 创建模型
- `list_models` - 列出模型
- `get_model` - 获取模型详情

### 会话管理
- `create_session` - 创建聊天会话
- `get_session` - 获取会话详情
- `list_sessions` - 列出会话
- `delete_session` - 删除会话

### 聊天功能
- `chat` - 发送聊天消息

### 块管理
- `list_chunks` - 列出知识块
- `delete_chunk` - 删除知识块

## 故障排除

如果遇到导入错误,请确保:
1. 已安装所有必需的依赖包
2. Python 版本兼容(推荐 3.10+)
3. 没有文件名冲突(避免使用 `mcp.py` 作为文件名)

## 调用效果

<img width="950" height="2063" alt="118d078426f42f3d4983c13386085d7f" src="https://github.com/user-attachments/assets/09111ec8-0489-415c-969d-aa3835778e14" />

TDQS

C2.7/5.0

Scored across 28 tools

Disambiguation4/5

Most tools target distinct resources (knowledge bases, knowledge items, sessions, agents, models, wiki). The only real overlap is list_knowledge vs list_chunks and possibly chat vs agent_chat, but the descriptions help differentiate these.

Naming Consistency4/5

The majority follow a verb_noun snake_case pattern (get_, create_, delete_, list_). Minor deviations like chat, agent_chat, and wiki_index_view are still readable and do not break the overall consistency.

Tool Count2/5

With 28 tools, the set exceeds the recommended 25-tool threshold and feels heavy. While the broader domain (knowledge, chat, agents, wiki, models, tenants) justifies some size, the number is still unwieldy for an agent to navigate efficiently.

Completeness3/5

The surface covers core CRUD for knowledge bases and knowledge items, but lacks update operations for most resources (e.g., update_knowledge, update_model, update_agent). Agent management includes only inspection, and wiki lacks editing capabilities, leaving notable gaps.

Maintenance

ActivitySlowing
ResponsivenessNo issues