mcpField
H
honest-cv

honest-cv

本地服务
github.com/JesusCabreraReveles商业与营销11 周前更新

关于 honest-cv

honest-cv 是 MCP 服务、命令行工具和 Claude Code 技能,可根据用户确认的经历档案生成针对不同岗位的简历与求职信。它要求技能等级有证据并经本人确认,还会检查 PDF 的 ATS 文本提取问题。

主要功能

  1. 01有证据支持且需本人确认的技能等级
  2. 02职位关键词覆盖率与差距报告
  3. 03生成岗位专属 PDF 和 DOCX 简历
  4. 04通过两种文本提取器检查 ATS 兼容性
  5. 05求职信声明核验与申请记录

适用场景

  1. 01为不同岗位类型制作简历
  2. 02对照已记录技能分析职位要求
  3. 03根据档案证据核查求职信
  4. 04依据工作成果准备面试回答

MCP 相关

MCP 服务允许 MCP 客户端开展经历访谈、调整简历版本并构建和验证文档。技能等级升级须通过 MCP elicitation 或终端命令由本人确认。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"jesuscabrerareveles-honest-cv": {
"command": "uvx",
"args": [
"honest-cv"
],
"env": {
"HONEST_CV_PROFILE": "<HONEST_CV_PROFILE>"
}
}
}
}
启动命令uvx honest-cv
需要配置的环境变量
HONEST_CV_PROFILEFolder that holds your profile, e.g. ~/cv-profile. Keep it out of public repositories. Tools also accept a profile argument.

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

安装包
pypihonest-cv0.3.3

工具

31

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

参数类型必填说明
profilestring是要创建的文件夹。该文件夹中不得已有配置文件。

详细介绍

honest-cv

CI License: MIT PyPI Listed on mcpservers.org

由你的 AI Agent 生成针对每个岗位量身定制、诚实且适合 ATS 的简历。 honest-cv 是一个 MCP 服务、命令行工具和 Claude Code 技能。它将你的经历集中保存在一个可信来源中,并针对每类岗位生成 PDF 和 DOCX。它绝不会声称你掌握了自己并不具备的技能。

阅读西班牙语版

演示:包含个人技能清单、职位信息评分、经过验证的构建、拒绝虚报本人不具备技能的求职信、LinkedIn 文案以及申请记录

为什么选择 honest-cv

许多杳无音讯的简历,问题并不在设计,而在于缺乏针对性,以及一些会悄悄破坏文本提取的细节。AI 则让相反的问题变得轻而易举:模型会乐于在简历中塞满你在面试中无法自圆其说的关键词。honest-cv 围绕三个理念构建:

  • 由代码确保诚实,而不是依靠提示词。 每项技能都有一个等级。熟悉程度的技能始终会明确标注,你不具备的技能绝不会出现在简历上。提高技能等级需要提供书面证据并由你本人确认,服务会直接向你询问。模型不能代替你确认。
  • 根据你自己的技能清单衡量差距。 对于职位要求的每个关键词,honest-cv 会告诉你它属于以下三种情况中的哪一种:
    • 你具备这项技能,但简历中没有体现;
    • 你只达到熟悉程度;
    • 你不具备这项技能。
  • 每次构建都会检查 ATS 兼容性。 每份 PDF 都会经过两个文本提取器(pypdf 和 pdfminer.six)检查。构建过程会确认文本是否为单栏、没有连字、每个日期是否与对应职位处于同一行、阅读顺序是否正确,以及是否包含所有项目符号。

该服务具有确定性,无需 API 密钥。你的 MCP 客户端模型负责对话;honest-cv 负责验证、构建、核验和评估。它会将你的个人资料保存在你设备上的一个文件夹中,绝不会发送到其他地方:关于 AI 客户端如何处理这些资料,请参阅隐私。

为虚构人物 Ada Example 生成的一页简历

快速开始

honest-cv 需要 uv。Typst 和字体已随软件包提供, 因此无需安装其他内容。 它支持运行于 x86_64 和 ARM64 架构、使用 glibc 的 Linux,Intel 和 Apple Silicon 版 macOS,以及 x64 版 Windows。Alpine Linux 和 ARM 版 Windows 不受支持,因为 typst 软件包没有为这些平台发布 wheel 文件。

