mcpField
M
moontide

moontide

本地服务
github.com/konni-arcadia媒体与设计42 周前更新

关于 moontide

Moontide 将 Claude 连接到基于浏览器的 Strudel 音乐编辑器,Claude 可编写代码并实时播放、修改音乐。这个业余项目适合希望通过对话创作音乐,同时查看和编辑底层代码的人。

主要功能

  1. 01在浏览器中生成并播放 Strudel 代码
  2. 02无需停止播放即可修改音乐
  3. 03查看和编辑代码及历史版本
  4. 04提供时间线、歌曲、历史、混音器和即兴视图
  5. 05渐进调整速度并发送页面上下文请求
  6. 06通过 Web MIDI 播放 MIDI 乐器

适用场景

  1. 01根据情绪或主题创作实时音乐
  2. 02通过描述修改正在播放的曲目
  3. 03恢复较早版本的音乐构想
  4. 04将浏览器选区或时间线时刻发送给 Claude

MCP 相关

Moontide 作为 stdio MCP 服务连接 Claude,提供启动和修改音乐、页面请求及 Strudel 参考信息的工具;参考信息也作为 MCP 资源提供。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"konni-arcadia-moontide": {
"command": "npx",
"args": [
"-y",
"moontide-mcp"
]
}
}
}
启动命令npx -y moontide-mcp

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

安装包
npmmoontide-mcp2.2.0

工具

14

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

Moontide

月亮指引潮汐。

一个业余项目:Claude 为你现场演奏音乐。描述一种情绪、一个主题或一个想法,Claude 就会编写 Strudel 代码,在浏览器中播放,并持续变化,永不停歇。

npm 版本 CI

Moontide 演示:Claude 根据几个词创作了一段地牢主题音乐,随后根据在页面中输入的请求改变音乐

▶ 在 YouTube 上观看演示(3 分钟,含声音)

制作缘由

Moontide 是一个个人项目。大部分代码、研究和文档都是由一位 AI 编码助手在我的指导下编写的。我设定目标,听每一处改动,用自己的乐器试奏,凭耳朵判断效果,并做出决定。这里的所有内容,包括错误在内,都由我负责。

初衷

出于好奇。我想看看,如果给 AI 助手一件好乐器,它能把真正的音乐创作做到什么程度,而不只是做技术演示。Strudel 就是这件乐器:它是一种现场编程语言,改动会在下一个循环中生效,不会中断播放;音乐以纯文本呈现,我们双方都能读懂。

Claude 编写代码,代码在播放时始终显示在屏幕上。你可以观看、手动编辑、回到任何早期版本,也可以指着页面上的某个元素,请它做出改动。

功能

  • 你可以提出请求(“用 D 小调创作一段梦幻风格的音乐”“更阴暗一些”“加一段贝斯”)。Claude 会编写 Strudel 代码,浏览器页面随即播放。每次改动都会在不到一秒内生效,音乐不会中断。
  • 代码始终可见且可编辑。每个播放过的版本都会保留,Claude 也可以恢复其中任意一个版本。
  • 页面围绕代码提供多种音乐视图:可编辑音符的命名音轨时间线、显示乐曲各部分的歌曲网格、以列表或树状结构呈现的历史记录、带有分组和指示灯的混音器(操作控件会改写代码),以及在钢琴或吉他上显示音阶的即兴视图。如果音符符合多个音阶,即兴视图会推荐一个,并说明原因。
  • Claude 可以在若干小节内逐渐加快或放慢节奏,而不是突然改变。
  • 在页面中的任意内容上单击右键,即可将该内容作为上下文发送给 Claude。顶部栏中的 Requests 列表会显示每个请求的处理结果。
  • 通过 Web MIDI,同一段代码也可以在页面中演奏真实的 MIDI 乐器。

Moontide 并非从零开始。它的音乐引擎是 Strudel,这是 Felix Roos、Alex McLean 和 Strudel 贡献者开发的 TidalCycles JavaScript 移植版。Moontide 是 Claude 与 Strudel 页面之间的桥梁。

工作原理

 you ──talk──► Claude ──MCP (stdio)──► Moontide ──WebSocket (localhost)──► browser page
                                          │                                 Strudel plays
                                          └─ history file on your disk      the code, sound
                                                                            and Web MIDI out
  1. Moontide 以 MCP 服务的形式运行,Claude 会连接到它。在你请求播放音乐或说“start Moontide”之前,它不会启动任何内容。

  2. 随后,它会在浏览器中打开一个带有 Strudel 编辑器的页面。

  3. Claude 编写代码,页面播放音乐,你可以看到代码焕发生机。

  4. Claude 可以随时停止音乐。页面本身也有 Play 和 Stop 按钮。

  5. 在页面中的任何位置右键点击,即可向 Claude 询问相关内容。在时间线中右键点击,还会发送指针所在时刻的信息:周期和节拍、当时播放的版本、在该处发声或从同一个十六分音符开始的音符及其力度;如果是 MIDI 音轨,还会发送乐器和通道。Session 抽屉(顶栏中的 Session 按钮)会说明页面请求是实时发送(立即到达 Claude),还是等待 Claude(在 Claude 执行下一项操作时到达)。其中的 (i) 会说明如何切换。

    顶栏中的 Requests 按钮会显示仍在处理中的请求数量,并打开一个列表:每个请求占一行,显示处理情况和经过的时间。请求状态会先显示 Sent,随后显示 Waiting for Claude's next action 或 Received,接着显示 Claude has started on it,表示 Claude 在请求到达后发起了调用。为请求所做的更改会先显示 Waiting for its line,表示正在等待下一个小节或乐句,随后显示 Applied as v12(即 History 视图中的版本);失败的更改会显示 Failed 和错误信息,被更新的更改取代或被 Stop 取消的更改也会注明。Claude 用文字回复的请求会显示 Answered 或 Declined,并附上 Claude 的回复。只有 Claude 在说明更改时明确提到某个请求,该请求才会显示为已应用,单凭时间先后不会判定为已应用。30 秒内没有新消息时,状态会显示 No change yet,并继续计时:这不表示失败。如果页面断开连接,未完成的请求会显示 Connection lost。点击一行即可查看完整请求及其状态说明。完成的请求会在 30 秒后移至简短的 Recent 列表。Moontide 服务停止后不会保留任何内容。

安装

简要步骤,适用于已安装 Node 22 或更高版本以及 Claude Code 的用户:

claude mcp add --scope user moontide -- npx -y moontide-mcp

然后启动一个新的 Claude 会话并请求播放音乐。以下步骤会解释各个环节。

1. 准备事项
  • Node 22 或更高版本,以及 npm 和 npx(随 Node 一同安装)。
  • Claude Code 或 Claude Desktop。 Moontide 是 MCP 服务,由 Claude 与其交互。
  • Chrome,Moontide 已在此浏览器中测试。使用 MIDI(Web MIDI)时,请使用 Chrome 或 Edge。
  • 互联网访问:Strudel 及其音效从网上加载。
  • 扬声器或耳机。
2. 检查 Node

在终端中运行:

node --version

输出必须为 v22 或更高版本。如果未安装 Node 或版本较低,请从 nodejs.org 安装 LTS 版本。在使用 Homebrew 的 macOS 上,也可以运行 brew install node。之后打开一个新终端并再次检查。

3. 获取 Claude

从 claude.com 安装 Claude Code 或 Claude Desktop,并登录一次。Moontide 两者都支持;测试最多的是 Claude Code。

4. 将 Moontide 添加到 Claude
Claude Code(已在 macOS 上测试;尚未在 Linux 上测试)

在终端中运行:

claude mcp add --scope user moontide -- npx -y moontide-mcp

使用 --scope user 后,Moontide 在每个文件夹中都可用。默认范围(local)仅在运行命令的文件夹中生效,而 project 范围会通过 .mcp.json 文件共享。

请保留名称 moontide。下方的页面请求命令会使用它。

运行以下命令检查安装:

claude mcp get moontide

同一行命令也适用于 Linux,但尚未在 Linux 上测试。

Claude Desktop(已在 macOS 上测试;尚未在 Windows 上测试)

依次打开 Settings、Developer、Edit Config。文件路径如下:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json

将 Moontide 添加到该文件中:

{
  "mcpServers": {
    "moontide": {
      "command": "npx",
      "args": ["-y", "moontide-mcp"]
    }
  }
}

如果文件中已有 mcpServers 块,请将 moontide 条目添加到其中。完全退出 Claude Desktop,然后重新启动。Claude Desktop 没有 Linux 版本。

在 Windows 上使用 Claude Code(尚未测试)

在 PowerShell 或命令提示符(不要使用 Git Bash)中运行:

claude mcp add --scope user moontide -- cmd /c npx -y moontide-mcp

使用 claude mcp get moontide 检查。命令必须显示 cmd 和 /c npx -y moontide-mcp。如果显示的是 C:/ 而不是 /c,请编辑用户文件夹中的 .claude.json 文件里的 moontide 条目,使其内容为 "command": "cmd", "args": ["/c", "npx", "-y", "moontide-mcp"]。

此配置形式来自社区反馈,本文作者尚未尝试。

从源代码运行

要从此仓库的副本运行 Moontide,而不是通过 npm 运行:

git clone https://github.com/konni-arcadia/moontide.git
cd moontide
npm ci
npm run build

然后使用 dist/index.js 的完整路径添加它,此处将该路径写作 <folder>:

claude mcp add --scope user moontide -- node <folder>/dist/index.js

npm test 会运行测试套件。真实浏览器检查(npm run probe:page)需要 Chrome。

5. 播放第一段音乐
  1. 启动一个新的 Claude 会话。此时不会打开任何内容:Moontide 会等你提出需求。
  2. 请求播放音乐,例如“播放一些适合开启新一天的舒缓音乐”或“来点缓慢、温暖的律动”。也可以说“启动 Moontide”。在 Claude Code 中,/mcp__moontide__start 的作用相同。
  3. 页面会在新标签页中打开,地址为 http://localhost:5757;如果 5757 端口正忙,则会使用其他端口。Claude 的回复会显示地址。标签页标题会显示 Claude 运行所在的文件夹和端口,例如“Moontide · my-project · 5757”。
  4. 在页面任意位置点击一次。浏览器只有在点击后才会开始播放声音。
  5. 请求进行更改:“更暗一些”“加点贝斯”“慢一点”。

在环境中设置 MOONTIDE_NO_BROWSER=1 后,启动 Moontide 不会打开标签页。你可以自行打开 Claude 回复中提供的地址。

更新

要查看正在运行的版本,请运行 npx -y moontide-mcp --version。版本发布记录见 CHANGELOG.md。npx 可能会继续使用已下载的副本;要升级到最新版本,请使用 @latest 再次添加 Moontide:

claude mcp remove moontide --scope user
claude mcp add --scope user moontide -- npx -y moontide-mcp@latest
卸载
claude mcp remove moontide --scope user

在 Claude Desktop 中,从配置文件中删除 moontide 条目,然后重启。Moontide 会将历史记录和设置保存在数据文件夹中(参见“历史记录”);如果也想删除这些内容,请删除该文件夹。

MIDI 乐器(可选)

Moontide 可以通过 Web MIDI 播放代码中的 MIDI 乐器。它已内置 Roland MT-32 和 SC-55 的模型。你可以描述自己的乐器和模型、添加音色目录并发送 MIDI 时钟。设置说明见 docs/midi.md。

无需权限提示的页面请求

在 Claude 应用的 Code 标签页中,让 Claude 开启或关闭页面请求。Claude 会调用 Moontide 的 set_page_requests 工具。在终端中的 Claude Code 里,输入 /mcp__moontide__page-requests-on 让请求立即生效,或输入 /mcp__moontide__page-requests-off 让请求等待。请求立即生效时,Claude 会启动监控程序,最长持续 30 分钟;当工具回复要求时,监控程序会再次启动。请求等待时,工具回复会停止提供启动监控程序的选项,直到再次开启页面请求。页面请求需要打开的页面,因此请先启动 Moontide。这些名称假定服务已添加为 moontide。

Claude Code 在启动页面请求的监控程序前会请求权限,因为它会运行命令。你可以每次都批准。如果你想改用范围更窄的权限规则,请参阅 Claude Code 文档中的权限部分。请勿允许宽泛的 node 命令。

