Skip to main content
Glama

Occulytics MCP Server

ヘルスケアREITの資産管理チーム(Omega Healthcare Investors)向けに、AIアシスタントがポートフォリオに関する質問に回答できるようにするMCPサーバーです。2つの公開ソース(OmegaのSEC 10-K提出書類とCMS Nursing Home Provider Informationファイル)に基づいています。

設計目標(ブリーフによる): サーバーは、回答が完全、不確実、または裏付けなし — そしてその理由を言える必要があり、何の裏付けもない確信的な数字を生成してはなりません。すべてのツールは、計算されたステータス、注意事項、および出所を運ぶエンベロープ内で決定的なデータを返します。

クイックスタート

すべてオフラインで動作します — データ成果物はコミットされています。

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

質問できること

5つのターゲット質問と、サーバーが実際に行うこと:

質問

回答パス

正直な結果

投資額の%によるトップ5オペレーターと、それぞれが運営する施設数は?

operator_concentration + operator_facilities

設計上部分: OmegaはFY2020の10-K以降、完全なオペレーターテーブルを廃止しました。完全なFY2020ランキング(リース/モーゲージの分解を含む — モーゲージを含めると、ConsulateではなくCienaが実際に#1だったことを含む)および FY2025の名前付き開示(Maplewood ≥10%、CommuniCare 7.2%)を、それぞれ日付付きで、決して混ぜずに提供します。「実際に運営」= ライブCMSチェーン数。

トップオペレーターの施設のうち、全国平均の人員配置を下回る割合は?

operator_metrics(マルチオペレーター)

オペレーターごとに計算し、サーバー側で全国平均(報告された看護師HPRD 3.86)に対してプールします。マッピングできないオペレーターは名前を挙げて除外され、黙って削除されません。

最大のオペレーターの平均スター評価と2年間の方向性は?

operator_metrics

Maplewood(投資額で最大)には裏付けなし: シニアリビングコミュニティを運営しており、CMS認定のナーシングホームではありません — サーバーはその旨と理由を述べます。CommuniCare(収益で最大): 平均3.05スター、117施設の定数パネルで2.26 → 3.04に改善(2024年7月 → 2026年7月)。

ポートフォリオの稼働率は?

portfolio_occupancy

ラベル付きプロキシ: Omegaは稼働率も施設リストも開示していません。マッピングされたオペレーターチェーン全体でのベッド加重稼働率(全国80.5%に対して83.5%)、カバレッジ会計付き — プロキシが実際にポートフォリオのどの割合を表しているか、誰が除外されているか(英国オペレーター、Maplewood、低信頼度マップ)。

最大のオペレーターに関する1段落のエクスポージャーブリーフィングは?

portfolio_overview + resolve_operator(+集中度)

モデルが段落を書き、サーバーは決定的な事実のみを提供: 投資の≥10%、収益トレンド6.6%/5.2%/5.4%、$12.5Mの解約手数料注記、CMSカバレッジギャップ。

アーキテクチャ

3つのレイヤー、依存関係は一方向、データベースなし、ランタイムネットワークなし:

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

2つの日付付きランキングブロック(FY2020完全 / FY2025名前付き)

解決済み; %は提出されたドルから計算

resolve_operator

名前 → 正規オペレーター + CMSマッピング + 信頼度 + 10-Kコンテキスト(FY2020ランク/%、FY2025開示%)

メタデータ

operator_facilities

ページングされた施設行 + 全母集団サマリー

生の行 + 解決済みサマリー

operator_metrics

スター(平均+スター別分布)、人員配置対全国、稼働率、および3つすべての2年間定数パネル傾向; マルチオペレーター用のプールブロック

解決済み(すべての算術はサーバー側)

find_facility

CCN/名前による施設ドリルダウン: 現在のメトリクス、スナップショットごとの履歴、逆Omegaオペレーター提携

生の詳細 + 解決済み提携

portfolio_occupancy

プロキシ稼働率 + 2年間傾向 + カバレッジ会計

解決済み、明示的にラベル付きプロキシ

national_benchmarks

全国の人員配置/スター/稼働率の参照 + 方法

解決済み

data_coverage

ソース、ビンテージ、マッピング、既知のギャップ(coverage://data-sourcesリソースも)

メタデータ

粒度の根拠: ツールは質問に合わせた形ですが構成可能です — 決定的な集計(100行以上のLLM算術が正確性リスクとなる場合)はツールの責任であり、物語の統合はモデルの責任です。オペレーターを受け取るすべてのツールは自由テキストを受け入れ、内部で解決するため、クライアントが2段階のプロトコルを必要とすることはありません。解決失敗はエラーではなく、unsupportedの回答(候補と既知の宇宙を含む)です。

クロスソース質問(10-K部分 ↔ CMS部分)は第一級です: オペレーターIDが結合キーであり、往復で検証されます(10-Kランキングのすべての名前がすべてのCMSバックアップツールで解決されます — e2eテスト済み)、そして解決された各オペレーターブロックには10-Kコンテキスト(omegaContext: FY2020ランクとポートフォリオの%、FY2025開示集中度)が埋め込まれているため、「最大のオペレーターはどのくらい良いか?」という質問は2回目の呼び出しなしで解決されます。

主要な決定とトレードオフ

1. 2つのビンテージ、決して混ぜない。 決定的な調査結果: OmegaのFY2020以降の10-Kにはオペレーターごとの投資テーブルが含まれていません — FY2025提出書類はMaplewood(投資の≥10%)とCommuniCare(7.2%)のみを名前で挙げています。したがって、現在の「トップ5」は名前付きソースから完全に裏付けることはできず、サーバーはまさにそれを述べます: ランキングは2つの別々に日付付きのブロックとして提供され、ステータスは理由とともにpartialです。トレードオフ: 1つのきれいなリストよりも満足度が低い; 混ぜたリストは数値的に一貫性がないため(異なる分母での2020ドル対2025パーセンテージ)選択されました。

2. 手書き転写のSEC事実、機械取り込みのCMSデータ。 Omegaの事実は、2つの異なる形式の提出書類の2つのテーブルにわたる約30の数字です。このスコープでの一般的な10-Kパーサーは、このブリーフにとって最悪の失敗モード — 黙って間違った抽出 — を持っています。代わりに: 事実ごとの引用付きのキュレーションJSON、チェックサムテストで保護(合計可能なすべての列は提出書類自身の小計と合計を再現する必要があります — タイプミスの数字はビルドを失敗させます)。CMS側(14,693行×3ヶ月ビンテージ)は検証付きで完全に自動化されています。なぜなら、その規模では自動化がより安全な選択肢だからです。トレードオフ: 新しい10-Kの更新は手動編集です; 年次提出文書には受け入れられます。

3. オペレーター→CMS結合はキュレーションされ、信頼度タグ付きの成果物です。 どちらのデータセットも他方を参照していません。結合(10-Kオペレーター名 → CMSチェーン)はシステム内で最もリスクの高い推論であるため、コードではなくデータです: 各マッピングはどのように作成されたか、どの程度信頼すべきかを記録し、マッピングできないオペレーターは理由を記録します(Maplewood: シニアリビング、CMS外; Healthcare Homes: 英国)。低信頼度マッピング(Agemo → Signature)はデフォルトでプール集計から除外され、含まれる場合は表面化されます。トレードオフ: 数百のREITにはスケールしません; 1つのREITの約11の名前付きオペレーターには正しく、メカニズム(マッピングごとの方法/信頼度/注意事項)がスケールするものです。

4. チェーンメトリクスはスーパーセットであり、その旨を述べます。 Omegaの施設レベルのポートフォリオは公開されていません(検証済み: Schedule IIIは州ごとの集計)。したがって、CMSメトリクスはオペレーターの全体の運営を説明しており、Omegaの建物だけではありません — 影響を受けるすべての応答にはその注意事項が含まれ、稼働率プロキシはそのカバレッジが(FY2020)ポートフォリオのどの割合を表すかを報告します(約40%)。トレードオフ: CMS所有権ファイルからの施設レベルの再構築は可能でしたが、数日かかるファジーマッチング作業です; カバレッジ会計付きの正直なプロキシは4時間の回答です。その再構築が自然な次のステップです。

5. 方法論も回答の一部である。 スター傾向 = 固定パネル(両方のエンドポイントスナップショットで評価された施設)、パネルサイズ、除外事項、既知のバイアス(チェーン所属は現時点のみ)をレスポンスに含める。人員ベンチマーク = 報告された 総看護師HPRD、施設平均(質問が求めるもの、未調整。ケースミックス調整版は存在し、その旨記載)。稼働率 = 平均入居者数/日 ÷ 認定ベッド数。これは運営上の稼働率を過小評価する(認定ベッド数 > 稼働ベッド数)。これらはすべてここだけでなく、ペイロードにも明記されている。

6. インメモリJSON、データベースなし、成果物をコミット。 15,000行はミリ秒で読み込まれる。DBはクエリ需要ゼロに対して運用上の表面積を増やすだけ。コミット済み成果物(約6MB)により、インストール → ビルド → デモがネットワークなしで動作する。ライブデモはCMSの障害やダウンロードURLの変更で壊れない。コスト: リポジトリがデータを保持する。取り込みはいつでもソースから再導出できる。

7. 出力の制限。 施設リストはページングされ(デフォルト25件)、常に完全なサマリーブロックと総数を含む。185施設のチェーンでもクライアントのコンテキストがあふれることはない。

テスト

  • tests/curated.test.ts — 提出書類自体の合計に対する転写チェックサム。

  • tests/metrics.test.ts、tests/resolve.test.ts — フィクスチャ上のドメインユニット(正確な値)。

  • tests/e2e.test.ts — インメモリトランスポート上の実際のMCPクライアントを実際のデータに対して実行。デモ質問ごとに1テスト。サポート外のパスも含む。

  • npm run smoke — 外部のcwdから実際のstdio上でコンパイル済みサーバーを実行。

効率性とトークンコスト

npm run cost は、LLMクライアントがデモ質問ごとにコンテキストで支払うもの(ツール結果テキスト + 一度きりのツールスキーマ)を完全オフラインで測定する。トークン数は推定値(文字数 ÷ 4。実際のトークナイザーは±20%変動する)。価値があるのは相対コストと回帰追跡である。

現在の測定値(コミット済み成果物):

質問

呼び出し数

推定トークン

Q1 トップ5 + 施設数

2

約4.1k

Q2 全国平均未満の人員

1

約3.0k

Q3 最大手オペレーターの星評価 + 傾向

2

約1.9k

Q4 ポートフォリオ稼働率

1

約1.0k

Q5 エクスポージャーブリーフィング

2

約1.4k

5質問セッション

8

約11.4k(+ 約3.2k 一度きりのスキーマ)

各レスポンスはまた、自身の cost ブロック({chars, estTokens, basis})をスタンプする。これによりアシスタントは回答がコンテキストでいくらかかったかを引用できる。推定値と明記されているのは、実際のトークン化はクライアント側で行われ、サーバーはそれを決して見ないためである(Claude Codeでは、/cost と /context がセッションレベルで真実の情報源であり続ける)。

この軽量さを維持するための2つの意図的な最適化がある(ナイーブ版と比較して31%削減、測定済み): モデル向けテキストミラーはコンパクトなJSONである(それだけでペイロードの約26%を占めていた整形空白を削除)、そして繰り返しの方法論文字列は各トレンドブロックではなく、エンベロープの注意事項にレスポンスごとに1回だけ置かれる。施設リストはページングされ、サマリーは常に全母集団である。コストスタンプ自体はレスポンスごとに約21トークンを追加する — 測定済みであり、可視性の価値がある。

データパイプライン

npm run ingest は data/processed/ をダウンロードして再構築する:

  1. CMS PDCメタストアAPIから現在のProvider Information CSV URLを解決する(ファイルURLは毎月変わる)。それをダウンロードし、傾向用に2つのアーカイブスナップショット(2024年7月、2025年7月)も取得する。

  2. 検証する(行数、CMSの2024→2025年の列名変更にわたるヘッダーエイリアシングを伴う必須列、評価範囲、欠損率)— 失敗時は明確にエラーを出し、部分的な成果物は決して書き込まない。

  3. 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の四半期補足資料で狭められる可能性があるが、ブリーフのソース範囲外である。

  • 傾向(星評価、人員、稼働率)は2つのエンドポイントスナップショット + 中間点を使用。より多くの月次スナップショットがあれば平滑化できる。

  • 英国の施設(不動産の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.

Maintenance

ActivityStale
ResponsivenessNo issues

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
    -