Skip to main content
Glama

Occulytics MCP 服务器

一个 MCP 服务器,让 AI 助手能够为医疗保健 REIT 资产管理团队(Omega Healthcare Investors)回答投资组合问题,基于两个公开来源:Omega 的 SEC 10-K 文件和 CMS 养老院提供者信息文件。

根据简报的设计目标:服务器必须能够说明答案是完整、不确定或不支持——以及原因,而不是产生一个没有依据的自信数字。每个工具都在一个信封内返回确定性数据,该信封带有计算出的状态、注意事项和来源。

快速开始

所有内容均可离线运行——数据工件已提交。

npm install
npm run build
npm test          # 41 tests: curated-data checksums, domain units, full e2e over MCP

在 UI 中试用(MCP Inspector 会在浏览器中打开):

npm run inspect

连接到 Claude Code:包含一个项目范围的 .mcp.json——在 npm run build 之后在 Claude Code 中打开此仓库,occulytics 服务器即可使用。或者全局注册:

claude mcp add occulytics -- node /absolute/path/to/occulytics-mcp/dist/src/server/index.js

连接到 Claude Desktop(claude_desktop_config.json):

{
  "mcpServers": {
    "occulytics": {
      "command": "node",
      "args": ["/absolute/path/to/occulytics-mcp/dist/src/server/index.js"]
    }
  }
}

演示前检查编译后的服务器是否能在真实 stdio 上工作:npm run smoke。 要从实时来源刷新数据:npm run ingest(参见 数据管道)。

Related MCP server: filings-search

你可以问什么

五个目标问题,以及服务器实际做什么:

问题

答案路径

诚实的结果

按投资百分比排名前五的运营商,以及每个运营商运营多少设施?

operator_concentration + operator_facilities

设计上部分:Omega 在 FY2020 10-K 之后停止了完整的运营商表格。你得到完整的 FY2020 排名(包括租赁/抵押分解——包括 Ciena,而不是 Consulate,在包含抵押时实际上是第一名)以及 FY2025 的具名披露(Maplewood ≥10%,CommuniCare 7.2%),每个都注明日期,绝不混合。“实际运营” = 实时 CMS 连锁计数。

前几大运营商的设施中低于全国人员配备平均水平的比例?

operator_metrics(多运营商)

按运营商计算,并在服务器端针对全国平均值(3.86 报告护士 HPRD)进行汇总。无法映射的运营商会具名并排除,而不是静默丢弃。

最大运营商的平均星级和两年趋势?

operator_metrics

对 Maplewood 不支持(按投资额最大):它运营老年生活社区,这些社区不是 CMS 认证的养老院——服务器会说明这一点及原因。对于 CommuniCare(按收入最大):平均 3.05 星,在 117 个设施的恒定面板上从 2.26 → 3.04 改善(2024 年 7 月 → 2026 年 7 月)。

投资组合入住率?

portfolio_occupancy

一个标记的代理:Omega 既不披露入住率也不披露设施列表。按床位加权的入住率跨映射的运营商连锁(83.5% 对比全国 80.5%),并带有覆盖核算——代理实际代表投资组合的多少份额,以及谁被排除(英国运营商、Maplewood、低置信度映射)。

关于最大运营商的一段式风险简报?

portfolio_overview + resolve_operator(+ 集中度)

模型写段落;服务器只提供确定性事实:≥10% 的投资,6.6%/5.2%/5.4% 的收入趋势,$12.5M 终止费说明,以及 CMS 覆盖缺口。

架构

三层,一个依赖方向,无数据库,无运行时网络:

