mcpField
C

Commune

本地服务
github.com/shanjai-raj通信协作118 周前更新

关于 Commune

Commune 是为 AI Agent 提供邮箱和 SMS 访问能力的 MCP 服务。它将消息处理与邮箱、域名管理、邮件线程分诊及投递跟踪结合起来。

主要功能

  1. 01读取、搜索并回复邮件线程
  2. 02发送带附件的邮件
  3. 03创建邮箱并管理域名
  4. 04为线程添加标签、分配人员和更新状态
  5. 05发送 SMS 并搜索消息记录
  6. 06跟踪投递、退信和投诉

适用场景

  1. 01分诊并回复客户支持邮件
  2. 02按主题或内容搜索对话
  3. 03通过 SMS 发送订单更新
  4. 04查看邮件投递和抑制名单数据

MCP 相关

向 MCP 客户端提供邮件、邮箱、域名、线程分诊、投递跟踪和 SMS 工具,支持 Claude Desktop、Cursor 和 Windsurf。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"shanjai-raj-commune": {
"command": "uvx",
"args": [
"commune-mcp"
],
"env": {
"COMMUNE_API_KEY": "<COMMUNE_API_KEY>"
}
}
}
}
启动命令uvx commune-mcp
需要配置的环境变量
COMMUNE_API_KEY密钥Your Commune API key (starts with comm_). Get one at https://app.commune.email

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

安装包
pypicommune-mcp0.1.9

工具

还没有获取到工具列表

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

详细介绍

Claude Desktop、Cursor 和 Windsurf 的电子邮件

PyPI PyPI Downloads Python 3.9+ Apache-2.0 License MCP Works with Claude Works with Cursor commune.email

为 Claude(或任何 MCP 客户端)提供真正的电子邮件收件箱和 SMS。30 秒即可安装,无需克隆。

你的 AI Agent 可以:

  • 阅读电子邮件 — 列出邮件线程、按主题搜索、获取完整邮件历史记录
  • 发送电子邮件 — 在现有线程中回复、撰写新邮件、附加文件
  • 管理收件箱 — 创建程序化收件箱、设置自定义域名、使用标签和状态进行分类
  • 跟踪投递情况 — 获取投递统计数据、抑制列表、退信和投诉事件
  • 发送和接收 SMS — 配置电话号码、发送消息、搜索 SMS 历史记录

可与 Claude Desktop、Cursor、Windsurf 或任何 MCP 客户端搭配使用。


通过 Smithery 安装

smithery badge

Commune 已发布到 Smithery。为任何受支持的客户端一键安装:

# Install Smithery CLI (once)
npm install -g @smithery/cli@latest

# Add Commune to your client
npx @smithery/cli install commune-dev/commune --client claude      # Claude Desktop
npx @smithery/cli install commune-dev/commune --client cursor      # Cursor
npx @smithery/cli install commune-dev/commune --client windsurf    # Windsurf
npx @smithery/cli install commune-dev/commune --client vscode      # VS Code
npx @smithery/cli install commune-dev/commune --client claude-code # Claude Code
npx @smithery/cli install commune-dev/commune --client cline       # Cline
npx @smithery/cli install commune-dev/commune --client roo-cline   # Roo Code
npx @smithery/cli install commune-dev/commune --client goose       # Goose

也可以通过 Smithery API 连接,用于 Agent 对 Agent 的场景:

https://commune--commune-dev.run.tools

示例提示词

配置完成后,你可以用自然语言向 AI 助手下达电子邮件和 SMS 相关指令:

阅读电子邮件:

  • “检查我的支持收件箱是否有新邮件”
  • “显示账单收件箱中的所有未读邮件线程”
  • “查找本周询问退款的客户邮件”
  • “搜索上个月所有关于付款问题的邮件线程”
  • “conv_abc123 线程的完整对话历史记录是什么?”
  • “显示所有尚未回复的邮件线程”

发送电子邮件:

  • “回复 John 的邮件,告诉他我们会在 48 小时内处理退款”
  • “给 [email protected] 发送一封主题为‘明天开会’的邮件,告诉她会议改到下午 3 点”
  • “回复支持线程中关于登录故障的最后一条消息,并保留在线程中”
  • “给上周所有未回复的潜在客户发送一封跟进邮件”