音乐参考

Claude 通过 get_strudel_reference 工具(也以 MCP 资源的形式提供)获取页面运行的确切 Strudel 版本的事实性参考,涵盖九个主题:Strudel 与 TidalCycles 的比较、迷你记谱法、模式函数、效果和声音控制、音色库、Strudel 中的乐理、过渡、歌曲结构和 MIDI 输出。它只包含事实:有哪些内容以及如何编写。Moontide 不提供情绪词汇、风格素材或示例作品;Claude 会运用自己的乐理知识,将你的文字转化为音乐,然后用一句话告诉你它做了什么选择。用你自己的话提出一个惊喜要求:没有相应的菜单命令。为本次创作设定一个方向,例如渐进变化,Claude 就会在每次修改时遵循这个方向,直到你取消。告诉 Claude 你在意什么(旋律、节奏),它就会保留这些内容,并在彻底改写前征求你的意见。

小幅修改与和声

Claude 可以通过 edit_code 工具修改长篇作品中的几行代码,而无需重新发送整段代码;对于需要等到小节开始才生效的修改,Claude 会等到小节开始时再编辑,并保留你手动所做的编辑。

代码可以通过一行顶层代码声明所指的和声,例如 const harmony = 'C:minor',并将其放在模式上方。它不会播放任何声音,也不会成为音轨。Jam 视图随后会并排显示两行:“已声明:”和“实际听到:”。

当音符适用于多个音阶时,Jam 视图会推荐一个音阶,并用一句话说明原因,例如“推荐:C 大调,听到的 C 音最多。”如果正在播放的段落声明的音阶也属于适用音阶,它会采用该音阶;否则会采用音符最支持的音阶。警告仍会显示。“适用音阶,点击切换:”会列出这些音阶,点击一次或按 Enter 即可切换整个视图。只要适用的音阶不变,你选择的音阶就会保留;重新加载后则会重置。如果适用音阶的音符各不相同,且代码声明的音阶不属于其中任何一个,则不会显示警告:视图会说明原因并列出这些音阶,但不提供切换选项。钢琴会像吉他一样着色,使用相同的图例;此外,每个声部都有形状或文字提示,因此即使不看颜色也能辨认。

歌曲结构

Claude 编写的每首新作品都会在顶部以一个 const song 开始。它会列出各个段落及其循环长度,说明每个段落中每条音轨播放哪个版本(变体),或该音轨是否休止,还可以将音轨分组。它仍是普通的 Strudel,同一段代码也能在纯 Strudel 中播放。对旧作品提出的小幅修改会直接在原处完成,不会重构作品。没有歌曲结构的作品播放和显示方式与之前相同。

对于包含歌曲结构的作品,Parts 视图称为 Song。Song 网格会将音轨显示在可折叠的分组下,每个段落占一列,并标记正在播放的段落。

  • 点击段落标题,即可在工具栏指定的下一条边界处启动该段落:当前播放段落结束、下一乐句开始,或下一小节开始。再次点击可取消。
  • 点击单元格,可为该音轨和段落选择其他变体或休止。它会按照你平常手动编辑的时机接管。
  • 固定变体会显示其音符是否符合该段落的和声:符合、不符合或无法检查。它只作提示,不会阻止播放。
  • 点击 Stop 后再点击 Play,会从第一个段落开始播放。Jam 视图中的 Declared 行会随正在播放的段落更新。

Mixer 会将各分组显示为边框,并与网格同步折叠。点击分组的 M 或 S,一次即可将其下的所有音轨静音或独奏。没有分组推子,因为纯 Strudel 不支持分组增益。每条通道和每个分组上的小指示灯会在听到音符时闪烁。在 Session 抽屉中关闭动态效果后,音符持续出现时,指示灯会保持亮起。

在 Timeline 上,点击音符即可选中它。向上或向下拖动,或按 Up 和 Down 键,可按半音改变音高。按 Delete、Backspace 或选择“Make a rest”,可将音符变为休止。两个按钮可按十分之一的幅度改变其力度。页面会在写入前检查编辑内容;如果一次编辑会在多个位置改变音符,会先告知你,并沿用你手动编辑的时机。页面无法编辑的音符会显示原因。随后,你的操作会打开 Ask 框,其中已填好请求;只有按 Enter 后才会发送给 Claude。拖动以选中单条音轨上的范围,或按住 Shift 并按 Left 或 Right 键,即可选中整数个循环的范围,然后使用“Ask Claude”发送。

