confluence-mcp
by riverlover
README.md
# confluence-mcp
面向 **Atlassian Confluence Server 6.x** 的 MCP,把某个页面层级下的文档树拉出来,供 Cursor / Codex 等 AI IDE 分析。
支持两种运行方式:
| 模式 | 适用场景 |
|------|----------|
| **stdio**(默认) | 本机 Cursor 直接拉起进程 |
| **HTTP / Streamable HTTP** | 部署到局域网机器,多台 IDE 共用 |
## 工具
| Tool | 作用 |
|------|------|
| `find_page` | 按标题查找页面(可带 spaceKey) |
| `list_subtree` | 递归列出某页下的子树(id / 路径 / depth) |
| `get_page` | 取单页正文(纯文本,可选 HTML) |
| `get_subtree_docs` | 一次拉取整棵子树正文,供 AI 分析 |
示例:以某项目的需求文档根页面为例,`pageId=<pageId>`,空间 `<space-key>`。
## 配置
复制 `.env.example`,用环境变量注入(**不要把密码写进仓库**):
```bash
CONFLUENCE_BASE_URL=http://<confluence-host>:<port>
CONFLUENCE_USERNAME=<your-username>
CONFLUENCE_PASSWORD=********
CONFLUENCE_SPACE_KEY=<space-key>
```
# HTTP mode (LAN / K8s) — server only needs base URL; users send Basic auth
MCP_TRANSPORT=http
MCP_HOST=0.0.0.0
MCP_PORT=3100
```
## 本机运行(stdio)
```bash
cd confluence-mcp
npm install
npm run build
# Windows PowerShell 示例
$env:CONFLUENCE_BASE_URL="http://<confluence-host>:<port>"
$env:CONFLUENCE_USERNAME="<your-username>"
$env:CONFLUENCE_PASSWORD="********"
$env:CONFLUENCE_SPACE_KEY="<space-key>"
node dist/index.js
```
Cursor `mcp.json`:
```json
{
"mcpServers": {
"confluence": {
"command": "node",
"args": ["D:/vscode/mcps/confluence-mcp/dist/index.js"],
"env": {
"CONFLUENCE_BASE_URL": "http://<confluence-host>:<port>",
"CONFLUENCE_USERNAME": "<your-username>",
"CONFLUENCE_PASSWORD": "********",
"CONFLUENCE_SPACE_KEY": "<space-key>"
}
}
}
}
```
## 部署到局域网(推荐)
**可以。** 把 MCP 跑在能访问 Confluence 的内网机器上(跳板机 / 同网段服务器),Cursor 通过 HTTP 连过去。
### 1. 在局域网机器上启动
```bash
cd confluence-mcp
npm install && npm run build
export CONFLUENCE_BASE_URL=http://<confluence-host>:<port>
export CONFLUENCE_SPACE_KEY=<space-key>
export MCP_TRANSPORT=http
export MCP_HOST=0.0.0.0
export MCP_PORT=3100
node dist/index.js --http
# → listening; clients must send Authorization: Basic ...
```
健康检查:`GET http://<lan-ip>:3100/health`
也可用 systemd / nssm / Docker / K8s 常驻。防火墙放行 `3100`。
### 2. Cursor 连远端
每位同事在自己的 `mcp.json` 里填**自己的** Confluence 账号(Basic):
```json
{
"mcpServers": {
"confluence": {
"url": "http://<lan-ip>:3100/mcp",
"headers": {
"X-Confluence-Username": "你的用户名",
"X-Confluence-Password": "你的密码"
}
}
}
}
```
> 不同 Cursor 版本对远端 MCP 字段略有差异;若 `url` 不被识别,可用本机 stdio,或在本机用反向代理/SSH 隧道:
> `ssh -L 3100:127.0.0.1:3100 user@lan-host`,再把 `url` 写成 `http://127.0.0.1:3100/mcp`。
### 部署拓扑
```
[Cursor / Codex] --X-Confluence-Username/Password--> [confluence-mcp] --REST(同一账号)--> [Confluence]
```
要点:
1. **MCP 必须放在能访问 Confluence 的网段**。
2. **每人在 mcp.json 填 `X-Confluence-Username` / `X-Confluence-Password`**,权限随账号走。
3. 服务端只配置 `CONFLUENCE_BASE_URL`,不要存共享账号密码。
4. 工具参数可直接贴 `viewpage.action?pageId=` 链接。
5. 大子树用 `maxDepth` / `maxPages`,避免一次塞爆模型上下文。
## Podman 构建 & Kubernetes 部署
### Podman 本地构建 / 试跑
```bash
cd confluence-mcp
podman build -t confluence-mcp:1.0.0 .
podman run --rm -p 3100:3100 \
-e CONFLUENCE_BASE_URL=http://<confluence-host>:<port> \
-e CONFLUENCE_SPACE_KEY=<space-key> \
confluence-mcp:1.0.0
```
验证:`curl http://127.0.0.1:3100/health`
HTTP 模式**不在服务端存用户密码**。每位同事在 Cursor 里填两个字段即可:
```json
{
"mcpServers": {
"confluence": {
"url": "http://<ingress-host>:3100/mcp",
"headers": {
"X-Confluence-Username": "你的用户名",
"X-Confluence-Password": "你的密码"
}
}
}
}
```
也可仍用 `Authorization: Basic ...`(兼容)。
工具参数 `page` 支持直接粘贴链接,例如:
`http://<confluence-host>:<port>/pages/viewpage.action?pageId=<pageId>`
会自动抽出 `pageId`。也可用工具 `resolve_page_link` 先解析。
推到你们的镜像仓库(按实际 registry 改):
```bash
podman tag confluence-mcp:1.0.0 registry.example.com/confluence-mcp:1.0.0
podman push registry.example.com/confluence-mcp:1.0.0
```
### 部署到 K8s
1. 编辑 `deploy/deploy.yaml`:改 `image`、Secret 里的 `CONFLUENCE_BASE_URL`
2. 集群 Pod 必须能访问 Confluence 地址
3. 应用清单:
```bash
kubectl apply -f deploy/deploy.yaml
kubectl get svc confluence-mcp confluence-mcp-nodeport -n <namespace>
```
- 集群内:`http://confluence-mcp.<namespace>:3100/mcp`
- 局域网同事:用 Ingress / NodePort,Cursor 配置里填自己的 Basic 账号(见上)
```json
{
"mcpServers": {
"confluence": {
"url": "http://<ingress>/mcp",
"headers": {
"X-Confluence-Username": "你的用户名",
"X-Confluence-Password": "你的密码"
}
}
}
}
```
## 在对话里怎么用
- 「解析这个链接并列出子树:http://confluence.../pages/viewpage.action?pageId=<pageId>」
- 「用 confluence 拉《示例项目》下文档」(标题 / pageId / 链接均可)
- 「拉取示例文档整棵子树正文并总结需求」
- `get_subtree_docs` + `maxDepth: 1` 只拿当前层级
- `find_page` / `resolve_page_link` 按标题或链接定位
## 开发
```bash
npm run dev # stdio
npm run dev:http # http://0.0.0.0:3100/mcp
```
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues