mcp
This commit is contained in:
38
mcp/data/id_rsa.txt
Normal file
38
mcp/data/id_rsa.txt
Normal file
@@ -0,0 +1,38 @@
|
||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
56
mcp/server.py
Normal file
56
mcp/server.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# server.py
|
||||
|
||||
import asyncio
|
||||
import asyncssh # 用于 SSH 连接的库
|
||||
from mcp.server.fastmcp import FastMCP, Context
|
||||
|
||||
# --- 预设的服务器连接信息 ---
|
||||
# 警告:在生产环境中,不要将密钥和密码硬编码在代码里。
|
||||
# 最好使用环境变量、配置文件或专门的密钥管理服务。
|
||||
REMOTE_HOST = '202.121.182.208' # 替换为你的服务器地址
|
||||
REMOTE_USER = 'koko125' # 替换为你的用户名
|
||||
PRIVATE_KEY_PATH = 'data/id_rsa.txt' # 替换为你的私钥文件路径
|
||||
|
||||
# 创建一个 MCP 服务器实例
|
||||
mcp = FastMCP("远程服务器工具")
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def execute_remote_command(command: str, ctx: Context) -> str:
|
||||
"""
|
||||
在远程服务器上执行一个shell命令并返回其输出。
|
||||
|
||||
Args:
|
||||
command: 要在远程服务器上执行的命令字符串。
|
||||
"""
|
||||
await ctx.info(f"准备在 {REMOTE_HOST} 上执行命令: '{command}'")
|
||||
|
||||
try:
|
||||
# 建立 SSH 连接
|
||||
async with asyncssh.connect(REMOTE_HOST, username=REMOTE_USER, client_keys=[PRIVATE_KEY_PATH]) as conn:
|
||||
# 执行命令
|
||||
result = await conn.run(command, check=True)
|
||||
|
||||
# 成功执行,返回标准输出
|
||||
output = result.stdout.strip()
|
||||
await ctx.info(f"命令成功执行,返回输出。")
|
||||
await ctx.debug(f"输出内容: {output}")
|
||||
return output
|
||||
|
||||
except asyncssh.ProcessError as e:
|
||||
# 命令执行出错(例如,命令本身返回了非零退出码)
|
||||
error_message = f"命令执行失败: {e.stderr.strip()}"
|
||||
await ctx.error(error_message)
|
||||
return error_message
|
||||
|
||||
except Exception as e:
|
||||
# 其他连接错误等
|
||||
error_message = f"发生未知错误: {str(e)}"
|
||||
await ctx.error(error_message)
|
||||
return error_message
|
||||
|
||||
|
||||
# 这部分使得你可以直接运行 `python server.py`
|
||||
if __name__ == "__main__":
|
||||
# mcp.run() # 这是默认的 stdio 模式
|
||||
mcp.run(transport="streamable-http") # 改为 streamable-http 模式
|
||||
Reference in New Issue
Block a user