整理和分类:

  • “将此线程标记为紧急,并分配给账单团队”
  • “将所有超过 30 天且没有回复的线程标记为已关闭”
  • “显示过去 7 天的邮件送达率统计数据”
  • “列出支持收件箱中所有被抑制的电子邮件地址”

SMS:

  • “为我的 Agent 配置一个电话号码”
  • “向 +14155551234 发送 SMS,内容为‘你的订单已发货’”
  • “显示我的所有 SMS 对话”
  • “在我的 SMS 消息中搜索与配送问题有关的内容”

域名和收件箱管理:

  • “在 example.com 下创建一个名为‘billing’的新收件箱”
  • “验证 example.com 需要添加哪些 DNS 记录?”
  • “显示我所有已验证的域名”

设置

1. 获取 API 密钥

从你的 Commune 控制面板创建 API 密钥。密钥以 comm_ 开头。

2. 添加到 MCP 客户端

选择你的客户端并添加 Commune 服务。无需本地文件 — uvx 会自动获取软件包。

Claude Desktop

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS):

{
  "mcpServers": {
    "commune": {
      "command": "uvx",
      "args": ["commune-mcp"],
      "env": {
        "COMMUNE_API_KEY": "comm_your_key_here"
      }
    }
  }
}
Cursor

打开 设置 → MCP → 添加服务器:

{
  "commune": {
    "command": "uvx",
    "args": ["commune-mcp"],
    "env": {
      "COMMUNE_API_KEY": "comm_your_key_here"
    }
  }
}
Windsurf

打开 设置 → MCP,使用与 Cursor 相同的格式。

替代方案:使用 pip 安装

如果你更喜欢使用 pip 而不是 uvx:

pip install commune-mcp

然后使用 commune-mcp 作为命令:

{
  "commune": {
    "command": "commune-mcp",
    "env": {
      "COMMUNE_API_KEY": "comm_your_key_here"
    }
  }
}

工作原理

配置完成后,你的 AI agent 就可以在自然对话中使用 Commune 工具:

你: 检查我的支持邮箱,看看有没有新邮件

Agent: (调用 list_domains → list_inboxes → list_threads) [email protected] 中有 3 个新邮件线程:

  1. “未收到订单”——4 条消息,最后一次活动在 2 小时前
  2. “账单问题”——1 条消息,今天收到
  3. “功能请求”——2 条消息,最后一次活动在昨天

你: 订单的问题是什么?

Agent: (调用 get_thread_messages) 客户 [email protected] 表示他们的订单 #4521 已于 5 天前发货,但至今未收到。他们已跟进两次,询问追踪信息。

你: 回复说我们正在向物流部门核实,并会在 24 小时内告知进展

Agent: (调用带有 thread_id 的 send_email) 完成——已在现有邮件线程中向 [email protected] 发送回复。

Agent 会根据你的请求决定调用哪些工具。你无需指定工具名称。


邮件如何通过 Commune MCP 流转

入站(你收到邮件):

  User sends email
       |
       v
  Commune receives at your inbox ([email protected])
       |
       v
  Commune fires webhook to your app (8 retries, HMAC signed)
       |
       v
  Your MCP client reads thread via list_threads / get_thread_messages
       |
       v
  You ask Claude: "Reply to John saying we're on it"
       |
       v
  Claude calls send_email with thread_id --> reply appears in John's email thread

出站(你发送邮件):

  You: "Send an update email to all VIP customers"
       |
       v
  Claude calls list_threads --> get_thread_messages --> send_email (per thread)
       |
       v
  Commune delivers via DKIM-signed SMTP
       |
       v
  Delivery events tracked: sent --> delivered / bounced / complained

工具参考

域名工具

这些工具用于管理你的邮件域名。发送或接收邮件前,必须通过 DNS 验证域名。

list_domains

列出你账户中的所有邮件域名。

参数: 无

输出:

[
  {
    "id": "d_abc123",
    "name": "example.com",
    "status": "verified",
    "region": "us-east-1"
  }
]

create_domain

创建新的自定义域名。创建后,使用 get_domain_records 查看所需的 DNS 记录,然后使用 verify_domain 进行验证。

