SEAF MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| API_BASE_URL | Yes | Base URL of the SEAF portal, e.g. https://seaf-portal.example.com | |
| MAX_RESPONSE_CHARS | No | Maximum number of characters for response text; longer responses are truncated | |
| ENDPOINT_CATALOG_PATH | No | Path to the endpoints catalog JSON file, e.g. endpoints.json | |
| SEAF_JSONATA_LOG_FILE | No | Path to a JSONL journal file for logging JSONata queries; used together with SEAF_JSONATA_LOG_INCLUDE_QUERY=true | |
| SEAF_JSONATA_LOG_INCLUDE_QUERY | No | Set to true to include the JSONata query in the JSONL log file specified by SEAF_JSONATA_LOG_FILE |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_sectionsA | Когда вызывать: в начале работы или когда неизвестно, в каком разделе искать данные. Возвращает разделы seaf.company.* с числом объектов и описанием. Дальше: inspect_sections (структура и образцы нескольких разделов) или describe_section (один раздел без образцов). |
| describe_sectionA | Когда вызывать: нужна структура ОДНОГО раздела без образцов — атрибуты с частотой, исходящие/входящие поля-связи, примеры ID. Для образцов данных и нескольких разделов сразу используйте inspect_sections. Дальше: list_entities (выборка по фильтрам) или describe_query_result (разведка перед JSONata). |
| get_entityA | Когда вызывать: известен точный ID объекта (например example.app_system.hotel_booking). Возвращает раздел и все атрибуты объекта. ID неизвестен — сначала find_entities. Дальше: get_relations для связей объекта. |
| find_entitiesA | Когда вызывать: известно только примерное название объекта (система, сервис, человек) — поиск по подстроке в ID/title/description всех разделов (или одного). Возвращает total и items {section, id, title}. Когда раздел и условия по полям известны точно, эффективнее list_entities. Дальше: get_entity или get_relations по найденному id. |
| list_entitiesA | Когда вызывать: нужны объекты раздела с точными фильтрами по полям (eq/ne/contains/missing/exists) и пагинацией — выполняется на портале. Пример: системы без стейкхолдеров — where=[{field:'stakeholders',op:'missing'}]. Поля через точку (stakeholders.name); для массивов eq/contains срабатывает на любой элемент; булевы — 'true'/'false'. Не знаете раздел — list_sections; ищете по примерному названию — find_entities. Возвращает {section,total,offset,items}. Дальше: get_entity по id из items. |
| get_relationsA | Когда вызывать: нужны связи объекта — outgoing (на что он ссылается) и incoming (кто ссылается на него: подсистемы — incoming is_part_of, компоненты — incoming realizes_system, таблицы — incoming system). Возвращает группы по полю с count, до limit элементов и title. У крупных объектов сужайте direction/field. Дальше: get_entity на связанном id. |
| metamodel_guideA | Когда вызывать: нужны понятия метамодели SEAF, смысл отношений и проверенные приёмы JSONata (чек-лист, паттерны, ловушки). Возвращает текст справочника. Дальше: list_sections. |
| find_relation_pathsA | Когда вызывать: нужно понять, через какие поля и разделы связаны два раздела (например, people и products), прежде чем писать JOIN. Возвращает до 10 кратчайших маршрутов (до 5 шагов): каждый шаг — from_section, field, to_section, direction (out/in); данные сущностей не возвращаются, JOIN не выполняется. via_sections ограничивает промежуточные разделы. Дальше: find_jsonata_examples (группа relations) или seaf_jsonata_query. |
| find_jsonata_examplesA | Когда вызывать: перед написанием JSONata — взять проверенный пример похожего запроса (keyword-поиск по вопросу, группе, разделам и тексту выражения; русские словоформы совпадают по префиксу). Возвращает до limit (по умолчанию 5) примеров {id, question, sections, expression, explanation}; записи с template=true требуют подстановки реального ID. При настроенном SEAF_METAMODEL_PATH после проверенных примеров идут фрагменты YAML метамодели с пометкой файла. Дальше: seaf_jsonata_query с адаптированным выражением. |
| get_datasetA | Когда вызывать: нужен именованный датасет представлений ЦЕЛИКОМ (только seaf.company.ds., например seaf.company.ds.people: записи людей с полями title/ФИО, role, department и техническими id/link_to_card). Возвращает объект объектов (ключ — ID записи). Для выборок по датасету и служебных seaf.ds. — query_dataset. Дальше: query_dataset с фильтром. |
| query_datasetA | Когда вызывать: нужна выборка JSONata поверх именованного датасета (корневой $ — данные датасета; для манифеста модели — seaf_jsonata_query). origin — ID датасета или {алиас: dataset_id} (тогда $ — мапа, датасет как $."алиас"); source оборачивается в (...) автоматически. Возвращает результат выражения; доступны любые датасеты, включая seaf.ds.* — сужайте выборку: ответ считается на портале целиком. Дальше: seaf_jsonata_query, если данных нет в датасете. |
| describe_query_resultA | Когда вызывать: ПЕРЕД seaf_jsonata_query, когда не уверены в форме результата запроса. Возвращает тип (array/object/scalar/missing), count по всему результату, поля с покрытием present_in k/n по первым 100 элементам и до 3 примеров (≤1500 символов каждый); схема строится по выборке — это разведка, а не полная схема. Терминальные агрегаты ($count, $sum) — скаляр в value. Дальше: seaf_jsonata_query с уточнённым запросом. |
| inspect_sectionsA | Когда вызывать: нужны структура И образцы сразу 1-5 разделов, например перед запросом со связями между типами. Возвращает по каждому разделу count, атрибуты, поля-связи и до sample_limit (1-3, по умолчанию 2) ограниченных образцов; раздел целиком не выгружается. Для одного раздела без образцов достаточно describe_section. Дальше: seaf_jsonata_query со связывающим запросом. При включённом API_MIN_INTERVAL_SECONDS время ответа растёт пропорционально числу разделов. |
| get_healthA | Когда вызывать: проверить доступность портала (health-check). Возвращает {"message": "app is alive"}. Дальше: list_sections. Endpoint: GET /health |
| seaf_jsonata_queryA | Когда вызывать: нужен произвольный JSONata по манифесту модели (корневой $ — манифест); для датасетов — query_dataset, для разведки формы результата — describe_query_result. Возвращает результат выражения; ошибки JSONata (S0xxx/T0xxx) приходят с подсказкой по исправлению. Дальше: get_entity/list_entities для типовых выборок без JSONata. Endpoint: POST /seaf-core/api/core/storage/jsonata |
| get_seaf_core_api_core_storage_versionsA | Когда вызывать: узнать версию ядра портала и хэш манифеста. Дальше: list_sections. Endpoint: GET /seaf-core/api/core/storage/versions |
| get_seaf_core_api_core_storage_problemsA | Когда вызывать: увидеть ошибки валидации, найденные при загрузке манифеста. Дальше: зависит от найденных проблем. Endpoint: GET /seaf-core/api/core/storage/problems/ |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| SEAF metamodel guide | Справочник метамодели SEAF |
TDQS
Scored across 17 tools
The discovery cluster (list_sections / describe_section / inspect_sections) and the lookup cluster (get_entity / find_entities / list_entities) overlap conceptually, but the descriptions explicitly state when to prefer each and cross-reference alternatives. The JSONata family (query_dataset / seaf_jsonata_query / describe_query_result / find_jsonata_examples) is likewise differentiated by scope (dataset vs manifest vs result-shape vs examples). A few boundaries remain soft, but an agent can pick correctly.
Most tools follow a clean verb_noun snake_case pattern (list_sections, get_entity, find_entities, describe_query_result). However, two tools are auto-derived raw endpoint names (get_seaf_core_api_core_storage_versions, get_seaf_core_api_core_storage_problems) that break the convention badly, and seaf_jsonata_query adds an inconsistent domain prefix.
17 tools is on the heavier side but each maps to a distinct step in the discovery→inspect→query workflow, so they mostly earn their place. It could be trimmed (e.g. merging versions/problems into a diagnostics tool), but it is not bloated for the domain.
The surface covers health, section/structure discovery, entity lookup and relation traversal, metamodel guidance, JSONata examples, dataset access, query execution and result introspection — a full read-oriented lifecycle. Gaps are minor: no explicit dataset enumeration, and no write operations if mutation is in scope, but the read/query workflow has no dead ends.