occulytics
Occulytics MCP Server
MCP-сервер, который позволяет ИИ-ассистенту отвечать на вопросы о портфеле для команды по управлению активами healthcare-REIT (Omega Healthcare Investors), опираясь на два публичных источника: SEC 10-K файлы Omega и файл 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 с областью проекта — откройте этот репозиторий в Claude Code после npm run build, и сервер 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: Medical Billing MCP
О чём можно спрашивать
Пять целевых вопросов и что сервер на самом деле делает:
Вопрос | Путь к ответу | Честный результат |
Топ-5 операторов по % инвестиций, и сколько объектов каждый из них управляет? |
| Частично по дизайну: Omega прекратила публикацию полной таблицы операторов после своего 10-K за FY2020. Вы получаете полный рейтинг FY2020 (с разбивкой на аренду/ипотеку — включая то, что Ciena, а не Consulate, на самом деле была #1 с учётом ипотек) и раскрытия FY2025 (Maplewood ≥10%, CommuniCare 7.2%), каждое с датой, никогда не смешанные. «Фактически управляет» = живые подсчёты цепочек CMS. |
Доля объектов топ-операторов ниже среднего по стране по укомплектованности персоналом? |
| Вычисляется по каждому оператору и объединяется на сервере относительно среднего по стране (3.86 отчётных часов медсестёр на пациента в день). Немаппируемые операторы называются и исключаются, а не молча отбрасываются. |
Средний рейтинг звёзд крупнейшего оператора и направление за два года? |
| Неподтверждено для Maplewood (крупнейший по инвестициям): он управляет сообществами для пожилых, которые не являются сертифицированными CMS домами престарелых — сервер говорит об этом и объясняет почему. Для CommuniCare (крупнейший по выручке): средний рейтинг 3.05 звёзд, улучшение с 2.26 → 3.04 на постоянной панели из 117 объектов (июль 2024 → июль 2026). |
Заполняемость портфеля? |
| Помеченный прокси: Omega не раскрывает ни заполняемость, ни список объектов. Заполняемость с учётом кроватей по сопоставленным операторским цепочкам (83.5% против 80.5% по стране), с учётом покрытия — какую долю портфеля прокси на самом деле представляет и кто исключён (операторы из Великобритании, Maplewood, сопоставления с низкой уверенностью). |
Однопараграфный брифинг о подверженности рискам по крупнейшему оператору? |
| Модель пишет параграф; сервер предоставляет только детерминированные факты: ≥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.
Поверхность инструментов
Инструмент | Возвращает | Сырые или обработанные? |
| Итоги FY2025, структура, гео + поименованная концентрация операторов | обработанные факты, как в файле |
| Два блока рейтингов с датами (полный FY2020 / поименованный FY2025) | обработанные; % вычислен из заявленных долларов |
| имя → канонический оператор + сопоставление с CMS + уверенность + контекст 10-K (ранг/% FY2020, раскрытый % FY2025) | метаданные |
| постраничные строки объектов + сводка по всей совокупности | сырые строки + обработанная сводка |
| звёзды (среднее + распределение по звёздам), укомплектованность против национальной, заполняемость и 2-летние тренды на постоянной панели для всех трёх; объединённый блок для нескольких операторов | обработанные (вся арифметика на сервере) |
| детализация объекта по CCN/имени: текущие метрики, история по снимкам, обратная принадлежность к оператору Omega | сырые детали + обработанная принадлежность |
| прокси заполняемости + 2-летний тренд + учёт покрытия | обработанные, явно помеченный прокси |
| национальные справочники по укомплектованности/звёздам/заполняемости + методы | обработанные |
| источники, версии, сопоставления, известные пробелы (также ресурс | метаданные |
Обоснование гранулярности: инструменты имеют форму вопросов, но компонуемы — детерминированная агрегация (где арифметика LLM по 100+ строкам является риском для корректности) — это ответственность инструмента; синтез повествования — модели. Каждый инструмент, принимающий оператора, принимает свободный текст и разрешает его внутренне, так что клиенту никогда не нужен двухшаговый протокол; неудачное разрешение — это unsupported ответ (с кандидатами и известной вселенной), а не ошибка.
Кросс-источниковые вопросы (часть 10-K ↔ часть CMS) являются первоклассными: идентичность оператора — ключ соединения, проверенный в обе стороны (каждое имя в рейтинге 10-K разрешается в каждом инструменте на основе CMS — проверено e2e), и каждый разрешённый блок оператора встраивает свой контекст 10-K (omegaContext: ранг и % портфеля FY2020, раскрытая концентрация FY2025), так что вопросы типа «насколько хорош наш крупнейший оператор?» разрешаются без второго вызова.
Ключевые решения и компромиссы
1. Два года, никогда не смешиваются. Решающий исследовательский вывод: 10-K Omega после FY2020 не содержат таблицы инвестиций по операторам — файл FY2025 называет только Maplewood (≥10% инвестиций) и CommuniCare (7.2%). Таким образом, текущий «топ-5» полностью не подтверждается названными источниками, и сервер говорит именно это: рейтинги представлены двумя отдельно датированными блоками, а статус — 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; корректен для ~11 названных операторов одного REIT, и механизм (метод/уверенность/оговорка для каждого сопоставления) — это то, что масштабировалось бы.
4. Метрики цепочек — супермножества, и об этом говорится. Портфель Omega на уровне объектов не публичен (проверено: Приложение III агрегирует по штатам). Поэтому метрики CMS описывают всю деятельность оператора, а не только здания Omega — каждый затронутый ответ несёт эту оговорку, а прокси заполняемости сообщает, какую долю портфеля (FY2020) покрывает его охват (~40%). Компромисс: реконструкция на уровне объектов из файла владения CMS была возможна, но это многодневная работа по нечёткому сопоставлению; честный прокси с учётом покрытия — это ответ за четыре часа. Эта реконструкция — естественный следующий шаг.
5. Методология — часть ответа. Тренд звёзд = постоянная панель (объекты, оценённые в обоих конечных снимках), с размером панели, исключениями и известным смещением (членство в сети учитывается только на текущую дату) в ответе. Бенчмарк по персоналу = заявленный суммарный HPRD медсестёр, среднее по объектам (то, о чём спрашивается, без корректировки; существует и поправка на структуру пациентов, она отмечена). Заполняемость = среднее число проживающих в день ÷ сертифицированные койки, что занижает операционную заполняемость (сертифицированных коек больше, чем действующих). Всё указано в полезных нагрузках, а не только здесь.
6. JSON в памяти, без базы данных, артефакты в репозитории. 15 тыс. строк загружаются за миллисекунды; БД добавляет операционную поверхность при нулевой потребности в запросах. Закоммиченные артефакты (~6 МБ) означают, что установка → сборка → демо работает без сети — живое демо невозможно сломать сбоем 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 из посторонней рабочей директории.
Эффективность и стоимость токенов
npm run cost измеряет, сколько LLM-клиент платит в контексте за каждый демонстрационный
вопрос (текст результата инструмента + одноразовые схемы инструментов), полностью офлайн.
Оценки токенов приблизительны (символы ÷ 4; реальные токенизаторы дают разброс ±20%) —
ценность в относительной стоимости и отслеживании регрессий.
Текущие измерения (закоммиченные артефакты):
Вопрос | Вызовов | Оценка токенов |
Q1 топ-5 + количество объектов | 2 | ~4,1 тыс. |
Q2 персонал ниже среднего по стране | 1 | ~3,0 тыс. |
Q3 крупнейший оператор: звёзды + тренд | 2 | ~1,9 тыс. |
Q4 заполняемость портфеля | 1 | ~1,0 тыс. |
Q5 брифинг по экспозиции | 2 | ~1,4 тыс. |
Сессия из пяти вопросов | 8 | ~11,4 тыс. (+ ~3,2 тыс. одноразовых схем) |
Каждый ответ также помечает собственный блок cost ({chars, estTokens, basis}),
чтобы ассистент мог указать, сколько ответ стоил в контексте, — помечен как оценка,
потому что реальная токенизация происходит на стороне клиента, и сервер её никогда
не видит (в Claude Code /cost и /context остаются источником истины на уровне сессии).
Две осознанные оптимизации держат это компактным (измеренное сокращение на 31% относительно наивной версии): зеркало текста для модели — компактный JSON (только пробелы pretty-print составляли ~26% полезной нагрузки), а повторяющиеся строки методологии размещаются один раз на ответ в оговорках конверта, а не в каждом блоке тренда. Списки объектов разбиты на страницы; сводки всегда по всей совокупности. Сам штамп стоимости добавляет ~21 токен на ответ — измерено, и оно того стоит ради прозрачности.
Конвейер данных
npm run ingest загружает и пересобирает data/processed/:
Разрешает текущий URL CSV Provider Information из API метастора CMS PDC (URL файла меняется ежемесячно), загружает его плюс два архивных снимка (июль 2024, июль 2025) для тренда.
Проверяет (количество строк, обязательные колонки с алиасингом заголовков при переименованиях колонок CMS 2024→2025, диапазоны рейтингов, долю пропусков) — падает громко, никогда не записывает частичные артефакты.
Проецирует в три артефакта: срез по объекту, историю рейтингов 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, не идентифицируются по отдельности → прокси операторской сети (далее: сквозная сверка записей компаний-собственников из файла Ownership CMS).
Рейтинг операторов за текущий год по своей природе неполон (раскрытие прекратилось в FY2020); ежеквартальные дополнения Omega могли бы сузить этот пробел, но они вне источников, указанных в задании.
Тренды (звёзды, персонал, заполняемость) используют два конечных снимка + среднюю точку; больше ежемесячных снимков сгладили бы их.
Для объектов в Великобритании (17,7% недвижимости) нет ингестии, аналогичной CMS (аналогом для Великобритании был бы CQC).
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered analysis of healthcare market segments, product comparisons, and sales data insights using natural language processing and retrieval-augmented generation.2
- AlicenseAqualityCmaintenanceEnables AI assistants to look up medical billing codes, denial reasons, and payer rules for faster claim resolution.66MIT
- FlicenseNot gradedqualityCmaintenanceEnables document search, grounded question answering, summarization, patient timeline extraction, and PHI redaction for healthcare documents using retrieval-augmented generation.
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query organizational architecture and governance constraints, returning evidence-grounded answers from documented structures.MIT
Related MCP Connectors
Certified SEC EDGAR fact memory for AI agents with zero hallucination and filing provenance.
Provide AI assistants with real-time access to official SEC EDGAR filings and financial data. Enab…
Deterministic compliance and vertical knowledge bases for autonomous agents. Free 24hr trial.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/siddak1234/occulytics-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server