参数类型必填描述
namestr是域名(例如 "example.com")
regionstr否AWS 区域(例如 "us-east-1")

输出: 已创建的域名对象,包含其 ID 和状态。


get_domain_records

获取需要在域名注册商处添加的 DNS 记录,添加后才能通过验证。

参数类型必填描述
domain_idstr是来自 list_domains 的域名 ID

输出:

[
  { "type": "MX", "name": "example.com", "value": "inbound-smtp.us-east-1.amazonaws.com", "status": "pending" },
  { "type": "TXT", "name": "example.com", "value": "v=spf1 include:amazonses.com ~all", "status": "pending" }
]

verify_domain

触发 DNS 验证。在域名注册商处添加记录后调用。

参数类型必填描述
domain_idstr是域名 ID

收件箱工具

收件箱是域名下的邮箱。例如,example.com 下的 support → [email protected]。

list_inboxes

列出收件箱。不提供 domain_id 时,会列出所有域名下的全部收件箱。

参数类型必填描述
domain_idstr否按域名筛选(省略时列出全部)

输出:

[
  {
    "id": "i_xyz789",
    "localPart": "support",
    "address": "[email protected]",
    "webhook": { "endpoint": "https://..." }
  }
]

create_inbox

创建新收件箱。如果未提供域名,则会自动解析,无需设置 DNS。

参数类型必填描述
local_partstr是@ 前面的部分(例如 "support"、"billing")
domain_idstr否要在其下创建收件箱的域名。省略时会自动解析。
namestr否收件箱的 Agent 名称
display_namestr否在邮件客户端中显示的发件人名称
webhook_endpointstr否用于邮件通知的 URL

delete_inbox

永久删除收件箱。

参数类型必填描述
domain_idstr是域名 ID
inbox_idstr是收件箱 ID

set_extraction_schema

使用 JSON Schema 为收件箱配置结构化提取。

参数类型必填描述
domain_idstr是Domain ID
inbox_idstr是收件箱 ID
namestr是Schema 名称
schemastr是Schema 对象的 JSON 字符串
descriptionstr否易于理解的描述
enabledbool否启用提取(默认 true)

remove_extraction_schema

从收件箱移除结构化提取。

参数类型必填描述
domain_idstr是Domain ID
inbox_idstr是收件箱 ID

线程工具

线程是电子邮件对话,即一组相关消息。这些是最常用的工具。

list_threads

列出收件箱中的线程,支持基于游标的分页。默认按最新优先返回。

参数类型必填描述
inbox_idstr二选一按收件箱筛选
domain_idstr必填按域筛选
limitint否1–100,默认 20
cursorstr否上一响应中的分页游标
orderstr否"desc"(最新优先)或 "asc"

输出:

{
  "data": [
    {
      "thread_id": "conv_abc123",
      "subject": "Order not received",
      "message_count": 4,
      "last_message_at": "2025-03-15T14:30:00Z",
      "snippet": "Hi, I ordered 5 days ago and still haven't...",
      "last_direction": "inbound",
      "has_attachments": false
    }
  ],
  "next_cursor": "eyJsYXN0...",
  "has_more": true
}

要获取下一页,请将 next_cursor 作为 cursor 参数传入。


get_thread_messages

获取线程中的所有消息。按最早优先返回(按时间顺序)。

参数类型必填描述
thread_idstr是来自 list_threads 的线程 ID
limitint否1–1000,默认 50
orderstr否"asc"(按时间顺序)或 "desc"

输出:

[
  {
    "message_id": "msg_001",
    "direction": "inbound",
    "participants": [
      { "role": "sender", "identity": "[email protected]" },
      { "role": "to", "identity": "[email protected]" }
    ],
    "content": "Hi, I placed order #4521 five days ago...",
    "metadata": {
      "subject": "Order not received",
      "created_at": "2025-03-10T09:15:00Z"
    }
  },
  {
    "message_id": "msg_002",
    "direction": "outbound",
    "content": "We're looking into this for you...",
    "metadata": {
      "subject": "Re: Order not received",
      "created_at": "2025-03-10T10:30:00Z"
    }
  }
]

搜索工具
search_threads

按主题或内容搜索电子邮件线程。有条件时使用向量搜索(语义搜索),否则回退到文本匹配。

参数类型必填描述
querystr是搜索查询(自然语言)
inbox_idstr二选一按收件箱筛选
domain_idstr必填按域筛选
limitint否1–100,默认 20

分诊工具

管理线程状态、标签和分配——适用于 Agent 的工作流基础操作。

get_thread_metadata

获取线程的分诊元数据:标签、状态和分配信息。

参数类型必填描述
thread_idstr是线程 ID

set_thread_status

设置线程的分诊状态。

参数类型必填描述
thread_idstr是线程 ID
statusstr是"open"、"needs_reply"、"waiting" 或 "closed"

tag_thread

为线程添加标签。标签会累加,不会移除现有标签。

参数类型必填描述
thread_idstr是线程 ID
tagsstr是逗号分隔的标签(例如 "urgent,vip,sales-lead")

untag_thread

从线程移除标签。

参数类型必填描述
thread_idstr是线程 ID
tagsstr是要移除的逗号分隔标签

assign_thread

将线程分配给 Agent 或用户。传入空值可取消分配。

参数类型必填描述
thread_idstr是线程 ID
assigned_tostr否Agent/用户标识符(传入空值可取消分配)

投递能力工具
get_deliverability_stats

获取投递指标:已发送、已送达、退信、投诉和失败的数量及比率。

ParameterTypeRequiredDescription
inbox_idstr二选一按收件箱筛选
domain_idstr必填按域名筛选
periodstr否"24h"、"7d"、"30d"(默认:"7d")

get_suppressions

列出被抑制的电子邮件地址(退信、投诉、退订)。

ParameterTypeRequiredDescription
inbox_idstr否按收件箱筛选
domain_idstr否按域名筛选
limitint否最大结果数(默认:50)

get_delivery_events

获取投递事件日志,以跟踪单封电子邮件。

ParameterTypeRequiredDescription
message_idstr否筛选特定消息
inbox_idstr否按收件箱筛选
domain_idstr否按域名筛选
event_typestr否"sent"、"delivered"、"bounced"、"complained"、"failed"
limitint否最大结果数(默认:50)

消息工具
send_email

发送电子邮件。可发送新邮件,也可在现有会话中回复。

ParameterTypeRequiredDescription
tostr是收件人;多个收件人以逗号分隔
subjectstr是主题行
htmlstr否*HTML 正文
textstr否*纯文本正文
from_addressstr否发件人地址
reply_tostr否回复地址
thread_idstr否在现有会话中回复
inbox_idstr否从指定收件箱发送
domain_idstr否从指定域名发送
attachmentsstr否以逗号分隔的附件 ID

*至少提供 html 或 text。

若要在会话中回复,请传入从 list_threads 或 get_thread_messages 获取的 thread_id。电子邮件会归入收件人邮箱中的相应会话。


附件工具
upload_attachment

上传文件。返回可用于 send_email 的 attachment_id。

ParameterTypeRequiredDescription
contentstr是Base64 编码的文件内容
filenamestr是文件名(例如 "report.pdf")
mime_typestr是MIME 类型(例如 "application/pdf")

输出:

{
  "attachment_id": "att_abc123",
  "filename": "report.pdf",
  "mime_type": "application/pdf",
  "size": 45230
}

get_attachment_url

获取附件的临时下载 URL。

ParameterTypeRequiredDescription
attachment_idstr是附件 ID
expires_inint否URL 过期前的秒数(默认:3600)

输出:

{
  "url": "https://res.cloudinary.com/...",
  "expires_in": 3600,
  "filename": "report.pdf",
  "mime_type": "application/pdf",
  "size": 45230
}

电话号码工具

管理已开通的 SMS 电话号码。

list_phone_numbers

列出账户中所有已开通的电话号码。

**参数:**无


get_phone_number

获取单个已开通电话号码的详细信息。

ParameterTypeRequiredDescription
phone_number_idstr是从 list_phone_numbers 获取的电话号码 ID

list_available_phone_numbers

购买前浏览可用的电话号码。

