DataForge Semantic MCP Server
Provides a read-only semantic gateway to the DataForge Product API by Business Qlik, enabling AI agents to browse projects and versions, and retrieve normalized metadata including measures, dimensions, and full Relationship Metadata (RMD).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DataForge Semantic MCP Serverlist all measures and dimensions for project 392 version 948"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DataForge Semantic MCP Server
Read-only semantic gateway between AI agents and DataForge Product API. Fetches projects, versions, measures, dimensions, facts and full RMD (Reference Model Data) plus data model entities (data marts, connections, dimension groups, fact tables, relationships), normalizes and caches the data, and exposes it via MCP protocol or as a Python library.
What This Server Provides
DataForge stores semantic layer metadata -- the business definitions of measures, dimensions, and facts used in analytics projects. This MCP server gives AI agents structured access to that metadata:
Projects -- top-level containers for analytics models
Versions -- snapshots of a project's semantic layer (one version can be marked as "global"/production)
Measures -- business metrics (e.g. "Total Revenue", "Gross Margin") with formulas, data types, source mappings
Dimensions -- attributes for slicing data (e.g. "Customer Segment", "Region") with grouping and source mappings
Facts -- factual data elements (e.g. "Order Amount") with types, formulas, source mappings
RMD -- full Reference Model Data combining all measures, dimensions, and facts in one response
Additionally, the DF API surface exposes data model entities:
Data Marts -- logical data marts with selected measures, dimensions, facts
Connections -- database connections with types and status
Dimension Groups -- logical groupings of dimensions with primary keys
Fact Tables -- physical fact tables with measures, dimensions, facts
Relationships -- links between fact tables and dimension groups
Consolidated RMD -- full data model export via DF API
All responses are JSON. The server normalizes raw DataForge API fields into a clean, stable schema so AI agents get consistent data regardless of API changes.
Features
Library-first -- use directly from Python, no MCP server required
MCP adapter -- 22 tools for Claude Desktop, Cursor and other MCP clients
Caching -- file-based cache with TTL and last-known-good fallback
Normalization -- inconsistent API fields mapped to clean canonical models
Retry & error handling -- exponential backoff on 5xx, proper error codes for auth issues
Quick Start
Installation
pip install -e ".[dev]"Configuration
Copy .env.example to .env and set your values:
DATAFORGE_BASE_URL=https://api.prod-df.businessqlik.com
DATAFORGE_API_KEY=your_api_key_here
DEFAULT_LANGUAGE=ruAs a Python Library
import asyncio
from dataforge_mcp import create_semantic_service
async def main():
service = create_semantic_service()
projects = await service.list_projects()
print(projects)
versions = await service.list_versions(project_id=392)
print(versions)
rmd = await service.get_rmd(project_id=392, version_id=948)
print(f"Measures: {rmd['stats']['measure_count']}")
print(f"Dimensions: {rmd['stats']['dimension_count']}")
print(f"Facts: {rmd['stats']['fact_count']}")
# DF API: data model entities
data_marts = await service.list_data_marts(project_id=392, version_id=948)
print(data_marts)
asyncio.run(main())As an MCP Server (stdio)
python -m dataforge_mcpAdd to Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"dataforge": {
"command": "python",
"args": ["-m", "dataforge_mcp"],
"env": {
"DATAFORGE_BASE_URL": "https://api.prod-df.businessqlik.com",
"DATAFORGE_API_KEY": "your_api_key_here"
}
}
}
}Docker (SSE mode)
cp .env.example .env
# edit .env with your API key
docker compose upMCP Tools -- Detailed Reference
All tools return JSON via MCP TextContent. Every response has a stable schema described below.
RMD API Tools
df_health
Check server, API and cache status.
Input: none
Output:
{
"server_status": "ok",
"product_api_status": "ok",
"base_url": "https://api.prod-df.businessqlik.com",
"cache_status": "ok"
}Field | Type | Description |
|
| Always |
|
|
|
|
| Configured DataForge API base URL |
|
|
|
df_list_projects
List available DataForge projects accessible with the configured API key.
Input:
Parameter | Type | Default | Description |
|
|
| Page number |
|
|
| Items per page |
|
|
| Use cached data if available |
Output:
{
"projects": [
{
"id": 392,
"name": "Fashion Retail",
"description": "Retail analytics project"
}
],
"pagination": {
"total": 10,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Project fields:
Field | Type | Description |
|
| Unique project identifier |
|
| Project name |
|
| Project description |
df_list_versions
List versions for a specific project.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"versions": [
{
"id": 948,
"name": "Global Version",
"is_global": true
}
],
"pagination": {
"total": 5,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Version fields:
Field | Type | Description |
|
| Unique version identifier |
|
| Version name |
|
| Whether this is the global (production) version |
df_get_measures
Get all measures (business metrics) for a project version.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default ( | Language for localized names |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"measures": [
{
"row_number": "1",
"group": "Sales",
"block": "Revenue",
"name": "Total Revenue",
"description": "Total revenue from all sales",
"data_type": "Numeric",
"measure_type": "Sum",
"formula": "[Revenue]",
"restrictions": null,
"connected_source": {
"db": "Sales DB",
"schema": null,
"table": "sales_table",
"column": null
},
"original_source_type": "Database",
"original_source": "Sales DB",
"original_object": "sales_table",
"report_for_verification": null,
"comment": "Primary revenue metric",
"display_data_type": null,
"status": "Active",
"relevance": "High",
"required": true,
"visibility": "Public",
"responsible_for_data": "Data Team",
"variation": null,
"raw": {}
}
]
}Measure fields:
Field | Type | Description |
|
| Row number from RMD spreadsheet |
|
| Business group (e.g. "Sales", "Finance") |
|
| Block within a group (e.g. "Revenue", "Costs") |
|
| Measure name (localized) |
|
| Human-readable description |
|
| Data type (e.g. "Numeric", "String") |
|
| Aggregation type (e.g. "Sum", "Count", "Average") |
|
| Calculation formula |
|
| Any restrictions or filters applied |
|
| Database source mapping (see Connected Source) |
|
| Source type (e.g. "Database") |
|
| Original data source name |
|
| Original object (table/view) name |
|
| Report used to verify this measure |
|
| Additional notes |
|
| Display format type |
|
| Status (e.g. "Active", "Draft") |
|
| Relevance level (e.g. "High", "Medium", "Low") |
|
| Whether the measure is required |
|
| Visibility level (e.g. "Public", "Internal") |
|
| Team/person responsible for data quality |
|
| Measure variation/variant |
|
| Original unmodified API response (empty by default) |
df_get_dimensions
Get all dimensions (attributes for slicing/filtering data) for a project version.
Input: same as df_get_measures.
Output:
{
"project_id": 392,
"version_id": 948,
"dimensions": [
{
"row_number": "1",
"group": "Sales",
"block": "Customer",
"name": "Customer ID",
"description": "Unique customer identifier",
"dimension_group": "Customer Attributes",
"data_type": "String",
"connected_source": {
"db": 161,
"schema": null,
"table": "customers",
"column": "CompanyName"
},
"dimension_type": null,
"original_source_type": "Database",
"original_source": "Sales DB",
"original_object": "customers_table",
"comment": "Primary key for customers",
"formula": null,
"value_options": null,
"display_data_type": null,
"source_data_type": null,
"status": "Active",
"relevance": "High",
"required": true,
"visibility": "Public",
"responsible_for_data": "Data Team",
"raw": {}
}
]
}Dimension fields:
Field | Type | Description |
|
| Row number from RMD spreadsheet |
|
| Business group |
|
| Block within a group |
|
| Dimension name (localized) |
|
| Human-readable description |
|
| Logical grouping of dimensions (e.g. "Customer Attributes") |
|
| Data type (e.g. "String", "Integer", "Date") |
|
| Database source mapping (see Connected Source) |
|
| Dimension type classification |
|
| Source type |
|
| Original data source name |
|
| Original object name |
|
| Additional notes |
|
| Calculation formula (if computed) |
|
| Allowed values or value list |
|
| Display format type |
|
| Data type in the source system |
|
| Status (e.g. "Active", "Draft") |
|
| Relevance level |
|
| Whether the dimension is required |
|
| Visibility level |
|
| Team/person responsible for data quality |
|
| Original unmodified API response (empty by default) |
df_get_facts
Get all facts for a project version.
Input: same as df_get_measures.
Output:
{
"project_id": 392,
"version_id": 948,
"facts": [
{
"row_number": "1",
"group": "Sales",
"block": "Orders",
"name": "Order Amount",
"description": "Total order amount",
"original_source_type": "Database",
"original_source": "Sales DB",
"original_object": "orders_table",
"source_data_type": "Decimal",
"fact_type": "Additive",
"formula": "[Amount]",
"connected_source": {
"db": "Sales DB",
"schema": null,
"table": "orders",
"column": null
},
"report_for_verification": null,
"comment": null,
"status": "Active",
"relevance": "High",
"required": true,
"visibility": "Public",
"responsible_for_data": "Data Team",
"raw": {}
}
]
}Fact fields:
Field | Type | Description |
|
| Row number from RMD spreadsheet |
|
| Business group |
|
| Block within a group |
|
| Fact name (localized, from |
|
| Description (from |
|
| Source type |
|
| Original data source name |
|
| Original object name |
|
| Data type in source system |
|
| Fact type (e.g. "Additive") |
|
| Calculation formula |
|
| Database source mapping (see Connected Source) |
|
| Verification report |
|
| Additional notes |
|
| Status (e.g. "Active", "Draft") |
|
| Relevance level |
|
| Whether the fact is required |
|
| Visibility level |
|
| Responsible team/person |
|
| Original unmodified API response (empty by default) |
df_get_rmd
Get full RMD -- all measures, dimensions, and facts for a project version in a single call. This is the most common starting point for AI agents.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language for localized names |
|
| no |
| Use cached data |
|
| no |
| Include raw API response in each entity |
Output:
{
"project": {
"id": 392,
"name": "",
"description": null
},
"version": {
"id": 948,
"name": "",
"is_global": false
},
"measures": [
{
"name": "Total Revenue",
"description": "Total revenue from all sales",
"measure_type": "Sum",
"formula": "[Revenue]",
"..."
}
],
"dimensions": [
{
"name": "Customer ID",
"description": "Unique customer identifier",
"dimension_group": "Customer Attributes",
"..."
}
],
"facts": [
{
"name": "Order Amount",
"description": "Total order amount",
"fact_type": "Additive",
"..."
}
],
"stats": {
"measure_count": 120,
"dimension_count": 75,
"fact_count": 30
}
}When include_raw is false (default), the raw field is stripped from every measure, dimension, and fact to reduce response size. Each entity in measures, dimensions, facts has the same fields as described in df_get_measures, df_get_dimensions, df_get_facts respectively.
df_refresh_cache
Force refresh cached data for a project version. Invalidates measures, dimensions, facts, and RMD cache keys, then re-fetches RMD.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
Output:
{
"status": "refreshed",
"cache_key": "rmd:392:948:ru",
"fetched_at": "2026-03-29T12:00:00+00:00"
}Field | Type | Description |
|
| Always |
|
| The primary cache key that was refreshed |
|
| ISO 8601 timestamp of when data was fetched |
DF API Tools (Data Model)
All DF API tools require project_id and version_id. They use the same base URL and API key as RMD API tools. These tools expose the physical data model: how measures, dimensions, and facts are organized into data marts, fact tables, dimension groups, and connected via relationships.
df_list_data_marts
List data marts for a project version. Data marts are logical groupings that combine selected measures, dimensions, and facts from fact tables.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no | -- | Filter by data mart type |
|
| no | -- | Filter by merge type |
|
| no | -- | Search by name |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"data_marts": [
{
"id": 1,
"name": "Sales Mart",
"type": "standard",
"merge_type": "union",
"description": "Main sales data mart"
}
],
"pagination": {
"total": 3,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Field | Type | Description |
|
| Unique data mart identifier |
|
| Data mart name |
|
| Data mart type |
|
| How multiple sources are merged |
|
| Data mart description |
df_get_data_mart
Get data mart details including selected measures, dimensions, facts, and source fact tables.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Data mart ID |
|
| no | config default | Language |
|
| no |
| Use cached data |
Output:
{
"id": 1,
"name": "Sales Mart",
"type": "standard",
"merge_type": "union",
"description": "Main sales data mart",
"measures": [
{ "id": 10, "name": "Revenue" }
],
"dimensions": [
{ "id": 20, "name": "Date" }
],
"facts": [],
"source_fact_tables": [
{ "id": 30, "name": "orders" }
]
}Field | Type | Description |
|
| Data mart ID |
|
| Data mart name |
|
| Data mart type |
|
| Merge type |
|
| Description |
|
| Selected measures in this data mart |
|
| Selected dimensions in this data mart |
|
| Selected facts in this data mart |
|
| Fact tables that feed this data mart |
df_get_data_mart_view
Get physical view metadata for a data mart.
Input:
Parameter | Type | Required | Description |
|
| yes | Project ID |
|
| yes | Version ID |
|
| yes | Data mart ID |
Output: object with physical view metadata (structure depends on the data mart configuration).
df_generate_sql
Generate SQL script for a data mart. This is read-only -- the SQL is generated but never executed.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Data mart ID |
|
| no | -- | Row limit for generated SQL |
|
| no | -- | Row offset for generated SQL |
Output:
{
"sql": "SELECT * FROM orders LIMIT 100"
}Field | Type | Description |
|
| Generated SQL query |
df_list_connections
List database connections for a project version.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no | -- | Filter by database type (e.g. "postgresql", "mssql") |
|
| no | -- | Filter by connection status |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"connections": [
{
"id": 1,
"name": "Main DB",
"db_type": "postgresql",
"status": "active"
}
],
"pagination": {
"total": 2,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Field | Type | Description |
|
| Connection identifier |
|
| Connection name |
|
| Database type (e.g. "postgresql", "mssql", "clickhouse") |
|
| Connection status |
df_get_connection
Get connection details. Optionally include database schema.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Connection ID |
|
| no | config default | Language |
|
| no |
| Include full database schema in response |
|
| no |
| Use cached data |
Output:
{
"id": 1,
"name": "Main DB",
"db_type": "postgresql",
"status": "active"
}Response may contain additional fields depending on the connection type. When include_db_schema is true, the response includes the full database schema (tables, columns, types).
df_get_connection_schema
Get database schema snapshot for a connection -- tables, columns, and data types.
Input:
Parameter | Type | Required | Description |
|
| yes | Project ID |
|
| yes | Version ID |
|
| yes | Connection ID |
Output: object with database schema structure (tables, columns, types). Structure depends on the database type.
df_list_dimension_groups
List dimension groups for a project version. Dimension groups are logical collections of related dimensions (e.g. "Customer Attributes", "Date Hierarchy") linked to fact tables.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"dimension_groups": [
{
"id": 1,
"name": "Date Group",
"primary_key": "date_id"
}
],
"pagination": {
"total": 5,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Field | Type | Description |
|
| Dimension group identifier |
|
| Dimension group name |
|
| Primary key column name |
df_get_dimension_group
Get dimension group details including contained dimensions and related fact tables.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Dimension group ID |
|
| no | config default | Language |
|
| no |
| Use cached data |
Output:
{
"id": 1,
"name": "Date Group",
"primary_key": "date_id",
"dimensions": [
{ "id": 10, "name": "Year" },
{ "id": 11, "name": "Month" }
],
"related_fact_tables": [
{ "id": 20, "name": "orders" }
]
}Field | Type | Description |
|
| Dimension group ID |
|
| Dimension group name |
|
| Primary key column |
|
| Dimensions belonging to this group |
|
| Fact tables linked to this dimension group |
df_list_fact_tables
List fact tables for a project version. Fact tables are the physical tables that store measures, dimensions, and facts.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"fact_tables": [
{
"id": 1,
"name": "orders"
}
],
"pagination": {
"total": 4,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Field | Type | Description |
|
| Fact table identifier |
|
| Fact table name |
df_get_fact_table
Get fact table details including measures, dimensions, facts, dimension groups, and verification filters.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Fact table ID |
|
| no | config default | Language |
|
| no |
| Include dependency information |
|
| no |
| Use cached data |
Output:
{
"id": 1,
"name": "orders",
"measures": [
{ "id": 10, "name": "Revenue" }
],
"dimensions": [
{ "id": 20, "name": "Customer ID" }
],
"facts": [
{ "id": 30, "name": "Order Amount" }
],
"dimension_groups": [
{ "id": 1, "name": "Date Group" }
],
"verification_filters": []
}Field | Type | Description |
|
| Fact table ID |
|
| Fact table name |
|
| Measures in this fact table |
|
| Dimensions in this fact table |
|
| Facts in this fact table |
|
| Dimension groups linked to this fact table |
|
| Verification filters configured for this fact table |
df_list_relationships
List relationships for a project version. Relationships define how fact tables connect to dimension groups (star schema links).
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no | -- | Filter by fact table |
|
| no | -- | Filter by dimension group |
|
| no |
| Page number |
|
| no |
| Items per page |
|
| no |
| Use cached data |
Output:
{
"project_id": 392,
"version_id": 948,
"relationships": [
{
"id": 1,
"fact_table_id": 1,
"dimension_group_id": 1
}
],
"pagination": {
"total": 8,
"page": 1,
"page_size": 100,
"total_pages": 1
}
}Field | Type | Description |
|
| Relationship identifier |
|
| Linked fact table ID |
|
| Linked dimension group ID |
df_get_relationship
Get relationship details between a fact table and a dimension group.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| yes | -- | Relationship ID |
|
| no | config default | Language |
|
| no |
| Use cached data |
Output:
{
"id": 1,
"fact_table_id": 1,
"dimension_group_id": 1
}Response may contain additional fields depending on the relationship configuration.
df_get_consolidated_rmd
Get consolidated RMD export via DF API -- the entire data model in one response. Includes project metadata, version info, all measures, dimensions, facts, dimension groups, fact tables, and relationships.
Input:
Parameter | Type | Required | Default | Description |
|
| yes | -- | Project ID |
|
| yes | -- | Version ID |
|
| no | config default | Language |
|
| no |
| Use cached data |
Output:
{
"project": { "id": 392, "name": "Fashion Retail" },
"version": { "id": 948, "name": "Global Version" },
"measures": [ ... ],
"dimensions": [ ... ],
"facts": [ ... ],
"dimension_groups": [ ... ],
"fact_tables": [ ... ],
"relationships": [ ... ],
"exported_at": "2026-05-18T12:00:00Z"
}Field | Type | Description |
|
| Project metadata |
|
| Version metadata |
|
| All measures |
|
| All dimensions |
|
| All facts |
|
| All dimension groups |
|
| All fact tables |
|
| All relationships |
|
| ISO 8601 export timestamp |
Shared Response Structures
Pagination Object
Paginated endpoints return a pagination object:
{
"total": 120,
"page": 1,
"page_size": 100,
"total_pages": 2
}Field | Type | Description |
|
| Total number of items across all pages |
|
| Current page number |
|
| Items per page |
|
| Total number of pages |
Connected Source Object
Measures, dimensions, and facts can reference their physical database source:
{
"db": "Sales DB",
"schema": null,
"table": "sales_table",
"column": "revenue"
}Field | Type | Description |
|
| Database name or ID |
|
| Database schema |
|
| Table or view name |
|
| Column name |
Error Format
All errors follow a consistent format:
{
"error": {
"code": "DATAFORGE_API_KEY_INVALID",
"message": "API error: API_KEY.INVALID_KEY",
"details": {
"http_status": 401
}
}
}Error codes:
Code | HTTP Status | Description |
| 401 |
|
| 401 | Invalid API key |
| 401 | Unauthorized |
| 401 | Authentication failed |
| 403 | Account locked |
| 403 | IP address blocked |
| 403 | No valid license |
| 400 | Invalid request parameter (DF API) |
| 400 | Page size too large (DF API) |
| 404 | Project, version, or entity not found |
| 5xx | Server-side error (retried automatically) |
| -- | Request timed out (retried automatically) |
| -- | Network connection error (retried automatically) |
Typical AI Agent Workflow
A typical workflow for an AI agent using this server:
1. df_health -> verify connectivity
2. df_list_projects -> discover available projects
3. df_list_versions -> find the global (production) version
4. df_get_rmd -> fetch all measures, dimensions, and facts at once
(or df_get_measures / df_get_dimensions / df_get_facts separately)
5. Use the semantic metadata to understand the data model,
generate queries, or answer business questionsFor exploring the physical data model:
6. df_list_fact_tables -> see available fact tables
7. df_get_fact_table -> inspect a fact table's contents
8. df_list_dimension_groups -> see dimension groups
9. df_list_relationships -> understand how fact tables connect to dimension groups
10. df_list_data_marts -> explore data marts
11. df_get_data_mart -> get data mart details
12. df_generate_sql -> generate SQL for a data mart
13. df_get_consolidated_rmd -> full data model export in one callArchitecture
AI Agent / MCP Client
|
v
MCP Adapter (mcp/) -- thin wrappers, no business logic
|
v
SemanticService (application/) -- cache-first orchestration (CORE)
|
+--> DataForgeClient (dataforge/) -- HTTP calls to RMD API + DF API with retry
+--> Normalizer (semantic/) -- raw API -> canonical models
+--> FileCacheStore (cache/) -- TTL + last-known-good fallbackSemanticService is the single entry point. MCP tools only delegate to it.
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Lint
ruff check src/ tests/
# Format
ruff format src/ tests/Configuration Reference
Variable | Default | Description |
|
| DataForge API base URL |
| -- | API key (required) |
|
| Default language for measures/dimensions/facts |
|
| Cache directory path |
|
| Cache TTL in seconds |
|
| Transport: |
|
| Host for SSE mode |
|
| Port for SSE mode |
|
| Log level |
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
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/SGromych/dataforge-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server