Claude Code
claude mcp add honest-cv -- uvx honest-cv serve --profile ~/cv-profile

如需同时安装用于引导面试和简历定制的技能:

mkdir -p ~/.claude/skills/honest-cv
curl -fsSL https://raw.githubusercontent.com/JesusCabreraReveles/honest-cv/master/skills/honest-cv/SKILL.md \
  -o ~/.claude/skills/honest-cv/SKILL.md

然后按照逐步创建你的第一份简历操作。

Cursor

将以下内容添加到 ~/.cursor/mcp.json,或项目中的 .cursor/mcp.json:

{
  "mcpServers": {
    "honest-cv": {
      "command": "uvx",
      "args": ["honest-cv", "serve", "--profile", "/absolute/path/to/cv-profile"]
    }
  }
}
Claude Desktop

编辑 claude_desktop_config.json:

  • 在 macOS 上,路径为 ~/Library/Application Support/Claude/;
  • 在 Windows 上,路径为 %APPDATA%\Claude\。

添加与 Cursor 示例中相同的 mcpServers 配置块,然后重启应用。如果应用找不到 uvx, 请使用它的绝对路径(which uvx)。

各客户端如何确认技能升级

提升技能等级需要你亲自确认,服务器会通过 MCP 询问功能征求你的确认。目前并非所有客户端都支持此功能:

客户端确认位置
Claude Code在聊天中:每次升级都会显示一个包含「no / sí」选项的表单,一次最多处理 10 项。只有你回答「sí」的项目才会保存;选择拒绝则不会保存任何内容。
Claude Desktop在终端中。服务器会拒绝此次更改,并提供要运行的命令:uvx honest-cv skill <profile> "<name>" <level> --evidence "..."。
其他客户端如果支持询问功能,则在聊天中确认;否则,按上述方式在终端中确认。

一步步制作你的第一份简历

本指南使用 Claude Code;任何 MCP 客户端都能以相同方式工作,只是设置有所不同。

1. 安装 uv 并添加 honest-cv。 只需安装一次。在 macOS 或 Linux 上:

curl -LsSf https://astral.sh/uv/install.sh | sh        # Windows: see docs.astral.sh/uv
claude mcp add honest-cv -- uvx honest-cv serve --profile ~/cv-profile

~/cv-profile 是存放个人资料的文件夹。它可以暂时不存在,而且不应放在公开仓库中。也请安装技能(参见上文的 Claude Code)。

2. 开始面试。 在任意文件夹中打开 Claude Code(claude),并用你自己的语言输入 "Interview me for my CV",或运行 /mcp__honest-cv__interview。助手会在整个对话中使用你的语言。你可以通过系统的听写功能口述回答(macOS 上:系统设置 → 键盘 → 听写):保存前,它会把姓名和数字读回给你,因为听写可能会听错。流程如下:

你: Interview me for my CV.

助手: ~/cv-profile 文件夹尚不存在。要创建它吗?……整个面试可能需要几小时,但我们会边进行边保存。首次会话只需填写联系信息、最近两份工作经历和技能清单,就足以制作第一份简历。你有 LinkedIn 数据导出文件或 JSON Resume 可以作为起点吗?

  • 导入已有资料(如有)(可选)。下载 LinkedIn 数据导出文件(参见导入已有资料),并将 ZIP 文件路径提供给助手。系统会导入你的工作经历、教育背景和成就,技能则会导入为未标记等级的状态。
  • 联系信息、工作经历和教育背景。 助手每次询问几项,并在保存前把姓名和数字读回给你。然后只会询问一次证书、课程和你撰写过的内容。
  • 逐份工作经历梳理成就。 对每份工作经历,助手都会询问团队做了什么、你做了什么,以及发生了哪些变化,并要求提供数字。它会起草一条要点,只有在你批准措辞后才会保存。
  • 技能。 助手会提供一份清单,例如 backend-jvm + engineering-lead,也可以使用适用于任何职业的自定义清单。在编辑器中打开 ~/cv-profile/checklist.md,在每一行填写 P、L、F 或 X,在 " — " 后补充使用该技能的场景,保存后告诉助手 "done"。它会分组询问缺失的证明材料。然后会提供表单,让你确认技能等级提升:只有你回答 "sí" 的项目才会保存。
  • 你最突出的成就。 一项成就通常能体现多项技能。接着,助手会询问尚未由任何成就体现的主要 P 级技能;其余技能可以等到有具体职位描述时再处理。