scripts/ingest.ts      CMS download → validate → project → data/processed/*.json  (committed)
data/curated/*.json    Hand-transcribed 10-K facts + operator→CMS map, per-fact citations
        │
src/domain/            Pure, deterministic, unit-tested: store, resolve, metrics
        │
src/server/            MCP wiring: 9 tools + 1 resource → envelope responses (stdio)
  • data/curated/omega-10k.json — FY2025 投资组合摘要 + 集中度说明,FY2020 运营商投资表。每个块都引用其文件/章节。

  • data/curated/operator-map.json — 诚实性的支柱:每个 Omega 运营商的 CMS 映射,带有 method(连锁精确 / 法律名称模式 / 策划别名)、confidence(高/中/低)和注意事项;无法映射的运营商记录原因。

  • src/domain/metrics.ts — 所有算术:排名、入住率、基准比较、恒定面板星级趋势。没有数字留给模型。

  • src/server/tools.ts — 薄层:验证输入(zod),调用领域,包装在信封中。

答案信封

每个工具返回:

{
  "status": "complete" | "partial" | "unsupported",   // brief's complete / uncertain / unsupported
  "data": { /* deterministic numbers & records, never prose */ },
  "caveats": [ /* why partial; staleness; method notes — computed, not decorative */ ],
  "provenance": [ { "source", "asOf", "detail", "url" } ],
  "cost": { "chars", "estTokens", "basis" }   // self-reported payload size, labeled estimate
}

status 是从数据路径计算出来的,而不是硬编码的:未映射的运营商产生 unsupported,并带有映射条目记录的原因;任何涉及 FY2020 表的内容都是 partial,并带有过时注意事项;入住率代理始终是 partial。

工具表面

工具

返回

原始或已解析?

portfolio_overview

FY2025 总计、组合、地理 + 具名运营商集中度

已解析的事实,按文件

operator_concentration

两个带日期的排名块(FY2020 完整 / FY2025 具名)

已解析;百分比从文件中的美元计算

resolve_operator

名称 → 规范运营商 + CMS 映射 + 置信度 + 10-K 上下文(FY2020 排名/%,FY2025 披露的 %)

元数据

operator_facilities

分页设施行 + 全人口摘要

原始行 + 已解析摘要

operator_metrics

星级(平均值 + 每星级分布)、人员配备对比全国、入住率,以及所有三个的 2 年恒定面板趋势;多运营商的汇总块

已解析(所有算术在服务器端)

find_facility

按 CCN/名称的设施钻取:当前指标、每个快照的历史、反向 Omega 运营商关联

原始详情 + 已解析关联

portfolio_occupancy

代理入住率 + 2 年趋势 + 覆盖核算

已解析,明确标记为代理

national_benchmarks

全国人员配备/星级/入住率参考 + 方法

已解析

data_coverage

