Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FES_MCP_AUTHNoCredential source (default: by transport: http => upstream, stdio => env)
FES_MCP_HOSTNoHTTP bind host (default: 127.0.0.1)127.0.0.1
FES_MCP_PORTNoHTTP bind port (default: 8200)8200
FES_MCP_TOOLSNoComma-separated tool_ids / modules override (default: config/allowlist.txt)config/allowlist.txt
SISENSE_TOKENNoSisense token for dev-mode (env) credential
FES_MCP_RS_URLNoResource server URL for fes-auth to proxy tool calls to
SISENSE_DOMAINNoSisense instance domain for dev-mode (env) credential
FES_MCP_LOG_DIRNoDirectory for log files (default: logs/)logs/
FES_MCP_LOG_LEVELNoLog verbosity (default: INFO)INFO
FES_MCP_TRANSPORTNoTransport for fes-mcp: stdio or http (default: stdio)stdio
FES_MCP_PUBLIC_URLNoPublic base URL for fes-auth (OAuth discovery/redirects)
FES_MCP_VERIFY_TTLNoSeconds a verified (instance, token) pair is trusted (default: 300)300
SISENSE_SSL_VERIFYNoVerify TLS when calling Sisense (default: true)true
FES_MCP_REGISTRY_PATHNoAlternate registry JSON (default: bundled registry)
FES_MCP_ALLOW_MUTATIONSNoExpose mutating tools (default: false)false
FES_MCP_ALLOWED_SISENSE_ORIGINSNoAllowed 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

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 (user or group), and share name (email or group name) — one row per share, so the row count equals the number of shares. …

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 datamodel_id, datamodel_name, table, and column. An empty list is returned if the DataModel cannot be found or has no columns.

access_management_get_groupsA

Retrieve groups — one named group, or all of them. Fetches the groups defined on the Sisense server. With name the API filters server-side to that group; without it, every group is returned. One row per group. Returns: list[dict[str, Any]] | dict[str, Any] A list of raw group objects as returned by the API (each with _id, name, defaultRole, and related fields). Without name, an empty list means the server genuinely has …

access_management_get_my_userA

Retrieve the currently logged-in user for the API token. Sends GET /api/users/loggedin. Use this to resolve migration user identity (email, username, internal ID) for the authenticated admin token. Returns: dict[str, Any] The logged-in user object from the API, or {"error": "..."} on failure.

access_management_get_rolesA

Retrieve all Sisense roles. Sends GET /api/roles. Returns the raw role list used to build role name-to-ID maps (for example in multi-tenant migration workflows). Returns: list[dict[str, Any]] | dict[str, Any] A list of role objects on success, or {"error": "..."} on failure.

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 "results" and "errors": - "results": flat list of column rows across all processed data models, each row shaped as get_datamodel_columns rows plus a "used" boolean. …

access_management_get_userA

Retrieve one named user by email address, in the canonical user row shape. Fetches users with expanded groups and role data and returns the record matching the provided email address. Changed in 2.0: ROLE_NAME held the display name in 1.x (that value is now ROLE_DISPLAY_NAME); GROUPS still holds the group names and is joined by the new GROUP_IDS. See docs/upgrading.md. Returns: dict[str, Any] The canonical user row: USER_ID, USER_NAME, EMAIL, FIRST_NAME, LAST_NAME, IS_ACTIVE, ROLE_ID, ROLE_NAME (the raw Sisense value, e.g. "consumer"), ROLE_DISPLAY_NAME

access_management_get_users_allA

Retrieve every user, one canonical user row each. Reports exactly what Sisense stores: group memberships are unfiltered (Everyone is included — consumers that want to hide a universal group can drop it; a consumer that never received it cannot put it back), and ROLE_NAME carries the raw Sisense value with the UI-facing name in ROLE_DISPLAY_NAME. Changed in 2.0: ROLE_NAME held the display name in 1.x (that value is now ROLE_DISPLAY_NAME), GROUPS is joined by the new GROUP_IDS, and Everyone is no longer filtered out of GROUPS. See docs/upgrading.md. Returns: list[dict[str, Any]] | dict[str, Any] One row per user, each with USER_ID, USER_NAME, EMAIL, FIRST_NAME, LAST_NAME, IS_ACTIVE, ROLE_ID, ROLE_NAME (raw, e.g. "consumer"), …

access_management_users_per_groupA