3. 制作第一份简历。 助手会针对你申请的每种职位类型(例如 "platform" 或 "engineering manager")提出一个版本,包括职位名称、简介以及要展示的要点。批准后:

你: Build my platform CV in English and Spanish.

PDF 和 DOCX 文件会生成在 ~/cv-profile/out/,并已通过 ATS 兼容性检查。不使用 AI 客户端时,可运行 uvx honest-cv build ~/cv-profile -v platform -l en 完成相同操作。

4. 根据职位描述调整简历。 粘贴职位描述,或运行 /mcp__honest-cv__tailor_for_job:

你: 这是职位描述:(粘贴内容)。我的匹配度如何?应该做哪些调整?

你会看到每个版本的匹配度,以及分类后的缺失关键词:你具备但这份简历未体现的技能、仅有一定了解和你不具备的技能;此外,还会列出你在清单中标记、但尚无证明材料支持的技能(助手会询问你在哪里使用过这些技能),并提供一个待你批准的定制版本和生成的简历。之后,助手还能起草求职信,并在生成前通过 check_claims 检查内容;还可以记录申请信息,包括职位描述文本和面试准备事项。收到面试通知后,输入 "help me prepare the interview",助手就会根据你自己的成就起草可能出现的问题及答案。

5. 随时回来继续。 输入 "let's continue my CV interview",助手会从缺少的内容开始。需要更新 LinkedIn 个人资料时,输入 "update my LinkedIn"。

你的档案

档案是一个包含四个 YAML 文件的文件夹。使用 honest-cv init ~/cv-profile 创建档案,或让 interview 提示词引导你填写。请勿将其放入公开仓库。

文件内容
profile.yaml联系方式、职位、教育经历、认证、出版物、课程和语言。
bullets.yaml成就集合,每条成就都有一个 id、一个 role 和一些 tags。
skills.yaml技能清单,包含等级和证明材料。
variants.yaml每种职位类型对应一份简历方案。变体可以通过 extends: 继承另一个变体。

任何文本都可以写成单个字符串,或每种语言各写一个字符串:{en: ..., es: ...}。简历可以用英语和西班牙语生成。

等级含义简历中的显示方式
P在工作中用于生产环境显示
L个人项目或实验室项目显示
F了解仅显示在标注为“了解”的一栏
X不具备此技能不显示,但会记录下来,确保技能差距报告真实准确
技能清单

逐个问题记录数十项技能很慢。技能清单是一个 Markdown 文件,你可以在编辑器中标记,每行填一个字母:

## Messaging and streaming
evidence: Payments platform at Acme, 2020–2026
- [P] Kafka — reconciliation flow, 2M events a day · years: 6 · last year: 2026
- [F] RabbitMQ — a workshop and the official tutorials
- [X] NATS

“ — ”后面的文本是证明材料,标题下的 evidence: 行则涵盖该部分。没有证明材料的行不会保存:它们会重新显示为待处理项,助手会分组询问你。整个文件只会确认一次升级。

技能清单提供英语和西班牙语版本(--lang es):西班牙语名称是英语名称的同义词,因此即使你用西班牙语标记技能,也能匹配英语职位描述。

honest-cv checklist list                                     # backend-jvm, platform-sre, ...
honest-cv checklist new ~/cv-profile backend-jvm engineering-lead
honest-cv checklist apply ~/cv-profile ~/cv-profile/checklist.md

