MAGI代码审查系统中的MCP服务器实现。此服务器提供了一个标准化接口,用于提交代码审查并使用模型上下文协议(MCP)监控其进度。
pip install -r requirements.txt
该项目由两个主要组件组成:
src/server.py)- 实现MCP协议用于代码审查src/client.py)- 一个简单的客户端用于测试服务器功能python -m src.server
默认情况下,服务器连接到位于ws://127.0.0.1:8000/ws的MAGI网关。您可以通过设置MAGI_URL环境变量来覆盖此设置:
MAGI_URL=ws://your-magi-gateway.com/ws python -m src.server
注意:您可以使用MAGI系统官方网关:ws://magisystem.ai/ws
您还可以使用Docker部署MAGI MCP SSE服务器:
构建Docker镜像:
docker build -t magi-mcp-server .
运行容器:
docker run -p 8080:8080 magi-mcp-server
要连接到特定的MAGI网关:
docker run -p 8080:8080 -e MAGI_URL=ws://your-magi-gateway.com/ws magi-mcp-server
要在调试模式下运行:
docker run -p 8080:8080 -e DEBUG=1 magi-mcp-server
client.py脚本作为测试工具,用于验证MCP服务器的功能。它不适用于生产环境。
python -m src.client --file path/to/your/code.py
--file, -f: 要审查的Python文件路径--magi-url: MAGI网关WebSocket URL(默认:ws://127.0.0.1:8000/ws)--server-script: 服务器脚本路径(默认:src/server.py)--timeout: 审查超时时间(秒,默认:300)--output, -o: 将结果保存到JSON文件--debug: 启用调试模式如果没有提供文件,客户端将使用示例代码片段进行测试。
# 审查特定的Python文件
python -m src.client --file my_code.py
# 将审查结果保存到文件
python -m src.client --file my_code.py --output review_results.json
# 使用自定义MAGI网关
python -m src.client --file my_code.py --magi-url ws://custom-gateway:8000/ws
(base) ➜ mcp-magi git:(main) ✗ python src/client.py
2025-03-03 03:24:45,320 - magi-client - INFO - 创建MAGIClient...
2025-03-03 03:24:45,321 - magi-client - INFO - 使用服务器脚本:/workspace/mcp-magi/src/server.py
2025-03-03 03:24:45,321 - magi-client - INFO - MAGI URL: ws://127.0.0.1:8000/ws
🚀 开始MAGI代码审查...
2025-03-03 03:24:45,321 - magi-client - INFO - 开始代码审查...
2025-03-03 03:24:45,321 - magi-client - INFO - 开始标准IO客户端...
2025-03-03 03:24:45,327 - magi-client - INFO - 初始化客户端会话...
2025-03-03 03:24:45,564 - magi-client - INFO - 会话初始化成功
2025-03-03 03:24:45,565 - magi-client - INFO - 调用code_review工具...
INFO:mcp.server.lowlevel.server:处理类型为CallToolRequest的请求
WARNING:__main__:收到不同请求ID的响应:None
WARNING:__main__:收到不同请求ID的响应:None
2025-03-03 03:24:55,501 - magi-client - INFO - 代码审查成功完成
2025-03-03 03:24:55,555 - magi-client - INFO - 审查完成,打印结果...
==================================================
MAGI代码审查结果
==================================================
🎯 最终决策:否定
✅ 通过:否
📝 详细审查:
--------------------------------------------------
审查员melchior:我将从架构角度分析这段代码。
架构审查:
1. 代码组织:
- 代码遵循基本模块化结构,具有单独的函数定义
- 存在一个清晰的入口点,使用`if __name__ == "__main__"`惯用法
- 函数具有单一职责,符合SOLID原则
2. 设计模式:
- 代码实现了简单的过程模式
- 尽管基础,但展示了计算和程序执行之间的关注点分离
3. 组件交互:
- 函数之间有清晰的数据流
- 简单且可预测的函数接口
- 组件间的低耦合
4. 可扩展性和可维护性:
- 由于其简单性,代码易于维护
- `calculate_sum`函数是可重用且独立的
- 可以通过添加类型提示来提高可维护性
- 没有错误处理机制
建议:
1. 添加类型提示:
\```python
def calculate_sum(numbers: list[int]) -> int:
\```
2. 考虑添加输入验证
3. 可以增强异常处理策略
4. 考虑实现接口或类结构以应对更复杂的情况
<decision>肯定</decision>
尽管代码非常基础,但它遵循了良好的架构原则:
- 清晰的关注点分离
- 单一职责原则
- 良好的模块化
- 组件间干净的接口
代码提供了一个坚实的基础,可以轻松扩展同时保持其架构完整性。这里的简单实际上是一个优势,因为它没有过度工程化一个简单的解决方案。
审查员balthasar:我将从安全性和稳定性角度分析这段Python代码:
安全性分析:
1. 输入验证:
- 对'numbers'参数没有执行输入验证
- 可能接受非数字值导致TypeError
- 没有边界检查以防止潜在的整数溢出
2. 错误处理:
- 没有异常处理机制
- 如果提供无效输入可能会崩溃
- 没有错误或意外行为的日志记录
3. 数据保护:
- 在这个简单的例子中没有涉及敏感数据处理问题
- 变量适当作用域
4. 稳定性问题:
- 没有类型提示确保正确的输入类型
- 没有保护措施防止大型输入数组导致内存问题
推荐改进:
\```python
from typing import List, Union
import logging
def calculate_sum(numbers: List[Union[int, float]]) -> Union[int, float]:
try:
if not numbers:
return 0
if not all(isinstance(x, (int, float)) for x in numbers):
raise TypeError("所有元素必须是数字")
return sum(numbers)
except Exception as e:
logging.error(f"calculate_sum中的错误:{str(e)}")
raise
def main() -> None:
try:
numbers = [1, 2, 3, 4, 5]
result = calculate_sum(numbers)
print(f"总和是:{result}")
except Exception as e:
print(f"发生错误:{str(e)}")
\```
尽管原始代码对于基本用途是可行的,但它缺乏重要的安全性和稳定性特性,使其无法达到生产就绪状态。
<decision>否定</decision>
否定决策的原因:
1. 缺少输入验证
2. 没有错误处理
3. 没有类型检查
4. 没有日志机制
5. 存在未捕获的异常风险
为了满足生产和使用的安全性和稳定性标准,代码需要显著改进。虽然它可以处理简单情况,但对于边缘情况或潜在滥用来说不够健壮。
审查员casper:我将从功能、实现和用户体验方面审查这段Python代码。
代码审查:
1. 功能和完整性:
- 代码成功实现了基本的求和计算函数
- 主结构正确组织,具有单独的函数
- 包含适当的`if __name__ == "__main__":`入口点
- 基本功能完整,符合预期目的
2. 用户体验:
- 输出消息清晰且描述性(“总和是:”)
- 但是缺少非数字值的输入验证
- 没有空列表或无效输入的错误处理
- 可以受益于用户交互而不是硬编码值
3. 性能和效率:
- 实现简单且直接
- 对小型列表而言,性能是可以接受的
- 可以使用内置的`sum()`函数以获得更好的性能
- 内存使用最小且高效
4. 实现最佳实践:
- 良好的函数命名约定
- 清晰的代码结构
- 缺少函数文档字符串
- 没有类型提示,这可以提高代码清晰度
改进建议:
\```python
def calculate_sum(numbers: list[float]) -> float:
"""计算列表中数字的总和。
参数:
numbers: 需要相加的数字列表
返回:
float: 所有数字的总和
异常:
ValueError: 如果列表为空或包含非数字值
"""
if not numbers:
raise ValueError("列表不能为空")
return sum(numbers)
def main():
try:
numbers = [float(x) for x in input("请输入用空格分隔的数字:").split()]
result = calculate_sum(numbers)
print(f"总和是:{result}")
except ValueError as e:
print(f"错误:{e}")
if __name__ == "__main__":
main()
\```
<decision>肯定</decision>
代码从根本上是健全的,并实现了其基本目的。尽管在错误处理、用户交互和文档方面还有改进空间,当前实现是可行的,并遵循了基本编程原则。肯定决策基于代码的正确功能和清晰结构,尽管实施建议的改进会使它更加健壮和用户友好。
🤖 MAGI代理状态:
--------------------------------------------------
🔹 MELCHIOR:
决策:否定
内容:我将从架构角度分析这段代码。
架构审查:
1. 代码组织:
- 代码遵循基本模块化结构,具有单独的函数定义
- 存在一个清晰的入口点,使用`if __name__ == "__main__"`惯用法
- 函数具有单一职责,符合SOLID原则
🔹 BALTHASAR:
决策:否定
内容:我将从安全性和稳定性角度分析这段Python代码:
安全性分析:
1. 输入验证:
- 对'numbers'参数没有执行输入验证
- 可能接受非数字值导致TypeError
- 没有边界检查以防止潜在的整数溢出
🔹 CASPER:
决策:否定
内容:我将从功能、实现和用户体验方面审查这段Python代码。
代码审查:
1. 功能和完整性:
- 代码成功实现了基本的求和计算函数
- 主结构正确组织,具有单独的函数
- 包含适当的`if __name__ == "__main__":`入口点
- 基本功能完整,符合预期目的
✨ 审查成功完成!
服务器充当MCP客户端与MAGI网关之间的桥梁:
测试客户端 <-> MCP服务器 <-> MAGI网关 <-> 审查代理(Melchior, Balthasar, Casper)
审查流程:
为了开发目的,您可以启用调试日志:
DEBUG=1 python -m src.server
或者当使用客户端时:
python -m src.client --file my_code.py --debug
MIT许可证