来源、年份、映射、已知缺口(也是 coverage://data-sources 资源)

元数据

粒度理由:工具是问题形状的但可组合——确定性聚合(其中 LLM 对 100+ 行的算术是正确性风险)是工具的责任;叙述综合是模型的。每个接受运营商的工具都接受自由文本并在内部解析,因此客户端永远不需要两步协议;解析失败是一个 unsupported 答案(带有候选和已知宇宙),而不是错误。

跨源问题(10-K 部分 ↔ CMS 部分)是一等公民:运营商身份是连接键,经过往返验证(10-K 排名中的每个名称在每个 CMS 支持的工具中都能解析——端到端测试),每个已解析的运营商块都嵌入其 10-K 上下文(omegaContext:FY2020 排名和投资组合百分比,FY2025 披露的集中度),因此“我们最大的运营商有多好?”这类问题无需第二次调用即可解析。

关键决策与权衡

1. 两个年份,绝不混合。 决定性的研究发现:Omega 在 FY2020 之后的 10-K 中没有包含按运营商的投资表——FY2025 文件仅点名 Maplewood(≥10% 的投资)和 CommuniCare(7.2%)。因此,当前的“前五”无法完全从具名来源支持,服务器正是这样说的:排名以两个单独日期的块呈现,状态为 partial 并带有原因。权衡:不如一个干净的列表令人满意;选择它是因为混合列表在数值上是不连贯的(2020 年美元与 2025 年百分比在不同分母上)。

2. 手工转录的 SEC 事实,机器摄入的 CMS 数据。 Omega 的事实是两个不同格式文件中的两个表中的约 30 个数字。在这个范围内,通用的 10-K 解析器具有本简报最糟糕的失败模式——静默错误的提取。相反:策划的 JSON 带有每个事实的引用,由校验和测试保护(每个可求和列必须重现文件自己的小计和总计——一个打错的数字会导致构建失败)。CMS 侧(14,693 行 × 3 个月度年份)完全自动化并带有验证,因为规模使自动化成为更安全的选择。权衡:为新 10-K 刷新是手动编辑;对于年度提交的文件,这是可接受的。

3. 运营商→CMS 连接是策划的、带置信度标签的工件。 两个数据集都不引用对方。连接(10-K 运营商名称 → CMS 连锁)是系统中最有风险的推断,因此它是数据,而不是代码:每个映射记录它是如何制作的以及应该信任多少,无法映射的运营商记录原因(Maplewood:老年生活,在 CMS 之外;Healthcare Homes:英国)。低置信度映射(Agemo → Signature)默认从汇总聚合中排除,并在包含时浮出。权衡:不能扩展到数百个 REIT;对一个 REIT 的约 11 个具名运营商是正确的,机制(每个映射的方法/置信度/注意事项)才是可扩展的。

4. 连锁指标是超集,并说明这一点。 Omega 的设施级投资组合不是公开的(已验证:Schedule III 按州汇总)。因此 CMS 指标描述的是运营商的整个运营,而不仅仅是 Omega 的建筑——每个受影响的响应都带有该注意事项,入住率代理报告其覆盖范围代表(FY2020)投资组合的多少份额(约 40%)。权衡:从 CMS 所有权文件重建设施级是可能的,但需要多天的模糊匹配工作;带有覆盖核算的诚实代理是四小时的答案。该重建是自然的下一步。

5. 方法论是答案的一部分。 星级趋势 = 恒定面板(在两个端点快照中均被评级的设施),响应中包含面板规模、排除项和已知偏差(链成员资格仅限当前)。人员配置基准 = 报告的护士总 HPRD,设施均值(即问题所问,未经调整;存在病例组合调整版本,已注明)。入住率 = 日均居民数 ÷ 认证床位,这会低估实际运营入住率(认证床位 > 在用床位)。所有这些都在载荷中说明,而不仅仅是在这里。

6. 内存 JSON,无数据库,产物已提交。 1.5 万行毫秒级加载;数据库为零查询需求增加了运维面。已提交的产物(约 6MB)意味着安装 → 构建 → 演示无需网络即可运行——实时演示不会因 CMS 宕机或下载 URL 变更而中断。代价:仓库携带数据;摄取可随时从来源重新推导。

7. 有界输出。 设施列表分页(默认 25),带有始终完整的摘要块和总数——185 个设施的连锁集团永远不会淹没客户端上下文。

测试

  • tests/curated.test.ts — 对照申报文件自身总计的转录校验和。

  • tests/metrics.test.ts、tests/resolve.test.ts — 基于固定数据的领域单元(精确值)。

  • tests/e2e.test.ts — 通过内存传输层连接真实数据的真实 MCP 客户端:每个演示问题一个测试,包括不支持的路径。

  • npm run smoke — 从外部工作目录通过真实 stdio 运行编译后的服务器。

效率与 token 成本

npm run cost 衡量 LLM 客户端在每个演示问题上支付的上下文成本(工具结果文本 + 一次性工具模式),完全离线。Token 数字为估算值(字符数 ÷ 4;真实分词器偏差 ±20%)——其价值在于相对成本和回归跟踪。

当前测量值(已提交产物):

问题

调用次数

估算 token

Q1 前 5 + 设施数量

2

~4.1k

Q2 人员配置低于全国

1

~3.0k

Q3 最大运营商星级 + 趋势

2

~1.9k

Q4 组合入住率

1

~1.0k

Q5 敞口简报

2

~1.4k

五问题会话

8

~11.4k(+ ~3.2k 一次性模式)

每个响应还会打上自己的 cost 块({chars, estTokens, basis}),以便助手可以引用答案在上下文中花费的成本——标记为估算值,因为真实分词发生在客户端,服务器永远看不到(在 Claude Code 中,/cost 和 /context 在会话级别仍是事实依据)。

两个刻意的优化使其保持精简(经测量,相比朴素版本减少 31%):面向模型的文本镜像为紧凑 JSON(仅美化打印的空白就约占载荷的 26%),重复的方法论字符串在每个响应的信封注意事项中只出现一次,而不是出现在每个趋势块上。设施列表分页;摘要始终为全量数据。成本戳本身每个响应增加约 21 个 token——经测量,为了可见性值得。

数据管道

npm run ingest 下载并重建 data/processed/:

  1. 从 CMS PDC 元存储 API 解析当前 Provider Information CSV URL(文件 URL 每月变化),下载该文件及两个归档快照(2024 年 7 月、2025 年 7 月)用于趋势分析。

  2. 验证(行数、必需列(含 CMS 2024→2025 列重命名的表头别名)、评级范围、空值率)——失败时大声报错,绝不写入部分产物。

  3. 投影为三个产物:按设施切片、CCN→评级历史、全国基准(方法记录在文件中)。

原始下载缓存在 data/raw/(已 gitignore);--force 重新下载。

仓库结构

data/curated/     hand-verified 10-K facts + operator map (source-cited, checksummed)
data/processed/   generated CMS artifacts (committed; rebuild with npm run ingest)
scripts/          ingest.ts, stdio-smoke.mjs
src/domain/       types, store, resolve, metrics — pure & unit-tested
src/server/       MCP tools + entry (stdio)
tests/            checksums, units, e2e
docs/             PLAN.md (build plan + audit trail), DEMO.md (presentation script)

已知限制与后续步骤

  • Omega 拥有的设施无法单独识别 → 运营商连锁代理(下一步:交叉对照 CMS Ownership 文件的物业公司记录)。

  • 当年运营商排名本质上不完整(披露于 FY2020 停止);Omega 的季度补充材料可以缩小这一差距,但不在简报的资料来源范围内。

  • 趋势(星级、人员配置、入住率)使用两个端点快照 + 一个中点;更多月度快照可使其更平滑。

  • 英国设施(占房地产的 17.7%)没有 CMS 等效的摄取(CQC 将是类似的英国来源)。

Available Tools

9 tools
data_coverageData sources, vintages and known gapsA
Read-only

What this server knows, from where, as of when — and what it cannot know. Call this when asked about data freshness, reliability, methodology, or why an answer is qualified. Mirrored as MCP resource coverage://data-sources.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true, so the description doesn't need to disclose side effects. It does add value by explaining that the tool reveals 'known gaps' and 'what it cannot know,' which is beyond the annotation. It also implies the tool is safe to call given read-only nature. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with a dash-separated clause, front-loaded with 'What this server knows.' It packs a lot of meaning efficiently—sources, timing, limitations, and when to use—without redundancy. Slightly wordy but appropriate for the scope; not overly verbose, but could be trimmed. Still earns a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are documented elsewhere. The description covers what data it exposes, when to call it, and what limitations exist. Nothing important is missing given the complexity and the presence of an output schema. It's fully sufficient for an agent to decide whether and when to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty with 100% coverage (nothing to cover). The description adds no parameter-specific information because there are none to document. Baseline for 0 params is 4, and the description doesn't need to compensate for missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: it tells about the server's data sources, vintages, and known gaps. This distinguishes it from sibling tools like portfolio_overview or national_benchmarks, which are about data content rather than metadata/health. The phrase 'What this server knows, from where, as of when — and what it cannot know' is specific and descriptive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Call this when asked about data freshness, reliability, methodology, or why an answer is qualified.' This is clear when-to-use instruction. It also mentions the mirrored resource, which adds context for alternative access, though it doesn't explicitly mention sibling tools for exclusion—but the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_facilityFind a specific facilityA
Read-only

Look up individual CMS-certified nursing facilities by CCN (exact) or name fragment, optionally filtered by state. Returns full current metrics, the two-year metric history per snapshot, and — when the facility's chain or legal name maps back to one of Omega's known operators — that affiliation (which indicates the operator relationship, NOT proof that Omega owns the building). Use for drill-downs like 'tell me about their Dayton facility'.

NameRequiredDescriptionDefault
limitNo
queryNoCCN (e.g. '365914') or part of a facility name (e.g. 'Maplewood Healthcare')
stateNoOptional two-letter state filter

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true in annotations, the safety profile is already declared. The description adds valuable context: it states the tool returns full metrics, two-year history, and affiliation, and importantly clarifies that affiliation is not ownership proof. This goes beyond structured annotations and helps the agent interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The main purpose and method are front-loaded, followed by return details and a usage example. Every sentence earns its place, and the structure is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup with an output schema present, the description covers all essential aspects: query method, optional filter, what is returned (including the affiliation caveat), and a concrete usage example. No critical missing information such as pagination or error handling, which the output schema likely handles. The description is sufficient for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover query (CCN or name fragment) and state (optional 2-letter). The description restates these without adding new meaning; limit's constraints are encoded in the schema (default, max, min). Since schema coverage is 67% and the most relevant parameters are described, the description does not significantly enhance semantics beyond the structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Look up'), a precise resource (CMS-certified nursing facilities), and the lookup methods (CCN exact or name fragment). It also indicates the scope ('individual facilities') and differentiates from broader tools by referencing drill-downs, making it clear this is for single-facility lookups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear when-to-use example ('Use for drill-downs like...') and notes the optional state filter. However, it does not explicitly mention when not to use it or name alternatives among the many sibling tools (e.g., operator_facilities), so exclusion guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