任何职业都适用。 内置技能清单涵盖软件领域(后端、前端、移动、数据、平台/SRE、QA、安全、ML/AI、嵌入式、游戏开发、架构、工程领导力),以及数据分析/BI、产品与项目管理、UX 设计、营销、销售、客户支持、财务与会计、人力资源、供应链、护理和教学。模板只需采用此格式的 Markdown 列表:将你自己的模板(或他人分享的模板)保存到 ~/cv-profile/checklists/,就会出现在 checklist list 中,并可与其他模板一起用于 checklist new;该命令也接受路径。模板可以声明同义词,例如 same: Work Breakdown Structure = WBS;技能评分、差距分析和求职信检查都会使用这些同义词以及技能名称。可以从 examples/checklists/event-planning.md 开始。你也可以应用自己标记的文件,支持英语或西班牙语(años、último uso)。完成后,honest-cv 会列出没有任何成就作为佐证的 P 和 L 级技能,助手会请你为每项技能提供一个真实案例。

honest-cv checklist list ~/cv-profile                        # yours too, e.g. accounting
honest-cv checklist new ~/cv-profile accounting engineering-lead

欢迎为其他职位类型添加技能清单:请参阅 CONTRIBUTING.md。

请参阅 examples/ada/,了解一份完整的虚构档案,其中包含三个变体、一份职位描述及其关键词。

隐私

  • honest-cv 本身不会发起网络请求。 无需账户,不收集遥测数据,也无需 API 密钥。你的 个人资料是设备上的一个 YAML 文件夹,PDF 引擎和字体也都在本地运行。你可以验证这一点: 关闭网络后,每条命令都能正常运行。
  • 你的 AI 客户端则是另一回事。 客户端的模型通过工具读取的任何内容,都会发送给该模型的提供商, 并受提供商的条款约束,就像你在聊天中分享的其他内容一样。这包括你的技能、要点和简历文本。
  • 有些客户端会将文件复制到云端。 要直接编辑文件,Claude Desktop 可能会请求访问个人资料文件夹, 并告知你文件会离开设备。honest-cv 的编辑工具让这一步变得不必要:拒绝该请求,并让助手使用这些工具。
  • 在托管服务上运行会使资料离开你的设备。 Glama 等目录提供在其服务器上部署 honest-cv 或在浏览器中试用的选项。虽然可行,但这样你的个人资料和简历就会存储在该服务上,并受其条款约束。 对于真实数据,请在自己的电脑上运行 uvx honest-cv。
  • 如果你不希望任何内容离开设备, 只使用 CLI(build、verify、score、 skill),并自行编辑 YAML 文件。

导入现有资料

honest-cv import 可读取 JSON Resume 文件,或 LinkedIn 的数据导出文件 (设置 → 数据隐私 → 下载你的数据,即一份 CSV 压缩包,或浏览器解压后的文件夹)。请下载完整档案: 选择文件时提供的基础档案只有你的标题和简介,不包含职位经历。联系方式、职位经历、教育经历、 认证、语言以及每份职位经历的成就都会导入个人资料;如果有标题和简介,它还会创建第一个变体, 这样你就可以立即运行 build。

  • 只添加个人资料中缺少的内容,绝不会覆盖现有内容。请先试用 --dry-run。
  • 导入的成就会标记为 imported:请检查其措辞。
  • 导入的技能不会附带级别,因为这两种格式都不会说明你是否在生产环境中使用过某项技能。 这些技能会写入 imported-skills.md,作为待你标记的清单。

LinkedIn 的“另存为 PDF”可能会在不通知的情况下更改个人资料布局,因此不会解析此类文件:使用 MCP 客户端时,import_linkedin_pdf 提示词会读取其中的文本,并列出各个部分供你审核。

跟踪求职申请

honest-cv apps 会在个人资料文件夹中的 applications.yaml 里记录日志:哪个变体和哪些文件发送给了哪家公司, 以及各状态及其日期(draft、applied、interview、offer、rejected、withdrawn)。再次记录同一家公司和职位 时,会更新已有记录。使用 MCP 客户端时,助手会在生成简历或求职信后询问是否记录申请;list_applications 会指出两周没有消息的申请。它会在 sent/ 中保存每份已发送文件的副本,因为下一次构建会覆盖 out/; 还会在 posts/ 中保存职位描述文本,因为链接可能会过期。你也可以询问面试准备事项:问助手 “我需要为 Acme 准备什么?”。

