一个自包含的模型上下文协议(MCP)服务器,使用本地嵌入提供SDLC文档的语义搜索和文档阅读功能。
┌─────────────────────────────────────────────────────────────┐
│ 构建时间(Docker) │
├─────────────────────────────────────────────────────────────┤
│ docs/*.md → build_index.py → 嵌入 → sdlc_docs.db │
│ • 按标题上下文分块文档 │
│ • 生成768维向量(all-mpnet-base-v2) │
│ • 存储在DuckDB中并附带元数据 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 运行时(容器) │
├─────────────────────────────────────────────────────────────┤
│ server.py (FastMCP) ← 标准输入 ← MCP 客户端 (Q CLI) │
│ • pqsoft_search_docs: 语义向量搜索 │
│ • pqsoft_read_docs: 精确行范围读取 │
│ • pqsoft_recommend_docs: 基于内容的推荐 │
└─────────────────────────────────────────────────────────────┘
pqsoft_search_docs(search_phrase: str, limit: int) -> list[dict]在整个文档中进行语义搜索。
返回值:
[{
'title': '测试策略',
'filename': '04-testing-strategies.md',
'start_line': 125,
'end_line': 201,
'content': '...',
'similarity': 0.873
}, ...]
pqsoft_read_docs(documentation_path: str, start_line: int, end_line: int) -> str从文档文件中读取特定的行范围。
示例:
pqsoft_read_docs('04-testing-strategies.md', 1, 50)
# 返回文件中的第1到第50行
pqsoft_recommend_docs(title: str) -> list[dict]根据内容相似性获取相关文档。
# 运行概念验证测试
./proof_test.sh
# 或手动构建
docker build -t best-practices-mcp .
# 或
podman build -t best-practices-mcp .
# 使用Python MCP客户端
python3 mcp_search.py "测试策略"
python3 mcp_search.py "部署最佳实践"
# 使用读取测试脚本
python3 test_read.py "04-testing-strategies.md" 1 50
添加到您的MCP配置(~/.aws/amazonq/mcp.json):
{
"mcpServers": {
"sdlc-docs": {
"command": "docker",
"args": ["run", "--read-only", "-i", "best-practices-mcp"]
}
}
}
或对于Podman:
{
"mcpServers": {
"sdlc-docs": {
"command": "podman",
"args": ["run", "--read-only", "-i", "best-practices-mcp"]
}
}
}
将markdown文件放置在docs/目录下
docs/
├── 编码标准.md
├── 部署/
│ ├── kubernetes.md
│ └── terraform.md
└── 测试/
└── 集成测试.md
重新构建容器
docker-compose up --build
# 或
podman-compose up --build
文档自动索引
├── Dockerfile # 多阶段构建,包括嵌入生成
├── docker-compose.yml # 组合配置(Docker/Podman)
├── requirements.txt # Python依赖项
├── build_index.py # 索引脚本(构建时运行)
├── server.py # MCP服务器(运行时运行)
├── mcp_search.py # 测试用Python MCP客户端
├── test_read.py # pqsoft_read_docs测试脚本
├── docs/ # 您的markdown文档
│ └── *.md
├── detect_container.sh # 自动检测Docker/Podman
├── proof_test.sh # 验证测试脚本
└── sdlc_docs.db # 生成的向量数据库(在容器内)
所有脚本自动检测并使用Docker或Podman:
proof_test.sh - 验证核心功能mcp_search.py - 自动检测运行时test_read.py - 自动检测运行时docker-compose.yml - 支持docker-compose和podman-composesentence-transformers/all-mpnet-base-v2编辑build_index.py:
chunks = chunk_text(content, chunk_size=400, overlap_lines=3)
编辑build_index.py和server.py:
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# 更新CREATE TABLE语句中的嵌入维度
默认是10个结果,最大50个。调整工具调用:
pqsoft_search_docs("查询", limit=20)
# 检查镜像是否成功构建
docker images | grep best-practices-mcp
# 查看构建日志
docker build -t best-practices-mcp . 2>&1 | less
# 验证数据库是否创建
docker run --rm best-practices-mcp ls -lh sdlc_docs.db
# 检查已索引块的数量
docker run --rm best-practices-mcp python -c "import duckdb; print(duckdb.connect('sdlc_docs.db').execute('SELECT COUNT(*) FROM documents').fetchone())"
..# 验证结构
python3 validate_structure.py
# 测试MCP协议
./proof_test.sh
# 测试搜索
python3 mcp_search.py "测试查询"
# 测试读取
python3 test_read.py "文件.md" 1 10
# 进入正在运行的容器
docker exec -it <容器ID> /bin/bash
# 检查数据库
python3 -c "import duckdb; conn = duckdb.connect('sdlc_docs.db', read_only=True); print(conn.execute('SELECT COUNT(*) FROM documents').fetchone())"
# 查看已索引文件
python3 -c "import duckdb; conn = duckdb.connect('sdlc_docs.db', read_only=True); print(conn.execute('SELECT DISTINCT filename FROM documents').fetchall())"
此项目按原样提供用于SDLC文档目的。
docs/./proof_test.sh进行测试python3 mcp_search.py "您的主题"✅ 生产就绪