national_benchmarksNational CMS benchmarksA
Read-only

National reference values computed from the current CMS Provider Information file: mean reported total nurse staffing HPRD, star-rating mean and distribution, and bed-weighted national occupancy — each with method and sample size. Use these to contextualize operator metrics.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=true in annotations, the description adds meaningful behavioral context: it is computed from the current CMS Provider Information file and includes method and sample size with each value. This reassures the agent about data provenance and the nature of the output. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that front-loads the key value (national reference values) and packs specific metrics without fluff. It could be broken into two sentences for readability, but it is efficient and every clause conveys needed information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool with an output schema, the description sufficiently covers what the agent needs to know: what data is computed, from what source, and how to use it. It doesn't need to detail return formats because the output schema exists. This is complete for the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so per the rubric the baseline is 4. The description need not explain parameters, and it doesn't. It does explain what the result contains, which is sufficient for a parameter-less read-only query tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies what the tool does: it returns national reference values for specific staffing and occupancy metrics computed from a named data source. It enumerates the exact outputs (mean HPRD, star-rating mean/distribution, bed-weighted occupancy) and notes method/sample size, making it unambiguous and distinct from sibling tools that cover operator-level data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the intended use: 'Use these to contextualize operator metrics.' This gives the agent clear when-to-use guidance. It doesn't name alternatives or exclusion conditions, but the purpose is specific enough that confusion with siblings like portfolio_overview or operator_metrics is unlikely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

