mcpField
P
Proxmox VE MCP Server

Proxmox VE MCP Server

本地服务
github.com/Samik081云与基础设施264 周前更新

关于 Proxmox VE MCP Server

MCP PVE 是用于管理 Proxmox VE 的 MCP 服务,可在 Cursor、Claude Code 和 Claude Desktop 中通过自然语言管理虚拟机、容器、存储、网络和集群。它提供三级访问权限和按类别过滤工具的功能。

主要功能

  1. 01覆盖 Proxmox VE REST API 的 122 个工具
  2. 02read-only、read-execute、full 三级访问权限
  3. 03通过 PVE_CATEGORIES 按类别筛选工具
  4. 04支持 stdio 与 Streamable HTTP 传输
  5. 05提供 linux/amd64 和 linux/arm64 的 Docker 镜像

适用场景

  1. 01通过 AI 助手查询节点、虚拟机和容器的状态
  2. 02在只读权限下浏览 Proxmox 环境而不改变状态
  3. 03为远程 MCP 客户端部署集中的 HTTP 服务

MCP 相关

该项目是 MCP 服务,将 Proxmox VE 的虚拟机、容器、存储等 REST API 操作以工具形式暴露给 MCP 客户端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"samik081-mcp-pve": {
"command": "npx",
"args": [
"-y",
"@samik081/mcp-pve"
],
"env": {
"PVE_BASE_URL": "<PVE_BASE_URL>",
"PVE_TOKEN_ID": "<PVE_TOKEN_ID>",
"PVE_TOKEN_SECRET": "<PVE_TOKEN_SECRET>"
}
}
}
}
启动命令npx -y @samik081/mcp-pve
需要配置的环境变量
PVE_BASE_URLURL of the Proxmox VE instance (e.g. https://pve.example.com:8006)
PVE_TOKEN_ID密钥Proxmox VE API token ID (e.g. user@pam!token-name)
PVE_TOKEN_SECRET密钥Proxmox VE API token secret

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@samik081/mcp-pve0.9.0
ocighcr.io/samik081/mcp-pve:0.9.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

npm version Docker image License: MIT Node.js Version

MCP PVE

适用于 Proxmox VE 的 MCP 服务。通过 Cursor、Claude Code 和 Claude Desktop 中的自然语言管理虚拟机、容器、存储、网络和集群。

功能

  • 122 个工具,分为 12 个类别,涵盖 Proxmox VE REST API
  • 三个访问级别(read-only、read-execute、full),实现精细控制
  • 通过 PVE_CATEGORIES 筛选类别,仅开放所需工具
  • 零 HTTP 依赖——使用原生 fetch(Node 22+)
  • 通过 PVE_VERIFY_SSL=false 支持自签名证书
  • 在 GHCR 提供适用于 linux/amd64 和 linux/arm64 的 Docker 镜像
  • 通过 HTTP 传输(MCP_TRANSPORT=http)和 Streamable HTTP 协议提供 远程 MCP
  • TypeScript/ESM,提供完整类型安全

API 兼容性

已在 Proxmox VE 9.2.4 上测试。

快速开始

使用 npx 直接运行服务:

PVE_BASE_URL="https://pve.example.com:8006" \
PVE_TOKEN_ID="root@pam!mcp" \
PVE_TOKEN_SECRET="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
npx -y @samik081/mcp-pve

服务启动时会验证 PVE 连接;如果凭据缺失或无效,会立即失败并显示清晰的错误信息。

Docker

使用 Docker 运行(stdio 传输,与 npx 相同):

docker run --rm -i \
  -e PVE_BASE_URL=https://pve.example.com:8006 \
  -e PVE_TOKEN_ID=root@pam!mcp \
  -e PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e PVE_VERIFY_SSL=false \
  ghcr.io/samik081/mcp-pve

如需通过 HTTP 传输运行远程 MCP 服务:

docker run -d -p 3000:3000 \
  -e MCP_TRANSPORT=http \
  -e PVE_BASE_URL=https://pve.example.com:8006 \
  -e PVE_TOKEN_ID=root@pam!mcp \
  -e PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e PVE_VERIFY_SSL=false \
  ghcr.io/samik081/mcp-pve

MCP 端点位于 http://localhost:3000,健康检查端点位于 http://localhost:3000/health。

配置

Claude Code CLI(推荐):

# Using npx
claude mcp add --transport stdio pve \
  --env PVE_BASE_URL=https://pve.example.com:8006 \
  --env PVE_TOKEN_ID=root@pam!mcp \
  --env PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  --env PVE_VERIFY_SSL=false \
  -- npx -y @samik081/mcp-pve

# Using Docker
claude mcp add --transport stdio pve \
  --env PVE_BASE_URL=https://pve.example.com:8006 \
  --env PVE_TOKEN_ID=root@pam!mcp \
  --env PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  --env PVE_VERIFY_SSL=false \
  -- docker run --rm -i ghcr.io/samik081/mcp-pve

# Using remote HTTP (connect to a running Docker container or HTTP server)
claude mcp add --transport http pve http://localhost:3000

JSON 配置(适用于 Claude Code .mcp.json、Claude Desktop claude_desktop_config.json、Cursor .cursor/mcp.json):

{
  "mcpServers": {
    "pve": {
      "command": "npx",
      "args": ["-y", "@samik081/mcp-pve"],
      "env": {
        "PVE_BASE_URL": "https://pve.example.com:8006",
        "PVE_TOKEN_ID": "root@pam!mcp",
        "PVE_TOKEN_SECRET": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "PVE_VERIFY_SSL": "false"
      }
    }
  }
}

Docker(stdio):

{
  "mcpServers": {
    "pve": {
      "command": "docker",
      "args": ["run", "--rm", "-i",
        "-e", "PVE_BASE_URL=https://pve.example.com:8006",
        "-e", "PVE_TOKEN_ID=root@pam!mcp",
        "-e", "PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "-e", "PVE_VERIFY_SSL=false",
        "ghcr.io/samik081/mcp-pve"
      ]
    }
  }
}

远程 MCP(连接到正在运行的 Docker 容器或 HTTP 服务):

{
  "mcpServers": {
    "pve": {
      "type": "streamable-http",
      "url": "http://localhost:3000"
    }
  }
}

访问级别

使用 PVE_ACCESS_TIER 环境变量控制可用工具:

级别工具数说明
full(默认)122读取、执行和写入——完全控制
read-execute77读取和执行——不创建或删除资源
read-only55仅读取——可安全探索,不更改状态

级别详情:

  • full:全部 122 个工具。包括创建/删除虚拟机、容器、存储、用户、防火墙规则等。
  • read-execute:77 个工具。包含所有读取工具,以及电源操作(启动、停止、迁移)、批量来宾操作、OCI 镜像拉取、备份执行和任务管理。
  • read-only:55 个工具。仅包含列表、获取、状态和日志工具。不更改状态。

在当前级别不可用的工具不会注册到 MCP 服务中,也不会出现在 AI 工具的工具列表中,从而保持上下文整洁。

环境变量

变量必填默认值说明
PVE_BASE_URL是--PVE 实例的 URL(例如 https://pve:8006)
PVE_TOKEN_ID是--API 令牌 ID(user@realm!tokenname)
PVE_TOKEN_SECRET是--API 令牌 UUID 密钥
PVE_ACCESS_TIER否fullread-only、read-execute 或 full
PVE_CATEGORIES否(全部)以逗号分隔的类别允许列表
PVE_TOOL_BLACKLIST否(无)以逗号分隔的要排除的工具名称列表(例如 pve_delete_qemu_vm)
PVE_TOOL_WHITELIST否(无)以逗号分隔的要强制包含的工具名称列表,可绕过访问级别和类别筛选
PVE_VERIFY_SSL否true对自签名证书设为 false
DEBUG否false启用调试日志并输出到 stderr
MCP_TRANSPORT否stdio传输模式:stdio(默认)或 http
MCP_PORT否3000HTTP 服务端口(仅在 MCP_TRANSPORT=http 时使用)
MCP_HOST否0.0.0.0HTTP 服务绑定地址(仅在 MCP_TRANSPORT=http 时使用)
MCP_SESSION_IDLE_TIMEOUT否1800HTTP 会话关闭并释放其内存前的空闲秒数(存在已连接 SSE 流的会话永远不会关闭)。设为 0 可禁用。仅在 MCP_TRANSPORT=http 时使用
MCP_EXCLUDE_TOOL_TITLES否false设为 true 可在注册时省略工具标题(节省令牌)

在 PVE UI 中,通过 Datacenter > Permissions > API Tokens 创建 API 令牌。如果希望令牌继承用户的全部权限,请务必取消勾选“Privilege Separation”。

可用类别

nodes、qemu、lxc、storage、cluster、access、pools、network、firewall、backup、tasks、ha

工具

mcp-pve 按类别提供 122 个工具。每个工具的 Access 列显示所需的最低访问级别:read-only(所有级别均可用)、read-execute(需要 read-execute 或 full)或 full(仅需要 full 级别)。Hints 列显示工具行为:read-only(不更改状态)、destructive(修改现有状态)、idempotent(调用两次结果相同)。

节点(9 个工具)
工具说明访问级别提示
pve_list_nodes列出集群中的所有节点read-onlyread-only, idempotent
pve_get_node_status获取节点的详细状态(CPU、内存、运行时间、负载)read-onlyread-only, idempotent
pve_get_node_rrddata获取指定时间段内的节点 RRD 统计数据(CPU、IO 等待、负载、内存、网络;输出与来宾 RRD 数据相同,采用紧凑分桶格式)read-onlyread-only, idempotent
pve_get_node_version获取节点的 PVE 版本信息read-onlyread-only, idempotent
pve_get_node_dns获取节点的 DNS 设置read-onlyread-only, idempotent
pve_get_node_time获取节点的时间和时区信息read-onlyread-only, idempotent
pve_get_node_syslog获取节点的系统日志条目read-onlyread-only, idempotent
pve_list_node_services列出节点上的所有系统服务read-onlyread-only, idempotent
pve_manage_node_service启动、停止、重启或重新加载节点服务read-executedestructive
QEMU 虚拟机(20 个工具) | 工具 | 描述 | 访问权限 | 提示 | |------|-------------|--------|-------| | `pve_list_qemu_vms` | 列出节点上的所有 QEMU 虚拟机 | 只读 | 只读、幂等 | | `pve_get_qemu_status` | 获取虚拟机当前状态(CPU、内存、磁盘、网络) | 只读 | 只读、幂等 | | `pve_get_qemu_config` | 获取虚拟机配置 | 只读 | 只读、幂等 | | `pve_get_qemu_rrddata` | 获取一段时间内的 RRD 统计信息(默认包含 60 个数据点的精简表格;支持 `fields`、`cf`、`buckets`、`format: raw`) | 只读 | 只读、幂等 | | `pve_list_qemu_snapshots` | 列出所有虚拟机快照 | 只读 | 只读、幂等 | | `pve_start_qemu_vm` | 启动虚拟机 | 读写执行 | 有破坏性 | | `pve_stop_qemu_vm` | 停止虚拟机(立即) | 读写执行 | 有破坏性 | | `pve_shutdown_qemu_vm` | 平稳关闭虚拟机 | 读写执行 | 有破坏性 | | `pve_reboot_qemu_vm` | 重启虚拟机 | 读写执行 | 有破坏性 | | `pve_suspend_qemu_vm` | 挂起虚拟机 | 读写执行 | 有破坏性 | | `pve_resume_qemu_vm` | 恢复已挂起的虚拟机 | 读写执行 | 有破坏性 | | `pve_reset_qemu_vm` | 重置虚拟机(强制) | 读写执行 | 有破坏性 | | `pve_migrate_qemu_vm` | 将虚拟机迁移到另一节点 | 读写执行 | 有破坏性 | | `pve_create_qemu_vm` | 创建新虚拟机 | 完全访问 | — | | `pve_delete_qemu_vm` | 删除虚拟机及其所有数据 | 完全访问 | 有破坏性 | | `pve_update_qemu_config` | 更新虚拟机配置 | 完全访问 | 有破坏性、幂等 | | `pve_clone_qemu_vm` | 克隆虚拟机 | 完全访问 | — | | `pve_create_qemu_snapshot` | 创建虚拟机快照 | 完全访问 | — | | `pve_delete_qemu_snapshot` | 删除虚拟机快照 | 完全访问 | 有破坏性 | | `pve_rollback_qemu_snapshot` | 将虚拟机回滚到某个快照 | 完全访问 | 有破坏性、幂等 |
LXC 容器(18 个工具)
工具描述访问权限提示
pve_list_lxc_containers列出节点上的所有 LXC 容器只读只读、幂等
pve_get_lxc_status获取容器当前状态只读只读、幂等
pve_get_lxc_config获取容器配置只读只读、幂等
pve_get_lxc_rrddata获取一段时间内的 RRD 统计信息(默认包含 60 个数据点的精简表格;支持 fields、cf、buckets、format: raw)只读只读、幂等
pve_list_lxc_snapshots列出所有容器快照只读只读、幂等
pve_start_lxc_container启动容器读写执行有破坏性
pve_stop_lxc_container停止容器(立即)读写执行有破坏性
pve_shutdown_lxc_container平稳关闭容器读写执行有破坏性
pve_reboot_lxc_container重启容器读写执行有破坏性
pve_suspend_lxc_container挂起(冻结)容器读写执行有破坏性
pve_resume_lxc_container恢复(解冻)容器读写执行有破坏性
pve_create_lxc_container创建新容器完全访问—
pve_delete_lxc_container删除容器及其所有数据完全访问有破坏性
pve_update_lxc_config更新容器配置完全访问有破坏性、幂等
pve_clone_lxc_container克隆容器完全访问—
pve_create_lxc_snapshot创建容器快照完全访问—
pve_delete_lxc_snapshot删除容器快照完全访问有破坏性
pve_rollback_lxc_snapshot将容器回滚到某个快照完全访问有破坏性、幂等
存储(9 个工具) | 工具 | 描述 | 访问权限 | 提示 | |------|-------------|--------|-------| | `pve_list_storage` | 列出所有已配置的存储后端 | 只读 | 只读、幂等 | | `pve_get_storage_config` | 获取存储后端配置 | 只读 | 只读、幂等 | | `pve_list_node_storage` | 列出节点上可用的存储及其使用情况 | 只读 | 只读、幂等 | | `pve_get_storage_status` | 获取节点上的存储状态和使用情况 | 只读 | 只读、幂等 | | `pve_list_storage_content` | 列出存储内容(镜像、ISO、备份);可按 `vmid` 筛选,或按每个来宾的 `mode` `latest` / `summary` 筛选 | 只读 | 只读、幂等 | | `pve_pull_oci_image` | 将 OCI 容器镜像拉取到存储的模板缓存中(PVE 9.1+) | 读写执行 | — | | `pve_create_storage` | 创建新的存储后端 | 完全访问 | — | | `pve_update_storage` | 更新存储配置 | 完全访问 | 破坏性、幂等 | | `pve_delete_storage` | 删除存储后端 | 完全访问 | 破坏性 |
集群(13 个工具)
工具描述访问权限提示
pve_get_cluster_status获取集群状态(成员资格、仲裁)只读只读、幂等
pve_list_cluster_resources列出所有集群资源,可选按类型筛选只读只读、幂等
pve_get_next_vmid获取下一个可用的 VMID只读只读、幂等
pve_get_cluster_log获取最近的集群日志条目只读只读、幂等
pve_get_cluster_options获取数据中心选项只读只读、幂等
pve_list_cluster_backup_info列出未纳入备份作业的来宾只读只读、幂等
pve_get_cluster_ha_status获取 HA 管理器状态只读只读、幂等
pve_list_cluster_replication列出所有复制作业只读只读、幂等
pve_bulk_start_guests在整个集群中批量启动 VM/容器(PVE 9.1+)读写执行破坏性
pve_bulk_shutdown_guests在整个集群中批量关闭 VM/容器(PVE 9.1+)读写执行破坏性
pve_bulk_suspend_guests在整个集群中批量暂停 VM(PVE 9.1+)读写执行破坏性
pve_bulk_migrate_guests将 VM/容器批量迁移到目标节点(PVE 9.1+)读写执行破坏性
pve_update_cluster_options更新数据中心选项完全访问破坏性、幂等
访问控制(14 个工具)
工具描述访问权限提示
pve_list_users列出所有用户只读只读、幂等
pve_get_user获取用户详情只读只读、幂等
pve_list_roles列出所有角色和权限只读只读、幂等
pve_list_groups列出所有用户组只读只读、幂等
pve_list_acls列出所有 ACL 条目只读只读、幂等
pve_list_domains列出身份验证域/领域只读只读、幂等
pve_list_user_tokens列出用户的 API 令牌只读只读、幂等
pve_create_user创建新用户完全访问—
pve_update_user更新用户属性完全访问破坏性、幂等
pve_delete_user删除用户完全访问破坏性
pve_update_acl授予或撤销 ACL 权限完全访问破坏性、幂等
pve_create_user_token创建 API 令牌(密钥仅显示一次)完全访问—
pve_update_user_token更新 API 令牌的注释、过期时间或 privsep完全访问破坏性、幂等
pve_delete_user_token从用户处删除 API 令牌完全访问破坏性
资源池(5 个工具) | 工具 | 描述 | 访问权限 | 提示 | |------|-------------|--------|-------| | `pve_list_pools` | 列出所有资源池 | 只读 | 只读、幂等 | | `pve_get_pool` | 获取资源池详情和成员 | 只读 | 只读、幂等 | | `pve_create_pool` | 创建资源池 | 完整 | — | | `pve_update_pool` | 更新资源池成员和设置 | 完整 | 破坏性、幂等 | | `pve_delete_pool` | 删除资源池 | 完整 | 破坏性 |
网络(5 个工具)
工具描述访问权限提示
pve_list_networks列出节点上的所有网络接口只读只读、幂等
pve_get_network获取网络接口配置只读只读、幂等
pve_create_network创建网络接口完整—
pve_update_network更新网络接口配置完整破坏性、幂等
pve_delete_network删除网络接口完整破坏性
防火墙(8 个工具)
工具描述访问权限提示
pve_get_firewall_options获取集群防火墙选项只读只读、幂等
pve_list_firewall_rules列出集群防火墙规则只读只读、幂等
pve_list_firewall_aliases列出防火墙别名只读只读、幂等
pve_list_firewall_ipsets列出防火墙 IP 集只读只读、幂等
pve_update_firewall_options更新集群防火墙选项完整破坏性、幂等
pve_create_firewall_rule创建防火墙规则完整—
pve_update_firewall_rule更新防火墙规则完整破坏性、幂等
pve_delete_firewall_rule删除防火墙规则完整破坏性
备份(5 个工具)
工具描述访问权限提示
pve_list_backup_jobs列出所有计划备份任务只读只读、幂等
pve_get_backup_job获取备份任务配置只读只读、幂等
pve_run_backup立即运行备份(vzdump)读取/执行—
pve_create_backup_job创建计划备份任务完整—
pve_delete_backup_job删除计划备份任务完整破坏性
任务(4 个工具)
工具描述访问权限提示
pve_list_tasks列出节点上的近期任务只读只读、幂等
pve_get_task_status根据 UPID 获取任务状态只读只读、幂等
pve_get_task_log根据 UPID 获取任务日志输出只读只读、幂等
pve_stop_task停止正在运行的任务读取/执行破坏性
高可用性(12 个工具) | 工具 | 描述 | 访问权限 | 提示 | |------|-------------|--------|-------| | `pve_list_ha_resources` | 列出所有由 HA 管理的资源 | 只读 | 只读、幂等 | | `pve_get_ha_resource` | 获取资源的 HA 配置 | 只读 | 只读、幂等 | | `pve_list_ha_rules` | 列出 HA 规则(节点/资源亲和性) | 只读 | 只读、幂等 | | `pve_get_ha_rule` | 获取 HA 规则配置 | 只读 | 只读、幂等 | | `pve_create_ha_resource` | 将 VM/容器添加到 HA 管理 | 完整 | — | | `pve_update_ha_resource` | 更新 HA 资源配置 | 完整 | 破坏性、幂等 | | `pve_delete_ha_resource` | 从 HA 管理中移除资源 | 完整 | 破坏性 | | `pve_create_ha_rule` | 创建 HA 规则 | 完整 | — | | `pve_update_ha_rule` | 更新 HA 规则 | 完整 | 破坏性、幂等 | | `pve_delete_ha_rule` | 删除 HA 规则 | 完整 | 破坏性 | | `pve_disarm_ha` | 为维护停用 HA 堆栈(PVE 9.2+) | 完整 | 破坏性、幂等 | | `pve_arm_ha` | 重新启用 HA 堆栈(PVE 9.2+) | 完整 | 破坏性、幂等 |

注意: PVE 9 中已弃用 HA 组,改为使用 HA 规则。PVE 9.1 中,HA 状态输出已移除每个服务的 group 字段。

验证是否正常工作

配置 MCP 客户端后,向 AI 助手提问:

“我的 Proxmox 集群中有哪些节点?”

如果连接正常,助手会调用 pve_list_nodes,并返回节点及其当前状态。

使用示例

配置完成后,可以用自然语言向 AI 工具提问:

  • “列出节点 pve1 上的所有 VM” -- 调用 pve_list_qemu_vms,显示 VM 的状态、CPU 和内存使用情况。

  • “VM 100 的状态如何?” -- 调用 pve_get_qemu_status,显示实时资源使用情况。

  • “VM 100 的 CPU 使用率今天何时开始上升?” -- 调用 pve_get_qemu_rrddata,并传入 timeframe: "day" 和 fields: ["cpu"],返回紧凑的 60 个数据桶表格,而不是约 1,400 条原始样本。

  • “在 pve1 上启动容器 200” -- 调用 pve_start_lxc_container 启动容器并返回任务 UPID。

  • “为 VM 100 创建名为 pre-upgrade 的快照” -- 调用 pve_create_qemu_snapshot,在进行更改前创建快照。

  • “显示集群资源” -- 调用 pve_list_cluster_resources,显示所有 VM、容器、存储和节点。

  • “VM 100 在 PBS 上的最新备份是什么时候?” -- 调用 pve_list_storage_content 并传入 vmid: 100 和 mode: "latest",而不是列出数据存储上的每个快照。

  • “将 VM 100 迁移到节点 pve2” -- 调用 pve_migrate_qemu_vm,将 VM 实时迁移到另一节点。

  • “并行关闭 VM 103、104 和 105” -- 调用 pve_bulk_shutdown_guests,通过单个请求关闭整个集群中的多个客户机。

故障排查

连接被拒绝 / ECONNREFUSED

检查 PVE_BASE_URL 是否正确且包含端口(默认值:8006)。确保运行 MCP 服务的环境可以访问 PVE 主机。

SSL 证书错误

如果 PVE 实例使用自签名证书,请设置 PVE_VERIFY_SSL=false。这会对所有请求禁用 TLS 验证。

未显示工具

检查访问权限级别设置。在 read-only 模式下会注册 55 个工具。在 read-execute 模式下会注册 77 个工具。使用 full(或省略 PVE_ACCESS_TIER)以启用全部 122 个工具。检查 PVE_CATEGORIES——只会注册所列类别中的工具。还要检查标准错误输出,确认服务启动时没有错误。

开发

# Install dependencies
npm install

# Build the project
npm run build

# Run in development mode (auto-reload)
npm run dev

# Open the MCP Inspector for interactive testing
npm run inspect

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。