Retrieve group memberships — one group's members, or every membership. Returns one flat row per (group, user) membership. With group_name the rows are that group's members; without it, every membership on the instance is returned (ask get_groups for the per-group view). Everyone and All users in system are omitted from the all-groups view: Sisense fills both with every user, so they restate get_users_all rather than describing group structure. Naming either one still returns its members. The rule across the SDK: **targeted questions give complete answers; only the … Returns: list[dict[str, Any]] | dict[str, Any] One row per (group, user) membership, each with GROUP_ID, GROUP_NAME, USER_ID, USER_NAME, EMAIL, FIRST_NAME, LAST_NAME, IS_ACTIVE, ROLE_ID, …

dashboard_can_be_ownedA

Check whether a dashboard can be owned by the current user. Sends GET /api/v1/dashboards/{dashboard_id}/can_be_owned. Returns: dict[str, Any] The API response on success, or {"error": "..."} on failure.

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 dashboards is None) and returns every widget whose type field matches widget_type. Returns: list[dict[str, Any]] A list of match records. Each record contains: - dashboard_id (str): The oid of the containing dashboard. - dashboard_title (str): The title of the containing dashboard. - widget_id

dashboard_get_all_dashboardsA

Retrieve all dashboards from the Sisense server. Sends GET /api/v1/dashboards/admin?dashboardType=owner using the admin endpoint, which requires elevated access. Returns: list[dict[str, Any]] | dict[str, Any] A list of dashboard objects on success, or {"error": "..."} on failure.

dashboard_get_dashboard_by_idA

Retrieve a specific dashboard by its ID. Sends GET /api/v1/dashboards/admin?dashboardType=owner&id={dashboard_id} against the admin endpoint. Returns: list[dict[str, Any]] | dict[str, Any] The matching dashboard objects on success, or {"error": "..."} when the request fails or no dashboard is found.

dashboard_get_dashboard_columnsA

Retrieve columns referenced by a dashboard, including widget and filter columns. Resolves the dashboard by title with get_dashboard_by_name, exports its full metadata, then extracts column references from both filters and widgets. The final list is deduplicated by table and column. Returns: list[dict[str, Any]] | dict[str, Any] A list of distinct column entries. Each entry contains dashboard_name, source ("filter" or "widget"), widget_id, table, and column — an empty list means …

dashboard_get_dashboard_scriptA