operator_concentrationOperator concentration rankingA
Read-only

Omega's operators ranked by share of total investments. Returns two separately-dated blocks that must not be blended: (1) fy2025Disclosed — the current filing's named concentrations (Maplewood ≥10% of investments, CommuniCare 7.2%; largest-by-revenue vs largest-by-investment differ); (2) fy2020FullRanking — the last complete per-operator table Omega ever filed (Dec 31, 2020), with lease vs mortgage decomposition and computed percentages. Use this for any 'top N operators' question and always report each block's as-of date.

NameRequiredDescriptionDefault
topNNoHow many FY2020-ranked operators to return (named operators only; max 15)

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint=true, but the description goes far beyond that by disclosing the two-block structure, the exact dates (Dec 31, 2020), the nature of each block (disclosed vs full ranking), example concentrations (Maplewood ≥10%, CommuniCare 7.2%), the difference between largest-by-revenue and largest-by-investment, and the decomposition (lease vs mortgage). This is rich behavioral context with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is long, every sentence conveys essential information: purpose, block structure, examples, and usage warnings. It is front-loaded with the core purpose, then systematically explains each block in numbered format. No fillers or redundancies; the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (per context), so return format is covered externally. The description covers all necessary operational details: when to use, what the blocks are, specific examples, and usage warnings. The only minor omission is explicit mention of the topN parameter's effect, but that's in the schema. For a read-only ranking tool, this is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description covers 100% of the single parameter topN, and the description adds no extra semantics beyond what the schema explains ('How many FY2020-ranked operators to return'). The baseline of 3 applies because the schema carries the meaning; the description's mention of two blocks doesn't clarify which block topN applies to (implicitly the FY2020 one).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('ranked by share of total investments') and resource ('Omega's operators'), and immediately clarifies that it returns two distinct blocks with different dates. It distinguishes itself from siblings by explicitly targeting 'top N operators' questions, which is not covered by the other tools like portfolio_overview or operator_facilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit directive: 'Use this for any "top N operators" question', and provides critical usage constraints — 'must not be blended' and 'always report each block's as-of date'. This clearly tells the agent when and how to use it, though it doesn't enumerate alternatives, the explicit use case is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

operator_facilitiesList an operator's CMS facilitiesA
Read-only

The CMS-certified nursing facilities affiliated with an operator (via its CMS chain), each with star rating, staffing hours, beds and occupancy, plus an aggregate summary. Output is paged (default 25 rows) — the summary block always covers ALL matching facilities. Accepts free-text operator names.

NameRequiredDescriptionDefault
limitNo
stateNoOptional two-letter state filter, e.g. 'OH'
offsetNo
operatorYesOperator name (free text; resolved internally)

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, so the description's job is to add behavioral detail. It discloses paging behavior (default 25 rows), that the summary block always covers ALL matching facilities regardless of pagination, and that operator names are resolved internally from free text. These are meaningful details beyond the readOnlyHint and help an agent anticipate behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, then a concise note on paging and summary scope. Every sentence adds useful information with no fluff. It is efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list-oriented tool with an output schema (present, though not detailed here), the description covers the essential behaviors: what is listed, the paging semantics, the summary coverage, and the free-text handling. It omits explicit mention of the state filter, but that is already in the schema description. Overall, an agent can invoke this tool correctly based on the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: operator and state have descriptions, while limit and offset do not. The description adds value by explaining free-text resolution for operator and clarifying the default page size, but it does not elaborate on how limit/offset interact or what offset means. It partially compensates for the schema gaps but not completely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and the resource 'CMS-certified nursing facilities affiliated with an operator', and enumerates specific output fields (star rating, staffing hours, beds, occupancy) plus an aggregate summary. It distinguishes itself by focusing on an operator's facilities via its CMS chain, though it does not explicitly contrast with sibling tools like portfolio_overview or find_facility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides practical context: it accepts free-text operator names, is paged with a default of 25 rows, and the summary covers all matches. However, it offers no explicit guidance on when to use this tool versus alternatives (e.g., when to use portfolio_overview or operator_metrics), nor any exclusions. Usage context is implied but not directly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

operator_metricsOperator quality/staffing/occupancy metricsA
Read-only

Deterministic CMS metrics for one or more operators (1–10, free-text names): average star rating with per-star distribution, share of facilities below the national average on reported nurse staffing hours per resident day, bed-weighted occupancy, and two-year constant-panel trends (Jul 2024 → Jul 2026) for star rating, staffing HPRD, and occupancy. When multiple operators are given, a server-computed pooled block (union of facilities, deduplicated) is included — do not sum per-operator numbers yourself. Operators without CMS coverage are reported as unsupported with the reason, never silently dropped.

NameRequiredDescriptionDefault
operatorsYesOperator names, e.g. ['CommuniCare', 'Saber', 'Maplewood']

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds valuable behavioral detail: it is deterministic, the pooled block is server-computed to avoid client-side aggregation, and unsupported operators are reported rather than silently omitted. This goes beyond the annotation and clarifies non-obvious behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-formed: it leads with the core purpose, then lists metrics, then addresses the pooling caveat and unsupported-operator behavior. It is a single paragraph but stays on-topic with no filler; every sentence carries essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the return format does not need to be explained. The description covers the metrics, the input constraints, pooling behavior, and error handling. It is adequately complete for an agent to invoke it correctly, though it does not mention any prerequisites or typical usage against siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with a description and example for 'operators'. The description adds meaning by specifying free-text names (1-10), the pooling behavior for multiple operators, and the error-handling for unsupported operators. This is valuable beyond the schema's basic array definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool computes deterministic CMS metrics for operators and enumerates the specific metrics (star rating distribution, staffing HPRD benchmark, occupancy, and constant-panel trends). It does not explicitly distinguish itself from sibling metrics tools like portfolio_overview or operator_concentration, but the described scope is specific enough for an agent to infer the primary use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives operational guidance for the multi-operator case (the server-computed pooled block and a caution not to sum per-operator numbers) and for unsupported operators (report with a reason, never drop). However, it does not explain when to choose this tool over its siblings, such as when to use portfolio_overview or national_benchmarks instead. The guidance is present but the alternative-selection context is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

portfolio_occupancyPortfolio occupancy (CMS proxy)A
Read-only

Best-supported occupancy estimate for Omega's portfolio. Omega's 10-K discloses neither occupancy nor a facility list, so this is a defined PROXY: bed-weighted occupancy (avg residents/day ÷ certified beds) across the US nursing facilities of Omega's mapped operator chains, with explicit coverage accounting (who is included, who is excluded and why, and what share of Omega's last fully-disclosed portfolio that covers). Low-confidence operator mappings are excluded unless includeLowConfidence is true.