ParameterTypeRequiredDescription
typestr否"TollFree"(默认)或 "Local"
countrystr否两字母国家代码(默认:"US")
limitint否最大结果数(默认:10)

provision_phone_number

购买一个用于接收 SMS 的电话号码。会从你的余额中扣除积分。

ParameterTypeRequiredDescription
phone_numberstrNo要购买的指定 E.164 号码(省略时自动选择)
typestrNo"tollfree"(默认)或 "local"
friendly_namestrNo易于理解的标签

update_phone_number

更新电话号码的易读名称或自动回复消息。

ParameterTypeRequiredDescription
phone_number_idstrYes电话号码 ID
friendly_namestrNo易于理解的标签
auto_replystrNo对所有收到的 SMS 自动回复的文本(设为空字符串可禁用)

release_phone_number

将已配置的电话号码释放回号码池。积分不予退还。消息历史会保留。

ParameterTypeRequiredDescription
phone_number_idstrYes要释放的电话号码 ID

set_phone_number_webhook

为电话号码配置 webhook,以接收 SMS 事件通知。

ParameterTypeRequiredDescription
phone_number_idstrYes电话号码 ID
endpointstrYes用于接收 webhook 负载的 HTTPS URL
secretstrNo用于验证负载的 webhook 签名密钥
eventslistNo事件类型(默认:["sms.received", "sms.sent"])

set_phone_number_allow_list

设置电话号码的允许列表——只有这些号码可以向其发送 SMS。此操作会替换现有列表。

ParameterTypeRequiredDescription
phone_number_idstrYes电话号码 ID
numberslistYes允许的 E.164 电话号码(使用空列表可清空)

set_phone_number_block_list

设置电话号码的屏蔽列表——这些号码的消息将被拒绝。此操作会替换现有列表。

ParameterTypeRequiredDescription
phone_number_idstrYes电话号码 ID
numberslistYes要屏蔽的 E.164 电话号码(使用空列表可清空)

SMS 工具
send_sms

发送一条 SMS 消息。

ParameterTypeRequiredDescription
tostrYesE.164 格式的收件人(例如 "+15551234567")
bodystrYesSMS 消息文本
phone_number_idstrNo使用指定电话号码发送(省略时自动分配)

list_sms_conversations

列出 SMS 对话线程。

ParameterTypeRequiredDescription
phone_number_idstrNo按电话号码筛选(省略时列出全部)
limitintNo1–100,默认值为 20

get_sms_thread

获取与指定号码之间 SMS 线程中的所有消息。

ParameterTypeRequiredDescription
remote_numberstrYesE.164 格式的外部电话号码
phone_number_idstrYes你的 Commune 电话号码 ID

search_sms

对 SMS 消息进行语义搜索。

ParameterTypeRequiredDescription
querystrYes搜索查询
phone_number_idstrNo将范围限定为指定电话号码
limitintNo1–100,默认值为 20

list_sms_suppressions

列出已禁止接收 SMS 的电话号码(通过 STOP 关键词选择退出)。

ParameterTypeRequiredDescription
phone_number_idstrNo按电话号码筛选(省略时列出全部)

remove_sms_suppression

从短信抑制列表中移除一个电话号码(重新启用短信投递)。

参数类型必填描述
phone_numberstr是要从抑制列表中移除的 E.164 格式电话号码

积分工具
get_credit_balance

获取 Commune 账户当前的积分余额。

参数: 无


list_credit_bundles

列出可购买的积分套餐。

参数: 无


credits_checkout

创建 Stripe 结账会话以购买积分套餐。

参数类型必填描述
bundlestr是套餐 ID:"starter"、"growth" 或 "scale"
return_urlstr否付款后重定向到的 URL

常见问题

如何将 Commune 添加到 Claude Desktop? 编辑 ~/Library/Application Support/Claude/claude_desktop_config.json,并添加 commune MCP 服务配置块(见上方的设置说明)。重启 Claude Desktop。Commune 工具会自动出现在 Claude 的工具列表中。

commune-mcp 与 Python/TypeScript SDK 有什么区别? commune-mcp 用于在 Claude Desktop 或 Cursor 等 MCP 客户端中进行交互式使用——你只需用自然语言下达指令,AI 就会调用这些工具。Python/TypeScript SDK 则用于通过代码以编程方式构建自主 Agent。两者都连接到同一个 Commune 后端。

它支持 Cursor 的 Agent 模式吗? 支持。按照设置部分所示的 JSON 配置块,通过 Settings → MCP → Add Server 将 commune-mcp 添加到 Cursor。配置完成后,Cursor 的 Agent 模式可以在任何聊天或 Composer 会话中使用所有 Commune 工具——读取会话、发送电子邮件和管理收件箱。

如何通过 MCP 服务创建新收件箱? 只需提出请求:“在 example.com 下创建一个名为 support 的新收件箱。”Agent 会调用 create_inbox,并传入 local_part: "support" 和你的域名 ID。如果你未指定域名,Commune 会自动分配一个,因此你只需提供本地部分,无需配置 DNS,即可创建收件箱。

Claude 能通过它实际发送电子邮件吗? 可以。Agent 调用 send_email 时,Commune 会通过带 DKIM 签名的 SMTP 将真实电子邮件投递到收件人的收件箱。邮件显示效果与普通邮件完全相同——在 Gmail 和 Outlook 中会正确归入同一会话,支持 HTML 和附件,并会生成可供追踪的投递事件。

我不在聊天会话中时收到的邮件会怎样? Commune 会持久保存所有收到的邮件和会话。打开新聊天并要求检查收件箱时,Agent 会调用 list_threads,检索上次会话之后收到的所有邮件。你也可以选择为每个收件箱配置 Webhook,这样你的应用就能实时收到通知(重试 8 次,使用 HMAC 签名)。

如何在会话中回复,而不是开始一封新邮件? 向 send_email 传入 thread_id。最简单的方式是先让 Agent 显示某个会话,然后说“回复此会话并写上……”。它会在上下文中保留 thread_id 并自动传入。回复会在收件人的邮件客户端中显示为同一会话中的邮件。

我的邮件内容是否私密? 你的邮件内容通过 TLS 传输,并以静态加密方式存储在 Commune 的基础设施上。每个请求都通过 API 密钥进行身份验证,Webhook 使用 HMAC 签名,因此你的应用可以验证负载未被篡改。你的内容绝不会用于训练 AI 模型。

我可以将它与自己的电子邮件域名配合使用吗? 可以。使用 create_domain 注册你的域名,然后使用 get_domain_records 查看所需的 MX、TXT 和 CNAME 记录,在域名注册商处添加这些记录,并调用 verify_domain。验证通过后,该域名下的所有收件箱都会使用你的域名作为发件人地址(例如 [email protected])。 API 密钥是什么样的? Commune API 密钥以 comm_ 前缀开头,后接随机字符串,例如 comm_sk_live_abc123xyz。请在 Commune 控制面板 中创建密钥。请妥善保管:将其视为密码,切勿将其提交到源代码管理中。

如何在收件箱中搜索特定主题? 自然地提出请求,使用 search_threads 工具,例如:“在我的支持收件箱中搜索有关退款的邮件。”Agent 会使用你的查询调用 search_threads。Commune 使用语义搜索,因此即使确切措辞不匹配,也能找到相关邮件串。例如,“退钱”也能找到有关退款的邮件串。

多人可以共用同一个 Commune MCP 服务吗? 可以。Commune 使用组织功能,多个团队成员可以共用同一账户和 API 密钥,也可以各自拥有一个限定于同一组织的 API 密钥。所有密钥都可以访问相同的域名和收件箱。若要隔离不同项目,请创建单独的收件箱(例如 billing@、support@),并在工具调用中按 inbox_id 进行筛选。


环境变量

变量必填描述
COMMUNE_API_KEY是你的 API 密钥(以 comm_ 开头)
COMMUNE_BASE_URL否覆盖 API URL(默认:Commune 云服务)

生态系统

软件包描述
commune电子邮件和 SMS 基础设施 — 可自托管的后端
commune-aiTypeScript/Node.js SDK
commune-pythonPython SDK
commune-mcp适用于 Claude Desktop、Cursor、Windsurf 的 MCP 服务
commune-cli命令行界面

许可证

Apache-2.0

评论

支持 Markdown

第一次接触 MCP?

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

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