右键点击段落、音轨、单元格或分组,即可向 Claude 询问相关内容。

速度渐变

请 Claude 在若干小节内加快或减慢速度,例如“在八小节内逐渐加速到 140”。Claude 会在 set_code 或 edit_code 中发送新代码,以及要达到的速度和 glideBars。glideBars 是一个介于 1 到 64 之间的整数,表示小节数。随后,速度会从当前播放速度以均匀的小步逐渐变为代码中的速度,并精确停在该速度上。渐变会立即开始,或在更改等待下一个小节或乐句时,从对应边界开始。

渐变过程中,顶部栏中的速度会显示实时速度、箭头和目标速度。将鼠标悬停在其上,可查看剩余小节数。

你对 Mixer、Song 网格单元格、Timeline 和手动编辑所做的更改不会中断渐变。包含其他速度的代码会取消渐变,并立即按新速度播放。未指定速度的代码会取消渐变,速度保持不变。新的 glideBars 会替换当前设置。Stop 也会取消渐变;下次点击 Play 时,会按代码中的速度开始播放。重新加载页面或由另一个标签页接管播放也会结束渐变。渐变没有专用的取消按钮。

如果没有内容正在播放、代码未设置速度,或代码设置的速度与当前播放速度相同,系统会拒绝渐变请求且不作任何更改。渐变不会成为一个版本:它不会写入代码或历史记录。

MIDI 时钟会跟随渐变的每一步。尚未验证跟随该时钟的硬件(例如琶音器或步进音序器)对速度渐变的响应方式。

历史记录

每个播放过的版本都会保留下来:Claude 自己做的修改,以及你按 Ctrl+Enter 做的编辑,每个版本都附有时间、修改者和简短标签。失败的代码和停止播放不算版本。

你可以向 Claude 提出类似这样的要求:“回到上一个版本”“回到 3 次修改之前的版本”“回到有贝斯的那个版本”或“保留这个版本,命名为 Take two”,也可以说“列出我收藏的版本”。Session 抽屉会在“上次更改”卡片中显示当前播放版本的编号,例如 v42。

历史记录文件位于操作系统的用户数据文件夹中:

  • macOS:~/Library/Application Support/moontide/history.jsonl
  • Linux:$XDG_DATA_HOME/moontide/history.jsonl,或 ~/.local/share/moontide/history.jsonl
  • Windows:%APPDATA%\moontide\history.jsonl

设置 MOONTIDE_DATA_DIR 可使用其他文件夹。历史记录是一个文本文件,每行一条记录,即使 Claude 会话结束后也会保留。

历史记录最多保留最近 1000 个版本;更早的版本会分批删除,并通知 Claude。收藏的版本永远不会被删除。

如果文件中有一行无法读取,Claude 会收到无法读取的行号;这些行会原样保留在文件中。如果文件完全无法读取或写入,音乐仍会继续播放,并会通知 Claude。

使用同一个历史记录文件时,一次只运行一个 Moontide。同时运行两个可能会导致两个版本使用相同的编号。

故障排除

安装后立即显示“Failed to connect”。 首次启动时会下载软件包,而 Claude Code 会在 30 秒后放弃。稍等片刻,然后运行 claude mcp list 再次检查。如果仍然失败,请延长超时时间后启动 Claude Code:MCP_TIMEOUT=60000 claude。在 PowerShell 中,使用 $env:MCP_TIMEOUT = "60000"; claude。

在另一个文件夹中找不到 Moontide。 添加时没有使用 --scope user。请使用 Install 行重新添加。

页面没有打开。 Claude 的回复中会显示页面地址。你可以自行打开,也可以让 Claude 再次启动 Moontide:如果没有已连接的页面,它会提供地址并打开新标签页。