NameRequiredDescriptionDefault
includeLowConfidenceNoInclude operators whose CMS mapping confidence is 'low' (e.g. Agemo→Signature)

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description does not contradict that. The description adds significant behavioral context beyond the annotation: it discloses the proxy definition, inclusion/exclusion logic, the fact that low-confidence mappings are excluded by default, and that it provides coverage accounting. This transparently sets expectations for what the returned estimate represents and its limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but every sentence earns its place. It front-loads the core purpose ('Best-supported occupancy estimate'), then elaborates on methodology and coverage reasoning. No fluff, no repetition of schema details, and the logical flow from purpose to proxy definition to parameter behavior is clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (signal: true), so the description needn't explain return values. Given the complexity of a proxy with inclusion/exclusion logic, the description fully covers what the estimate is, how it is computed, who is included/excluded and why, and what share of the portfolio it covers. It is complete enough for an agent to decide when to call it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter, so the baseline is 3. The description adds value by explaining the practical implication: low-confidence operators are excluded unless the flag is true, and it even provides a concrete example ('Agemo→Signature') that clarifies the kind of mapping involved. This goes beyond the schema's generic parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear purpose: providing a defined, best-supported occupancy estimate for Omega's portfolio, with explicit methodology (bed-weighted proxy). It distinguishes itself from siblings by framing itself as 'best-supported' and explaining exactly what is and isn't covered, which differentiates it from portfolio_overview or operator_metrics without needing to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage by calling itself the 'best-supported occupancy estimate,' suggesting this is the go-to tool for occupancy. However, it never explicitly mentions when to use another tool (e.g., operator_facilities, national_benchmarks) or provides exclusions. The only usage-related guidance is about the includeLowConfidence parameter, not tool selection context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

