fes-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FES_MCP_AUTH | No | Credential source (default: by transport: http => upstream, stdio => env) | |
| FES_MCP_HOST | No | HTTP bind host (default: 127.0.0.1) | 127.0.0.1 |
| FES_MCP_PORT | No | HTTP bind port (default: 8200) | 8200 |
| FES_MCP_TOOLS | No | Comma-separated tool_ids / modules override (default: config/allowlist.txt) | config/allowlist.txt |
| SISENSE_TOKEN | No | Sisense token for dev-mode (env) credential | |
| FES_MCP_RS_URL | No | Resource server URL for fes-auth to proxy tool calls to | |
| SISENSE_DOMAIN | No | Sisense instance domain for dev-mode (env) credential | |
| FES_MCP_LOG_DIR | No | Directory for log files (default: logs/) | logs/ |
| FES_MCP_LOG_LEVEL | No | Log verbosity (default: INFO) | INFO |
| FES_MCP_TRANSPORT | No | Transport for fes-mcp: stdio or http (default: stdio) | stdio |
| FES_MCP_PUBLIC_URL | No | Public base URL for fes-auth (OAuth discovery/redirects) | |
| FES_MCP_VERIFY_TTL | No | Seconds a verified (instance, token) pair is trusted (default: 300) | 300 |
| SISENSE_SSL_VERIFY | No | Verify TLS when calling Sisense (default: true) | true |
| FES_MCP_REGISTRY_PATH | No | Alternate registry JSON (default: bundled registry) | |
| FES_MCP_ALLOW_MUTATIONS | No | Expose mutating tools (default: false) | false |
| FES_MCP_ALLOWED_SISENSE_ORIGINS | No | Allowed Sisense instances for login page and X-Sisense-Url checks (default: accept any) |
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": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| access_management_get_all_dashboard_sharesA | Retrieve all dashboard shares, including user and group details for each shared dashboard. Uses pagination to retrieve all dashboards and their share information, and collects the corresponding user and group details for each share.
Returns: list[dict[str, Any]] A list of dictionaries containing the dashboard title, share type ( |
| access_management_get_datamodel_columnsA | Retrieve columns from a DataModel by collecting them from its datasets and tables. Resolves the DataModel ID by title, then walks its datasets and tables to gather every column.
Returns: list[dict[str, Any]] A list of dictionaries, each containing |
| access_management_get_groupsA | Retrieve groups — one named group, or all of them. Fetches the groups defined on the Sisense server. With |
| access_management_get_my_userA | Retrieve the currently logged-in user for the API token. Sends |
| access_management_get_rolesA | Retrieve all Sisense roles. Sends |
| access_management_get_unused_columns_bulkA | Run unused-column analysis for one or more data models and return a combined per-model outcome.
Returns: dict[str, Any] Always a dict with |
| access_management_get_userA | Retrieve one named user by email address, in the canonical user row shape. Fetches users with expanded |
| access_management_get_users_allA | Retrieve every user, one canonical user row each. Reports exactly what Sisense stores: group memberships are unfiltered ( |
| access_management_users_per_groupA | Retrieve group memberships — one group's members, or every membership. Returns one flat row per (group, user) membership. With |
| dashboard_can_be_ownedA | Check whether a dashboard can be owned by the current user. Sends |
| dashboard_find_widgets_by_typeA | Find all widgets matching a given type across one or more dashboards. Iterates over the specified dashboards (or all dashboards when |
| dashboard_get_all_dashboardsA | Retrieve all dashboards from the Sisense server. Sends |
| dashboard_get_dashboard_by_idA | Retrieve a specific dashboard by its ID. Sends |
| dashboard_get_dashboard_columnsA | Retrieve columns referenced by a dashboard, including widget and filter columns. Resolves the dashboard by title with |
| dashboard_get_dashboard_scriptA | Build a formatted dashboard script helper object. Retrieves a dashboard export payload and wraps its script content in a :class: |
| dashboard_get_dashboard_shareA | Retrieve share details (users and groups) for a dashboard by title. Resolves the dashboard by title, then maps each share's |
| dashboard_get_dashboardsA | Retrieve dashboards visible to the authenticated user. Sends |
| dashboard_get_widget_by_idA | Retrieve a single widget by its dashboard and widget IDs. Sends |
| dashboard_get_widget_scriptA | Build a formatted widget script helper object. Retrieves a dashboard export payload, selects a widget by index/key, and wraps its script content in a :class: |
| datamodel_describe_datamodelA | Retrieve data model structure in a flat, row-based format. Resolves the data model by name and flattens its datasets and tables into one row per table, suitable for DataFrame or CSV export. Returns: list[dict[str, Any]] List of row dicts, each representing a single table with model, dataset, connection, and table context. Returns an empty list if the data model is not found. |
| datamodel_generate_connections_payloadA | Generate a connection payload for a given data source type. Builds the provider-specific request body consumed by |
| datamodel_get_all_datamodelA | Retrieve metadata for all data models using an internal API. Sends a |
| datamodel_get_connectionA | Retrieve connections matching a name. Sends |
| datamodel_get_connections_allA | Retrieve all connections. Sends |
| datamodel_get_dataA | Retrieve data from a specific table in a data model. Runs a SQL query against the data model and returns the rows in a row-based format (a list of dicts) compatible with |
| datamodel_get_datamodel_sharesA | Retrieve all share entries (users and groups) for a given data model. Resolves user and group identifiers to names/emails and returns the shares in a flat row format. Permission codes are mapped to |
| datamodel_get_datasecurity_detailA | Retrieve detailed datasecurity rules for a data model, including share-level visibility. Each row represents a unique column-level rule and is repeated per share for clarity. Special handling is applied to interpret member values: - If |
| datamodel_get_elasticubesA | List all ElastiCubes using the legacy v1 endpoint. Sends |
| datamodel_get_model_schemaA | Retrieve the schema of a data model, including tables and columns. Resolves the data model by name and emits one row per column, mapping Sisense numeric column type codes to readable type names.
Returns: list[dict[str, Any]] | dict[str, Any] A list of dicts (one per column) with |
| datamodel_get_row_countA | Retrieve the row count for each table in a specific data model. Resolves the data model's tables, counts rows per table, and returns the results in a flat row-based structure suitable for tabular representation.
Returns: list[dict[str, Any]] | dict[str, Any] List of dictionaries, each with |
| datamodel_get_table_schemaA | Retrieve the schema of a table within a connection's data source. Resolves the connection by name to obtain its |
| folder_get_all_foldersA | Retrieve the full folder tree. Convenience wrapper for |
| folder_get_folder_idA | Retrieve a single folder by OID. Sends |
| plugins_get_all_pluginsA | Retrieve all plugins installed on the Sisense instance. Fetches the complete plugin list using paginated requests to |
| report_manager_get_reportsA | Retrieve all reports configured in Report Manager. Sends paginated requests to |
| wellcheck_run_full_wellcheckA | Run a composite "full" wellcheck across dashboards and data models. This method is a convenience wrapper that orchestrates multiple dashboard-level and data-model-level checks and returns a structured report that groups their results. It additionally delegates unused-column analysis to |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 36 tools
The domain prefixes and resource nouns separate most tools, but several pairs overlap in obvious ways: get_all_dashboards vs get_dashboards, get_all_datamodel vs get_elasticubes, and get_connection vs get_connections_all require close reading of descriptions to disambiguate. The shared read-only 'get everything' pattern across access, dashboards, and datamodels adds selection risk, so the boundaries are not crisp enough for a higher score.
The dominant pattern is domain_prefix_get_resource, and snake_case is used throughout, which makes the set feel predictable. Deviations like access_management_users_per_group, dashboard_can_be_owned, datamodel_describe_datamodel, datamodel_generate_connections_payload, and wellcheck_run_full_wellcheck break the pattern, and singular/plural forms like get_connection vs get_connections_all are inconsistent.
With 36 tools, this server is well above the 25-tool threshold for a heavy surface. The broad read-only scope would feel more manageable if consolidated into fewer aggregate tools per domain, but as-is the agent will carry a large tool list for what is largely a retrieval/wellcheck server.
The tool surface is almost entirely read-only: nearly every tool is a getter plus a single wellcheck runner. There are no create, update, delete, or ownership-changing operations, and datamodel_generate_connections_payload mentions create_connections without actually exposing that tool, creating a clear dead end. Agents can inspect the Sisense instance but cannot act on it.