from mcp.server.fastmcp import FastMCP
from pydantic import Field
from typing import Dict, Any, Optional
import logging
import debugpy
import argparse
import os
mcp = FastMCP("debugAssistantMcp")
global_config = {
'LOG_LEVEL': 'INFO',
'MAX_DEBUG_SESSIONS': 5,
'DEBUG_TIMEOUT': 3600
}
debug_sessions: Dict[str, Dict] = {}
def init_config():
"""初始化配置"""
parser = argparse.ArgumentParser()
parser.add_argument('--LOG_LEVEL', default='INFO')
parser.add_argument('--MAX_DEBUG_SESSIONS', type=int, default=5)
parser.add_argument('--DEBUG_TIMEOUT', type=int, default=3600)
args = parser.parse_args()
global_config.update({
'LOG_LEVEL': args.LOG_LEVEL,
'MAX_DEBUG_SESSIONS': args.MAX_DEBUG_SESSIONS,
'DEBUG_TIMEOUT': args.DEBUG_TIMEOUT
})
logging.basicConfig(
level=getattr(logging, global_config['LOG_LEVEL']),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
@mcp.tool()
def start_debug_session(
session_id: str = Field(..., description="调试会话ID,必须唯一"),
port: int = Field(default=5678, description="调试端口,默认为5678"),
wait_for_client: bool = Field(default=False, description="是否等待客户端连接")
) -> Dict[str, Any]:
"""启动调试会话
示例用法:
1. 启动一个调试会话,使用默认端口5678
2. 启动一个调试会话,指定端口为6789并等待客户端连接
注意:
- 每个会话ID必须唯一
- 默认最多同时运行5个调试会话(可通过MAX_DEBUG_SESSIONS配置)
"""
if session_id in debug_sessions:
return {"status": "error", "message": "Session already exists"}
if len(debug_sessions) >= global_config['MAX_DEBUG_SESSIONS']:
return {"status": "error", "message": "Maximum sessions reached"}
debugpy.listen(port)
if wait_for_client:
debugpy.wait_for_client()
debug_sessions[session_id] = {
"port": port,
"status": "waiting" if wait_for_client else "active"
}
return {
"status": "success",
"session_id": session_id,
"port": port,
"message": f"Debug session started on port {port}"
}
@mcp.tool()
def stop_debug_session(
session_id: str = Field(..., description="要停止的调试会话ID")
) -> Dict[str, Any]:
"""停止调试会话
示例用法:
1. 停止ID为test_session的调试会话
"""
if session_id not in debug_sessions:
return {"status": "error", "message": "Session not found"}
del debug_sessions[session_id]
return {"status": "success", "session_id": session_id}
@mcp.tool()
def analyze_logs(
log_data: str = Field(..., description="要分析的日志数据"),
error_pattern: Optional[str] = Field(default=None, description="自定义错误匹配模式"),
warning_pattern: Optional[str] = Field(default=None, description="自定义警告匹配模式")
) -> Dict[str, Any]:
"""分析日志数据
示例用法:
1. 分析给定的日志数据,统计错误和警告数量
2. 使用自定义模式分析日志中的特定错误
返回:
- error_count: 错误数量
- warning_count: 警告数量
- patterns_found: 匹配到的自定义模式数量
"""
error_count = log_data.count("ERROR") if not error_pattern else len(
[line for line in log_data.split('\n') if error_pattern in line]
)
warning_count = log_data.count("WARNING") if not warning_pattern else len(
[line for line in log_data.split('\n') if warning_pattern in line]
)
result = {
"error_count": error_count,
"warning_count": warning_count,
"analysis": "Log analysis completed"
}
if error_pattern or warning_pattern:
result["patterns_found"] = {
"error_pattern": error_pattern,
"warning_pattern": warning_pattern,
"matches": error_count + warning_count
}
return result
@mcp.tool()
def get_performance_stats(
detailed: bool = Field(default=False, description="是否返回详细性能数据")
) -> Dict[str, Any]:
"""获取系统性能统计
示例用法:
1. 获取基本性能统计
2. 获取详细性能统计
返回:
- cpu_percent: CPU使用率
- memory_usage: 内存使用率
- disk_usage: 磁盘使用率
- (详细模式下)各进程资源占用
"""
import psutil
stats = {
"cpu_percent": psutil.cpu_percent(),
"memory_usage": psutil.virtual_memory().percent,
"disk_usage": psutil.disk_usage('/').percent
}
if detailed:
stats["processes"] = [
{
"pid": p.pid,
"name": p.name(),
"cpu_percent": p.cpu_percent(),
"memory_percent": p.memory_percent()
}
for p in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent'])
]
return stats
if __name__ == "__main__":
init_config()
mcp.run()