收到面试通知后,请说 “帮我准备 Acme 的面试”(或运行 interview_prep 提示词)。对于已保存职位描述中的每个关键词,honest-cv 会列出你的级别、 相关证据及支撑它的要点,并优先展示你所发送简历中的要点。你的助手会根据这些要点起草可能的问题及 STAR 回答、针对你仅达到熟悉程度或尚不具备的内容给出诚实回答,并列出你可以向对方提问的问题。 你批准的笔记会保存到 prep/。如果不使用 AI 客户端:honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala"。

LinkedIn

honest-cv linkedin 会将一个变体转换为 LinkedIn 文案,每部分都不超过字数限制:标题 (你的职位和最多五项生产环境技能)、About(摘要和成就要点)、每个职位根据其要点生成的一段 描述,以及技能列表。它会将这些内容写入 Markdown 文件,供你复制。技能仅包含 P 和 L:LinkedIn 无法标注熟悉程度,因此不会包含 F 技能,也绝不会出现 X 技能。使用 MCP 客户端时,linkedin_profile 提示词会润色文案,并使用 check_claims 检查内容。

导出

反向操作时,honest-cv export 会将变体写出为 JSON Resume,供其他 CV 工具和网站使用,规则与 CV 相同:绝不会包含 X 技能;F 技能只会以对应级别列在 “Familiarity” 分组中。

求职信

cover_letter 提示词会根据职位招聘信息和你自己的要点起草一页求职信。生成前,check_claims 会将文本与你的个人资料进行比对:

  • 问题会阻止生成: 你标记为 X 的技能,或是将熟悉程度技能描述为经验(例如,Rust 为 F 时写“I use Rust in production”;写“I am familiar with Rust”则没问题)。
  • 警告供你审核: 你的技能清单和要点中都没有出现的技术,或个人资料中从未出现过的数字。如果属实,先将其记录下来;否则,就会从求职信中删除。

求职信会使用 CV 的字体,并通过相同的 ATS 检查。没有 AI 客户端时,请在文本文件中撰写(段落之间用空行分隔),然后使用 honest-cv letter check 和 letter build。

CLI

使用 uvx honest-cv ... 运行任意命令,或使用 uv tool install honest-cv 安装一次,以后只需输入 honest-cv。

honest-cv init ~/cv-profile                        # create the profile templates
honest-cv build ~/cv-profile -v backend -l en -l es # PDF + DOCX, verified on every build
honest-cv verify any-cv.pdf --text                  # check any PDF, even one made elsewhere
honest-cv score ~/cv-profile -k "Kubernetes,Go" -p "Rust"   # coverage per variant, with gaps
honest-cv skill ~/cv-profile "Rust" L --evidence "CLI tool on GitHub"  # asks you to confirm
honest-cv import ~/cv-profile linkedin-export.zip --dry-run         # or resume.json
honest-cv export ~/cv-profile -v backend -l en                       # JSON Resume
honest-cv apps log ~/cv-profile --company Acme --role "SRE" -s applied -v platform
honest-cv apps list ~/cv-profile                                     # latest first, with counts
honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala"           # what backs each keyword, for the interview
honest-cv linkedin ~/cv-profile -v platform -l en                    # texts to paste into LinkedIn
honest-cv remove skill ~/cv-profile "Kafka"                          # asks you to confirm
honest-cv letter check ~/cv-profile letter.txt -k "Kubernetes,Go"     # claims your profile doesn't support
honest-cv letter build ~/cv-profile letter.txt --company Acme --role "Platform Engineer" -l en
honest-cv serve --profile ~/cv-profile              # the MCP server, over stdio

verify 适用于任何 PDF。使用 --text 查看解析器准确提取的内容。它的 single_column 检查还可以捕获一种常见缺陷:日期右对齐,导致解析器将其与对应职位分开。

MCP 工具和提示词