打开了多个 Moontide 标签页。 每个启动了 Moontide 的 Claude 会话都有自己的页面和端口。标签页标题格式为“Moontide · · ”,其中包含该会话运行所在的文件夹;Session 抽屉中也会显示相同的信息。询问 Claude 哪个标签页属于它:它会告知你地址、端口和标签页标题。

没有声音。 在页面中单击一次。检查浏览器标签页是否处于静音状态,并保持页面打开。

Claude Desktop 找不到 npx。 将完整路径填入 "command":在 macOS 上运行 which npx 或在 Windows 上运行 where npx 所显示的路径,此处写作 <full path printed by which npx>。这是常见建议,但尚未在此处尝试。macOS 上的 Claude Desktop 日志位于 ~/Library/Logs/Claude,Windows 上位于 %APPDATA%\Claude\logs。

MIDI 提示使用 Chrome 或 Edge。 该浏览器不支持 Web MIDI。

状态

目前处于早期阶段,仅供个人使用。它只在一套环境中运行过:Mac、Chrome、Claude Code 和 Claude Desktop;MIDI 方面则使用 Roland SC-55、Munt MT-32 模拟器和 Roland JUPITER-Xm。尚未在其他环境中尝试过。测试套件会在 CI 中运行于 Windows、Linux 和 macOS,但还没有人在 Windows 或 Linux 上用它播放过音乐。已知存在一些错误。欢迎反馈,但我无法承诺提供支持。

已知限制:

  • 仅在 macOS 上手动测试过,使用的是 Chrome、Claude Code 和 Claude Desktop。
  • 尚未在 Windows 和 Linux 上手动测试。Edge、Safari 和 Firefox 也尚未测试。
  • 需要访问互联网。
  • MIDI 需要 Chrome 或 Edge。
  • 尚未验证跟随 Moontide MIDI 时钟的硬件(例如琶音器或步进音序器)对渐变速度的响应。
  • 使用同一个历史记录文件时,一次只运行一个 Moontide。
  • 首次通过 npx 启动时会下载软件包,可能需要较长时间。

网络与隐私

  • 服务仅监听 127.0.0.1,并拒绝任何其他主机名的请求。
  • Moontide 自身的服务代码不会发出任何出站请求,也不会发送遥测数据。
  • 页面从 unpkg 加载 @strudel/repl 1.3.0 和 acorn 8.18.0,并固定为精确版本且带有完整性哈希。
  • 随后,Strudel 会从 raw.githubusercontent.com 和 cdn.jsdelivr.net 获取声音列表和采样。它们不受哈希校验保护。
  • Claude 编写的代码会在页面中运行,并可能从其他地址加载采样。
  • 历史记录保存在上文所述的本地数据文件夹中。

贡献与安全

欢迎通过问题(使用错误报告表单)提交错误报告和想法。拉取请求的处理方式请参阅 CONTRIBUTING.md。

安全问题请通过私密报告渠道提交,切勿公开创建问题。请参阅 https://github.com/konni-arcadia/moontide/security/policy。

致谢

本项目基于其他人的工作构建:

  • Felix Roos、Alex McLean 和 Strudel 贡献者:Strudel (源代码:https://codeberg.org/uzu/strudel),这是一个能演奏每个音符的实时编码引擎。
  • Alex McLean 和 TidalCycles 社区:TidalCycles,这是一种 Strudel 移植到 JavaScript 的模式语言。
  • 制作采样的创作者:Strudel 默认加载了他们的采样集,包括 TidalCycles Dirt-Samples 和 Versilian Community Sample Library (VCSL)。
  • Anthropic:Model Context Protocol 及其 TypeScript SDK,让 Claude 能够与 Moontide 通信。
  • acorn 作者:页面用来读取代码的 JavaScript 解析器。

许可证

Moontide 可演奏 Strudel,而 Strudel 使用 AGPL-3.0-or-later 许可证。Moontide 也使用相同的许可证。它会在运行时从 unpkg 加载 Strudel,不会随附 Strudel。许可证文本见 LICENSE。Moontide 与 Strudel 或 TidalCycles 项目以及 Anthropic 均无关联,也未获得它们的认可。


Konni — 使用 AI 编码助手构建。

评论

支持 Markdown

第一次接触 MCP?

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

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