portfolio_overviewPortfolio overview (Omega 10-K)A
Read-only

Omega Healthcare Investors' portfolio as disclosed in the latest 10-K (FY2025): total investments by property type, facility mix, geographic concentration, and the operators named in the concentration note. For a ranked list of operators use operator_concentration — this overview names only the two operators the FY2025 filing discloses.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds context about the data source (latest 10-K for FY2025) and a limitation (only two operators from the concentration note), which is useful behavioral information beyond the annotation. It does not contradict the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first defines the tool and its contents, the second routes the agent to a sibling for a different need. It is concise, front-loaded, and contains no fluff. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that this tool has no parameters, has an output schema available, and is a simple read-only overview, the description provides all necessary context: what data it returns, the source, the limitation on operators, and an alternative for the ranked list. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline score is 4. The description adds context about the tool's source and scope, but there are no parameters to explain. The schema is empty with 100% coverage, so no additional parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: provides Omega's portfolio overview from the latest 10-K with specific components (property type, facility mix, geographic concentration, and operators). It explicitly differentiates from operator_concentration by noting this overview names only two operators, so an agent can immediately tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative operator_concentration and the condition that selects it: when a ranked list of operators is needed. It clearly states that this overview only includes the two operators disclosed in the filing, leaving no ambiguity about when to use this tool versus its sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_operatorResolve an operator nameA
Read-only