名称功能
init_profile创建个人资料文件夹,并附带带注释的模板。
get_inventory按级别分组返回你的技能,并附上年限和佐证。
set_skill添加或更改一项技能。若要提升技能级别,需要提供佐证,并会要求你确认。
set_skills一次添加或更改多项技能。升级会通过一个问题确认,其中会列出每项更改。
checklist_list列出内置清单。
checklist_new将内置清单合并到一个文件中,并根据你的技能清单预先填写内容。
checklist_apply保存清单中标记的技能,并返回仍需佐证的条目。
add_bullet将一项成就添加到内容池。
remove_skill、remove_bullet、remove_role、remove_publication永久删除,并移除所有版本中的相关内容。包含要点的职位需要使用 with_bullets。客户端会在运行这些工具前征求确认。
set_contact更改联系信息:姓名、电子邮件、电话、所在地和链接。
set_profile_details替换认证列表、课程列表和口语语言这一行。
upsert_role按日期顺序添加职位,或更改现有职位的字段。
upsert_education添加或更改一条教育经历。
upsert_publication添加或更改本人撰写的书籍、文章或论文。每个版本都会显示全部出版物,或其列出的出版物。
save_variant添加或替换一个版本。保存前会检查所有引用。
list_variants列出继承后的各个版本,包括要点文本,以及没有任何版本使用的要点。
build_cv生成 PDF 和/或 DOCX,并进行验证。
verify_pdf对任意 PDF 运行 ATS 检查,并返回提取出的文本。
score_job衡量每个版本的关键词覆盖率。关键词由客户端提取。
gap_report按你可以如何诚实应对,归类缺失的关键词。
提示词 interview一次提问一个问题,逐步完善你的技能清单和要点内容池。
check_claims根据你的个人资料检查任意文本:阻止将 X 级技能和熟悉程度包装成经验,并标出个人资料中未体现的内容。
build_letter生成一页的求职信 PDF 和 DOCX,并进行与简历相同的 ATS 检查。如果 check_claims 发现问题,则拒绝生成。
提示词 tailor_for_job为各版本评分、说明差距、调整一个版本并重新生成。
提示词 cover_letter根据你的要点为职位发布内容起草求职信,检查其中的陈述并生成求职信。
import_profile导入 JSON Resume 或 LinkedIn 数据导出文件,只添加缺失内容。对于 LinkedIn PDF,返回其文本。
export_json_resume将一个版本导出为 JSON Resume;X 级技能不会出现,F 级技能会保留其标签。
log_application记录一份申请(公司、职位、简历版本、发送的文件、职位发布文本、准备事项),或记录新的状态及其日期。
linkedin_profile根据一个版本生成符合 LinkedIn 字数限制的 LinkedIn 标题、自我介绍、职位描述和技能(仅限 P 和 L 级)。
list_applications按时间倒序列出申请,显示各状态的数量,以及 14 天以上没有消息的申请。
interview_prep针对一份申请,提供已保存的职位发布内容,以及每个关键词对应的你的级别、佐证和支持该关键词的要点。保存准备笔记。
提示词 import_linkedin_pdf经你批准,按章节将 LinkedIn 的“保存为 PDF”生成的 PDF 转换为个人资料。
提示词 linkedin_profile润色一个版本的 LinkedIn 文本,不添加未经证实的陈述,并使用 check_claims 进行检查。
提示词 interview_prep准备面试:预测可能的问题,根据你自己的要点撰写 STAR 答案,并为差距准备诚实的回答。

ATS 保证

模板会强制执行以下要求。每次构建时,verify 都会检查这些要求;测试套件也会在 CI 中针对 Linux、macOS 和 Windows 运行:

  • 单栏。不得使用布局表格、图片、图标、页眉或页脚。
  • 关闭连字和字距调整,不进行断字,并确保“CI/CD”、URL 和电子邮件等内容不会跨行拆分。
  • 阅读顺序与源文档顺序一致。日期与对应的职位位于同一行。
  • 文本可由 pypdf 和 pdfminer.six 提取,且两者结果一致。
  • 字体(Carlito,与 Calibri 度量兼容)会嵌入文档,并在每台机器上保持一致。

开发

uv sync
uv run pytest
uv run honest-cv build examples/ada -l en -l es

仓库的 .mcp.json 会使用虚构配置注册 honest-cv-dev,因此 Claude Code 在此文件夹中可以使用你的工作副本。请参阅 CONTRIBUTING.md。

许可证

MIT。随附的 Carlito 字体采用 SIL Open Font License;请参阅 src/honest_cv/render/fonts/OFL.txt。

评论

支持 Markdown

第一次接触 MCP?

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

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