用于汇流搜索的MCP服务器
MCP(Model Context Protocol)用于搜索Confluence内部文档的服务器。支持 上海证券交易所 和 可流式传输http 运输, 基本认证.
快速启动
cp .env.example .env # скопировать шаблон
# заполнить .env (минимум: CONFLUENCE_BASE_URL, CONFLUENCE_USERNAME, CONFLUENCE_API_TOKEN)
docker compose up -d --build # собрать и запустить服务器地址可用 http://localhost:8003/sse.
配置(.env)
所有设置在一个文件中 .env复制 .env.example 并填写:
cp .env.example .env强制性
变量描述 |---|---| | CONFLUENCE_BASE_URL URL confluence(本地或Cloud) | CONFLUENCE_USERNAME 登录(Cloud-email) | CONFLUENCE_API_TOKEN 密码(Cloud API Token)
可选
变量沉默了。描述 |---|---|---| | MCP_PORT | 8003 服务器端口 | CONFLUENCE_TIMEOUT | 30 ←HTTP Confluence请求超时(秒,至少5)→ | SCORE_MERGE_MAX_VARIANTS | 12 马克斯基于score-based搜索的查询选项数(4–24)→ | LLM_REWRITE_ENDPOINT | _(空)_ OpenAI兼容API的URL,用于重新定义查询。 | LLM_REWRITE_MODEL | _(空)_ 型号名称(例如) qwen2.5) | | LLM_REWRITE_API_KEY | _(空)_ –API密钥(如果不需要,则为空)。 | LLM_REWRITE_TIMEOUT | 5 ←LLM请求超时(秒)→
如何获得Credentials
本地冲突(On-Premise): 使用您的登录名和密码。
Atlassian云:
- Перейдите https://id.atlassian.com/manage-profile/security/api-tokens
- 创建API Token
- 作为
CONFLUENCE_USERNAME指定电子邮件为CONFLUENCE_API_TOKEN由Token创建
工具(tools)
search_content
按关键字搜索页面默认情况下(multi_pass=true服务器 :
- 提取
pageId从查询中的Confluence链接 - 生成多个搜索选项(完整短语,C令牌)
_(长话) - 执行每个选项的CQL查询,并在不重复的情况下合并结果
参数:
≫参数≫类型≫默认。描述 |---|---|---|---| | query |字符串| _(强制性)_ 搜索请求 | space_key |字符串| null (空间键或多个逗号分隔)DEV, HR) | | space_keys |string\[\]| null –空间密钥列表(最好是多个)→ | content_type |字符串| "page" 类型: page, blogpost, comment, attachment, space, all | | limit |int| 10 马克斯结果(至100) | multi_pass bool的。 true –多种选项的高级搜索。 | score_merge bool的。 false score(见下文) | score_merge_max_variants |int| 0 ≫选项限制(0=从配置) SCORE_MERGE_MAX_VARIANTS) | | llm_rewrite bool的。 false –搜索前通过LLM重新定义请求→
search_content(query="оформить звонок директорат", score_merge=true)search_by_cql
搜索任意CQL字符串。
≫参数≫类型≫默认。描述 |---|---|---|---| | cql |字符串| _(强制性)_ CQL查询 | limit |int| 10 马克斯结果→ | expand |string\[\]| ["space","version"] 更多的领域。
get_page_content
完整的ID页面内容返回HTML(body.view)空间,版本,父母链(ancestors)和子页面(children.page).
get_page_children
指定pageu id的子页面列表(id、title、version)。
list_spaces
列出所有Confluence空间。
confluence_health
验证Confluence和凭据的可用性。返回用户名和git构建哈希。
智能搜索
问题
查询“如何向董事会打电话”找不到带有“接受”一词的文章,因为:
- “设计”和“接受”在词汇上是不同的词,Confluence没有将它们联系起来
- 在这两种情况下都存在通用的“呼叫董事会”选项,但早期的选项填充
limit以前
解决方案是三个独立的改进,每个改进都解决了问题的一部分:
1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.score_merge=true)
想法: 运行查询的所有变体,收集所有匹配,按找到页面的变体数排序。
没有score_merge,服务器在键入时停止。 limit 结果-第一个选项被拒绝。使用scoreu merge,所有选项都执行到最后,找到5个选项的页面将获得比找到一个页面更高的评级。
选项权重:
选择的类型,权重,例子。 |---|---|---| 下一篇:3.0如何打电话给董事会 2.0-2.5“打电话” 一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字,一个字。
选项数量有限 SCORE_MERGE_MAX_VARIANTS (默认为12,范围4–24)。
search_content(query="оформить звонок директорат", score_merge=true)改进2:无限制通行(自动)
想法: pymorphy3定义语音部分。从查询中只选择名词-你会得到一个没有动词和介词的“干净”变体。
"КАК ОФОРМИТЬ ЗВОНОК В ДИРЕКТОРАТ" → "ЗВОНОК ДИРЕКТОРАТ"
"ПОРЯДОК СОГЛАСОВАНИЯ ДОКУМЕНТОВ" → "ПОРЯДОК СОГЛАСОВАНИЕ ДОКУМЕНТ"名词-搜索查询中信息量最大的词。通过删除动词和介词,变体更准确地放在文章的标题和文本中。它总是工作的,不需要标志,不需要外部依赖。
3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1llm_rewrite=true)
想法: LLM接收原始请求,并使用同义词和重述生成3-5个替代措辞。
"КАК ОФОРМИТЬ ЗВОНОК В ДИРЕКТОРАТ"
→ "принять звонок директорат"
→ "перевести вызов в директорат"
→ "маршрутизация звонков директорат"这是唯一理解同义词的机制(“形式”=“接受”=“翻译”)。需要配置变量 LLM_REWRITE_* 在 .env如果出现错误(超时,LLM不可用),则会悄悄回滚到正常搜索。
search_content(query="оформить звонок директорат", llm_rewrite=true)可以组合两个旗帜: score_merge=true, llm_rewrite=true.
方法比较
–方法→依赖→覆盖同义词→ |---|---|---| | 分数合并 不,40%是通过交叉选择。 | 只有名词 –pymorphy3(内置)–60%消除动词噪声。 | LLM重写 –外部LLM API–~90%理解同义词和重述–。
它是如何一起工作的
Запрос: "КАК ОФОРМИТЬ ЗВОНОК В ДИРЕКТОРАТ"
│
┌───────────────┼───────────────┐
│ │ │
Полная фраза Noun-only LLM варианты
"КАК ОФОРМИТЬ "ЗВОНОК "принять звонок
ЗВОНОК В ДИРЕКТОРАТ" директорат"
ДИРЕКТОРАТ" "перевести вызов
│ │ в директорат"
│ │ │
└───────────────┼───────────────┘
│
Каждый вариант →
CQL-запрос к Confluence
│
▼
Score-based ранжирование
(страница, найдённая 3+
вариантами, будет первой)
│
▼
Результаты集成
克劳德桌面版
添加到 claude_desktop_config.json:
{
"mcpServers": {
"confluence": {
"url": "http://localhost:8003/sse",
"transport": "sse"
}
}
}克劳德代码(CLI)
添加到 ~/.claude/mcp_config.json:
{
"mcpServers": {
"confluence": {
"url": "http://localhost:8003/sse",
"transport": "sse"
}
}
}MCP超级助理代理
{
"mcpServers": {
"confluence": {
"type": "streamable-http",
"url": "http://localhost:8003/mcp",
"timeout": 30
}
}
}端点
Endpoint方法描述 |---|---|---| | /sse |GET|SSE端点(克劳德桌面,克劳德代码)| | /messages/ |POST|SSE JSON-RPC| | /mcp |GET/POST |流式HTTP(超级助理代理)| | /health ÐgetÐÐÐÐÐÐÐÐÐÐÐÐ
检查curl
# Статус
curl http://localhost:8003/health
# Инициализация MCP
curl -X POST http://localhost:8003/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'本地安装(无Docker)
pip install -r requirements.txt
cp .env.example .env # заполнить credentials
python -m confluence_mcp.server项目结构
src/confluence_mcp/
├── server.py # MCP сервер (SSE + streamable-http), инструменты
├── confluence_client.py # REST-клиент Confluence (Basic Auth)
├── config.py # Конфигурация из .env
├── cql_escape.py # Экранирование CQL-строк
├── query_expand.py # Генерация вариантов поискового запроса
├── scoring.py # Score-based ранжирование результатов
├── noun_extract.py # Выделение существительных (pymorphy3)
└── llm_rewrite.py # LLM-переформулировка запросов
tests/
└── test_cql_escape.py # python tests/test_cql_escape.py -v要求
- Python 3.10+
- Docker(推荐)
- Confluence(本地或Cloud)与Basic Auth