Resolve a free-text operator name to the curated Omega operator record and its CMS chain mapping (method, confidence, caveats). Use to disambiguate names or check whether CMS metrics are even possible for an operator before asking for them. Other tools resolve names internally, so calling this first is optional.

NameRequiredDescriptionDefault
queryYesOperator name, e.g. 'Maplewood', 'CommuniCare', 'Saber Health'

Output Schema

NameRequiredDescription
costYes
dataYes
statusYes
caveatsYes
provenanceYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, so the description's added value is disclosing the return structure (method, confidence, caveats) and noting that it is an optional pre-step because other tools resolve internally. This goes beyond the annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loaded with the core purpose and followed by usage context. Every sentence earns its place; there is no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to detail return values. It covers purpose, usage, and optionality sufficiently for a single-parameter tool. The guidance about other tools resolving internally is valuable context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter already includes examples and a clear description. The tool description adds little beyond the schema—it reaffirms 'free-text' but does not introduce new semantics. Baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (resolve) and the resource (free-text operator name to curated Omega record and CMS chain mapping). It explicitly mentions the output includes method, confidence, and caveats, and differentiates from siblings by noting that other tools resolve names internally, making this tool for disambiguation and feasibility checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use guidance: disambiguate names or check whether CMS metrics are possible. It also states that other tools resolve names internally, so calling this first is optional, which effectively tells when not to use it. This is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv1.0.0
    • First observeddata_coverage
    • First observedfind_facility
    • First observednational_benchmarks
    • First observedoperator_concentration
    • First observedoperator_facilities
    • First observedoperator_metrics
    • First observedportfolio_occupancy
    • First observedportfolio_overview
    • First observedresolve_operator

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: resolving names, viewing portfolio overview, ranking operators, listing facilities, computing metrics, estimating occupancy, individual facility lookup, national benchmarks, and data coverage. Even the overlapping facility tools differ by entry point (operator vs. CCN/name).

Naming Consistency5/5

All tool names follow a consistent verb_noun or noun_noun pattern in lowercase snake_case (e.g., resolve_operator, portfolio_overview, find_facility, data_coverage). There is no mixing of conventions or vague verbs.

Tool Count5/5

With 9 tools, the server is well-scoped for its domain of analyzing Omega's portfolio and CMS facility metrics. Each tool addresses a specific need without redundancy or bloat, falling comfortably in the ideal range.

Completeness5/5

The tool surface covers the full analytical workflow: operator disambiguation, portfolio perspective, concentration rankings, facility-level data, aggregated metrics with trends, occupancy estimation, national context, and data transparency. No obvious gaps exist for the domain.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to search, retrieve, and analyze SEC 10-K filings with hybrid BM25+kNN retrieval, per-claim citations, and strict numeric grounding verification.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to answer questions about Japanese long-term care supply and demand, such as whether a municipality has enough special nursing homes, using public data.
    -
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to perform institutional research and due diligence by retrieving, extracting, validating, and citing data from public sources, then generating reports in markdown, HTML, or PDF.
    23
    -