Build a formatted dashboard script helper object. Retrieves a dashboard export payload and wraps its script content in a :class:SisenseScript helper that can render plain text, markdown, or file output. Returns: SisenseScript | dict[str, str] A :class:SisenseScript instance when the dashboard is retrieved and has a script. {"error": "..."} when the export fails (including status_code for HTTP failures such as missing …

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 shareId to a readable name using the users and groups lists: user shares resolve to the user's email and group shares to the group name. Returns: list[dict[str, Any]] A list of share entries, each containing type ("user" or "group") and name (email or group name). An empty list means the dashboard genuinely has no shares. On failure (dashboard not …

dashboard_get_dashboardsA

Retrieve dashboards visible to the authenticated user. Sends GET /api/v1/dashboards, which returns dashboards the current user owns or has been shared to — as opposed to get_all_dashboards, which uses the admin endpoint and requires elevated access. Returns: list[dict[str, Any]] | dict[str, Any] List of dashboard objects on success, or {"error": "..."} on failure.

dashboard_get_widget_by_idA

Retrieve a single widget by its dashboard and widget IDs. Sends GET /api/v1/dashboards/{dashboard_id}/widgets/{widget_id}. Returns the full widget object as returned by the Sisense API. Returns: dict[str, Any] The widget object returned by the API, or {"error": "..."} on failure.

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:SisenseScript helper for downstream rendering. Returns: SisenseScript | dict[str, str] A :class:SisenseScript instance when the widget is found and has a script. {"error": "..."} when the export fails (including status_code for HTTP failures such as missing …

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 create_connections. The datasource_type is matched case-insensitively. Supported types are "Athena", "RedShift", "BigQuery", and "DataBricks". Returns: dict[str, Any] The provider-specific connection payload.

datamodel_get_all_datamodelA

Retrieve metadata for all data models using an internal API. Sends a POST /api/v2/ecm/ GraphQL query (elasticubesMetadata). This includes additional fields such as build status, size, and timestamps that may not be available through the standard public endpoints. Returns: list[dict[str, Any]] | dict[str, Any] List of data model metadata objects (each with oid, title, type, status, sizeInMb) on success, or {"error": "..."} on failure. Uses an internal Linux-only route; on Windows-based Sisense use get_elasticubes instead.

datamodel_get_connectionA

Retrieve connections matching a name. Sends GET /api/v2/connections?name=<connection_name> and returns the matching connection list. Returns: list[dict[str, Any]] | dict[str, Any] List of matching connection objects if found, or {"error": "..."} on failure or when no match is found.

datamodel_get_connections_allA

Retrieve all connections. Sends GET /api/v2/connections and returns the full connection list. Returns: list[dict[str, Any]] | dict[str, Any] List of connection objects on success, or {"error": "..."} on failure.

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 to_dataframe. Returns: list[dict[str, Any]] | dict[str, Any] List of dictionaries where each dict represents a row — an empty list means the query genuinely returned no data. On failure, returns the standard ``{"ok": False, "error": "...", …

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 "EDIT", "READ", or "USE". Returns: list[dict[str, Any]] List of dicts, each with "datamodel_name", "datamodel_id", "party_name", "party_type", and "permission" — an empty list means the model genuinely has no shares. On failure, …

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 members is an empty list and exclusionary is missing/null, it is interpreted as "Nothing". - If members is empty and exclusionary is False, it is interpreted as "Everything". - If values exist and exclusionary is True, it is treated as a restricted subset. Returns: list[dict[str, Any]] | dict[str, Any] List of dicts representing datasecurity rules in flat, share-resolved format, each with "datamodel_name", "table_name", "column_name", "data_type", "value", …

datamodel_get_elasticubesA

List all ElastiCubes using the legacy v1 endpoint. Sends GET /api/v1/elasticubes/getElasticubes. This endpoint is supported on both Linux and Windows Sisense deployments and returns basic ElastiCube metadata including title, address, and fullname. Prefer get_all_datamodel for Linux deployments when richer metadata (build status, size, timestamps) is needed. Use get_elasticubes when targeting Windows environments or when a lightweight list suffices. Returns: list[dict[str, Any]] | dict[str, Any] List of ElastiCube objects on success, or {"error": "..."} on failure.

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_name, datamodel_type, dataset_name, table_name, column_name, and column_type on success, or ``{"error": …

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 "table_name" and "row_count", plus a final entry with the total row count. On failure, returns the standard ``{"ok": False, "error": "...", …

datamodel_get_table_schemaA

Retrieve the schema of a table within a connection's data source. Resolves the connection by name to obtain its oid and provider, then sends POST /api/v1/connection/{id}/table_schema_details. Returns: dict[str, Any] Table schema details if found, or {"error": "..."} on failure or when no schema is found. Note: This endpoint is undocumented and may change in future Sisense versions. Use with caution.

folder_get_all_foldersA

Retrieve the full folder tree. Convenience wrapper for get_folders("tree"). Returns the nested folder hierarchy used by Sisense for organizing dashboards. Returns: list[dict[str, Any]] | dict[str, Any] A list of root-level folder nodes (each may contain nested folders and dashboards keys), or {"error": "..."} on failure.

folder_get_folder_idA

Retrieve a single folder by OID. Sends GET /api/v1/folders/{folder_id} and returns the folder metadata object. Returns: dict[str, Any] Folder metadata from the API, or {"error": "..."} if the request fails or no folder is found.

plugins_get_all_pluginsA

Retrieve all plugins installed on the Sisense instance. Fetches the complete plugin list using paginated requests to GET /api/v1/plugins. All pages are collected and returned as a single flat list. Returns: list[dict[str, Any]] A list of plugin objects, each containing at minimum: - name (str): API identifier for the plugin. - folderName (str): Filesystem folder name (e.g. "plugin-MyPlugin"). - isEnabled

report_manager_get_reportsA

Retrieve all reports configured in Report Manager. Sends paginated requests to GET /api/v1/report_manager/reports and collects every page into a single flat list. Filters are applied server-side. Returns: list[dict[str, Any]] | dict[str, Any] A flat list of report objects, or {"error": "..."} on failure.

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 AccessManagement.get_unused_columns_bulk when an AccessManagement instance is configured on this WellCheck (the default constructor configures one); otherwise the unused_columns section is an empty list and a warning is logged. Returns: dict A dictionary with two top-level sections: - "dashboards": { "structure": [...], "widget_counts": [...], "pivot_widget_fields": [...], } - "datamodels": { "custom_tables": [...], "island_tables": [...], … Can be slow: the m2m check runs real aggregate SQL. Scope it with the dashboards/datamodels parameters whenever the user named specific assets.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.6/5.0

Scored across 36 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness2/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues