mcpField
C
clinicaltrialsgov-mcp-server

clinicaltrialsgov-mcp-server

远程服务
github.com/cyanheads健康医疗993 天前更新
代码仓库

关于 clinicaltrialsgov-mcp-server

clinicaltrialsgov-mcp-server 通过 MCP 提供 ClinicalTrials.gov 搜索、研究详情、结果及患者与候选试验匹配功能,适用于临床试验检索和领域分析,并支持字段探索与精简或完整记录。

主要功能

  1. 01按查询条件和筛选项搜索研究
  2. 02获取方案记录和已发布结果
  3. 03查看字段定义及取值
  4. 04匹配患者资料与招募中试验
  5. 05按地理位置搜索研究地点

适用场景

  1. 01按病症、阶段或地点查找试验
  2. 02查看已完成研究的结果和不良事件
  3. 03分析研究数量与注册表字段
  4. 04为患者资料筛选候选试验

MCP 相关

向 MCP 客户端提供七个工具、一个 JSON 资源和一个分析提示词。支持 stdio 与 Streamable HTTP 传输。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://clinicaltrials.caseyjhand.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

安装包
npmclinicaltrialsgov-mcp-server2.10.2

工具

7
参数类型必填说明
sortstring否排序方式。格式:FieldName:asc 或 FieldName:desc。例如,"LastUpdatePostDate:desc"、"EnrollmentCount:desc"。最多可用逗号分隔 2 个字段。对于“最大规模试验”查询,将 EnrollmentCount:desc 与高级筛选条件 "AREA[StudyType]INTERVENTIONAL" 配对——入组人数最高的通常是观察性登记/理赔研究,入组人数达数千万。入组人数由申办方报告;除排除未知入组人数的哨兵值外,上游不会对其进行验证。使用 clinicaltrials_get_field_definitions 查找可排序的字段名。
querystring否跨所有字段的通用全文搜索。运行 ClinicalTrials.gov 为此参数提供的 57 字段相关性搜索:NCTId、NCTIdAlias、OrgStudyId、SecondaryId、Acronym、BriefTitle、OfficialTitle、Condition、InterventionName、InterventionOtherName、Phase、StdAge、StudyType、BriefSummary、结局指标及其描述、LeadSponsorName、CollaboratorName、Location* 字段、Design* 字段,以及 ConditionAncestorTerm/InterventionAncestorTerm MeSH 上位词——因此,命中结果未必在你预期的字段中包含搜索词。支持普通词语以及 AND、OR、NOT。`[ ]` 仅在 AREA[FieldName]value 或 RANGE[min, max] 表达式中有效——这些表达式在此处和 advancedFilter 中均可使用,因此 AREA[Phase]PHASE2 可用于此参数;单独出现的方括号会导致错误。`( )` 用于分组子表达式,并在匹配时生效;`,` 表示 AND。专用的 *Query 参数(conditionQuery、interventionQuery 等)将搜索限定到单个字段。
fieldsarray否要返回的 PascalCase 叶字段名;强烈建议指定,因为完整记录约为 70KB。省略时返回精简索引投影——空列表会被拒绝,不会视为省略。以逗号或竖线连接的条目("NCTId,BriefTitle")会拆分为多个名称。常用叶字段:NCTId、BriefTitle、BriefSummary、OverallStatus、Phase、LeadSponsorName、Condition。调用 clinicaltrials_get_field_definitions 并提供概念查询(例如 "adverse events"、"eligibility"),以查找任何概念对应的确切叶字段。
nctIdsany否筛选指定的 NCT ID,以便批量查询。省略时搜索所有研究——空列表会被拒绝,不会视为“无筛选条件”。提供此参数会取消默认的未知入组人数排除规则,因此指定的 ID 不会在其自身查询中被筛除。
pageSizeinteger否每页结果数,1–200。
geoFilterstring否地理位置邻近筛选器。格式:distance(lat,lon,radius),其中 radius 带有 `mi` 或 `km` 后缀——例如,"distance(47.6062,-122.3321,50mi)" 表示筛选西雅图 50 英里范围内的研究。必须指定后缀:不带单位的半径、非正半径、超出 [-90, 90] 的纬度以及超出 [-180, 180] 的经度均会被拒绝。设置后,会按各研究地点与中心点的距离重新排序,使最近的匹配地点排在首位,并标注其英里距离;完整地点列表会保留。
pageTokenstring否分页游标:将先前响应中的 nextPageToken 原样传回,并使用相同的筛选条件。ClinicalTrials.gov 刷新数据后,令牌会过期。
countTotalboolean否在响应中包含研究总数。仅在第一页计算。
titleQuerystring否仅在研究标题和缩写中搜索。匹配 Acronym、BriefTitle 和 OfficialTitle。支持普通词语以及 AND/OR/NOT。`[ ]` 仅在 AREA[FieldName]value 或 RANGE[min, max] 表达式中有效;此参数接受这些表达式。单独出现的方括号会导致错误。`( )` 在匹配时用于分组子表达式;`,` 表示 AND。
phaseFilterany否按试验阶段筛选。省略则搜索所有阶段——空列表会被拒绝,不会视为“无筛选条件”。可选值:EARLY_PHASE1、PHASE1、PHASE2、PHASE3、PHASE4、NA。接受大小写和空格变体(“Phase 3”、“early phase 1”、“Not Applicable”);列表或以逗号或竖线连接的字符串会匹配任一阶段。每个条目都必须指定一个阶段——请将搜索表达式(OR、NOT、AREA[…])放入 advancedFilter。
outcomeQuerystring否在结局指标字段中搜索。匹配 PrimaryOutcomeMeasure、SecondaryOutcomeMeasure、OtherOutcomeMeasure 和 OutcomeMeasureTitle,以及对应的描述字段 PrimaryOutcomeDescription、SecondaryOutcomeDescription、OtherOutcomeDescription、OutcomeMeasureDescription 和 OutcomeMeasurePopulationDescription——因此,即使搜索词只出现在结局描述文本中也会匹配。支持普通词以及 AND/OR/NOT。`[ ]` 仅可用于 AREA[FieldName]value 或 RANGE[min, max] 表达式;此参数接受这类表达式,单独出现的方括号会导致失败。匹配时,`( )` 用于组合子表达式;`,` 表示 AND。
sponsorQuerystring否搜索申办方/协作方名称。匹配 LeadSponsorName、CollaboratorName 和 OrgFullName。支持普通词以及 AND/OR/NOT。`[ ]` 仅可用于 AREA[FieldName]value 或 RANGE[min, max] 表达式;此参数接受这类表达式,单独出现的方括号会导致失败。匹配时,`( )` 用于组合子表达式;`,` 表示 AND。
statusFilterany否按研究状态筛选。省略则搜索所有状态——空列表会被拒绝,不会视为“无筛选条件”。可选值:RECRUITING、COMPLETED、ACTIVE_NOT_RECRUITING、NOT_YET_RECRUITING、ENROLLING_BY_INVITATION、SUSPENDED、TERMINATED、WITHDRAWN、UNKNOWN、WITHHELD、NO_LONGER_AVAILABLE、AVAILABLE、APPROVED_FOR_MARKETING、TEMPORARILY_NOT_AVAILABLE。
locationQuerystring否搜索地点——城市、州、国家或机构名称。匹配 LocationCity、LocationState、LocationCountry、LocationFacility 和 LocationZip;研究只要有任一地点匹配即视为匹配。支持普通词以及 AND/OR/NOT。`[ ]` 仅可用于 AREA[FieldName]value 或 RANGE[min, max] 表达式;此参数接受这类表达式,单独出现的方括号会导致失败。匹配时,`( )` 用于组合子表达式;`,` 表示 AND。
advancedFilterstring否使用 AREA[FieldName]value 语法进行高级筛选。示例:“AREA[StudyType]INTERVENTIONAL”、“AREA[EnrollmentCount]RANGE[100, 1000]”、“AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL”、“(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL”。“AREA[HasResults]true”会限定为已发布结果的研究。AND/OR/NOT 用于连接完整的 AREA[FieldName]value 表达式;圆括号用于组合表达式。调用 clinicaltrials_get_field_definitions 查找兼容 AREA[] 的字段名。
conditionQuerystring否按病症/疾病搜索。例如:“Type 2 Diabetes”、“non-small cell lung cancer”。匹配 Condition、BriefTitle、OfficialTitle、ConditionMeshTerm、ConditionAncestorTerm、Keyword 和 NCTId。ConditionAncestorTerm 是研究自身列出的病症所属的 MeSH 上位概念,因此搜索结果范围比这些列表更广——研究可能匹配自身未提及的上位术语。支持普通词以及 AND/OR/NOT。`[ ]` 仅可用于 AREA[FieldName]value 或 RANGE[min, max] 表达式;此参数接受这类表达式,单独出现的方括号会导致失败。匹配时,`( )` 用于组合子表达式;`,` 表示 AND。
interventionQuerystring否搜索干预措施/治疗。例如:“pembrolizumab”、“cognitive behavioral therapy”。匹配 InterventionName、InterventionType、ArmGroupType、InterventionOtherName、BriefTitle、OfficialTitle、ArmGroupLabel、InterventionMeshTerm、Keyword、InterventionAncestorTerm、InterventionDescription 和 ArmGroupDescription。InterventionAncestorTerm 是研究自身列出的干预措施所属的 MeSH 上位概念,因此搜索结果范围比这些列表更广。支持普通词以及 AND/OR/NOT。`[ ]` 仅可用于 AREA[FieldName]value 或 RANGE[min, max] 表达式;此参数接受这类表达式,单独出现的方括号会导致失败。匹配时,`( )` 用于组合子表达式;`,` 表示 AND。
includeUnknownEnrollmentboolean否包含 EnrollmentCount 为上游“unknown”哨兵值(99999999)的研究。默认排除——该哨兵值会干扰 RANGE[N, MAX] 查询和 EnrollmentCount:desc 排序。设为 true 可用于数据质量审计,或专门查找入组人数未知的研究。

详细介绍

clinicaltrialsgov-mcp-server

通过 MCP 搜索 ClinicalTrials.gov 临床试验、获取研究详情和结果,并为患者匹配候选试验。支持 STDIO 或 Streamable HTTP。

7 个工具 • 1 个资源 • 1 个提示词

版本 许可证 Docker MCP SDK npm TypeScript Bun

安装到 Claude Desktop 安装到 Cursor 安装到 VS Code

框架


概述

搜索 ClinicalTrials.gov 上的 60 多万项研究;该网站是美国国家医学图书馆的临床试验注册平台。获取完整研究记录和已发布的结果、发现字段及其有效值,并将患者资料与招募中的试验进行匹配。无需 API 密钥。

工具
工具描述
clinicaltrials_search_studies搜索研究,支持全文和特定字段查询、状态/阶段/地理位置筛选、分页、排序和字段选择
clinicaltrials_get_study_record按 NCT ID 获取单项研究——完整方案记录,可选限制地点/结果/参考资料数量
clinicaltrials_get_study_count快速获取查询对应的研究总数,无需获取数据
clinicaltrials_get_field_values查找 API 字段的有效值,并显示各值对应的研究数量
clinicaltrials_get_field_definitions查找有效字段名称——支持关键词搜索、逐级路径查询或顶层概览
clinicaltrials_get_study_results获取已发布的结果——已完成研究的结局、不良事件、参与者流程和基线数据
clinicaltrials_find_eligible根据患者的人口统计信息和病情匹配招募中的候选试验,不检查纳入/排除标准
资源
资源描述
clinicaltrials://{nctId}按 NCT ID 以 JSON 格式获取单项临床研究,其中列表数量有限,结果以计数代替
提示词
提示词描述
analyze_trial_landscape使用计数和搜索工具,引导开展数据驱动的临床试验概况分析

功能参考

clinicaltrials_search_studies 工具
  • 支持自由文本 query,以及按字段指定的 conditionQuery / interventionQuery / locationQuery / sponsorQuery / titleQuery / outcomeQuery、枚举类型的 statusFilter / phaseFilter(接受大小写和空格格式的变体)、advancedFilter(AREA[FieldName]value / RANGE[min, max])和 geoFilter(distance(lat,lon,radius),带 mi/km 后缀);pageSize 为 1–1000(默认 10;若超过服务端的单页上限,默认 200,则按上限返回一页,并附带 truncated / shown / cap);pageToken 游标;最多可按 2 个字段进行 sort
  • 默认返回每项研究的精简索引(nctId、briefTitle、overallStatus、phases、enrollmentCount、hasResults 等);fields(PascalCase 叶字段)用于选择完整保真度的投影——完整记录约为 70 KB
  • 类型化错误:blank_value、ids_not_found、field_invalid、enum_invalid、query_parse_error、geo_invalid、sort_invalid、page_token_invalid、rate_limited

clinicaltrials_get_study_record 工具
  • 根据 nctId 获取完整方案记录,可选使用 locationLimit、outcomeLimit / referenceLimit,以及 nearLocation(lat、lon、radiusMi)对地点列表进行限制和排序——这些参数均无上限;若指定值超过列表长度,则返回整个列表
  • 若上限截断了列表,filtersApplied 会报告上游总数;resultsSection 会替换为 resultsSummary 计数。类型化错误:study_not_found、rate_limited

clinicaltrials_get_study_count 工具
  • 与 clinicaltrials_search_studies 使用相同的查询和筛选参数,仅返回 totalCount——不获取研究数据
  • 类型化错误:blank_value、field_invalid、enum_invalid、query_parse_error、rate_limited

clinicaltrials_get_field_values 工具
  • 支持一个或多个 PascalCase 格式的 fields(例如 OverallStatus、Phase)——返回每个字段的类型及其常见取值和对应的研究计数(API 上限为 250);对于数值和日期字段,返回 min / max / avg;对于布尔字段,返回 trueCount / falseCount
  • STRING 字段会额外返回其 longest 值;超过 2,000 个字符时会返回带有 truncated 标记的预览,并附上完整的 length,以及说明如何调用 clinicaltrials_search_studies 获取完整文本的提示。对于 API 不统计不同取值的自由文本字段,会设置 uniqueValuesCounted: false,表示其 uniqueValuesCount 为 0 并非实际计数
  • multiValued 用于标记各取值计数总和可能超过研究总数的字段。类型化错误:blank_value、field_invalid、rate_limited

clinicaltrials_get_field_definitions 工具
  • mode:search(关键词 query,limit 默认值为 20,无上限)、drill(点分隔表示法的 path)或 overview——用于解析 fields、advancedFilter、sort 和 clinicaltrials_get_field_values 接受的 PascalCase 名称
  • 类型化错误:blank_value、mode_mismatch、mode_requires、path_not_found、rate_limited

clinicaltrials_get_study_results 工具
  • 每次调用最多获取 20 个不同 nctIds 的结果;更多 ID(最多 500 个条目)会通过 deferredNctIds 返回;sections(outcomes、adverseEvents、participantFlow、baseline、moreInfo);summary 用于精简单项研究结果集(可能超过 500 KB);outcomeLimit / adverseEventLimit,以及可恢复的 outcomeOffset / seriousEventOffset / otherEventOffset
  • 对每项研究分别返回 fetchErrors / studiesWithoutResults,而非导致整个批次失败;若别名 ID 解析为另一项研究,则返回 canonicalNctId。类型化错误:blank_value、offset_not_applicable、rate_limited

clinicaltrials_find_eligible 工具
  • age(整数,0–120),可选 ageUnit(默认为 years,可选 months、weeks、days),适用于婴儿和年幼儿童;sex(FEMALE / MALE / ALL);conditions[];location(必填 country,可选 state / city);healthyVolunteer;recruitingOnly(默认为 true);maxResults(最多 1000;每次调用最多返回 50 条,其余条目通过 truncated / shown / cap 和可重放的 searchCriteria 予以说明);locationLimit(无上限;如果设置的值大于匹配的地点数,则返回所有地点)
  • 根据年龄、性别、地点、招募状态和模糊条件搜索进行匹配;funnel 会报告各筛选阶段的匹配数量,notice 会说明尚未检查纳入/排除标准(使用 clinicaltrials_get_study_record 查看)
  • 类型化错误:blank_value、rate_limited

clinicaltrials://{nctId} 资源
  • 完整的方案记录,格式为 application/json,地点、次要/其他结局和参考文献各最多 50 条——由服务端固定限制,无参数
  • 结果数据将替换为 resultsSummary 计数;truncated 和 filtersApplied 会说明截断了哪些内容,retrieval 则列出获取完整数据的工具
  • 类型化错误:study_not_found、rate_limited

analyze_trial_landscape 提示词
  • 参数:必填 topic;可选 focusAreas(逗号分隔)
  • 返回一条用户消息,指引 Agent 使用计数、搜索、字段发现和结果工具进行数据驱动的概况分析

功能

基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。

ClinicalTrials.gov 专属功能:

  • 提供类型安全的 ClinicalTrials.gov REST API v2 客户端——公开使用,无需身份验证或 API 密钥
  • 序列化请求队列,强制遵守 ClinicalTrials.gov 约每秒 1 次请求的速率限制;遇到 429/5xx 响应和 HTML 错误页面时会重试并采用指数退避
  • 自动修正传入 fields/sort 的字段名(大小写、空格、RecruitmentStatus → OverallStatus 等旧别名),并记录每次修正
  • 地理邻近搜索和最近地点重新排序,无需地理编码依赖
  • 默认从搜索和计数中排除“未知”入组人数哨兵值(99999999);includeUnknownEnrollment 可将其重新纳入

面向 Agent 的输出:

  • 溯源信息——搜索、计数和资格工具会回显 searchCriteria;如果别名 ID 解析到另一项研究,clinicaltrials_get_study_results 会指出 canonicalNctId
  • 优雅处理部分失败——clinicaltrials_get_study_results 会按研究返回 fetchErrors / studiesWithoutResults,而不是导致整个批次失败
  • 类型化错误——每个工具都会返回 reason 代码(study_not_found、blank_value 等),有界列表仅在仍有更多条目时才会携带 next*Offset
  • 响应裁剪——搜索和资格工具默认返回精简索引,而非约 70KB 的完整记录

开始使用

公共托管实例

公共实例位于 https://clinicaltrials.caseyjhand.com/mcp,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:

{
  "mcpServers": {
    "clinicaltrialsgov-mcp-server": {
      "type": "streamable-http",
      "url": "https://clinicaltrials.caseyjhand.com/mcp"
    }
  }
}
自托管 / 本地

将以下内容添加到 MCP 客户端配置文件中。

{
  "mcpServers": {
    "clinicaltrialsgov-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["clinicaltrialsgov-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

或使用 npx(无需 Bun):

{
  "mcpServers": {
    "clinicaltrialsgov-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "clinicaltrialsgov-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

或使用 Docker:

{
  "mcpServers": {
    "clinicaltrialsgov-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/clinicaltrialsgov-mcp-server:latest"]
    }
  }
}

如需使用 Streamable HTTP,请设置传输方式并启动服务:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
  • Bun v1.4.0 或更高版本(或 Node.js v24+)。
安装
  1. 克隆代码库:
git clone https://github.com/cyanheads/clinicaltrialsgov-mcp-server.git
  1. 进入目录:
cd clinicaltrialsgov-mcp-server
  1. 安装依赖:
bun install

配置

所有配置均为可选项——服务使用默认值即可运行,无需 API 密钥。

变量说明默认值
CT_API_BASE_URLClinicalTrials.gov API 基础 URL。https://clinicaltrials.gov/api/v2
CT_REQUEST_TIMEOUT_MS单次请求超时时间,单位为毫秒;必须为正整数。30000
CT_MAX_PAGE_SIZEclinicaltrials_search_studies 单页返回的研究数量上限;必须为 ≥ 1 的整数,超过 1000 的值会限制为 1000。200
MCP_TRANSPORT_TYPE传输方式:stdio 或 http。stdio
MCP_HTTP_PORTHTTP 服务端口。3010
MCP_SESSION_MODEHTTP 会话模式:stateless、stateful 或 auto。stateless
MCP_AUTH_MODE身份验证模式:none、jwt 或 oauth。none
MCP_LOG_LEVEL日志级别(RFC 5424)。info
LOGS_DIR日志文件目录(仅 Node.js)。<project-root>/logs
OTEL_ENABLED启用 OpenTelemetry 跟踪。false
OTEL_EXPORTER_OTLP_ENDPOINT用于跟踪和指标的 OTLP 基础 URL。—
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT用于导出日志的 OTLP 端点。—
LOG_TOOL_FAILURE_PAYLOADS记录每次失败的工具调用参数和结果,按键名进行脱敏,并限制在 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES 字节以内(默认值为 16384)。自由格式值中的密钥不会脱敏。false

完整的可选覆盖项列表请参阅 .env.example。

运行服务

本地开发
  • 构建并运行:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:http
    # or
    bun run start:stdio
    
  • 运行检查和测试:

    bun run devcheck   # Lint, format, typecheck, and security audit
    bun run test       # Vitest test suite
    bun run lint:mcp   # Validate MCP definitions against spec
    
Docker
docker build -t clinicaltrialsgov-mcp-server .
docker run --rm -p 3010:3010 clinicaltrialsgov-mcp-server

Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/clinicaltrialsgov-mcp-server。默认会安装 OpenTelemetry 对等依赖项——构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖项。

项目结构

目录用途
src/index.tscreateApp() 入口点——注册工具、资源和提示词,并初始化 ClinicalTrials.gov 服务。
src/config使用 Zod 解析和验证服务专用环境变量。
src/mcp-server/tools工具定义(*.tool.ts)。
src/mcp-server/resources资源定义(*.resource.ts)。
src/mcp-server/prompts提示词定义(*.prompt.ts)。
src/services/clinical-trialsClinicalTrials.gov REST API v2 客户端——重试、速率限制、字段搜索、类型。
tests/单元测试和集成测试。

开发指南

开发指南和架构规则请参阅 CLAUDE.md。简要说明:

  • 处理程序抛出异常,由框架捕获——工具逻辑中不要使用 try/catch
  • 使用 ctx.log 记录请求范围内的日志,不要调用 console
  • 通过 src/mcp-server/*/definitions/index.ts 中的聚合导出文件注册新工具和资源
  • 验证原始 API 响应,将其规范化为领域类型,绝不伪造缺失字段

贡献

欢迎提交问题。提交前请运行检查和测试:

bun run devcheck
bun run test

许可证

Apache-2.0——详情请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

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

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