@tmdc-solutions/mcp-beta 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/stdio.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stdio.ts","../src/dev/tools/mock-data/generation.ts","../src/dev/tools/depot-source.ts","../src/dev/tools/flare-workflow.ts","../src/dev/tools/instance-secrets.ts","../src/dev/tools/scanner-workflow.ts","../src/dev/tools/quality-workflow.ts","../src/lens/resources/lens-list.ts","../src/lens/tools/lens-list.ts","../src/lens/tools/schema.ts","../src/lens/resources/schema.ts","../package.json","../src/dev/tools/bundle.ts","../src/dev/tools/data-product.ts","../src/dev/tools/lens/lens-manifest.ts","../src/dev/tools/lens/lens-sql.ts","../src/dev/tools/lens/lens-segments.ts","../src/dev/tools/lens/lens-table.ts","../src/dev/tools/lens/lens-views.ts","../src/dev/tools/lens/lens-user-groups.ts","../src/trino/client.ts","../src/trino/tools/query.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { initFakerGenSchemaTools } from \"./dev/tools/mock-data/generation.js\";\nimport { initDepotSourceTool } from \"./dev/tools/depot-source.js\";\nimport { initFlareWorkflowTool } from \"./dev/tools/flare-workflow.js\";\nimport { initInstanceSecretsTool } from \"./dev/tools/instance-secrets.js\";\nimport { initScannerWorkflowTool } from \"./dev/tools/scanner-workflow.js\";\nimport { initQualityWorkflowTool } from \"./dev/tools/quality-workflow.js\";\nimport { initLensDataTool } from \"./lens/tools/lens-data.js\";\nimport { initLensListResource } from \"./lens/resources/lens-list.js\";\nimport { initListLensTool } from \"./lens/tools/lens-list.js\";\nimport { initSchemaTool } from \"./lens/tools/schema.js\";\nimport { initSchemaResource } from \"./lens/resources/schema.js\";\n\nimport packageJson from '../package.json' with { type: 'json' };\nimport { initBundleTool } from \"./dev/tools/bundle.js\";\nimport { initDataProductTool } from \"./dev/tools/data-product.js\";\nimport { initLensManifestTool } from \"./dev/tools/lens/lens-manifest.js\";\nimport { initLensSqlTool } from \"./dev/tools/lens/lens-sql.js\";\nimport { initLensSegmentsTool } from \"./dev/tools/lens/lens-segments.js\";\nimport { initLensTableTool } from \"./dev/tools/lens/lens-table.js\";\nimport { initLensViewsTool } from \"./dev/tools/lens/lens-views.js\";\nimport { initLensUserGroupsTool } from \"./dev/tools/lens/lens-user-groups.js\";\nimport { getTableMetadata } from \"./trino/tools/query.js\";\n\nconst { version } = packageJson;\n\n\nasync function main() {\n \n let apiKey = process.env.API_KEY;\n let fqdn = process.env.FQDN;\n let slug = process.env.SLUG;\n let dev = process.env.DEV || false;\n\n // Create an MCP server\n const server = new McpServer({\n name: \"DataOS - Synthetic data\",\n version,\n capabilities: {\n resources: {}\n }\n });\n\n const transport = new StdioServerTransport();\n\n\n if(dev) {\n // initFakerSchemaResource(server)\n // initFakerGenerateTools(server)\n initFakerGenSchemaTools(server)\n \n initInstanceSecretsTool(server)\n initDepotSourceTool(server)\n initFlareWorkflowTool(server)\n initQualityWorkflowTool(server)\n initScannerWorkflowTool(server)\n // initFakerSchemaResource(server)\n // initFakerDocumentTools(server);\n initBundleTool(server)\n initDataProductTool(server)\n \n initLensManifestTool(server)\n initLensSqlTool(server)\n initLensSegmentsTool(server)\n initLensTableTool(server)\n initLensViewsTool(server)\n initLensUserGroupsTool (server)\n\n\n }\n\n if(apiKey) {\n initLensDataTool({\n server,\n apiKey,\n fqdn,\n slug\n });\n\n if(!slug) {\n initLensListResource({\n server,\n apiKey,\n fqdn,\n });\n initListLensTool({\n server,\n apiKey,\n fqdn,\n });\n }\n\n initSchemaTool({\n server,\n apiKey,\n fqdn,\n slug\n });\n\n initSchemaResource({\n server,\n apiKey,\n fqdn,\n slug\n });\n\n getTableMetadata({server, apiKey, fqdn})\n \n }\n \n await server.connect(transport);\n}\n\nmain().catch(console.error);","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport fakerSchema from \"../../resources/faker-schema.json\" with { type: \"json\" }\nimport z from 'zod';\nimport { faker } from '@faker-js/faker';\nimport { validateFakerFields } from '../../../util/faker-validation.js';\nimport CSVProcessing from '../../../util/csv-processing.js';\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\ntype FakerSchema = {\n module: string\n description: string\n methods: {\n method: string\n description: string\n options?: Record<string, {\n description: string\n optional: boolean\n }>\n }[]\n}\n\nconst fSchema: FakerSchema[] = fakerSchema\n\nconst baseFileSchema = z.object({\n fields: z.array(z.object({\n fieldName: z.string(),\n defaultValue: z.string().or(z.number()).optional(),\n unique: z.boolean().optional(),\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n fakerConfig: z.object({\n module: z.enum(Object.keys(faker) as [keyof typeof faker, ...(keyof typeof faker)[]]),\n method: z.string(),\n options: z.any().optional(),\n dependencies: z.array(\n z.object({\n optionName: z.string(),\n fieldName: z.string()\n }),\n {\n description: `This is to pass inter related fields to the faker method for producing value that is based on other fields. \nMake sure to pass the fields with dependencies as the last fields in the fields array.\nExample: \nIf you want to generate email that is based on the first name and last name, you can pass the original fieldName of first name and last name fields as fieldName of dependencies and optionName as firstName and lastName.`\n }\n ).optional()\n })\n }), { description: \"The fields to generate\" }),\n\n path: z.string({ description: \"Absolute full path where file needs to be created. Always send full absolute path\" }).default(\"~/tmp/mock-data/\"),\n filename: z.string().optional().default(\"mock-data.csv\"),\n parentMapping: z.array(z.object({\n fieldName: z.string(),\n parentFieldName: z.string(),\n parentFieldValue: z.string()\n })).optional().default([]),\n count: z.number({ description: \"The number of items to generate\" }).min(1).max(5e6).default(10)\n})\ntype FileType = z.infer<typeof baseFileSchema> & {\n children?: FileType[];\n};\n\nconst fileSchema: z.ZodType<FileType> = baseFileSchema.extend({\n children: z.lazy(() => fileSchema.array()).optional().default([]),\n});\n\n\n\nconst toolSchema = {\n file: fileSchema, \n type: z.enum(\n [\"csv\", \"json\", \"text\"],\n { description: \"The output type of the generated data\" }\n ).optional().default(\"csv\"),\n append: z.boolean().optional().default(false),\n bufferSize: z.number().optional().default(10000),\n count: z.number({ description: \"The number of items to generate\" }).min(1).max(5e6).default(10)\n}\n\nexport type FileSchema = z.infer<typeof fileSchema>;\nexport type Fields = z.infer<typeof baseFileSchema.shape.fields>;\n\nexport function initFakerGenerateTools(server: McpServer) {\n\n server.tool(\n \"mock-data-generate\",\n \"Generate fake data using Faker.js modules and methods. Output is a CSV with the headers and the data.\",\n toolSchema,\n async ({ file, append, bufferSize }, { sendNotification, _meta }) => {\n\n return {\n isError: true,\n content: [{ type: \"text\", text: \"error\" }]\n }\n\n // const errors = validateFakerFields(fields)\n\n // if (errors && errors.length > 0) {\n // return {\n // isError: true,\n // content: (errors.map((text) => ({ type: \"text\", text })))\n // }\n // }\n\n // const startTime = Date.now()\n // const successMessage = () => ({\n // isError: false,\n // content: [{ \n // type: \"text\", \n // text: `Generated ${count} items in ${path} - ${filename}. Time taken: ${(Math.floor(Date.now() - startTime) / 1000)} seconds` }]\n // })\n\n // const csvProcessing = new CSVProcessing({\n // fields, path, fileName: filename, append, bufferSize, count\n // })\n\n // const interval = setInterval(() => {\n // sendNotification({\n // method: \"notifications/progress\",\n // params: {\n // progress: Math.floor((csvProcessing.getCurrentCount() * 100) / count),\n // progressToken: _meta?.progressToken,\n // _meta: { data: `Generated ${csvProcessing.getCurrentCount()} items so far` }\n // }\n // })\n // }, 10000)\n\n\n // csvProcessing.writeStream.on(\"error\", (err) => {\n // clearInterval(interval)\n // return {\n // isError: true,\n // content: [{ type: \"text\", text: `Error writing to file ${path} - ${filename}: ${err.message}` }]\n // }\n // })\n\n // csvProcessing.writeStream.on(\"close\", () => {\n // clearInterval(interval)\n // return successMessage()\n // })\n\n // csvProcessing.writeStream.on(\"end\", () => {\n // clearInterval(interval)\n // return successMessage()\n // })\n\n // csvProcessing.writeStream.on(\"finish\", () => {\n // clearInterval(interval)\n // return successMessage()\n // })\n }\n )\n\n}\n\nexport function initFakerDocumentTools(server: McpServer) {\n\n server.tool(\n \"faker-document\",\n \"Comprehensive API documentation of fackerJs in JSON\",\n {},\n () => ({\n isError: true,\n content: [{\n type: \"text\",\n text: JSON.stringify(fSchema)\n }]\n })\n )\n}\n\nexport function initFakerGenSchemaTools(server: McpServer) {\n\n server.tool(\n \"mock-data-pattern-schema\",\n \"Schema for producing mock data patterns\",\n {},\n () => ({\n isError: false,\n content: [{\n type: \"text\",\n text: JSON.stringify(zodToJsonSchema(z.object(toolSchema)), null, 2)\n }]\n })\n )\n}\n","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Depot in DataOS is a Resource used to connect different data sources to DataOS by abstracting the complexities associated with the underlying source system (including protocols, credentials, and connection schemas). \nIt enables users to establish connections and retrieve data from various data sources, such as file systems (e.g., AWS S3, Google GCS, Azure Blob Storage), data lake systems, database systems (e.g., Redshift, SnowflakeDB, Bigquery, Postgres), and event systems (e.g., Kafka, Pulsar) without moving the data.\n`\n\n// Connection Secret Schema\nconst connectionSecretSchema = z.object({\n acl: z.enum([\"r\", \"rw\"], { \n description: \"Access control level - 'r' for read-only, 'rw' for read-write\" \n }),\n type: z.literal(\"key-value-properties\").describe(\"Type of secret storage\"),\n data: z.record(z.string(), z.string(), {\n description: \"Key-value pairs for authentication credentials (e.g., username, password, access keys)\"\n }),\n files: z.record(z.string(), z.string(), {\n description: \"File paths for credential files (e.g., JSON key files for GCP)\"\n }).optional()\n})\n\nconst commonDepotFields = {\n description: z.string({\n description: \"Human-readable description of the depot\"\n }),\n external: z.boolean({\n description: \"Whether the depot connects to an external data source\"\n }).default(true),\n connectionSecret: z.array(connectionSecretSchema).optional()\n};\n\n// Validate depot type and configuration combination\nconst validateDepotCombination = (depot: any): string | null => {\n const { type, spec, s3, abfss, wasbs, redshift, elasticsearch, opensearch, eventhub, pulsar, bigquery, gcs, kafka, mongodb, mysql, oracle, postgresql, snowflake, mssql } = depot;\n \n switch (type) {\n case \"JDBC\":\n if (!spec) {\n return \"Error: 'JDBC' type requires 'spec' property with subprotocol, host, port, and database.\";\n }\n if (s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'JDBC' type should only have 'spec' property, not other configuration properties.\";\n }\n break;\n \n case \"S3\":\n if (!s3) {\n return \"Error: 'S3' type requires 's3' property with scheme, bucket, and relativePath.\";\n }\n if (spec || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'S3' type should only have 's3' property, not other configuration properties.\";\n }\n break;\n \n case \"ABFSS\":\n if (!abfss) {\n return \"Error: 'ABFSS' type requires 'abfss' property with account, container, and relativePath.\";\n }\n if (spec || s3 || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'ABFSS' type should only have 'abfss' property, not other configuration properties.\";\n }\n break;\n \n case \"WASBS\":\n if (!wasbs) {\n return \"Error: 'WASBS' type requires 'wasbs' property with account, container, and relativePath.\";\n }\n if (spec || s3 || abfss || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'WASBS' type should only have 'wasbs' property, not other configuration properties.\";\n }\n break;\n \n case \"REDSHIFT\":\n if (!redshift) {\n return \"Error: 'REDSHIFT' type requires 'redshift' property with host, database, bucket, and relativePath.\";\n }\n if (spec || s3 || abfss || wasbs || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'REDSHIFT' type should only have 'redshift' property, not other configuration properties.\";\n }\n break;\n \n case \"ELASTICSEARCH\":\n if (!elasticsearch) {\n return \"Error: 'ELASTICSEARCH' type requires 'elasticsearch' property with nodes.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'ELASTICSEARCH' type should only have 'elasticsearch' property, not other configuration properties.\";\n }\n break;\n \n case \"OPENSEARCH\":\n if (!opensearch) {\n return \"Error: 'OPENSEARCH' type requires 'opensearch' property with nodes.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'OPENSEARCH' type should only have 'opensearch' property, not other configuration properties.\";\n }\n break;\n \n case \"EVENTHUB\":\n if (!eventhub) {\n return \"Error: 'EVENTHUB' type requires 'eventhub' property with endpoint.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'EVENTHUB' type should only have 'eventhub' property, not other configuration properties.\";\n }\n break;\n \n case \"PULSAR\":\n if (!pulsar) {\n return \"Error: 'PULSAR' type requires 'pulsar' property with adminUrl and serviceUrl.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'PULSAR' type should only have 'pulsar' property, not other configuration properties.\";\n }\n break;\n \n case \"BIGQUERY\":\n if (!bigquery) {\n return \"Error: 'BIGQUERY' type requires 'bigquery' property with project.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'BIGQUERY' type should only have 'bigquery' property, not other configuration properties.\";\n }\n break;\n \n case \"GCS\":\n if (!gcs) {\n return \"Error: 'GCS' type requires 'gcs' property with bucket and relativePath.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || kafka || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'GCS' type should only have 'gcs' property, not other configuration properties.\";\n }\n break;\n \n case \"KAFKA\":\n if (!kafka) {\n return \"Error: 'KAFKA' type requires 'kafka' property with brokers.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || mongodb || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'KAFKA' type should only have 'kafka' property, not other configuration properties.\";\n }\n break;\n \n case \"MONGODB\":\n if (!mongodb) {\n return \"Error: 'MONGODB' type requires 'mongodb' property with subprotocol and nodes.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mysql || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'MONGODB' type should only have 'mongodb' property, not other configuration properties.\";\n }\n break;\n \n case \"MYSQL\":\n if (!mysql) {\n return \"Error: 'MYSQL' type requires 'mysql' property with host and port.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || oracle || postgresql || snowflake || mssql) {\n return \"Error: 'MYSQL' type should only have 'mysql' property, not other configuration properties.\";\n }\n break;\n \n case \"ORACLE\":\n if (!oracle) {\n return \"Error: 'ORACLE' type requires 'oracle' property with subprotocol, host, port, and service.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || postgresql || snowflake || mssql) {\n return \"Error: 'ORACLE' type should only have 'oracle' property, not other configuration properties.\";\n }\n break;\n \n case \"POSTGRESQL\":\n if (!postgresql) {\n return \"Error: 'POSTGRESQL' type requires 'postgresql' property with host, port, and database.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || snowflake || mssql) {\n return \"Error: 'POSTGRESQL' type should only have 'postgresql' property, not other configuration properties.\";\n }\n break;\n \n case \"SNOWFLAKE\":\n if (!snowflake) {\n return \"Error: 'SNOWFLAKE' type requires 'snowflake' property with warehouse, url, and database.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || mssql) {\n return \"Error: 'SNOWFLAKE' type should only have 'snowflake' property, not other configuration properties.\";\n }\n break;\n \n case \"MSSQL\":\n if (!mssql) {\n return \"Error: 'MSSQL' type requires 'mssql' property with host, port, and database.\";\n }\n if (spec || s3 || abfss || wasbs || redshift || elasticsearch || opensearch || eventhub || pulsar || bigquery || gcs || kafka || mongodb || mysql || oracle || postgresql || snowflake) {\n return \"Error: 'MSSQL' type should only have 'mssql' property, not other configuration properties.\";\n }\n break;\n \n default:\n return `Error: Invalid depot type '${type}'. Supported types are: JDBC, S3, ABFSS, WASBS, REDSHIFT, ELASTICSEARCH, OPENSEARCH, EVENTHUB, PULSAR, BIGQUERY, GCS, KAFKA, MONGODB, MYSQL, ORACLE, POSTGRESQL, SNOWFLAKE, MSSQL.`;\n }\n \n return null; // No validation errors\n};\n\nconst toolSchema = {\n name: z.string({\n description: \"Depot name - alphanumeric with hyphens, max 48 chars, pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing and organizing the depot\"\n }),\n secrets: z.array(\n z.object({\n name: z.string({\n description: \"Reference name for the secret\"\n }),\n keys: z.array(z.string(), {\n description: \"Specific keys to extract from the secret\"\n }).optional(),\n allkeys: z.boolean({\n description: \"Whether to use all keys from the secret\"\n })\n })\n ).optional(),\n owner: z.string({\n description: \"Owner of the depot resource\"\n }).optional(),\n compute: z.string({\n description: \"Compute resource for the depot (default: runnable-default)\"\n }).optional(),\n depot: z.object({\n type: z.enum([\"JDBC\", \"S3\", \"ABFSS\", \"WASBS\", \"REDSHIFT\", \"ELASTICSEARCH\", \"OPENSEARCH\", \"EVENTHUB\", \"PULSAR\", \"BIGQUERY\", \"GCS\", \"KAFKA\", \"MONGODB\", \"MYSQL\", \"ORACLE\", \"POSTGRESQL\", \"SNOWFLAKE\", \"MSSQL\"], {\n description: \"Type of depot connection\"\n }),\n // JDBC configuration\n spec: z.object({\n subprotocol: z.string({\n description: \"JDBC subprotocol (e.g., 'postgresql', 'mysql', 'sqlserver', 'oracle:thin')\"\n }),\n host: z.string({\n description: \"Database server hostname or IP address\"\n }),\n port: z.number({\n description: \"Database server port number\"\n }),\n database: z.string({\n description: \"Database name to connect to\"\n }),\n params: z.record(z.string(), z.any(), {\n description: \"Additional connection parameters (e.g., SSL settings)\"\n }).optional()\n }).optional(),\n // S3 configuration\n s3: z.object({\n scheme: z.enum([\"s3a\", \"s3\"], {\n description: \"S3 protocol scheme\"\n }),\n bucket: z.string({\n description: \"S3 bucket name\"\n }),\n relativePath: z.string({\n description: \"Path within the bucket\"\n }),\n format: z.string({\n description: \"Data format (e.g., 'ICEBERG', 'PARQUET', 'JSON', 'CSV')\"\n }).optional()\n }).optional(),\n // ABFSS configuration\n abfss: z.object({\n account: z.string({\n description: \"Azure storage account name\"\n }),\n container: z.string({\n description: \"Container name within the storage account\"\n }),\n relativePath: z.string({\n description: \"Path within the container\"\n }),\n format: z.string({\n description: \"Data format (e.g., 'PARQUET', 'JSON', 'CSV')\"\n }).optional()\n }).optional(),\n // WASBS configuration\n wasbs: z.object({\n account: z.string({\n description: \"Azure storage account name\"\n }),\n container: z.string({\n description: \"Container name within the storage account\"\n }),\n relativePath: z.string({\n description: \"Path within the container\"\n }),\n format: z.string({\n description: \"Data format (e.g., 'PARQUET', 'JSON', 'CSV')\"\n }).optional()\n }).optional(),\n // REDSHIFT configuration\n redshift: z.object({\n host: z.string({\n description: \"Redshift cluster endpoint\"\n }),\n subprotocol: z.string({\n description: \"JDBC subprotocol for Redshift\"\n }).optional(),\n port: z.number({\n description: \"Redshift port (default: 5439)\"\n }).default(5439),\n database: z.string({\n description: \"Redshift database name\"\n }),\n bucket: z.string({\n description: \"S3 bucket for data staging\"\n }),\n relativePath: z.string({\n description: \"Path within the S3 bucket\"\n })\n }).optional(),\n // ELASTICSEARCH configuration\n elasticsearch: z.object({\n nodes: z.array(z.string(), {\n description: \"List of Elasticsearch nodes (format: 'host:port')\"\n })\n }).optional(),\n // OPENSEARCH configuration\n opensearch: z.object({\n nodes: z.array(z.string(), {\n description: \"List of OpenSearch nodes (format: 'host:port')\"\n })\n }).optional(),\n // EVENTHUB configuration\n eventhub: z.object({\n endpoint: z.string({\n description: \"Event Hub namespace endpoint (format: 'sb://namespace.servicebus.windows.net/')\"\n })\n }).optional(),\n // PULSAR configuration\n pulsar: z.object({\n adminUrl: z.string({\n description: \"Pulsar admin API URL\"\n }),\n serviceUrl: z.string({\n description: \"Pulsar broker service URL\"\n }),\n tenant: z.string({\n description: \"Pulsar tenant name\"\n }).optional()\n }).optional(),\n // BIGQUERY configuration\n bigquery: z.object({\n project: z.string({\n description: \"Google Cloud project ID\"\n }),\n params: z.record(z.string(), z.any(), {\n description: \"Additional BigQuery connection parameters\"\n }).optional()\n }).optional(),\n // GCS configuration\n gcs: z.object({\n bucket: z.string({\n description: \"GCS bucket name\"\n }),\n relativePath: z.string({\n description: \"Path within the bucket\"\n })\n }).optional(),\n // KAFKA configuration\n kafka: z.object({\n brokers: z.array(z.string(), {\n description: \"List of Kafka broker addresses\"\n }),\n schemaRegistryUrl: z.string({\n description: \"Schema Registry URL for Avro/JSON schemas\"\n }).optional()\n }).optional(),\n // MONGODB configuration\n mongodb: z.object({\n subprotocol: z.string({\n description: \"MongoDB connection protocol (e.g., 'mongodb+srv')\"\n }),\n nodes: z.array(z.string(), {\n description: \"MongoDB cluster nodes\"\n })\n }).optional(),\n // MYSQL configuration\n mysql: z.object({\n host: z.string({\n description: \"MySQL server hostname\"\n }),\n port: z.number({\n description: \"MySQL server port (default: 3306)\"\n }).default(3306),\n database: z.string({\n description: \"MySQL database name\"\n }).optional(),\n params: z.record(z.string(), z.any(), {\n description: \"Additional connection parameters (e.g., SSL settings)\"\n }).optional()\n }).optional(),\n // ORACLE configuration\n oracle: z.object({\n subprotocol: z.string({\n description: \"Oracle JDBC subprotocol (e.g., 'oracle:thin')\"\n }),\n host: z.string({\n description: \"Oracle server hostname\"\n }),\n port: z.number({\n description: \"Oracle server port (default: 1521)\"\n }).default(1521),\n service: z.string({\n description: \"Oracle service name\"\n })\n }).optional(),\n // POSTGRESQL configuration\n postgresql: z.object({\n host: z.string({\n description: \"PostgreSQL server hostname\"\n }),\n port: z.number({\n description: \"PostgreSQL server port (default: 5432)\"\n }).default(5432),\n database: z.string({\n description: \"PostgreSQL database name\"\n }),\n params: z.record(z.string(), z.any(), {\n description: \"Additional connection parameters (e.g., sslmode)\"\n }).optional()\n }).optional(),\n // SNOWFLAKE configuration\n snowflake: z.object({\n warehouse: z.string({\n description: \"Snowflake warehouse name\"\n }),\n url: z.string({\n description: \"Snowflake account URL\"\n }),\n database: z.string({\n description: \"Snowflake database name\"\n })\n }).optional(),\n // MSSQL configuration\n mssql: z.object({\n host: z.string({\n description: \"SQL Server hostname\"\n }),\n port: z.number({\n description: \"SQL Server port (default: 1433)\"\n }).default(1433),\n database: z.string({\n description: \"SQL Server database name\"\n }),\n params: z.record(z.string(), z.any(), {\n description: \"Additional connection parameters (e.g., encrypt)\"\n }).optional()\n }).optional()\n }),\n ...commonDepotFields,\n source: z.string({\n description: \"Maps the depot to the metadata source name in Metis. Running a scanner job on this depot will save the metadata in Metis DB under the specified 'source' name. If this key-value property is not mentioned, the metadata will surface under the depot name on Metis UI.\"\n }).optional(),\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-depot.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the depot file. example: my-depot.yaml\"\n })\n}\n\nexport const initDepotSourceTool = (server: McpServer) => {\n server.tool(\n \"create-depot-source\",\n description,\n toolSchema,\n async ({\n name, tags, depot, owner, compute, source, description, external, connectionSecret, path: p, fileName\n }) => {\n\n // Perform validation\n const validationError = validateDepotCombination(depot);\n if (validationError) {\n return {\n content: [{\n type: \"text\",\n text: validationError\n }]\n };\n }\n\n const fileContent = stringify({\n name,\n tags,\n type: \"depot\",\n version: \"v2alpha\",\n layer: \"user\",\n ...(owner && { owner }),\n ...(compute && { compute }),\n ...(source && { source }),\n description,\n external,\n ...(connectionSecret && { connectionSecret }),\n depot\n })\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n \n const directory = path.dirname(fullPath);\n \n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n \n writeFileSync(fullPath, fileContent)\n \n return {\n content: [\n {\n type: \"text\",\n text: `Depot source created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating depot source: ${error}`\n }]\n }\n }\n }\n )\n}","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Flare Workflow in DataOS is a declarative stack for large-scale data processing using Apache Spark. It provides comprehensive solutions for data ingestion, transformation, enrichment, profiling, quality assessment, and syndication on both batch and incremental data.\n\nFlare Workflows support multiple job types:\n- **Batch Jobs**: Process all data in each run, ensuring consistent performance. Ideal for small to medium datasets\n- **Incremental Jobs**: Process only changed data since last run, reducing computation and latency for large datasets\n- **Data Quality Jobs**: Validate data using business-specific assertions to ensure fitness-for-purpose\n- **Data Profiling Jobs**: Assess data structure, completeness, and validity with automatic fingerprinting\n\nKey Features:\n- Declarative YAML-based programming paradigm\n- Support for 16+ data sources (S3, BigQuery, Snowflake, Kafka, etc.)\n- Advanced transformations with SQL and built-in functions\n- Comprehensive data quality and profiling capabilities\n- Iceberg table optimization and maintenance\n- Auto-scaling and resource management\n\nExamples:\n- ETL pipelines from data lakes to warehouses\n- Real-time data ingestion and transformation\n- Data quality validation and monitoring\n- Cross-platform data syndication\n- Advanced analytics and feature engineering\n`\n\n// Driver Configuration\nconst driverConfigSchema = z.object({\n coreLimit: z.string().default(\"1000m\").describe(\"CPU core limit for the driver (e.g., '1000m', '2000m'). 1000m = 1 CPU core\"),\n cores: z.number().min(1).default(1).describe(\"Number of CPU cores allocated to the driver\"),\n memory: z.string().default(\"1024m\").describe(\"Memory allocation for the driver (e.g., '1024m', '2Gi')\")\n}).optional().describe(\"Driver resource configuration for Spark driver\")\n\n// Executor Configuration\nconst executorConfigSchema = z.object({\n coreLimit: z.string().default(\"1000m\").describe(\"CPU core limit for each executor (e.g., '1000m', '2000m')\"),\n cores: z.number().min(1).default(1).describe(\"Number of CPU cores for each executor\"),\n instances: z.number().min(1).default(1).describe(\"Number of executor instances for parallel processing\"),\n memory: z.string().default(\"1024m\").describe(\"Memory allocation for each executor (e.g., '1024m', '4Gi')\")\n}).optional().describe(\"Executor resource configuration for Spark executors\")\n\n// Incremental Configuration\nconst incrementalConfigSchema = z.object({\n context: z.string().describe(\"Context name for incremental processing (e.g., 'incrinput', 'customer_incremental')\"),\n sql: z.string().describe(\"SQL query with placeholders for incremental keys (e.g., 'SELECT * FROM incrinput WHERE date BETWEEN $|start_date| AND $|end_date|')\"),\n keys: z.array(z.object({\n name: z.string().describe(\"Name of the incremental key (e.g., 'start_date', 'end_date', 'last_updated_id')\"),\n sql: z.string().describe(\"SQL query to obtain the key value (e.g., 'SELECT MAX(date) FROM target_table')\")\n })).describe(\"Incremental keys for tracking data changes\"),\n state: z.array(z.object({\n key: z.string().describe(\"State key name for persistence\"),\n value: z.string().describe(\"State value reference for next run\")\n })).describe(\"State management for incremental processing\")\n}).describe(\"Incremental load configuration for processing only changed data\")\n\n// Input Dataset Schema with comprehensive format support\nconst inputDatasetSchema = z.object({\n name: z.string().describe(\"Reference name for the input dataset (used in SQL queries and transformations)\"),\n dataset: z.string().describe(\"Dataset address in UDL format (e.g., 'dataos://lakehouse:retail/customers', 'dataos://s3-depot:bucket/path', 'dataos://bigquery-depot:project.dataset.table')\"),\n query: z.string().optional().describe(\"SQL query for data filtering and selection (e.g., 'SELECT * FROM table WHERE status = \\\"active\\\"')\"),\n format: z.enum([\n \"iceberg\", \"csv\", \"json\", \"parquet\", \"avro\", \"delta\", \"excel\", \"xml\",\n \"kafka\", \"pulsar\", \"eventhub\", \"elasticsearch\", \"opensearch\",\n \"bigquery\", \"snowflake\", \"redshift\", \"mysql\", \"postgresql\", \"oracle\", \"mssql\", \"mongodb\"\n ]).optional().describe(\"Data format of the source dataset\"),\n isStream: z.boolean().default(false).describe(\"Flag indicating if this is a streaming dataset (required for Kafka, Pulsar, EventHub)\"),\n schemaType: z.enum([\"avro\", \"json\"]).default(\"avro\").optional().describe(\"Schema type for the dataset\"),\n schemaPath: z.string().optional().describe(\"DataOS address to schema file (e.g., 'dataos://thirdparty:schemas/customer.avsc')\"),\n schemaString: z.string().optional().describe(\"Inline schema definition (Avro JSON or Spark struct)\"),\n schemaSubject: z.string().optional().describe(\"Subject name for schema registry (for Kafka/Pulsar with schema registry)\"),\n schemaId: z.number().optional().describe(\"Schema ID in schema registry (specific version of schema)\"),\n incremental: incrementalConfigSchema.optional(),\n options: z.record(z.string(), z.any()).optional().describe(\"Additional data load options (branch, connection settings, partitioning, etc.)\")\n}).describe(\"Input dataset configuration with comprehensive format support\")\n\n// Output Dataset Schema with advanced options\nconst outputDatasetSchema = z.object({\n name: z.string().describe(\"Reference name for the output dataset (must match transformation step name)\"),\n dataset: z.string().describe(\"Dataset address in UDL format with write permissions (e.g., 'dataos://lakehouse:retail/processed_data?acl=rw')\"),\n format: z.enum([\n \"iceberg\", \"parquet\", \"csv\", \"json\", \"avro\", \"delta\", \"excel\",\n \"kafka\", \"pulsar\", \"eventhub\", \"elasticsearch\", \"opensearch\",\n \"bigquery\", \"snowflake\", \"redshift\", \"mysql\", \"postgresql\", \"oracle\", \"mssql\"\n ]).optional().describe(\"Output format for the dataset\"),\n driver: z.string().optional().describe(\"JDBC driver class for database outputs (e.g., 'org.postgresql.Driver')\"),\n title: z.string().optional().describe(\"Human-readable title for the output dataset\"),\n description: z.string().optional().describe(\"Description of the output dataset content and purpose\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorizing and discovering the output dataset\"),\n options: z.object({\n saveMode: z.enum([\"overwrite\", \"append\", \"ignore\", \"error\"]).default(\"overwrite\").describe(\"Save mode: overwrite (replace), append (add), ignore (skip if exists), error (fail if exists)\"),\n extraOptions: z.record(z.string(), z.any()).optional().describe(\"Format-specific options (warehouse settings, compression, etc.)\"),\n compressionType: z.enum([\"gzip\", \"snappy\", \"lz4\", \"zstd\"]).optional().describe(\"Compression type for the output data\"),\n sort: z.object({\n mode: z.enum([\"partition\", \"global\"]).describe(\"Sort mode: partition (within partitions), global (across all data)\"),\n columns: z.array(z.object({\n name: z.string().describe(\"Column name to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).default(\"asc\").describe(\"Sort order: ascending or descending\")\n })).describe(\"Columns to sort by with their order\")\n }).optional().describe(\"Sorting configuration for optimized data layout\"),\n iceberg: z.object({\n merge: z.object({\n onClause: z.string().describe(\"Join condition for merge operation (e.g., 'old.id = new.id')\"),\n whenClause: z.string().describe(\"Merge conditions and actions (e.g., 'matched then update set * when not matched then insert *')\")\n }).optional().describe(\"Iceberg merge configuration for upsert operations\"),\n properties: z.record(z.string(), z.string()).optional().describe(\"Iceberg table properties (e.g., 'write.format.default': 'parquet')\"),\n partitionSpec: z.array(z.object({\n type: z.enum([\"identity\", \"bucket\", \"truncate\", \"year\", \"month\", \"day\", \"hour\"]).describe(\"Partition transform type\"),\n column: z.string().describe(\"Column to partition on\"),\n asColumn: z.string().optional().describe(\"Alias for the partition column\"),\n numBuckets: z.number().optional().describe(\"Number of buckets for bucket partitioning\"),\n width: z.number().optional().describe(\"Width for truncate partitioning\")\n })).optional().describe(\"Iceberg partitioning specification for query optimization\")\n }).optional().describe(\"Iceberg-specific configuration options\")\n }).optional()\n}).describe(\"Output dataset configuration with advanced options\")\n\n// Transform Steps with Functions\nconst flareFunction = z.object({\n name: z.enum([\n \"set_type\", \"change_case\", \"any_date\", \"split\", \"concat\", \"replace\",\n \"trim\", \"substring\", \"regex_extract\", \"hash\", \"encrypt\", \"decrypt\",\n \"pivot\", \"unpivot\", \"explode\", \"collect\", \"window\", \"rank\"\n ]).describe(\"Flare function name for data transformation\"),\n columns: z.record(z.string(), z.any()).optional().describe(\"Column-specific function parameters and configurations\")\n}).describe(\"Flare built-in transformation function\")\n\nconst transformCommandSchema = z.object({\n name: z.enum([\"persist\", \"cache\", \"broadcast\", \"repartition\", \"coalesce\"]).describe(\"Command for data optimization\"),\n sequenceName: z.string().optional().describe(\"Sequence name to apply command to\"),\n mode: z.enum([\"MEMORY_ONLY\", \"MEMORY_AND_DISK\", \"DISK_ONLY\"]).optional().describe(\"Persistence mode for caching\"),\n numPartitions: z.number().optional().describe(\"Number of partitions for repartitioning\")\n}).describe(\"Data optimization command\")\n\nconst transformStepSchema = z.object({\n sequence: z.array(z.object({\n name: z.string().describe(\"Name of the transformation step (must be unique within job)\"),\n doc: z.string().optional().describe(\"Documentation describing the purpose of this transformation step\"),\n sql: z.string().describe(\"SQL query for data transformation (can reference input datasets and previous steps)\"),\n classpath: z.string().optional().describe(\"Custom Java/Scala class for advanced transformations\"),\n functions: z.array(flareFunction).optional().describe(\"Flare built-in functions to apply after SQL transformation\"),\n commands: z.array(transformCommandSchema).optional().describe(\"Performance optimization commands\")\n })).describe(\"Sequence of transformation operations\")\n}).describe(\"Data transformation step with SQL, functions, and commands\")\n\n// Validate assertion test type and configuration combination\nconst validateAssertionTestCombination = (assertion: any): string | null => {\n const { type, column, filter, validFormat, tests, sql } = assertion;\n \n switch (type) {\n case \"column\":\n if (!column) {\n return \"Error: 'column' type requires 'column' property with column name to test.\";\n }\n if (!tests || tests.length === 0) {\n return \"Error: 'column' type requires 'tests' property with test expressions.\";\n }\n if (sql) {\n return \"Error: 'column' type should not have 'sql' property.\";\n }\n break;\n \n case \"sql\":\n if (!sql) {\n return \"Error: 'sql' type requires 'sql' property with custom SQL query.\";\n }\n if (!tests || tests.length === 0) {\n return \"Error: 'sql' type requires 'tests' property with test expressions.\";\n }\n if (column || filter || validFormat) {\n return \"Error: 'sql' type should not have column-specific properties ('column', 'filter', 'validFormat').\";\n }\n break;\n \n default:\n return `Error: Invalid assertion test type '${type}'. Supported types are: column, sql.`;\n }\n \n return null; // No validation errors\n};\n\n// Assertions for Data Quality\nconst assertionTestSchema = z.object({\n type: z.enum([\"column\", \"sql\"], {\n description: \"Type of assertion test: 'column' for column-based tests, 'sql' for custom SQL-based tests\"\n }),\n // Column-specific properties\n column: z.string({\n description: \"Column name to test\"\n }).optional(),\n filter: z.string({\n description: \"SQL filter condition (e.g., 'brand_name == \\\"Nike\\\"')\"\n }).optional(),\n validFormat: z.object({\n regex: z.string({\n description: \"Regular expression pattern for format validation\"\n })\n }).optional(),\n // SQL-specific properties\n sql: z.string({\n description: \"Custom SQL query for complex validation\"\n }).optional(),\n // Common properties\n tests: z.array(z.string(), {\n description: \"Test expressions (e.g., 'avg > 1000', 'max < 5000', 'missing_count < 10')\"\n })\n}).describe(\"Data quality assertion configuration\");\n\n// Common workflow fields\nconst commonWorkflowFields = {\n name: z.string().describe(\"Flare workflow name - alphanumeric with hyphens, max 48 chars\"),\n tags: z.array(z.string()).describe(\"Tags for categorizing and organizing the workflow\"),\n description: z.string().describe(\"Human-readable description of the workflow purpose and data processing logic\"),\n title: z.string().optional().describe(\"Display title for the workflow\"),\n owner: z.string().optional().describe(\"Owner of the workflow resource\"),\n workspace: z.string().default(\"public\").describe(\"Workspace where the workflow will be deployed\"),\n compute: z.string().default(\"runnable-default\").describe(\"Compute resource for the workflow (e.g., 'runnable-default', 'runnable-large')\")\n}\n\nconst toolSchema = {\n ...commonWorkflowFields,\n jobType: z.enum([\"batch\", \"incremental\", \"data-quality\", \"data-profiling\"]).describe(\"Type of Flare job - batch: process all data, incremental: process only changes, data-quality: validate with assertions, data-profiling: analyze data structure\"),\n stack: z.enum([\"flare:6.0\", \"flare:5.0\"]).default(\"flare:6.0\").describe(\"Flare stack version\"),\n tier: z.enum([\"connect\", \"transform\", \"premium\"]).optional().describe(\"Compute tier for the job\"),\n driver: driverConfigSchema,\n executor: executorConfigSchema,\n logLevel: z.enum([\"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]).default(\"INFO\").describe(\"Application log level for debugging and monitoring\"),\n explain: z.boolean().default(false).describe(\"Flag to print Spark logical/physical plans for debugging\"),\n inputs: z.array(inputDatasetSchema).describe(\"Input datasets for the workflow to process\"),\n outputs: z.array(outputDatasetSchema).optional().describe(\"Output datasets where processed data will be written (not required for data-profiling jobs)\"),\n steps: z.array(transformStepSchema).optional().describe(\"Data transformation steps to apply between inputs and outputs\"),\n assertions: z.array(assertionTestSchema).optional().describe(\"Data quality assertions for validation (required for data-quality jobs)\"),\n \n // Advanced features\n scheduling: z.object({\n cron: z.string().describe(\"Cron expression for scheduled execution (e.g., '0 0 * * *' for daily)\"),\n timezone: z.string().default(\"UTC\").describe(\"Timezone for cron schedule\"),\n retries: z.number().default(3).describe(\"Number of retry attempts on failure\"),\n concurrency: z.enum([\"forbid\", \"allow\", \"replace\"]).default(\"forbid\").describe(\"Concurrent execution policy\")\n }).optional().describe(\"Scheduling configuration for automated workflow execution\"),\n \n dependencies: z.object({\n datasets: z.array(z.string()).optional().describe(\"Dataset dependencies that must exist before execution\"),\n workflows: z.array(z.string()).optional().describe(\"Workflow dependencies that must complete before execution\"),\n services: z.array(z.string()).optional().describe(\"Service dependencies that must be available\")\n }).optional().describe(\"Workflow dependencies and prerequisites\"),\n \n notifications: z.object({\n email: z.array(z.string()).optional().describe(\"Email addresses for notifications\"),\n slack: z.string().optional().describe(\"Slack webhook URL for notifications\"),\n teams: z.string().optional().describe(\"Microsoft Teams webhook URL\"),\n conditions: z.array(z.enum([\"success\", \"failure\", \"retry\", \"timeout\"])).default([\"failure\"]).describe(\"Conditions that trigger notifications\")\n }).optional().describe(\"Notification configuration for workflow events\"),\n \n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-flare.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the flare workflow file. example: my-flare.yaml\"\n })\n}\n\nexport const initFlareWorkflowTool = (server: McpServer) => {\n server.tool(\n \"create-flare-workflow\",\n description,\n toolSchema,\n async ({\n name, tags, description, title, owner, workspace, compute, jobType, stack, tier,\n driver, executor, logLevel, explain, inputs, outputs, steps, assertions,\n scheduling, dependencies, notifications, path: p, fileName\n }) => {\n \n // Validate all assertions if provided\n if (assertions && assertions.length > 0) {\n for (const assertion of assertions) {\n const validationError = validateAssertionTestCombination(assertion);\n if (validationError) {\n return {\n content: [{\n type: \"text\",\n text: validationError\n }]\n };\n }\n }\n }\n\n // Build the job configuration based on job type\n const jobConfig: any = { \n logLevel, \n explain,\n inputs\n }\n\n // Add outputs for most job types (data-profiling jobs don't require outputs)\n if (jobType !== \"data-profiling\" && outputs) {\n jobConfig.outputs = outputs\n }\n\n // Add transformation steps if provided\n if (steps && steps.length > 0) {\n jobConfig.steps = steps\n }\n\n // Add assertions for data quality jobs\n if (jobType === \"data-quality\" && assertions) {\n jobConfig.assertions = assertions\n }\n\n // Build the stackSpec\n const stackSpec: any = { job: jobConfig }\n if (driver) stackSpec.driver = driver\n if (executor) stackSpec.executor = executor\n\n // Build the workflow specification\n const workflowSpec: any = {\n name,\n version: \"v1\",\n type: \"workflow\",\n tags,\n description,\n ...(owner && { owner }),\n ...(workspace && workspace !== \"public\" && { workspace }),\n workflow: {\n title: title || `${name} - ${jobType} job`,\n dag: [{\n name: `${name}-${jobType}-job`,\n title: `${jobType.charAt(0).toUpperCase() + jobType.slice(1)} Job`,\n description: `${jobType} job for ${description}`,\n spec: {\n tags: [...tags, jobType],\n stack,\n compute,\n ...(tier && { tier }),\n stackSpec\n }\n }]\n }\n }\n\n // Add scheduling if provided\n if (scheduling) {\n workflowSpec.schedule = {\n cron: scheduling.cron,\n timezone: scheduling.timezone,\n ...(scheduling.retries && { retries: scheduling.retries }),\n concurrency: scheduling.concurrency\n }\n }\n\n // Add dependencies if provided\n if (dependencies) {\n workflowSpec.dependencies = dependencies\n }\n\n // Add notifications if provided\n if (notifications) {\n workflowSpec.notifications = notifications\n }\n\n const fileContent = stringify(workflowSpec)\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Flare workflow created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating flare workflow: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `An Instance Secret is a DataOS Resource(https://dataos.info/resources/) designed for securely storing sensitive information at the DataOS Instance-level. \nThe primary purpose of an Instance Secret is to address the inherent exposure risk associated with directly embedding such confidential data within application code or manifest files (YAML configuration files). \nThis includes usernames, passwords, certificates, tokens, and keys. Instance Secrets establish a critical segregation between sensitive data and Resource definitions. This division minimizes inadvertent exposure during various Resource management phases, including creation, viewing, or editing.\n\nComplete configuration details: https://dataos.info/resources/instance_secret/configurations/\n`\n\nconst creds = {\n \"database\": {\n \"username\": \"${DATABASE_USERNAME}\",\n \"password\": \"${DATABASE_PASSWORD}\"\n },\n \"aws\": {\n \"accesskeyid\": \"${AWS_ACCESS_KEY_ID}\",\n \"secretkey\": \"${AWS_SECRET_KEY}\",\n \"awsaccesskeyid\": \"${AWS_ACCESS_KEY_ID}\",\n \"awssecretaccesskey\": \"${AWS_SECRET_ACCESS_KEY}\"\n },\n \"azure\": {\n \"azureendpointsuffix\": \"${AZURE_ENDPOINT_SUFFIX}\",\n \"azurestorageaccountkey\": \"${AZURE_STORAGE_ACCOUNT_KEY}\",\n \"azurestorageaccountname\": \"${AZURE_STORAGE_ACCOUNT_NAME}\"\n },\n \"gcp\": {\n \"projectid\": \"${GCP_PROJECT_ID}\",\n \"email\": \"${GCP_SERVICE_ACCOUNT_EMAIL}\"\n },\n \"eventhub\": {\n \"eh_shared_access_key_name\": \"${EVENTHUB_SHARED_ACCESS_KEY_NAME}\",\n \"eh_shared_access_key\": \"${EVENTHUB_SHARED_ACCESS_KEY}\"\n },\n \"git\": {\n \"GITSYNC_USERNAME\": \"${GIT_USERNAME}\",\n \"GITSYNC_PASSWORD\": \"${GIT_PASSWORD_OR_TOKEN}\"\n },\n \"redshift\": {\n \"username\": \"${REDSHIFT_USERNAME}\",\n \"password\": \"${REDSHIFT_PASSWORD}\",\n \"awsaccesskeyid\": \"${AWS_ACCESS_KEY_ID}\",\n \"awssecretaccesskey\": \"${AWS_SECRET_ACCESS_KEY}\"\n },\n \"generic\": {\n \"custom_key_1\": \"${CUSTOM_VALUE_1}\",\n \"custom_key_2\": \"${CUSTOM_VALUE_2}\",\n \"api_key\": \"${API_KEY}\",\n \"token\": \"${ACCESS_TOKEN}\"\n }\n}\n\n// Common fields for all instance secret metadata\nconst commonInstanceSecretFields = {\n description: z.string({\n description: \"Brief description of the instance-secret's purpose and usage\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing and organizing the instance secret\"\n }),\n owner: z.string({\n description: \"Owner of the instance secret resource\"\n }).optional(),\n layer: z.enum([\"user\", \"system\"], {\n description: \"DataOS layer where the instance secret will be deployed\"\n }).default(\"user\")\n}\n\n\n// Validate instance secret type and files combination\nconst validateInstanceSecretCombination = (instanceSecret: any): string | null => {\n const { type, files } = instanceSecret;\n \n switch (type) {\n case \"key-value\":\n if (files) {\n return \"Error: 'key-value' type should not have 'files' property. Remove the 'files' property for key-value type.\";\n }\n break;\n \n case \"key-value-properties\":\n if (files && typeof files === 'object' && !Array.isArray(files)) {\n // Check if files is a record (object with string keys and values)\n const hasInvalidStructure = files.hasOwnProperty('truststoreLocation') || files.hasOwnProperty('keystoreLocation');\n if (hasInvalidStructure) {\n return \"Error: 'key-value-properties' type should have 'files' as a record of file paths (key-value pairs), not certificate-specific properties.\";\n }\n }\n break;\n \n case \"certificate\":\n if (!files) {\n return \"Error: 'certificate' type requires 'files' property with 'truststoreLocation' and 'keystoreLocation'.\";\n }\n if (typeof files !== 'object' || Array.isArray(files)) {\n return \"Error: 'certificate' type requires 'files' to be an object with 'truststoreLocation' and 'keystoreLocation'.\";\n }\n if (!files.truststoreLocation || !files.keystoreLocation) {\n return \"Error: 'certificate' type requires both 'truststoreLocation' and 'keystoreLocation' in the 'files' object.\";\n }\n break;\n \n case \"cloud-kernel\":\n if (files) {\n return \"Error: 'cloud-kernel' type should not have 'files' property. Remove the 'files' property for cloud-kernel type.\";\n }\n break;\n \n default:\n return `Error: Invalid instance secret type '${type}'. Supported types are: key-value, key-value-properties, certificate, cloud-kernel.`;\n }\n \n return null; // No validation errors\n};\n\nconst toolSchema = {\n name: z.string({\n description: \"Instance secret name - alphanumeric with hyphens allowed, max 48 chars, pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])\"\n }),\n version: z.enum([\"v1\"], {\n description: \"Manifest version for instance secret\"\n }).default(\"v1\"),\n type: z.literal(\"instance-secret\", {\n description: \"Resource type - must be 'instance-secret'\"\n }),\n system: z.enum([\"aws\", \"azure\", \"gcp\", \"eventhub\", \"git\", \"redshift\", \"database\", \"generic\"]),\n instanceSecret: z.object({\n type: z.enum([\"key-value\", \"key-value-properties\", \"certificate\", \"cloud-kernel\"], {\n description: \"Type of instance secret: 'key-value' stores arbitrary key-value pairs encoded separately in base64, 'key-value-properties' transforms multiple key-value pairs into a single base64 encoded pair, 'certificate' stores TLS certificates and keys, 'cloud-kernel' stores cloud-specific kernel configurations\"\n }),\n acl: z.enum([\"r\", \"rw\"], {\n description: \"Access control level - 'r' for read-only, 'rw' for read-write\"\n }),\n files: z.union([\n z.record(z.string(), z.string(), {\n description: \"For key-value-properties: File paths for credential files (e.g., JSON key files, certificates)\"\n }),\n z.object({\n truststoreLocation: z.string({\n description: \"File path to the truststore containing trusted certificates\"\n }),\n keystoreLocation: z.string({\n description: \"File path to the keystore containing private keys and certificates\"\n })\n }, {\n description: \"For certificate type: File locations for certificate and key storage\"\n })\n ]).optional().describe(\"Optional files configuration - used for key-value-properties (arbitrary file paths) and certificate types (truststore and keystore locations)\")\n }),\n secretMetadata: z.object(commonInstanceSecretFields, {\n description: \"Common metadata fields for instance secret configuration\"\n }),\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Dcouments/project-name/my-secret.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the instance secret file. example: my-secret.module.yaml\"\n })\n}\n\nexport const initInstanceSecretsTool = (server: McpServer) => {\n server.tool(\n \"create-instance-secrets\",\n description,\n toolSchema,\n async ({ name, version, type, instanceSecret, secretMetadata, system, path: p, fileName }) => {\n\n // Perform validation\n const validationError = validateInstanceSecretCombination(instanceSecret);\n if (validationError) {\n return {\n content: [{\n type: \"text\",\n text: validationError\n }]\n };\n }\n\n const fileContent = stringify({\n name,\n version: version || \"v1\",\n type,\n ...secretMetadata,\n \"instance-secret\": {\n ...instanceSecret,\n data: creds[system]\n }\n })\n \n\n try {\n\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n \n const directory = path.dirname(fullPath);\n \n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n \n writeFileSync(fullPath, fileContent)\n \n return {\n content: [\n {\n type: \"text\",\n text: `Instance secret created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating instance secret: ${error}`\n }]\n }\n }\n }\n )\n}","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Scanner Workflow in DataOS is a Stack that functions as a metadata extractor for scheduled or one-time metadata extraction jobs. It enables users to pull information from various data sources and subsequently store this extracted metadata in the Metis DB. These sources include data systems, BI tools, dashboard and visualization tools, databases, data lake systems, messaging services, pipelines, ML-model stores, and many more.\n\nScanner Workflows support comprehensive metadata extraction:\n- **Database Sources**: PostgreSQL, MySQL, Snowflake, BigQuery, Redshift, Oracle, SQL Server\n- **Messaging Systems**: Kafka, Pulsar, EventHub\n- **Search Engines**: Elasticsearch, OpenSearch\n- **NoSQL Databases**: MongoDB\n- **Data Lakes**: Iceberg, Delta Lake, Hudi\n- **BI Tools**: Tableau, PowerBI, Looker\n- **DataOS Resources**: Workflows, Depots, Services, Policies\n\nExamples:\n- Database scanner: Extract table schemas, relationships from PostgreSQL/MySQL/Snowflake\n- Kafka scanner: Extract topic metadata and schemas \n- Data Quality scanner: Extract quality check results and lineage\n- DataOS Resources scanner: Extract metadata from DataOS resources like workflows, depots\n`\n\n// Filter Pattern Schema for includes/excludes\nconst filterPatternSchema = z.object({\n includes: z.array(z.string(), {\n description: \"Array of regex patterns to include entities (e.g., ['^customer.*', 'sales_db$'])\"\n }).optional(),\n excludes: z.array(z.string(), {\n description: \"Array of regex patterns to exclude entities (e.g., ['temp.*', '^test_.*'])\"\n }).optional()\n}).describe(\"Filter pattern with regex support for precise entity selection\")\n\n// Source Connection Schema for direct connections (bypassing depot)\nconst sourceConnectionSchema = z.object({\n config: z.object({\n type: z.enum([\n \"Snowflake\", \"BigQuery\", \"Redshift\", \"PostgreSql\", \"MySql\", \"Oracle\", \n \"MsSql\", \"MariaDB\", \"AzureSql\", \"Kafka\", \"Pulsar\", \"MongoDB\", \n \"Elasticsearch\", \"OpenSearch\"\n ], {\n description: \"Direct connection type to data source\"\n }),\n hostPort: z.string({\n description: \"Host and port for connection (e.g., 'localhost:5432', 'cluster.snowflake.com:443')\"\n }).optional(),\n host: z.string({\n description: \"Database host address\"\n }).optional(),\n port: z.number({\n description: \"Database port number\"\n }).optional(),\n database: z.string({\n description: \"Database name to connect to\"\n }).optional(),\n username: z.string({\n description: \"Username for authentication\"\n }).optional(),\n // Additional connection properties\n warehouse: z.string({\n description: \"Snowflake warehouse name\"\n }).optional(),\n url: z.string({\n description: \"Connection URL (for Snowflake, MongoDB Atlas, etc.)\"\n }).optional(),\n project: z.string({\n description: \"BigQuery project ID\"\n }).optional(),\n serviceUrl: z.string({\n description: \"Service URL for Pulsar/Kafka\"\n }).optional(),\n adminUrl: z.string({\n description: \"Admin URL for Pulsar\"\n }).optional(),\n brokers: z.array(z.string(), {\n description: \"List of Kafka broker addresses\"\n }).optional(),\n nodes: z.array(z.string(), {\n description: \"List of Elasticsearch/OpenSearch/MongoDB nodes\"\n }).optional()\n })\n}).describe(\"Direct source connection configuration bypassing depot\")\n\n// Source Config Schema for metadata scanning configuration\nconst sourceConfigSchema = z.object({\n config: z.object({\n type: z.enum([\n \"DatabaseMetadata\", \"BigqueryMetadata\", \"KafkaMetadata\", \"PulsarMetadata\",\n \"LakehouseMetadata\", \"DashboardMetadata\", \"PipelineMetadata\", \n \"DataProductMetadata\", \"UserMetadata\", \"DataQualityIndexer\",\n \"DataProfilingIndexer\", \"QueryUsageIndexer\", \"SodaIndexer\"\n ], {\n description: \"Type of metadata source to scan\"\n }),\n \n // Database filtering options\n databaseFilterPattern: filterPatternSchema.optional(),\n schemaFilterPattern: filterPatternSchema.optional(), \n tableFilterPattern: filterPatternSchema.optional(),\n \n // BigQuery specific\n projectFilterPattern: filterPatternSchema.optional(),\n datasetFilterPattern: filterPatternSchema.optional(),\n \n // Kafka/Pulsar specific \n topicFilterPattern: filterPatternSchema.optional(),\n \n // General metadata options\n markDeletedTables: z.boolean({\n description: \"Flag tables as soft-deleted if not present in source system\"\n }).default(false),\n markDeletedTablesfromFilterOnly: z.boolean({\n description: \"Flag tables as deleted only within filtered scope\"\n }).default(false),\n markDeletedTopics: z.boolean({\n description: \"Flag topics as soft-deleted if not present in source system\" \n }).default(false),\n includeViews: z.boolean({\n description: \"Include database views in metadata extraction\"\n }).default(true),\n includeTables: z.boolean({\n description: \"Include database tables in metadata extraction\"\n }).default(true),\n includeTags: z.boolean({\n description: \"Include tags and labels in metadata\"\n }).default(true),\n includeOwners: z.boolean({\n description: \"Include ownership information in metadata\"\n }).default(true),\n \n // Data sampling and profiling\n ingestSampleData: z.boolean({\n description: \"Ingest sample data from topics/tables for preview\"\n }).default(false),\n enableDataProfiler: z.boolean({\n description: \"Enable data profiling during scan (resource intensive)\"\n }).default(false),\n profileSample: z.number({\n description: \"Percentage of data to sample for profiling (1-100)\"\n }).min(1).max(100).default(100).optional(),\n \n // Advanced options\n enableDebugLog: z.boolean({\n description: \"Enable debug logging for troubleshooting\"\n }).default(false),\n connectionTimeout: z.number({\n description: \"Connection timeout in seconds\"\n }).default(300).optional(),\n processProcedures: z.boolean({\n description: \"Include stored procedures in metadata extraction\"\n }).default(false),\n \n // Query usage specific\n queryLogDuration: z.number({\n description: \"Duration in days for query usage analysis\"\n }).default(30).optional(),\n \n // Session configuration\n sessionTags: z.record(z.string(), z.string(), {\n description: \"Session tags to set during connection\"\n }).optional(),\n \n // SSL and security\n sslMode: z.enum([\"disable\", \"require\", \"verify-ca\", \"verify-full\"], {\n description: \"SSL mode for database connections\"\n }).optional(),\n \n // Batch processing\n batchSize: z.number({\n description: \"Batch size for metadata extraction\"\n }).default(1000).optional()\n })\n}).describe(\"Source configuration for metadata scanning with comprehensive filtering and options\")\n\n// Schedule Schema\nconst scheduleSchema = z.object({\n cron: z.string({\n description: \"Cron expression for scheduling (e.g., '0 2 * * *' for daily at 2 AM, '*/15 * * * *' for every 15 minutes)\"\n }),\n concurrencyPolicy: z.enum([\"Allow\", \"Forbid\", \"Replace\"], {\n description: \"Policy for handling concurrent executions - Allow: allow concurrent runs, Forbid: skip if running, Replace: cancel and restart\"\n }).default(\"Allow\"),\n endOn: z.string({\n description: \"End date for scheduled executions in ISO 8601 format (e.g., '2024-12-31T23:59:59Z')\"\n }).optional(),\n timezone: z.string({\n description: \"Timezone for schedule execution (e.g., 'UTC', 'Asia/Kolkata', 'America/New_York')\"\n }).default(\"UTC\")\n}).optional().describe(\"Schedule configuration for recurring scanner workflows\")\n\n// Common workflow fields\nconst commonWorkflowFields = {\n name: z.string({\n description: \"Scanner name - alphanumeric with hyphens, max 48 chars, pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing and organizing the scanner workflow\"\n }),\n description: z.string({\n description: \"Human-readable description of the scanner purpose and data sources\"\n }),\n owner: z.string({\n description: \"Owner of the scanner resource (DataOS user identifier)\"\n }).optional(),\n workspace: z.string({\n description: \"Workspace where the scanner will be deployed\"\n }).default(\"public\")\n}\n\nconst validateConnectionCombination = (connection: any) => {\n const { method, depot, source, sourceConnection } = connection;\n \n if (method === \"depot\") {\n if (!depot) {\n throw new Error(\"Connection method 'depot' requires 'depot' field\");\n }\n if (sourceConnection) {\n throw new Error(\"Connection method 'depot' cannot have 'sourceConnection' field\");\n }\n return { method, depot, source };\n }\n \n if (method === \"direct\") {\n if (!sourceConnection) {\n throw new Error(\"Connection method 'direct' requires 'sourceConnection' field\");\n }\n if (depot || source) {\n throw new Error(\"Connection method 'direct' cannot have 'depot' or 'source' fields\");\n }\n return { method, sourceConnection };\n }\n \n throw new Error(`Invalid connection method: ${method}. Must be 'depot' or 'direct'`);\n};\n\nconst toolSchema = {\n ...commonWorkflowFields,\n schedule: scheduleSchema,\n jobName: z.string({\n description: \"Name of the scanner job within the workflow DAG\"\n }),\n jobDescription: z.string({\n description: \"Description of what this scanner job accomplishes\"\n }).optional(),\n jobTags: z.array(z.string(), {\n description: \"Tags specific to this scanner job\"\n }).optional(),\n compute: z.string({\n description: \"Compute resource for the job (default: runnable-default)\"\n }).default(\"runnable-default\"),\n runAsUser: z.string({\n description: \"User to run the scanner as - 'metis' for metadata operations, or specific user ID\"\n }).default(\"metis\"),\n stack: z.enum([\"scanner:2.0\"], {\n description: \"Scanner stack version - currently supports 2.0\"\n }).default(\"scanner:2.0\"),\n \n // Scanner connection configuration\n connection: z.object({\n method: z.enum([\"depot\", \"direct\"], {\n description: \"Connection method - 'depot' for depot-based scanning (recommended), 'direct' for direct source connection (advanced)\"\n }),\n depot: z.string({\n description: \"Depot name or UDL for the data source (e.g., 'snowflake-depot', 'dataos://icebase')\"\n }).optional(),\n source: z.string({\n description: \"Maps depot to metadata source name in Metis - if not specified, uses depot name\"\n }).optional(),\n sourceConnection: sourceConnectionSchema.optional()\n }),\n \n sourceConfig: sourceConfigSchema,\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-scanner.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the scanner workflow file. example: my-scanner.yaml\"\n })\n}\n\nexport const initScannerWorkflowTool = (server: McpServer) => {\n server.tool(\n \"create-scanner-workflow\",\n description,\n toolSchema,\n async ({\n name, tags, description, owner, workspace, schedule, jobName, jobDescription, \n jobTags, compute, runAsUser, stack, connection, sourceConfig, path: p, fileName\n }) => {\n try {\n // Validate connection combination\n const validatedConnection = validateConnectionCombination(connection);\n \n const stackSpec: any = {\n ...sourceConfig\n }\n \n // Add connection configuration\n if (validatedConnection.method === \"depot\") {\n stackSpec.depot = (validatedConnection as any).depot\n if ((validatedConnection as any).source) {\n stackSpec.source = (validatedConnection as any).source\n }\n } else {\n stackSpec.sourceConnection = (validatedConnection as any).sourceConnection\n }\n \n const dag = [{\n name: jobName,\n ...(jobDescription && { description: jobDescription }),\n ...(jobTags && { tags: jobTags }),\n spec: {\n stack,\n compute,\n runAsUser,\n stackSpec\n }\n }]\n\n const fileContent = stringify({\n name,\n version: \"v1\",\n type: \"workflow\",\n tags,\n description,\n ...(owner && { owner }),\n ...(workspace && workspace !== \"public\" && { workspace }),\n workflow: {\n ...(schedule && { schedule }),\n dag\n }\n })\n\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Scanner workflow file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating scanner workflow file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Soda Workflow in DataOS is a declarative tool for scheduled data quality testing within and beyond data pipelines, extending its capabilities, enhancing data observability and reliability across one or more datasets. It enables you to use the Soda Checks Language (SodaCL) to turn user-defined inputs into aggregated SQL queries.\n\nSoda supports comprehensive data quality checks across multiple categories:\n- **Accuracy**: Row counts, value ranges, calculations, cross-dataset validation\n- **Completeness**: Missing value detection, required field validation\n- **Consistency**: Cross-table reference checks, data format consistency \n- **Freshness**: Data recency and staleness detection\n- **Schema**: Column presence, data types, structural validation\n- **Uniqueness**: Duplicate detection and primary key validation\n- **Validity**: Format validation, range checks, custom business rules\n\nExamples:\n- Basic checks: row_count between 100 and 1000, missing_count(email) = 0\n- Advanced checks: values in (city) must exist in cities (name), freshness(updated_at) < 1d\n- Schema validation: required columns, data types, forbidden columns\n`\n\n// Check Attributes Schema\nconst checkAttributesSchema = z.object({\n title: z.string({\n description: \"Human-readable title for the check (e.g., 'Customer ID Completeness Check')\"\n }).optional(),\n category: z.enum([\"Accuracy\", \"Completeness\", \"Consistency\", \"Freshness\", \"Schema\", \"Uniqueness\", \"Validity\"], {\n description: \"Category of the data quality check for organization and reporting\"\n }),\n description: z.string({\n description: \"Detailed description of what the check validates\"\n }).optional(),\n tags: z.array(z.string(), {\n description: \"Tags for organizing and filtering checks (e.g., ['critical', 'pii', 'financial'])\"\n }).optional()\n}).describe(\"Metadata attributes for organizing and documenting quality checks\")\n\n// Failed Row Samples Configuration\nconst samplesSchema = z.object({\n limit: z.number({\n description: \"Maximum number of failed row samples to collect for analysis (default: 100)\"\n }).min(1).max(1000).default(100)\n}).optional().describe(\"Configuration for collecting failed row samples for debugging\")\n\n// Validation Rules Schema (for validity checks)\nconst validationRulesSchema = z.object({\n \"valid format\": z.enum([\"email\", \"phone number\", \"credit card\", \"uuid\", \"date\", \"url\"], {\n description: \"Built-in format validation (e.g., 'email', 'phone number')\"\n }).optional(),\n \"valid regex\": z.string({\n description: \"Custom regex pattern for validation (e.g., '^[A-Z]{2}[0-9]{4}$' for postal codes)\"\n }).optional(),\n \"valid min\": z.number({\n description: \"Minimum valid value for numeric columns\"\n }).optional(),\n \"valid max\": z.number({\n description: \"Maximum valid value for numeric columns\"\n }).optional(),\n \"valid min length\": z.number({\n description: \"Minimum valid length for string columns\"\n }).optional(),\n \"valid max length\": z.number({\n description: \"Maximum valid length for string columns\"\n }).optional(),\n \"valid values\": z.array(z.union([z.string(), z.number()]), {\n description: \"List of valid values (e.g., ['active', 'inactive', 'pending'])\"\n }).optional()\n}).describe(\"Validation rules for validity checks\")\n\n// Schema Check Configuration \nconst schemaCheckConfigSchema = z.object({\n name: z.string({\n description: \"Name identifier for the schema check\"\n }).optional(),\n warn: z.object({\n \"when required column missing\": z.array(z.string(), {\n description: \"Columns that should trigger warnings if missing\"\n }).optional(),\n \"when forbidden column present\": z.array(z.string(), {\n description: \"Columns that should trigger warnings if present (e.g., ['temp_*', 'old_*'])\"\n }).optional(),\n \"when wrong column type\": z.record(z.string(), z.string(), {\n description: \"Expected column types that should trigger warnings if wrong (e.g., {'age': 'integer'})\"\n }).optional(),\n \"when wrong column index\": z.record(z.string(), z.number(), {\n description: \"Expected column positions that should trigger warnings if wrong\"\n }).optional()\n }).optional(),\n fail: z.object({\n \"when required column missing\": z.array(z.string(), {\n description: \"Columns that should trigger failures if missing\"\n }).optional(),\n \"when forbidden column present\": z.array(z.string(), {\n description: \"Columns that should trigger failures if present (sensitive data)\"\n }).optional(),\n \"when wrong column type\": z.record(z.string(), z.string(), {\n description: \"Expected column types that should trigger failures if wrong\"\n }).optional(),\n \"when wrong column index\": z.record(z.string(), z.number(), {\n description: \"Expected column positions that should trigger failures if wrong\"\n }).optional()\n }).optional(),\n attributes: checkAttributesSchema\n}).describe(\"Schema validation check configuration with warn/fail conditions\")\n\n// Base Check Schema\nconst baseCheckSchema = z.object({\n name: z.string({\n description: \"Custom name for the check (overrides default naming)\"\n }).optional(),\n filter: z.string({\n description: \"SQL WHERE clause to filter data for this specific check (e.g., 'status = \\\"active\\\"')\"\n }).optional(),\n attributes: checkAttributesSchema\n})\n\n// Validate soda check type and configuration combination\nconst validateSodaCheckCombination = (check: any): string | null => {\n const { checkType, column, operator, value, compareDataset, samples, name, filter, attributes, missingValues, missingRegex, validationRules, function: aggregationFunction, percentile, lengthType, sourceColumn, referenceDataset, referenceColumn, checkPattern, warn, fail, failCondition, failQuery } = check;\n \n // Base validation for all checks\n if (!checkType) {\n return \"Error: 'checkType' is required for all quality checks.\";\n }\n \n switch (checkType) {\n case \"row_count\":\n if (!operator) {\n return \"Error: 'row_count' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'row_count' check requires 'value' property.\";\n }\n if (column || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'row_count' check should only have 'operator', 'value', 'compareDataset', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"missing_count\":\n if (!column) {\n return \"Error: 'missing_count' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'missing_count' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'missing_count' check requires 'value' property.\";\n }\n if (compareDataset || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'missing_count' check should only have 'column', 'operator', 'value', 'missingValues', 'missingRegex', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"missing_percent\":\n if (!column) {\n return \"Error: 'missing_percent' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'missing_percent' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'missing_percent' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'missing_percent' check should only have 'column', 'operator', 'value', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"duplicate_count\":\n if (!column) {\n return \"Error: 'duplicate_count' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'duplicate_count' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'duplicate_count' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'duplicate_count' check should only have 'column', 'operator', 'value', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"duplicate_percent\":\n if (!column) {\n return \"Error: 'duplicate_percent' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'duplicate_percent' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'duplicate_percent' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'duplicate_percent' check should only have 'column', 'operator', 'value', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"invalid_count\":\n if (!column) {\n return \"Error: 'invalid_count' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'invalid_count' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'invalid_count' check requires 'value' property.\";\n }\n if (!validationRules) {\n return \"Error: 'invalid_count' check requires 'validationRules' property.\";\n }\n if (compareDataset || missingValues || missingRegex || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'invalid_count' check should only have 'column', 'operator', 'value', 'validationRules', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"invalid_percent\":\n if (!column) {\n return \"Error: 'invalid_percent' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'invalid_percent' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'invalid_percent' check requires 'value' property.\";\n }\n if (!validationRules) {\n return \"Error: 'invalid_percent' check requires 'validationRules' property.\";\n }\n if (compareDataset || missingValues || missingRegex || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'invalid_percent' check should only have 'column', 'operator', 'value', 'validationRules', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"freshness\":\n if (!column) {\n return \"Error: 'freshness' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'freshness' check requires 'operator' property.\";\n }\n if (!value) {\n return \"Error: 'freshness' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'freshness' check should only have 'column', 'operator', 'value', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"aggregation\":\n if (!aggregationFunction) {\n return \"Error: 'aggregation' check requires 'function' property.\";\n }\n if (!column) {\n return \"Error: 'aggregation' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'aggregation' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'aggregation' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'aggregation' check should only have 'function', 'column', 'operator', 'value', 'percentile', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"length\":\n if (!lengthType) {\n return \"Error: 'length' check requires 'lengthType' property.\";\n }\n if (!column) {\n return \"Error: 'length' check requires 'column' property.\";\n }\n if (!operator) {\n return \"Error: 'length' check requires 'operator' property.\";\n }\n if (value === undefined) {\n return \"Error: 'length' check requires 'value' property.\";\n }\n if (compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail || failCondition || failQuery) {\n return \"Error: 'length' check should only have 'lengthType', 'column', 'operator', 'value', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"reference\":\n if (!sourceColumn) {\n return \"Error: 'reference' check requires 'sourceColumn' property.\";\n }\n if (!referenceDataset) {\n return \"Error: 'reference' check requires 'referenceDataset' property.\";\n }\n if (!referenceColumn) {\n return \"Error: 'reference' check requires 'referenceColumn' property.\";\n }\n if (!checkPattern) {\n return \"Error: 'reference' check requires 'checkPattern' property.\";\n }\n if (column || operator || value || compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || warn || fail || failCondition || failQuery) {\n return \"Error: 'reference' check should only have 'sourceColumn', 'referenceDataset', 'referenceColumn', 'checkPattern', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"schema\":\n if (column || operator || value || compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || failCondition || failQuery) {\n return \"Error: 'schema' check should only have 'warn', 'fail', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n case \"failed_rows\":\n if (!failCondition && !failQuery) {\n return \"Error: 'failed_rows' check requires either 'failCondition' or 'failQuery' property.\";\n }\n if (column || operator || value || compareDataset || missingValues || missingRegex || validationRules || aggregationFunction || percentile || lengthType || sourceColumn || referenceDataset || referenceColumn || checkPattern || warn || fail) {\n return \"Error: 'failed_rows' check should only have 'failCondition', 'failQuery', 'samples', 'name', 'filter', and 'attributes' properties.\";\n }\n break;\n \n default:\n return `Error: Invalid soda check type '${checkType}'. Supported types are: row_count, missing_count, missing_percent, duplicate_count, duplicate_percent, invalid_count, invalid_percent, freshness, aggregation, length, reference, schema, failed_rows.`;\n }\n \n return null; // No validation errors\n};\n\n// Soda Check Types with linear structure\nconst sodaCheckSchema = z.object({\n checkType: z.enum([\"row_count\", \"missing_count\", \"missing_percent\", \"duplicate_count\", \"duplicate_percent\", \"invalid_count\", \"invalid_percent\", \"freshness\", \"aggregation\", \"length\", \"reference\", \"schema\", \"failed_rows\"], {\n description: \"Type of data quality check to perform\"\n }),\n \n // Common properties\n name: z.string({\n description: \"Custom name for the check (overrides default naming)\"\n }).optional(),\n filter: z.string({\n description: \"SQL WHERE clause to filter data for this specific check (e.g., 'status = \\\"active\\\"')\"\n }).optional(),\n attributes: checkAttributesSchema,\n samples: samplesSchema,\n \n // Row count specific\n compareDataset: z.string({\n description: \"Reference dataset for comparison (e.g., 'same as reference_table')\"\n }).optional(),\n \n // Column-based checks\n column: z.string({\n description: \"Column name for checks that operate on specific columns\"\n }).optional(),\n \n // Operator and value for most checks\n operator: z.enum([\"=\", \"!=\", \">\", \">=\", \"<\", \"<=\", \"between\"], {\n description: \"Comparison operator for the check\"\n }).optional(),\n value: z.union([z.number(), z.string()], {\n description: \"Expected value or range for the check\"\n }).optional(),\n \n // Missing value specific\n missingValues: z.array(z.union([z.string(), z.null()]), {\n description: \"Custom missing value indicators (e.g., ['NA', 'n/a', '', null])\"\n }).optional(),\n missingRegex: z.string({\n description: \"Regex pattern to identify missing values\"\n }).optional(),\n \n // Invalid value specific\n validationRules: validationRulesSchema.optional(),\n \n // Aggregation specific\n function: z.enum([\"min\", \"max\", \"avg\", \"sum\", \"stddev\", \"variance\", \"percentile\"], {\n description: \"Aggregation function to apply\"\n }).optional(),\n percentile: z.number({\n description: \"Percentile value (0-1) for percentile function\"\n }).min(0).max(1).optional(),\n \n // Length specific\n lengthType: z.enum([\"min_length\", \"max_length\", \"avg_length\"], {\n description: \"Type of length check to perform\"\n }).optional(),\n \n // Reference specific\n sourceColumn: z.string({\n description: \"Column in current dataset\"\n }).optional(),\n referenceDataset: z.string({\n description: \"Reference dataset name (e.g., 'reference_table')\"\n }).optional(),\n referenceColumn: z.string({\n description: \"Column in reference dataset\"\n }).optional(),\n checkPattern: z.enum([\"must exist in\", \"must not exist in\"], {\n description: \"Type of reference validation\"\n }).optional(),\n \n // Schema specific\n warn: z.object({\n \"when required column missing\": z.array(z.string(), {\n description: \"Columns that should trigger warnings if missing\"\n }).optional(),\n \"when forbidden column present\": z.array(z.string(), {\n description: \"Columns that should trigger warnings if present (e.g., ['temp_*', 'old_*'])\"\n }).optional(),\n \"when wrong column type\": z.record(z.string(), z.string(), {\n description: \"Expected column types that should trigger warnings if wrong (e.g., {'age': 'integer'})\"\n }).optional(),\n \"when wrong column index\": z.record(z.string(), z.number(), {\n description: \"Expected column positions that should trigger warnings if wrong\"\n }).optional()\n }).optional(),\n fail: z.object({\n \"when required column missing\": z.array(z.string(), {\n description: \"Columns that should trigger failures if missing\"\n }).optional(),\n \"when forbidden column present\": z.array(z.string(), {\n description: \"Columns that should trigger failures if present (sensitive data)\"\n }).optional(),\n \"when wrong column type\": z.record(z.string(), z.string(), {\n description: \"Expected column types that should trigger failures if wrong\"\n }).optional(),\n \"when wrong column index\": z.record(z.string(), z.number(), {\n description: \"Expected column positions that should trigger failures if wrong\"\n }).optional()\n }).optional(),\n \n // Failed rows specific\n failCondition: z.string({\n description: \"SQL condition for identifying failed rows (e.g., 'age < 0 OR age > 150')\"\n }).optional(),\n failQuery: z.string({\n description: \"Custom SQL query for complex failed row detection\"\n }).optional()\n}).describe(\"Comprehensive Soda quality check with typed validation\");\n\n// Profile Configuration\nconst profileSchema = z.object({\n columns: z.array(z.string(), {\n description: \"Column specifications for profiling: exact names, wildcards (*), includes/excludes (e.g., ['customer_id', 'include address_*', 'exclude temp_*', '*'])\"\n })\n}).optional().describe(\"Data profiling configuration for statistical analysis\")\n\n// Filter Configuration \nconst filterSchema = z.object({\n name: z.string({\n description: \"Identifier name for the filter\"\n }),\n where: z.string({\n description: \"SQL WHERE clause for global filtering across all checks (e.g., 'status = \\\"active\\\" AND created_date > \\\"2023-01-01\\\"')\"\n })\n}).optional().describe(\"Global filter applied to all checks on this dataset\")\n\n// Options Configuration\nconst optionsSchema = z.object({\n engine: z.enum([\"minerva\", \"default\"], {\n description: \"Query engine: 'minerva' for Trino-based queries, 'default' for native engine\"\n }).default(\"default\"),\n clusterName: z.string({\n description: \"Cluster name for Minerva engine (required when engine is 'minerva')\"\n }).optional(),\n branchName: z.string({\n description: \"Branch name for Iceberg datasets (defaults to 'main')\"\n }).default(\"main\").optional()\n}).optional().describe(\"Engine and execution options for quality checks\")\n\n// Dataset Input Schema\nconst datasetInputSchema = z.object({\n dataset: z.string({\n description: \"Dataset specification using DataOS UDL format: dataos://[depot]:[collection]/[dataset] (e.g., 'dataos://icebase:retail/customer')\"\n }),\n options: optionsSchema,\n filter: filterSchema, \n profile: profileSchema,\n checks: z.array(sodaCheckSchema, {\n description: \"List of data quality checks to execute on this dataset\"\n })\n}).describe(\"Complete dataset configuration with quality checks and profiling\")\n\n// Resource Configuration\nconst resourcesSchema = z.object({\n requests: z.object({\n cpu: z.string({\n description: \"CPU resource request (e.g., '500m', '1', '2000m')\"\n }).default(\"1000m\"),\n memory: z.string({\n description: \"Memory resource request (e.g., '512Mi', '1Gi', '250Mi')\"\n }).default(\"250Mi\")\n }),\n limits: z.object({\n cpu: z.string({\n description: \"CPU resource limit (e.g., '1', '2', '4000m')\"\n }).optional(),\n memory: z.string({\n description: \"Memory resource limit (e.g., '1Gi', '2Gi', '500Mi')\"\n }).optional()\n }).optional()\n}).optional().describe(\"Resource allocation for quality check execution\")\n\n// Schedule Schema\nconst scheduleSchema = z.object({\n cron: z.string({\n description: \"Cron expression for scheduling (e.g., '0 2 * * *' for daily at 2 AM, '0 */6 * * *' for every 6 hours)\"\n }),\n concurrencyPolicy: z.enum([\"Allow\", \"Forbid\", \"Replace\"], {\n description: \"Policy for handling concurrent executions\"\n }).default(\"Allow\"),\n endOn: z.string({\n description: \"End date for scheduled executions in ISO 8601 format\"\n }).optional(),\n timezone: z.string({\n description: \"Timezone for schedule execution (e.g., 'UTC', 'Asia/Kolkata')\"\n }).default(\"UTC\")\n}).optional().describe(\"Schedule configuration for recurring quality checks\")\n\n// Common fields\nconst commonWorkflowFields = {\n name: z.string({\n description: \"Quality workflow name - alphanumeric with hyphens, max 48 chars\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing and organizing the quality workflow\"\n }),\n description: z.string({\n description: \"Human-readable description of the quality checks and purpose\"\n }),\n owner: z.string({\n description: \"Owner of the quality workflow resource\"\n }).optional(),\n workspace: z.string({\n description: \"Workspace where the quality workflow will be deployed\"\n }).default(\"public\")\n}\n\nconst toolSchema = {\n ...commonWorkflowFields,\n schedule: scheduleSchema,\n jobName: z.string({\n description: \"Name of the quality job within the workflow\"\n }),\n jobTitle: z.string({\n description: \"Human-readable title for the job\"\n }).optional(),\n jobDescription: z.string({\n description: \"Description of the quality job\"\n }).optional(),\n jobTags: z.array(z.string(), {\n description: \"Tags specific to this quality job\"\n }).optional(),\n compute: z.string({\n description: \"Compute resource for the job\"\n }).default(\"runnable-default\"),\n runAsUser: z.string({\n description: \"User to run the quality job as\"\n }).optional(),\n stack: z.enum([\"soda+python:1.0\"], {\n description: \"Soda stack version with Python flavor\"\n }).default(\"soda+python:1.0\"),\n logLevel: z.enum([\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\"], {\n description: \"Logging level for the quality job\"\n }).default(\"INFO\"),\n resources: resourcesSchema,\n inputs: z.array(datasetInputSchema, {\n description: \"List of datasets and their associated quality checks\"\n }),\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-quality.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the quality workflow file. example: my-quality.yaml\"\n })\n}\n\nexport const initQualityWorkflowTool = (server: McpServer) => {\n server.tool(\n \"create-quality-workflow\",\n description,\n toolSchema,\n async ({\n name, tags, description, owner, workspace, schedule, jobName, jobTitle, \n jobDescription, jobTags, compute, runAsUser, stack, logLevel, resources, inputs, path: p, fileName\n }) => {\n \n // Validate all quality checks\n for (const input of inputs) {\n for (const check of input.checks) {\n const validationError = validateSodaCheckCombination(check);\n if (validationError) {\n return {\n content: [{\n type: \"text\",\n text: validationError\n }]\n };\n }\n }\n }\n\n const dag = [{\n name: jobName,\n ...(jobTitle && { title: jobTitle }),\n ...(jobDescription && { description: jobDescription }),\n ...(jobTags && { tags: jobTags }),\n spec: {\n stack,\n compute,\n ...(runAsUser && { runAsUser }),\n ...(resources && { resources }),\n logLevel,\n stackSpec: {\n inputs\n }\n }\n }]\n\n const fileContent = stringify({\n name,\n tags,\n type: \"workflow\",\n version: \"v1\",\n ...(owner && { owner }),\n workspace,\n description,\n ...(schedule && { schedule }),\n dag\n })\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n \n const directory = path.dirname(fullPath);\n \n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n \n writeFileSync(fullPath, fileContent)\n \n return {\n content: [\n {\n type: \"text\",\n text: `Quality workflow created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating quality workflow: ${error}`\n }]\n }\n }\n }\n )\n} ","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { lensList } from \"../service.js\"\n\nexport interface InitParams {\n server: McpServer\n apiKey?: string\n fqdn?: string\n}\n\nexport const initLensListResource = ({\n server,\n apiKey,\n fqdn\n}: InitParams) => {\n server.resource(\n \"sematic-models\",\n \"sematic-models://lenses\",\n async (uri): Promise<any> => {\n const result = await lensList({ apiKey, fqdn })\n\n return {\n isError: result.isError,\n contents: result.content.map(({ text }) => ({\n uri: uri.href,\n text\n }))\n }\n }\n )\n}","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { lensList, meta } from \"../service.js\";\nimport { z } from \"zod\";\nimport { InitParams } from \"../resources/schema.js\";\n\nexport const description = `Discover available semantic models within Data Products. This is always the starting point for data exploration.\n\nWHEN TO USE:\n- Begin every new data exploration journey by listing available semantic models\n- Help users understand what data domains & use cases are available\n- Identify the semantic model that contains the business entities relevant to the user's question\n\nWHAT IT RETURNS:\n- List of all accessible semantic models (lenses) & the data product it belongs to\n- Each entry includes: Semantic model (lens) - fully qualified name|Data product name|Data product description|Purpose|DPDomain|DPUsecase|Owner|Updated At\n- Use the Semantic model (lens) - fully qualified name to query schema or data from specific semantic models\n\nSEMANTIC MODEL CONTEXT:\nSemantic models are business-friendly modeling layers that sit on top of data warehouses/lakehouses. They transform raw data into logical business entities (customers, products, sales, orders) with dimensions, measures, and pre-built business logic.\n\nKeywords: list lens, discover data, available models, semantic models, data products, exploration`\n\nexport const initListLensTool = ({\n server, apiKey, fqdn\n}: InitParams) => {\n server.tool(\n \"list-lens\",\n description,\n {},\n async (): Promise<any> => lensList({ apiKey, fqdn })\n )\n}","import { meta } from \"../service.js\";\nimport { z } from \"zod\";\nimport { InitParams } from \"../resources/schema.js\";\n\nexport const description = `Retrieve the complete metadata and structure of a semantic model. This is essential before querying data.\n\nWHEN TO USE:\n- After discovering available semantic models (lenses)\n- Before constructing any data queries to understand available fields\n- To identify relevant dimensions for grouping/filtering\n- To identify relevant measures for analysis\n- To understand available segments for common filtering scenarios\n- To explore views that combine multiple tables\n\nCRITICAL: Never assume schema structure. Always query schema first to understand available fields before constructing data queries.\n\nWHAT IT RETURNS:\nThe schema includes:\n\n**TABLES** - Real-world business entities (customers, products, sales, orders)\n- Foundational building blocks of the semantic model\n\n**DIMENSIONS** - Descriptive attributes for filtering, grouping, and slicing data\n- Examples: customer_name, product_category, order_date, region\n- Answer \"by what\" questions (sales by region, customers by age group)\n- Enable drill-down and drill-up analysis\n\n**MEASURES** - Quantifiable metrics that can be aggregated (sum, count, average, etc.)\n- Examples: total_revenue, customer_count, average_order_value\n- Answer \"how much\" or \"how many\" questions\n- Can be calculated measures referencing other measures\n\n**SEGMENTS** - Predefined filters for common data subsets\n- Examples: active_customers, high_value_orders, premium_products\n- Reusable business logic for consistent data filtering\n\n**VIEWS** - Simplified interfaces combining dimensions and measures from multiple tables\n- Provide curated data experiences for specific use cases\n- Can be entity-first (customer_360) or metrics-first (monthly_revenue)\n\nKeywords: schema, metadata, data structure, dimensions, measures, segments, views, model structure`\n\n\nexport const slugSchema = z.string({\n description: \"Name of the lens (semantic model slug). Alphanumeric with hyphen(-)s allowed. Make sure slug string contains workspace notation. example: public.customer-360\"\n})\n\nexport const initSchemaTool = ({\n server, apiKey, fqdn, slug: reqSlug\n}: InitParams) => {\n server.tool(\n \"query-lens-schema\",\n description,\n ( reqSlug ? {} : \n {\n slug: slugSchema\n }\n ),\n async ({ slug }): Promise<any> => meta({ slug: reqSlug || slug, payload: {}, apiKey, fqdn })\n )\n}","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { LensOptions, meta } from \"../service.js\"\n\nexport interface InitParams {\n server: McpServer\n apiKey?: string\n fqdn?: string\n slug?: string\n}\n\nexport const initSchemaResource = ({\n server,\n apiKey,\n fqdn,\n slug: reqSlug\n}: InitParams) => {\n\n if(reqSlug) {\n server.resource(\n \"sematic-models\",\n `sematic-models://lenses/${reqSlug}`,\n async (uri): Promise<any> => {\n return fetchMeta({ slug: reqSlug.toString(), href: uri.href, apiKey, fqdn, payload: {} })\n }\n )\n } else {\n server.resource(\n \"sematic-models\",\n new ResourceTemplate(\"sematic-models://lenses/{slug}\", { list: undefined }),\n async (uri, { slug }): Promise<any> => {\n return fetchMeta({ slug: slug.toString(), href: uri.href, apiKey, fqdn, payload: {} })\n }\n )\n }\n}\n\nasync function fetchMeta({ slug, apiKey, fqdn, href }: LensOptions & { href: string }) {\n const result = await meta({ slug: slug.toString(), payload: {}, apiKey, fqdn })\n \n return {\n isError: result.isError,\n contents: result.content.map(({ text }) => ({\n uri: href,\n text\n }))\n }\n}","{\n \"name\": \"@tmdc-solutions/mcp-beta\",\n \"version\": \"0.1.2\",\n \"description\": \"for dataOS related tasks in local\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"main\": \"dist/stdio.cjs\",\n \"types\": \"dist/stdio.d.ts\",\n \"scripts\": {\n \"build\": \"tsc\",\n \"build:stdio\": \"tsup --clean\",\n \"build:modules\": \"tsup --clean\",\n \"http\": \"node dist/src/streamable-http.js -L\",\n \"compile\": \"npm run build && npm run build:css && node dist/src/streamable-http.js -L\",\n \"watch\": \"nodemon --watch src,views -e ts,pug,json,css --exec \\\"npm run compile\\\"\",\n \"build:css\": \"npx @tailwindcss/cli -i app.css -o public/output.css\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"mcp\": \"./dist/stdio.js\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"packageManager\": \"pnpm@10.12.4\",\n \"dependencies\": {\n \"@faker-js/faker\": \"^9.8.0\",\n \"@modelcontextprotocol/sdk\": \"^1.12.0\",\n \"date-fns\": \"^4.1.0\",\n \"dotenv\": \"^16.5.0\",\n \"express\": \"^5.1.0\",\n \"keyv\": \"^5.3.4\",\n \"pug\": \"^3.0.3\",\n \"trino-client\": \"^0.2.9\",\n \"yaml\": \"^2.8.0\",\n \"zod\": \"^3.25.67\",\n \"zod-to-json-schema\": \"^3.24.5\"\n },\n \"devDependencies\": {\n \"@tailwindcss/cli\": \"^4.1.8\",\n \"@total-typescript/tsconfig\": \"^1.0.4\",\n \"@types/express\": \"^5.0.2\",\n \"@types/node\": \"^22.15.21\",\n \"daisyui\": \"^5.0.40\",\n \"nodemon\": \"^3.1.10\",\n \"tailwindcss\": \"^4.1.8\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Bundle in DataOS is a Resource that serves as a declarative and standardized mechanism for deploying a collection of Resources, Data Products, or applications in a single operation. \nIt empowers data developers with the capability to programmatically orchestrate the deployment, scheduling, creation, and dismantling of code and infrastructure resources linked to these Data Products and applications in a unified manner.\n\nA Bundle aggregates various DataOS Resources into a flattened directed acyclic graph (DAG), where each node represents a distinct DataOS Resource, interconnected through dependency relationships.\nExamples: Deploy a complete data pipeline with depot connections, data ingestion workflows, quality checks, and scanners all orchestrated together.\n`\n\n// Cron schedule schema for Bundle scheduling\nconst cronScheduleSchema = z.object({\n cron: z.string({\n description: \"Cron expression for scheduling (5 fields: minute hour day-of-month month day-of-week). Examples: '0 9 * * 1' (every Monday at 9 AM), '*/15 * * * *' (every 15 minutes), '0 0 1 * *' (first day of every month)\"\n })\n})\n\n// Bundle schedule section\nconst bundleScheduleSchema = z.object({\n initialState: z.enum([\"create\", \"delete\"], {\n description: \"Starting condition of the Bundle Resource. 'create' initiates Bundle creation according to the create schedule, 'delete' triggers Bundle deletion according to the delete schedule\"\n }),\n timezone: z.string({\n description: \"Timezone for interpreting the schedule in 'Area/Location' format (e.g., 'Asia/Kolkata', 'America/New_York', 'Europe/Berlin'). Supports daylight savings time rules\"\n }),\n create: z.array(cronScheduleSchema, {\n description: \"List of cron schedules for creating the Bundle Resource. Multiple schedules can be specified for different creation times\"\n }).optional(),\n delete: z.array(cronScheduleSchema, {\n description: \"List of cron schedules for deleting the Bundle Resource. Used when initialState is 'delete' or for cleanup schedules\"\n }).optional()\n})\n\n// Workspace configuration within Bundle\nconst bundleWorkspaceSchema = z.object({\n name: z.string({\n description: \"Workspace name - max 32 chars, pattern: [a-z]([-a-z0-9]*[a-z0-9])? Examples: 'data-platform', 'ml-workspace', 'analytics-dev'\"\n }),\n description: z.string({\n description: \"Human-readable description of the workspace purpose and functionality\"\n }).optional(),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing the workspace. Examples: ['dataproduct', 'production', 'analytics']. Note: DataOS adds system tags like 'dataos:type:workspace'\"\n }).optional(),\n labels: z.record(z.string(), z.string(), {\n description: \"Key-value labels for metadata and organization. Examples: {'environment': 'production', 'team': 'data-engineering'}\"\n }).optional(),\n layer: z.enum([\"user\", \"system\"], {\n description: \"Layer within the User Space - 'user' for user-created workspaces, 'system' for system-managed\"\n })\n})\n\n// Dependency condition schemas\nconst statusConditionSchema = z.object({\n is: z.array(z.string(), {\n description: \"Exact status matches required. Common values: ['active', 'inactive', 'succeeded', 'failed', 'running']\"\n }).optional(),\n contains: z.array(z.string(), {\n description: \"Status contains any of these values (flexible matching). Examples: ['error', 'warning', 'activ'] for partial matches\"\n }).optional()\n})\n\nconst runtimeConditionSchema = z.object({\n is: z.array(z.string(), {\n description: \"Exact runtime state matches. Common values: ['running', 'succeeded', 'failed', 'pending', 'completed']\"\n }).optional(),\n contains: z.array(z.string(), {\n description: \"Runtime state contains any of these values. Examples: ['run', 'complete'] for partial matches\"\n }).optional()\n})\n\nconst dependencyConditionSchema = z.object({\n resourceId: z.string({\n description: \"Unique identifier of the resource this resource depends on (must match an 'id' within the Bundle)\"\n }),\n status: statusConditionSchema.optional(),\n runtime: runtimeConditionSchema.optional()\n})\n\n// Resource specification - can be either inline spec or file reference\nconst bundleResourceSchema = z.object({\n id: z.string({\n description: \"Unique identifier for this resource within the Bundle. Used for creating dependencies between resources in the DAG\"\n }),\n workspace: z.string({\n description: \"Target workspace for deploying Workspace-level resources. Must be a valid workspace name (max 32 chars, pattern: [a-z]([-a-z0-9]*[a-z0-9])?)\"\n }).optional(),\n spec: z.record(z.string(), z.any(), {\n description: \"Inline resource specification - complete DataOS resource manifest (name, version, type, etc.). Alternative to 'file' attribute\"\n }).optional(),\n file: z.string({\n description: \"Path to external resource specification file (YAML). Alternative to 'spec' attribute. Examples: './depot.yaml', '/path/to/workflow.yml'\"\n }).optional(),\n dependencies: z.array(z.string(), {\n description: \"List of resource IDs this resource depends on. Creates edges in the DAG. Resources will wait for dependencies to be ready\"\n }).optional(),\n dependencyConditions: z.array(dependencyConditionSchema, {\n description: \"Advanced dependency conditions with status and runtime checks. If not specified but dependencies exist, defaults to status 'active'\"\n }).optional()\n}).refine(\n (data) => data.spec || data.file,\n {\n message: \"Either 'spec' (inline specification) or 'file' (external file path) must be provided\",\n path: [\"spec\"]\n }\n)\n\n// Main Bundle-specific section\nconst bundleSpecSchema = z.object({\n schedule: bundleScheduleSchema.optional(),\n workspaces: z.array(bundleWorkspaceSchema, {\n description: \"List of new workspaces to create for this Bundle. These workspaces can then be referenced by resources within the Bundle\"\n }).optional(),\n resources: z.array(bundleResourceSchema, {\n description: \"List of DataOS resources that make up this Bundle, organized as a directed acyclic graph (DAG) with dependencies\"\n }),\n properties: z.record(z.string(), z.any(), {\n description: \"Additional custom properties for the Bundle in key-value format. Examples: {'team': 'data-platform', 'cost-center': 'engineering'}\"\n }).optional(),\n manageAsUser: z.string({\n description: \"UserID to manage this Bundle on behalf of. Grants authority to perform operations as that user\"\n }).optional()\n})\n\n// Main tool schema combining resource meta section and bundle-specific section\nconst toolSchema = {\n name: z.string({\n description: \"Bundle name - alphanumeric with hyphens, max 48 chars, pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])? Examples: 'data-pipeline-bundle', 'ml-training-stack'\"\n }),\n version: z.enum([\"v1alpha\", \"v1beta\"], {\n description: \"Bundle manifest version - determines available features and compatibility\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing the Bundle. Examples: ['dataproduct', 'production', 'analytics', 'ml-pipeline']\"\n }).optional(),\n description: z.string({\n description: \"Human-readable description of the Bundle's purpose and contents\"\n }).optional(),\n owner: z.string({\n description: \"Owner of the Bundle resource - typically a UserID or team identifier\"\n }).optional(),\n layer: z.enum([\"user\", \"system\"], {\n description: \"Resource layer - 'user' for user-created bundles, 'system' for system-managed\"\n }).default(\"user\"),\n workspace: z.string({\n description: \"Default workspace for the Bundle (Instance-level). Note: Individual resources can override this with their own workspace settings\"\n }).optional(),\n bundle: bundleSpecSchema,\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-bundle.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the bundle file. example: my-bundle.yaml\"\n })\n}\n\nexport const initBundleTool = (server: McpServer) => {\n server.tool(\n \"create-bundle\",\n description,\n toolSchema,\n async ({\n name, version, tags, description, owner, layer, workspace, bundle, path: p, fileName\n }) => {\n const fileContent = stringify({\n // Resource meta section\n name,\n version,\n type: \"bundle\",\n ...(tags && { tags }),\n ...(description && { description }),\n ...(owner && { owner }),\n layer,\n ...(workspace && { workspace }),\n \n // Bundle-specific section\n bundle\n })\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Bundle file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating bundle file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Data Product in DataOS is a curated, reusable, and governed dataset that provides business value and is designed to be consumed by various applications, analytics, and decision-making processes. \nData Products encapsulate data, metadata, transformation logic, quality checks, and consumption interfaces, making data assets more discoverable, accessible, and trustworthy.\n\nData Products can be versioned (v1alpha, v1beta) and support various inputs, outputs, resources, and consumption ports like Lens (semantic layer) and Talos (APIs).\n`\n\n// Common reference schema for inputs, outputs, and resources\nconst refSchema = z.object({\n description: z.string({\n description: \"Description of the referenced resource or dataset\"\n }).optional(),\n purpose: z.string({\n description: \"Purpose of this reference (e.g., 'source', 'ingestion', 'transformation', 'consumption')\"\n }).optional(),\n refType: z.enum([\"dataos\", \"external\"], {\n description: \"Type of reference - 'dataos' for internal DataOS resources, 'external' for external systems\"\n }),\n ref: z.string({\n description: \"Reference path (e.g., 'dataset:icebase:sales:customers', 'bundle:v1beta:sales-pipeline', 'dataos://s3:bucket/path')\"\n }),\n name: z.string({\n description: \"Name of the resource (for workflow/service references)\"\n }).optional(),\n version: z.string({\n description: \"Version of the referenced resource\"\n }).optional(),\n type: z.string({\n description: \"Type of resource (e.g., 'workflow', 'service', 'dataset')\"\n }).optional(),\n workspace: z.string({\n description: \"Workspace where the resource exists (default: 'public')\"\n }).optional()\n})\n\n// Port schemas for different consumption interfaces\nconst lensPortSchema = z.object({\n ref: z.string({\n description: \"Lens reference (e.g., 'lens:v1alpha:sales-semantic-model:public')\"\n }),\n refType: z.literal(\"dataos\")\n})\n\nconst talosPortSchema = z.object({\n ref: z.string({\n description: \"Talos service reference (e.g., 'service:v1:sales-api:public')\"\n }),\n refType: z.literal(\"dataos\")\n})\n\nconst portsSchema = z.object({\n lens: lensPortSchema.optional(),\n talos: z.union([\n talosPortSchema,\n z.array(talosPortSchema)\n ]).optional()\n}).optional()\n\n// Collaborator schema\nconst collaboratorSchema = z.object({\n name: z.string({\n description: \"DataOS user ID of the collaborator\"\n }),\n description: z.string({\n description: \"Role of the collaborator (e.g., 'developer', 'consumer', 'reviewer', 'domain expert')\"\n })\n})\n\n// Meta information for v1beta\nconst metaSchema = z.object({\n title: z.string({\n description: \"Human-readable title of the data product (e.g., 'Customer 360 Analytics', 'Sales Intelligence Dashboard')\"\n }),\n sourceCodeUrl: z.string({\n description: \"URL to source code repository (e.g., GitHub, Bitbucket, GitLab repository URL)\"\n }).optional(),\n trackerUrl: z.string({\n description: \"URL to issue tracker or project management tool (e.g., Jira, GitHub Issues)\"\n }).optional()\n})\n\n// Use case schema for v1alpha\nconst useCaseSchema = z.array(z.string({\n description: \"Business use cases this data product serves (e.g., 'Customer Segmentation', 'Demand Forecasting', 'Fraud Detection')\"\n}))\n\n// Common schema elements\nconst commonDataProductFields = {\n name: z.string({\n description: \"Data Product name - alphanumeric with hyphens, max 48 chars, pattern: [a-z0-9]([-a-z0-9]*[a-z0-9]) (e.g., 'customer-360-dp', 'sales-analytics')\"\n }),\n version: z.enum([\"v1alpha\", \"v1beta\"], {\n description: \"Data Product version - v1alpha for basic structure, v1beta for enhanced structure with ports\"\n }),\n entity: z.literal(\"product\", {\n description: \"DataOS entity type - always 'product' for data products\"\n }),\n type: z.literal(\"data\", {\n description: \"Product type - always 'data' for data products\"\n }),\n tags: z.array(z.string(), {\n description: \"Categorization tags (e.g., 'DPDomain.Sales', 'DPTier.Gold', 'DPUsecase.Analytics', 'Readiness.Ready to use')\"\n }),\n description: z.string({\n description: \"Comprehensive description of the data product, its purpose, business value, and use cases\"\n }),\n purpose: z.string({\n description: \"Specific purpose and business objective this data product serves\"\n }).optional(),\n owner: z.string({\n description: \"DataOS user ID of the data product owner (person responsible for the data product)\"\n }),\n collaborators: z.array(z.string(), {\n description: \"List of DataOS user IDs who collaborate on this data product (for v1alpha format)\"\n }).optional(),\n refs: z.array(\n z.object({\n title: z.string({\n description: \"Reference title (e.g., 'Dashboard', 'API Documentation', 'Data Dictionary')\"\n }),\n href: z.string({\n description: \"URL to the reference resource\"\n })\n })\n ).optional()\n}\n\n// Version-specific schemas\nconst v1alphaSchema = z.object({\n data: z.object({\n useCases: useCaseSchema.optional(),\n resources: z.array(refSchema).optional(),\n inputs: z.array(refSchema).optional(),\n outputs: z.array(refSchema).optional()\n })\n})\n\nconst v1betaSchema = z.object({\n data: z.object({\n meta: metaSchema,\n collaborators: z.array(collaboratorSchema).optional(),\n relatedDataProducts: z.array(z.string({\n description: \"References to related data products (format: 'data:version:name', e.g., 'data:v1beta:customer-360')\"\n })).optional(),\n resource: z.object({\n description: z.string({\n description: \"Description of the main resource (usually a bundle) that implements this data product\"\n }).optional(),\n purpose: z.string({\n description: \"Purpose of the resource (e.g., 'ingestion', 'transformation', 'data pipeline')\"\n }).optional(),\n refType: z.literal(\"dataos\"),\n ref: z.string({\n description: \"Reference to the main bundle or resource (e.g., 'bundle:v1beta:sales-pipeline')\"\n })\n }),\n inputs: z.array(refSchema).optional(),\n outputs: z.array(refSchema).optional(),\n ports: portsSchema\n })\n})\n\n// Main schema as object with conditional validation\nconst toolSchema = {\n ...commonDataProductFields,\n v1alpha: v1alphaSchema.optional(),\n v1beta: v1betaSchema.optional(),\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-data-product.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the data product file. example: my-data-product.yaml\"\n })\n}\n\nexport const initDataProductTool = (server: McpServer) => {\n server.tool(\n \"create-data-product\",\n description,\n toolSchema,\n async (params) => {\n const { version, v1alpha, v1beta, path: p, fileName, ...commonFields } = params\n\n let versionSpecificContent: any = {}\n \n if (version === \"v1alpha\" && v1alpha) {\n versionSpecificContent = { v1alpha }\n } else if (version === \"v1beta\" && v1beta) {\n versionSpecificContent = { v1beta }\n }\n\n const manifest = {\n ...commonFields,\n ...versionSpecificContent\n }\n\n const fileContent = stringify(manifest)\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Data product file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating data product file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens Manifest is used to deploy Lens resources on DataOS, providing a semantic modeling layer over your data sources. Lens enables business users to access and analyze data through a unified interface while maintaining governance and performance.\n\nLens provides:\n- **Semantic Modeling**: Create logical views of your data with dimensions, measures, and metrics\n- **Multi-Source Support**: Connect to various data sources (Minerva, Themis, Depot, Flash)\n- **Auto-scaling**: Automatically scale API instances based on workload\n- **High Availability**: Distribute workloads across nodes, zones, or regions\n- **Performance Optimization**: Built-in caching and query optimization\n- **Security**: Role-based access control and data governance\n\nKey Components:\n- **API Instance**: Processes incoming requests and connects to databases\n- **Worker**: Manages background refresh and cache invalidation\n- **Router**: Handles query planning and distribution between API and workers\n\nDeployment Features:\n- Support for public and private code repositories\n- Flexible resource allocation (CPU/Memory)\n- Environment variable configuration\n- Auto-scaling based on CPU/Memory utilization\n- High availability across multiple zones/regions`\n\n// Common resource schemas\nconst resourceRequestsSchema = z.object({\n cpu: z.string({\n description: \"CPU request in milliCPU (m) or cores (e.g., '100m', '1', '2000m')\"\n }),\n memory: z.string({\n description: \"Memory request in Mi/Gi (e.g., '256Mi', '1Gi', '2048Mi')\"\n })\n});\n\nconst resourceLimitsSchema = z.object({\n cpu: z.string({\n description: \"CPU limit in milliCPU (m) or cores (e.g., '2000m', '4', '6000m')\"\n }),\n memory: z.string({\n description: \"Memory limit in Mi/Gi (e.g., '2048Mi', '4Gi', '6048Mi')\"\n })\n});\n\nconst resourcesSchema = z.object({\n requests: resourceRequestsSchema.optional(),\n limits: resourceLimitsSchema.optional()\n});\n\n// Log level schema\nconst logLevelSchema = z.enum([\"INFO\", \"WARN\", \"DEBUG\", \"ERROR\"], {\n description: \"Logging level: INFO (general info), WARN (warnings), DEBUG (detailed debug), ERROR (errors only)\"\n});\n\n// Environment variables schema\nconst environmentVariablesSchema = z.record(z.string(), z.union([z.string(), z.number()]), {\n description: \"Environment variables as key-value pairs. Common variables: LENS2_SCHEDULED_REFRESH_TIMEZONES, LENS2_SOURCE_WORKSPACE_NAME, LENS2_DB_TIMEOUT\"\n});\n\n// Secret configuration schema\nconst secretConfigSchema = z.object({\n name: z.string({\n description: \"Name of the Instance Secret resource (e.g., 'bitbucket-r', 'github-cred')\"\n }),\n key: z.string({\n description: \"Specific key to reference from the secret\"\n }).optional(),\n keys: z.array(z.string(), {\n description: \"List of specific keys to reference from the secret\"\n }).optional(),\n allKeys: z.boolean({\n description: \"Whether to use all keys from the secret (default: true for most cases)\"\n }).optional(),\n consumptionType: z.enum([\"envVars\", \"propFile\"], {\n description: \"How the secret should be consumed: 'envVars' (environment variables) or 'propFile' (property file)\"\n }).optional()\n});\n\n// Validate source configuration type and properties combination\nconst validateSourceConfigCombination = (source: any): string | null => {\n const { type, name, catalog } = source;\n \n switch (type) {\n case \"minerva\":\n if (!name) {\n return \"Error: 'minerva' type requires 'name' property with Minerva cluster name.\";\n }\n // catalog is optional for minerva\n break;\n \n case \"themis\":\n if (!name) {\n return \"Error: 'themis' type requires 'name' property with Themis cluster name.\";\n }\n // catalog is optional for themis\n break;\n \n case \"depot\":\n if (!name) {\n return \"Error: 'depot' type requires 'name' property with Depot resource name.\";\n }\n if (catalog) {\n return \"Error: 'depot' type should not have 'catalog' property.\";\n }\n break;\n \n case \"flash\":\n if (!name) {\n return \"Error: 'flash' type requires 'name' property with Flash service name.\";\n }\n if (catalog) {\n return \"Error: 'flash' type should not have 'catalog' property.\";\n }\n break;\n \n default:\n return `Error: Invalid source configuration type '${type}'. Supported types are: minerva, themis, depot, flash.`;\n }\n \n return null; // No validation errors\n};\n\n// Source configuration with linear structure\nconst sourceConfigSchema = z.object({\n type: z.enum([\"minerva\", \"themis\", \"depot\", \"flash\"], {\n description: \"Type of data source: 'minerva' for Minerva clusters, 'themis' for Themis clusters, 'depot' for Depot resources, 'flash' for Flash services\"\n }),\n name: z.string({\n description: \"Name of the source (cluster name for minerva/themis, resource name for depot, service name for flash)\"\n }),\n catalog: z.string({\n description: \"Catalog name for Minerva/Themis (e.g., 'icebase', 'lakehouse')\"\n }).optional()\n});\n\n// Repository configuration schema\nconst repoConfigSchema = z.object({\n url: z.string({\n description: \"Git repository URL containing the Lens model (e.g., 'https://github.com/org/lens-models', 'https://bitbucket.org/team/project')\"\n }).url(),\n lensBaseDir: z.string({\n description: \"Relative path to the Lens model directory in the repository (e.g., 'lens/sales360/model', 'models/customer-analytics')\"\n }),\n secretId: z.string({\n description: \"Secret ID for private repository access (alternative to secrets array)\"\n }).optional(),\n syncFlags: z.array(z.string(), {\n description: \"Additional synchronization flags, typically for branch specification (e.g., ['--ref=main', '--ref=develop'])\"\n }).optional()\n});\n\n// Auto-scaling configuration schema\nconst autoScalingSchema = z.object({\n enabled: z.boolean({\n description: \"Whether auto-scaling is enabled\"\n }).default(true),\n minReplicas: z.number({\n description: \"Minimum number of replicas for auto-scaling\"\n }).int().positive().default(1),\n maxReplicas: z.number({\n description: \"Maximum number of replicas for auto-scaling\"\n }).int().positive(),\n targetMemoryUtilizationPercentage: z.number({\n description: \"Target memory utilization percentage (0-100) that triggers scaling\"\n }).int().min(0).max(100).optional(),\n targetCPUUtilizationPercentage: z.number({\n description: \"Target CPU utilization percentage (0-100) that triggers scaling\"\n }).int().min(0).max(100).default(80)\n});\n\n// High availability configuration schema\nconst highAvailabilityConfigSchema = z.object({\n level: z.enum([\"hostname\", \"zone\", \"region\"], {\n description: \"Distribution level: 'hostname' (separate nodes), 'zone' (multiple zones), 'region' (multiple regions)\"\n }),\n mode: z.enum([\"preferred\", \"required\"], {\n description: \"Distribution mode: 'preferred' (flexible, starts quickly), 'required' (strict, waits for proper distribution)\"\n })\n});\n\n// API configuration schema\nconst apiConfigSchema = z.object({\n replicas: z.number({\n description: \"Number of API instance replicas (recommended: 1 instance per 5-10 requests/second)\"\n }).int().positive().optional(),\n logLevel: logLevelSchema.optional(),\n autoScaling: autoScalingSchema.optional(),\n resources: resourcesSchema.optional(),\n envs: environmentVariablesSchema.optional()\n});\n\n// Worker configuration schema\nconst workerConfigSchema = z.object({\n replicas: z.number({\n description: \"Number of Worker replicas for background processing\"\n }).int().positive().optional(),\n logLevel: logLevelSchema.optional(),\n highAvailabilityConfig: highAvailabilityConfigSchema.optional(),\n resources: resourcesSchema.optional(),\n envs: environmentVariablesSchema.optional()\n});\n\n// Router configuration schema\nconst routerConfigSchema = z.object({\n replicas: z.number({\n description: \"Number of Router instances\"\n }).int().positive().optional(),\n logLevel: logLevelSchema.optional(),\n resources: resourcesSchema.optional(),\n envs: environmentVariablesSchema.optional()\n});\n\n// Lens-specific configuration schema\nconst lensConfigSchema = z.object({\n compute: z.string({\n description: \"Compute Resource name to be used by Lens (e.g., 'runnable-default', 'runnable-large')\"\n }),\n runAsApiKey: z.string({\n description: \"DataOS API key to run as another user (optional, use dataos-ctl user apikey get to obtain)\"\n }).optional(),\n runAsUser: z.string({\n description: \"DataOS User ID to run as (requires proper use-case assignment)\"\n }).optional(),\n secrets: z.array(secretConfigSchema, {\n description: \"List of Instance Secret configurations for private repositories and authentication\"\n }).optional(),\n source: sourceConfigSchema,\n repo: repoConfigSchema,\n api: apiConfigSchema.optional(),\n worker: workerConfigSchema.optional(),\n router: routerConfigSchema.optional()\n});\n\n// Resource meta section schema\nconst resourceMetaSchema = z.object({\n name: z.string({\n description: \"Lens Resource name - alphanumeric with hyphens, max 48 chars (e.g., 'sales-analytics', 'customer-insights')\"\n }),\n version: z.literal(\"v1alpha\", {\n description: \"Lens manifest version (always v1alpha)\"\n }),\n type: z.literal(\"lens\", {\n description: \"Resource type (always lens)\"\n }),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing the Lens resource (e.g., ['analytics', 'sales', 'customer'])\"\n }).optional(),\n description: z.string({\n description: \"Human-readable description of the Lens resource\"\n }).optional(),\n owner: z.string({\n description: \"Owner of the Lens resource (defaults to user deploying the resource)\"\n }).optional(),\n layer: z.enum([\"user\", \"system\"], {\n description: \"DataOS layer where the resource will be deployed\"\n }).default(\"user\")\n});\n\n// Template-based configuration for common deployment patterns\nconst deploymentTemplateSchema = z.enum([\n \"basic\",\n \"production\", \n \"high_availability\",\n \"auto_scaling\",\n \"development\",\n \"custom\"\n], {\n description: \"Deployment template: 'basic' (minimal setup), 'production' (optimized for prod), 'high_availability' (HA setup), 'auto_scaling' (with auto-scaling), 'development' (dev environment), 'custom' (fully custom)\"\n});\n\n// Main tool schema combining resource meta section and lens-specific section\nconst toolSchema = {\n // Resource meta information\n ...resourceMetaSchema.shape,\n \n // Template and customization\n deploymentTemplate: deploymentTemplateSchema.default(\"production\"),\n \n // Lens-specific configuration\n lens: lensConfigSchema,\n \n // Template overrides\n templateOverrides: z.object({\n apiReplicas: z.number().min(1).max(20).optional(),\n workerReplicas: z.number().min(1).max(10).optional(),\n enableAutoScaling: z.boolean().optional(),\n enableHighAvailability: z.boolean().optional(),\n logLevel: logLevelSchema.optional(),\n customResources: z.object({\n api: resourcesSchema.optional(),\n worker: resourcesSchema.optional(),\n router: resourcesSchema.optional()\n }).optional()\n }).optional(),\n \n // Output preferences\n includeComments: z.boolean().default(true).describe(\"Whether to include helpful comments in the generated YAML\"),\n workspace: z.string().optional(),\n additionalComments: z.string().optional().describe(\"Additional custom comments to include in the output\"),\n \n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-lens.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the lens manifest file. example: my-lens.yaml\"\n })\n}\n\nexport const initLensManifestTool = (server: McpServer) => {\n server.tool(\n \"create-lens-manifest\",\n description,\n toolSchema,\n async ({\n name, version, type, tags, description, owner, layer, deploymentTemplate,\n lens, templateOverrides, workspace, path: p, fileName\n }) => {\n \n // Validate source configuration\n const validationError = validateSourceConfigCombination(lens.source);\n if (validationError) {\n return {\n content: [{\n type: \"text\",\n text: validationError\n }]\n };\n }\n\n const applyTemplate = (template: string, lensConfig: any) => {\n const config = { ...lensConfig };\n \n // Apply template-based defaults\n switch (template) {\n case \"basic\":\n config.api = {\n replicas: 1,\n logLevel: \"INFO\",\n resources: {\n requests: { cpu: \"100m\", memory: \"256Mi\" },\n limits: { cpu: \"1000m\", memory: \"512Mi\" }\n }\n };\n break;\n \n case \"production\":\n config.api = {\n replicas: 3,\n logLevel: \"WARN\",\n autoScaling: {\n enabled: true,\n minReplicas: 2,\n maxReplicas: 10,\n targetCPUUtilizationPercentage: 70\n },\n resources: {\n requests: { cpu: \"500m\", memory: \"1Gi\" },\n limits: { cpu: \"2000m\", memory: \"2Gi\" }\n }\n };\n config.worker = {\n replicas: 2,\n logLevel: \"WARN\",\n resources: {\n requests: { cpu: \"200m\", memory: \"512Mi\" },\n limits: { cpu: \"1000m\", memory: \"1Gi\" }\n }\n };\n break;\n \n case \"high_availability\":\n config.api = {\n replicas: 5,\n logLevel: \"INFO\",\n autoScaling: {\n enabled: true,\n minReplicas: 3,\n maxReplicas: 15,\n targetCPUUtilizationPercentage: 60\n },\n resources: {\n requests: { cpu: \"500m\", memory: \"1Gi\" },\n limits: { cpu: \"2000m\", memory: \"2Gi\" }\n }\n };\n config.worker = {\n replicas: 3,\n logLevel: \"INFO\",\n highAvailabilityConfig: {\n level: \"zone\",\n mode: \"preferred\"\n },\n resources: {\n requests: { cpu: \"300m\", memory: \"512Mi\" },\n limits: { cpu: \"1000m\", memory: \"1Gi\" }\n }\n };\n config.router = {\n replicas: 2,\n logLevel: \"INFO\",\n resources: {\n requests: { cpu: \"100m\", memory: \"256Mi\" },\n limits: { cpu: \"500m\", memory: \"512Mi\" }\n }\n };\n break;\n \n case \"auto_scaling\":\n config.api = {\n replicas: 2,\n logLevel: \"INFO\",\n autoScaling: {\n enabled: true,\n minReplicas: 1,\n maxReplicas: 20,\n targetCPUUtilizationPercentage: 80,\n targetMemoryUtilizationPercentage: 75\n },\n resources: {\n requests: { cpu: \"250m\", memory: \"512Mi\" },\n limits: { cpu: \"1500m\", memory: \"1Gi\" }\n }\n };\n config.worker = {\n replicas: 1,\n logLevel: \"INFO\",\n resources: {\n requests: { cpu: \"200m\", memory: \"256Mi\" },\n limits: { cpu: \"800m\", memory: \"512Mi\" }\n }\n };\n break;\n \n case \"development\":\n config.api = {\n replicas: 1,\n logLevel: \"DEBUG\",\n resources: {\n requests: { cpu: \"100m\", memory: \"256Mi\" },\n limits: { cpu: \"500m\", memory: \"512Mi\" }\n }\n };\n break;\n \n case \"custom\":\n // No defaults applied - fully custom configuration\n break;\n }\n \n // Apply template overrides\n if (templateOverrides) {\n if (templateOverrides.apiReplicas) {\n config.api = config.api || {};\n config.api.replicas = templateOverrides.apiReplicas;\n }\n if (templateOverrides.workerReplicas) {\n config.worker = config.worker || {};\n config.worker.replicas = templateOverrides.workerReplicas;\n }\n if (templateOverrides.enableAutoScaling) {\n config.api = config.api || {};\n config.api.autoScaling = config.api.autoScaling || {};\n config.api.autoScaling.enabled = templateOverrides.enableAutoScaling;\n }\n if (templateOverrides.enableHighAvailability) {\n config.worker = config.worker || {};\n config.worker.highAvailabilityConfig = config.worker.highAvailabilityConfig || {\n level: \"zone\",\n mode: \"preferred\"\n };\n }\n if (templateOverrides.logLevel) {\n if (config.api) config.api.logLevel = templateOverrides.logLevel;\n if (config.worker) config.worker.logLevel = templateOverrides.logLevel;\n if (config.router) config.router.logLevel = templateOverrides.logLevel;\n }\n if (templateOverrides.customResources) {\n if (templateOverrides.customResources.api) {\n config.api = config.api || {};\n config.api.resources = templateOverrides.customResources.api;\n }\n if (templateOverrides.customResources.worker) {\n config.worker = config.worker || {};\n config.worker.resources = templateOverrides.customResources.worker;\n }\n if (templateOverrides.customResources.router) {\n config.router = config.router || {};\n config.router.resources = templateOverrides.customResources.router;\n }\n }\n }\n \n return config;\n };\n \n // Apply template to lens configuration\n const finalLensConfig = applyTemplate(deploymentTemplate, lens);\n \n // Build the manifest\n const manifest = {\n name,\n version,\n type,\n ...(tags && { tags }),\n ...(description && { description }),\n ...(owner && { owner }),\n layer,\n lens: finalLensConfig,\n ...(workspace && { workspace })\n };\n \n const fileContent = stringify(manifest);\n \n // Generate helpful comments\n const generateComments = (): string => {\n const comments = [\n \"# Lens Manifest for DataOS\",\n `# This manifest deploys a Lens semantic layer using the '${deploymentTemplate}' template`,\n \"# \",\n \"# Lens provides a unified semantic modeling layer over your data sources\",\n \"# Key components:\",\n \"# - API: Processes queries and connects to data sources\",\n \"# - Worker: Manages background tasks and cache invalidation\",\n \"# - Router: Handles query planning and distribution\",\n \"# \",\n `# Source Configuration: ${finalLensConfig.source.type} (${finalLensConfig.source.name})`,\n `# Repository: ${finalLensConfig.repo.url}`,\n `# Model Path: ${finalLensConfig.repo.lensBaseDir}`,\n \"# \",\n \"# Deployment Details:\",\n `# - Template: ${deploymentTemplate}`,\n ...(finalLensConfig.api ? [`# - API Replicas: ${finalLensConfig.api.replicas || 'default'}`] : []),\n ...(finalLensConfig.worker ? [`# - Worker Replicas: ${finalLensConfig.worker.replicas || 'default'}`] : []),\n ...(finalLensConfig.router ? [`# - Router Replicas: ${finalLensConfig.router.replicas || 'default'}`] : []),\n ...(finalLensConfig.api?.autoScaling?.enabled ? [\"# - Auto-scaling: Enabled\"] : []),\n ...(finalLensConfig.worker?.highAvailabilityConfig ? [\"# - High Availability: Enabled\"] : []),\n \"# \",\n \"# For more information: https://dataos.info/resources/lens/\",\n \"\"\n ];\n \n return comments.join(\"\\n\");\n };\n \n const commentedContent = generateComments() + fileContent;\n \n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`;\n \n const directory = path.dirname(fullPath);\n \n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true });\n }\n \n writeFileSync(fullPath, commentedContent);\n \n return {\n content: [\n {\n type: \"text\",\n text: `Lens manifest created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `Template: ${deploymentTemplate}`\n },\n {\n type: \"text\",\n text: `Source: ${finalLensConfig.source.type} (${finalLensConfig.source.name})`\n },\n {\n type: \"text\",\n text: `File content:\\n${commentedContent}`\n }\n ]\n };\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens manifest: ${error}`\n }]\n };\n }\n }\n );\n}; ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens SQL Tool for preparing view models in DataOS Lens semantic layer using SQL selections and filters.\nThis tool helps create SQL queries for Lens model views that reference dimensions, measures, and segments from multiple logical tables.\n\nLens operates as a logical modeling layer for accessing tabular data in data warehouses/lakehouses, extending physical tables into logical tables with measures and relationships.\nExamples: Create entity-first views (customer profiles, product analytics) or metrics-first views (conversion rates, revenue tracking) with proper SQL selections and joins.\n`\n\n// Common SQL data types for Lens\nconst sqlDataTypeSchema = z.enum([\n \"string\", \"number\", \"time\", \"boolean\", \"date\", \"timestamp\"\n], {\n description: \"SQL data type for dimensions and measures in Lens models\"\n})\n\n// Aggregation types for measures\nconst measureTypeSchema = z.enum([\n \"count\", \"count_distinct\", \"count_distinct_approx\", \"sum\", \"avg\", \"min\", \"max\", \"string\", \"number\", \"boolean\"\n], {\n description: \"Measure aggregation type - count/sum/avg for numerical aggregations, string/number/boolean for calculated measures\"\n})\n\n// Relationship types for joins\nconst relationshipTypeSchema = z.enum([\n \"one_to_one\", \"one_to_many\", \"many_to_one\"\n], {\n description: \"Join relationship type between tables - one_to_one (1:1), one_to_many (1:N), many_to_one (N:1)\"\n})\n\n// View types for different modeling approaches\nconst viewTypeSchema = z.enum([\n \"entity_first\", \"metrics_first\"\n], {\n description: \"View modeling approach - entity_first (focus on entity attributes), metrics_first (focus on specific metrics with time dimensions)\"\n})\n\n// SQL join condition schema\nconst joinConditionSchema = z.object({\n baseTable: z.string({\n description: \"Base table name for the join (left side of join). Examples: 'customer', 'sales', 'product'\"\n }),\n baseColumn: z.string({\n description: \"Column name in base table for join condition. Examples: 'customer_id', 'product_id', 'order_id'\"\n }),\n targetTable: z.string({\n description: \"Target table name for the join (right side of join). Examples: 'orders', 'transactions', 'inventory'\"\n }),\n targetColumn: z.string({\n description: \"Column name in target table for join condition. Examples: 'customer_id', 'product_id', 'order_id'\"\n })\n})\n\n// Column selection for views\nconst columnSelectionSchema = z.object({\n tableName: z.string({\n description: \"Source table name containing the column. Examples: 'customer', 'sales', 'product'\"\n }),\n columnName: z.string({\n description: \"Column name to select from the table. Examples: 'customer_id', 'product_name', 'order_date'\"\n }),\n alias: z.string({\n description: \"Optional alias for the column in the view. Examples: 'customer_identifier', 'product_title', 'purchase_date'\"\n }).optional(),\n dataType: sqlDataTypeSchema,\n isPrimaryKey: z.boolean({\n description: \"Whether this column serves as a primary key for the entity\"\n }).default(false),\n isRequired: z.boolean({\n description: \"Whether this column is required (NOT NULL) in the view\"\n }).default(true)\n})\n\n// Calculated field/measure definition\nconst calculatedFieldSchema = z.object({\n name: z.string({\n description: \"Name of the calculated field. Examples: 'total_revenue', 'customer_lifetime_value', 'avg_order_value'\"\n }),\n expression: z.string({\n description: \"SQL expression for the calculation. Examples: 'SUM(order_amount)', 'COUNT(DISTINCT customer_id)', 'AVG(product_price * quantity)'\"\n }),\n dataType: sqlDataTypeSchema,\n measureType: measureTypeSchema.optional(),\n description: z.string({\n description: \"Business description of what this calculated field represents\"\n }).optional()\n})\n\n// WHERE condition for filtering\nconst whereConditionSchema = z.object({\n column: z.string({\n description: \"Column name for the condition. Examples: 'status', 'created_date', 'region'\"\n }),\n operator: z.enum([\n \"=\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IN\", \"NOT IN\", \"LIKE\", \"NOT LIKE\", \n \"IS NULL\", \"IS NOT NULL\", \"BETWEEN\", \"EXISTS\", \"NOT EXISTS\"\n ], {\n description: \"SQL comparison operator for the condition\"\n }),\n value: z.union([z.string(), z.number(), z.array(z.union([z.string(), z.number()]))], {\n description: \"Value(s) for the condition. Can be single value, array for IN/NOT IN, or range for BETWEEN\"\n }).optional(),\n logicalOperator: z.enum([\"AND\", \"OR\"], {\n description: \"Logical operator to combine with next condition\"\n }).optional()\n})\n\n// GROUP BY specification\nconst groupBySchema = z.object({\n columns: z.array(z.string(), {\n description: \"Column names to group by. Examples: ['region', 'product_category'], ['customer_segment'], ['date_trunc(\\\\'month\\\\', order_date)']\"\n }),\n having: z.array(whereConditionSchema, {\n description: \"HAVING conditions for filtering grouped results (applied after GROUP BY)\"\n }).optional()\n})\n\n// ORDER BY specification\nconst orderBySchema = z.object({\n column: z.string({\n description: \"Column name to order by. Examples: 'total_revenue', 'customer_name', 'order_date'\"\n }),\n direction: z.enum([\"ASC\", \"DESC\"], {\n description: \"Sort direction - ASC (ascending) or DESC (descending)\"\n }).default(\"ASC\")\n})\n\n// Main view SQL generation schema\nconst lensViewSqlSchema = z.object({\n viewName: z.string({\n description: \"Name of the Lens view to create. Examples: 'customer_360', 'sales_metrics', 'product_performance'\"\n }),\n viewType: viewTypeSchema,\n description: z.string({\n description: \"Business description of the view's purpose and use case\"\n }),\n \n // Table and join configuration\n baseTables: z.array(z.string(), {\n description: \"Primary tables for the view. Examples: ['customer', 'orders'], ['sales', 'product'], ['transactions']\"\n }),\n joins: z.array(joinConditionSchema, {\n description: \"Join conditions between tables. All joins in Lens are LEFT JOINs by default\"\n }).optional(),\n \n // Column selections\n dimensions: z.array(columnSelectionSchema, {\n description: \"Dimensional columns (descriptive attributes) to include in the view. Examples: customer_name, product_category, region\"\n }),\n measures: z.array(calculatedFieldSchema, {\n description: \"Calculated measures (aggregated values) for the view. Examples: total_sales, customer_count, avg_order_value\"\n }).optional(),\n \n // Query conditions\n whereConditions: z.array(whereConditionSchema, {\n description: \"WHERE conditions to filter the data. Examples: status = 'active', created_date > '2023-01-01'\"\n }).optional(),\n groupBy: groupBySchema.optional(),\n orderBy: z.array(orderBySchema, {\n description: \"ORDER BY specifications for result sorting\"\n }).optional(),\n \n // Query limits\n limit: z.number({\n description: \"Maximum number of rows to return. Examples: 1000, 10000\"\n }).optional(),\n \n // Time-based filtering (for metrics-first views)\n timeFilter: z.object({\n timeColumn: z.string({\n description: \"Time/date column for filtering. Examples: 'created_date', 'order_timestamp', 'updated_at'\"\n }),\n granularity: z.enum([\n \"second\", \"minute\", \"hour\", \"day\", \"week\", \"month\", \"quarter\", \"year\"\n ], {\n description: \"Time granularity for grouping time-based data\"\n }).optional(),\n range: z.string({\n description: \"Time range filter. Examples: 'last 30 days', 'this month', 'last quarter', '2023-01-01 to 2023-12-31'\"\n }).optional()\n }).optional(),\n \n // Advanced options\n includeNulls: z.boolean({\n description: \"Whether to include NULL values in results\"\n }).default(true),\n distinct: z.boolean({\n description: \"Whether to apply DISTINCT to the entire result set\"\n }).default(false)\n})\n\nconst toolSchema = {\n viewConfig: lensViewSqlSchema,\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-lens-sql.sql\"\n }),\n fileName: z.string({\n description: \"File name for the lens SQL file. example: my-lens-sql.sql\"\n })\n}\n\n// Helper function to generate JOIN clauses\nfunction generateJoinClause(joins: Array<{baseTable?: string, baseColumn?: string, targetTable?: string, targetColumn?: string}>): string {\n const joinClauses = joins.map(join => \n `LEFT JOIN ${join.targetTable} ON ${join.baseTable}.${join.baseColumn} = ${join.targetTable}.${join.targetColumn}`\n );\n return joinClauses.join('\\n ');\n}\n\n// Helper function to generate WHERE clause\nfunction generateWhereClause(conditions: Array<{column?: string, operator?: string, value?: any, logicalOperator?: string}>): string {\n if (!conditions.length) return '';\n \n const clauses = conditions.map((condition, index) => {\n let clause = '';\n \n // Add logical operator for non-first conditions\n if (index > 0 && condition.logicalOperator) {\n clause += `${condition.logicalOperator} `;\n }\n \n // Generate condition based on operator\n switch (condition.operator) {\n case 'IS NULL':\n case 'IS NOT NULL':\n clause += `${condition.column} ${condition.operator}`;\n break;\n case 'IN':\n case 'NOT IN':\n const values = Array.isArray(condition.value) ? condition.value : [condition.value];\n const formattedValues = values.map(v => typeof v === 'string' ? `'${v}'` : v).join(', ');\n clause += `${condition.column} ${condition.operator} (${formattedValues})`;\n break;\n case 'BETWEEN':\n if (Array.isArray(condition.value) && condition.value.length === 2) {\n clause += `${condition.column} BETWEEN ${condition.value[0]} AND ${condition.value[1]}`;\n }\n break;\n case 'LIKE':\n case 'NOT LIKE':\n clause += `${condition.column} ${condition.operator} '${condition.value}'`;\n break;\n default:\n const formattedValue = typeof condition.value === 'string' ? `'${condition.value}'` : condition.value;\n clause += `${condition.column} ${condition.operator} ${formattedValue}`;\n }\n \n return clause;\n });\n \n return `WHERE ${clauses.join(' ')}`;\n}\n\n// Helper function to generate SELECT clause\nfunction generateSelectClause(dimensions: Array<{tableName?: string, columnName?: string, alias?: string}>, measures?: Array<{name?: string, expression?: string}>): string {\n const dimensionCols = dimensions.map(dim => {\n const fullColumn = `${dim.tableName}.${dim.columnName}`;\n return dim.alias ? `${fullColumn} AS ${dim.alias}` : fullColumn;\n });\n \n const measureCols = measures?.map(measure => `${measure.expression} AS ${measure.name}`) || [];\n \n const allColumns = [...dimensionCols, ...measureCols];\n return allColumns.join(',\\n ');\n}\n\nexport const initLensSqlTool = (server: McpServer) => {\n server.tool(\n \"create-lens-sql\",\n description,\n toolSchema,\n async ({ viewConfig, path: p, fileName }) => {\n const {\n viewName,\n viewType,\n description: viewDescription,\n baseTables,\n joins = [],\n dimensions,\n measures = [],\n whereConditions = [],\n groupBy,\n orderBy = [],\n limit,\n timeFilter,\n includeNulls,\n distinct\n } = viewConfig;\n\n // Generate SQL components\n const selectClause = generateSelectClause(dimensions, measures);\n const fromClause = baseTables[0]; // Primary table\n const joinClause = joins.length > 0 ? generateJoinClause(joins) : '';\n const whereClause = whereConditions.length > 0 ? generateWhereClause(whereConditions) : '';\n \n // Generate GROUP BY clause\n let groupByClause = '';\n if (groupBy) {\n groupByClause = `GROUP BY ${groupBy.columns.join(', ')}`;\n if (groupBy.having && groupBy.having.length > 0) {\n const havingClause = generateWhereClause(groupBy.having).replace('WHERE', 'HAVING');\n groupByClause += `\\n${havingClause}`;\n }\n }\n \n // Generate ORDER BY clause\n const orderByClause = orderBy.length > 0 \n ? `ORDER BY ${orderBy.map(o => `${o.column} ${o.direction}`).join(', ')}`\n : '';\n \n // Generate LIMIT clause\n const limitClause = limit ? `LIMIT ${limit}` : '';\n \n // Add time filter to WHERE conditions if specified\n let timeFilterClause = '';\n if (timeFilter) {\n const timeConditions: string[] = [];\n if (timeFilter.range) {\n // Parse common time range patterns\n if (timeFilter.range.includes('last') && timeFilter.range.includes('days')) {\n const days = timeFilter.range.match(/\\d+/)?.[0] || '30';\n timeConditions.push(`${timeFilter.timeColumn} >= CURRENT_DATE - INTERVAL '${days}' DAY`);\n } else if (timeFilter.range.includes('this month')) {\n timeConditions.push(`${timeFilter.timeColumn} >= DATE_TRUNC('month', CURRENT_DATE)`);\n } else if (timeFilter.range.includes('last quarter')) {\n timeConditions.push(`${timeFilter.timeColumn} >= DATE_TRUNC('quarter', CURRENT_DATE) - INTERVAL '3' MONTH`);\n } else if (timeFilter.range.includes(' to ')) {\n const [start, end] = timeFilter.range.split(' to ');\n timeConditions.push(`${timeFilter.timeColumn} BETWEEN '${start.trim()}' AND '${end.trim()}'`);\n }\n }\n \n if (timeConditions.length > 0) {\n timeFilterClause = timeConditions.join(' AND ');\n }\n }\n \n // Combine WHERE and time filter conditions\n let finalWhereClause = '';\n if (whereClause && timeFilterClause) {\n finalWhereClause = `${whereClause} AND ${timeFilterClause}`;\n } else if (whereClause) {\n finalWhereClause = whereClause;\n } else if (timeFilterClause) {\n finalWhereClause = `WHERE ${timeFilterClause}`;\n }\n \n // Build the complete SQL query\n const sqlParts: string[] = [\n `-- Lens View: ${viewName}`,\n `-- Type: ${viewType}`,\n `-- Description: ${viewDescription}`,\n '',\n `SELECT${distinct ? ' DISTINCT' : ''}`,\n ` ${selectClause}`,\n `FROM ${fromClause}`,\n joinClause,\n finalWhereClause,\n groupByClause,\n orderByClause,\n limitClause\n ].filter(part => part.trim() !== '');\n \n const finalSql = sqlParts.join('\\n');\n \n // Add metadata comments for Lens model usage\n const lensMetadata: string[] = [\n '',\n '-- Lens Model Integration Notes:',\n `-- 1. Save this SQL as: sqls/${viewName}.sql`,\n `-- 2. Reference in table YAML: sql: {{ load_sql('${viewName}') }}`,\n `-- 3. View type: ${viewType}`,\n viewType === 'metrics_first' \n ? '-- 4. For metrics-first views, focus on single measure with time dimension'\n : '-- 4. For entity-first views, include comprehensive entity attributes',\n '-- 5. Define dimensions and measures in the table YAML manifest',\n timeFilter?.granularity \n ? `-- 6. Time granularity: ${timeFilter.granularity}`\n : '',\n '-- 7. All joins are LEFT JOINs in Lens by default'\n ].filter(line => line !== '');\n \n const fileContent = finalSql + '\\n' + lensMetadata.join('\\n');\n\n try {\n const fullPath = (p.includes(\".sql\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Lens SQL file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens SQL file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens Segments are reusable filters defined in the segment section within table manifests of the semantic model. They allow stakeholders to apply common filtering logic consistently across multiple queries, similar to how a WHERE clause works in SQL.\n\nSegments are essential for:\n- **Reusable Filtering**: Apply the same filter conditions across multiple queries and dashboards\n- **Data Governance**: Enforce row-level security and data access policies\n- **Performance**: Pre-defined filters that can be optimized by the query engine\n- **Consistency**: Ensure consistent business logic across different analyses\n\nKey Features:\n- SQL-based filter expressions using {TABLE} placeholder\n- Support for complex logical operations (AND, OR, LIKE, IN)\n- User group-based security policies\n- Row-level data access control\n- Integration with Lens views and queries\n\nUse segments when you notice the same filter conditions being applied repeatedly across multiple queries or dashboards.`\n\n// User group security schema\nconst userGroupSecuritySchema = z.object({\n includes: z.union([\n z.literal(\"*\"),\n z.array(z.string(), {\n description: \"List of user groups to include. Use specific group names (e.g., ['data_analyst', 'data_scientist']) or '*' for all users\"\n })\n ], {\n description: \"User groups that should have access to this segment. Use '*' for all users or specify group names\"\n }),\n excludes: z.array(z.string(), {\n description: \"List of user groups to exclude from access (e.g., ['reader', 'guest'])\"\n }).optional()\n});\n\n// Meta security configuration schema\nconst segmentSecuritySchema = z.object({\n user_groups: userGroupSecuritySchema.describe(\"User group access control configuration for row-level security\")\n});\n\n// Meta configuration schema for segments\nconst segmentMetaSchema = z.object({\n secure: segmentSecuritySchema.optional(),\n tags: z.array(z.string(), {\n description: \"Tags for categorizing and organizing segments (e.g., ['geography', 'sales', 'security'])\"\n }).optional(),\n description: z.string({\n description: \"Additional metadata description for the segment\"\n }).optional()\n});\n\n// SQL expression patterns for common segment types\nconst sqlExpressionSchema = z.string({\n description: `SQL filter expression using {TABLE} placeholder. Examples:\n - Simple equality: \"{TABLE}.state = 'California'\"\n - Multiple values with OR: \"{TABLE}.state = 'Illinois' OR {TABLE}.state = 'Ohio'\"\n - IN operator: \"{TABLE}.state IN ('Illinois', 'Ohio', 'California')\"\n - LIKE pattern: \"{TABLE}.state LIKE '%York%'\"\n - Complex AND/OR: \"{TABLE}.state = 'Illinois' AND {TABLE}.sales > 1000\"\n - Date ranges: \"{TABLE}.order_date >= '2023-01-01'\"\n - Null checks: \"{TABLE}.email IS NOT NULL\"`\n});\n\n// Individual segment schema\nconst segmentSchema = z.object({\n name: z.string({\n description: \"Segment name - should be descriptive and follow naming conventions (e.g., 'active_customers', 'high_value_orders', 'california_sales')\"\n }),\n sql: sqlExpressionSchema,\n public: z.boolean({\n description: \"Whether the segment is publicly visible to all users or restricted\"\n }).default(true),\n description: z.string({\n description: \"Human-readable description of what this segment filters (e.g., 'Filters for customers with active status and recent purchases')\"\n }).optional(),\n meta: segmentMetaSchema.optional()\n});\n\n// Predefined segment templates for common use cases\nconst segmentTemplateSchema = z.enum([\n \"geographic_filter\",\n \"date_range_filter\", \n \"status_filter\",\n \"category_filter\",\n \"value_range_filter\",\n \"null_check_filter\",\n \"pattern_match_filter\",\n \"custom\"\n], {\n description: \"Predefined templates for common segment patterns. Choose 'custom' for fully custom segments\"\n});\n\n// Validate template configuration combination\nconst validateTemplateConfigCombination = (config: any): string | null => {\n const { template, column, values, operator, startDate, endDate, minValue, maxValue, checkType, pattern, sql } = config;\n \n switch (template) {\n case \"geographic_filter\":\n if (!column) {\n return \"Error: 'geographic_filter' template requires 'column' property.\";\n }\n if (!values || values.length === 0) {\n return \"Error: 'geographic_filter' template requires 'values' property with geographic values.\";\n }\n if (startDate || endDate || minValue || maxValue || checkType || pattern || sql) {\n return \"Error: 'geographic_filter' template should only have 'column', 'values', and 'operator' properties.\";\n }\n break;\n \n case \"date_range_filter\":\n if (!column) {\n return \"Error: 'date_range_filter' template requires 'column' property.\";\n }\n if (!startDate && !endDate) {\n return \"Error: 'date_range_filter' template requires either 'startDate' or 'endDate' property.\";\n }\n if (values || minValue || maxValue || checkType || pattern || sql) {\n return \"Error: 'date_range_filter' template should only have 'column', 'startDate', 'endDate', and 'operator' properties.\";\n }\n break;\n \n case \"status_filter\":\n if (!column) {\n return \"Error: 'status_filter' template requires 'column' property.\";\n }\n if (!values || values.length === 0) {\n return \"Error: 'status_filter' template requires 'values' property with status values.\";\n }\n if (startDate || endDate || minValue || maxValue || checkType || pattern || sql) {\n return \"Error: 'status_filter' template should only have 'column', 'values', and 'operator' properties.\";\n }\n break;\n \n case \"category_filter\":\n if (!column) {\n return \"Error: 'category_filter' template requires 'column' property.\";\n }\n if (!values || values.length === 0) {\n return \"Error: 'category_filter' template requires 'values' property with category values.\";\n }\n if (startDate || endDate || minValue || maxValue || checkType || pattern || sql) {\n return \"Error: 'category_filter' template should only have 'column', 'values', and 'operator' properties.\";\n }\n break;\n \n case \"value_range_filter\":\n if (!column) {\n return \"Error: 'value_range_filter' template requires 'column' property.\";\n }\n if (!minValue && !maxValue) {\n return \"Error: 'value_range_filter' template requires either 'minValue' or 'maxValue' property.\";\n }\n if (values || startDate || endDate || checkType || pattern || sql) {\n return \"Error: 'value_range_filter' template should only have 'column', 'minValue', 'maxValue', and 'operator' properties.\";\n }\n break;\n \n case \"null_check_filter\":\n if (!column) {\n return \"Error: 'null_check_filter' template requires 'column' property.\";\n }\n if (!checkType) {\n return \"Error: 'null_check_filter' template requires 'checkType' property.\";\n }\n if (values || operator || startDate || endDate || minValue || maxValue || pattern || sql) {\n return \"Error: 'null_check_filter' template should only have 'column' and 'checkType' properties.\";\n }\n break;\n \n case \"pattern_match_filter\":\n if (!column) {\n return \"Error: 'pattern_match_filter' template requires 'column' property.\";\n }\n if (!pattern) {\n return \"Error: 'pattern_match_filter' template requires 'pattern' property.\";\n }\n if (values || startDate || endDate || minValue || maxValue || checkType || sql) {\n return \"Error: 'pattern_match_filter' template should only have 'column', 'pattern', and 'operator' properties.\";\n }\n break;\n \n case \"custom\":\n if (!sql) {\n return \"Error: 'custom' template requires 'sql' property with SQL expression.\";\n }\n if (column || values || operator || startDate || endDate || minValue || maxValue || checkType || pattern) {\n return \"Error: 'custom' template should only have 'sql' property.\";\n }\n break;\n \n default:\n return `Error: Invalid template type '${template}'. Supported types are: geographic_filter, date_range_filter, status_filter, category_filter, value_range_filter, null_check_filter, pattern_match_filter, custom.`;\n }\n \n return null; // No validation errors\n};\n\n// Template-specific configuration with linear structure\nconst templateConfigSchema = z.object({\n template: segmentTemplateSchema,\n \n // Common properties\n column: z.string({\n description: \"Column name for the filter\"\n }).optional(),\n operator: z.enum([\"=\", \"!=\", \">\", \">=\", \"<\", \"<=\", \"BETWEEN\", \"IN\", \"NOT IN\", \"LIKE\", \"NOT LIKE\", \"ILIKE\"], {\n description: \"SQL operator to use for filtering\"\n }).optional(),\n \n // Geographic and category filter properties\n values: z.array(z.string(), {\n description: \"Values to filter for (geographic, status, or category values)\"\n }).optional(),\n \n // Date range filter properties\n startDate: z.string({\n description: \"Start date in YYYY-MM-DD format (e.g., '2023-01-01')\"\n }).optional(),\n endDate: z.string({\n description: \"End date in YYYY-MM-DD format (e.g., '2023-12-31')\"\n }).optional(),\n \n // Value range filter properties\n minValue: z.number({\n description: \"Minimum value for the range\"\n }).optional(),\n maxValue: z.number({\n description: \"Maximum value for the range\"\n }).optional(),\n \n // Null check filter properties\n checkType: z.enum([\"IS NULL\", \"IS NOT NULL\"], {\n description: \"Type of null check to perform\"\n }).optional(),\n \n // Pattern match filter properties\n pattern: z.string({\n description: \"Pattern to match (e.g., '%@gmail.com', 'Mr.%', '%premium%')\"\n }).optional(),\n \n // Custom template properties\n sql: sqlExpressionSchema.optional()\n});\n\n// Main segment configuration schema\nconst segmentConfigSchema = z.object({\n segmentType: z.enum([\"template\", \"custom\"], {\n description: \"Whether to use a predefined template or create a custom segment\"\n }).default(\"custom\"),\n \n // Basic segment properties\n name: z.string({\n description: \"Segment name - descriptive identifier for the segment\"\n }),\n description: z.string({\n description: \"Human-readable description of the segment's purpose\"\n }).optional(),\n public: z.boolean({\n description: \"Whether the segment is publicly accessible\"\n }).default(true),\n \n // Template configuration (for template type)\n templateConfig: templateConfigSchema.optional(),\n \n // Custom SQL (for custom type)\n sql: sqlExpressionSchema.optional(),\n \n // Security and metadata\n security: z.object({\n enabled: z.boolean({\n description: \"Whether to enable user group-based security for this segment\"\n }).default(false),\n includeGroups: z.union([\n z.literal(\"*\"),\n z.array(z.string())\n ], {\n description: \"User groups to include. Use '*' for all users or specify group names\"\n }).optional(),\n excludeGroups: z.array(z.string(), {\n description: \"User groups to exclude from access\"\n }).optional()\n }).optional(),\n \n meta: z.object({\n tags: z.array(z.string()).optional(),\n customProperties: z.record(z.string(), z.any()).optional()\n }).optional()\n});\n\nconst toolSchema = {\n configurationType: z.enum([\"single\", \"multiple\", \"bulk_template\"], {\n description: \"Configuration type: 'single' for one segment, 'multiple' for several segments, 'bulk_template' for template-based generation\"\n }),\n \n // Single segment configuration\n segment: segmentConfigSchema.optional(),\n \n // Multiple segments configuration\n segments: z.array(segmentConfigSchema, {\n description: \"Array of segment configurations\"\n }).optional(),\n \n // Bulk template configuration\n bulkTemplate: z.object({\n baseTemplate: segmentTemplateSchema,\n variations: z.array(z.object({\n name: z.string({\n description: \"Name of the segment variation\"\n }),\n values: z.array(z.string(), {\n description: \"Values for this variation\"\n }).optional(),\n customSql: z.string({\n description: \"Custom SQL to override template\"\n }).optional()\n }))\n }).optional(),\n \n // Output preferences\n outputFormat: z.enum([\"segments_only\", \"full_table_structure\"], {\n description: \"Whether to output only segments or include them in a full table structure\"\n }).default(\"segments_only\"),\n \n tableName: z.string({\n description: \"Table name for full table structure output\"\n }).optional(),\n \n comments: z.string({\n description: \"Additional comments or notes about the segment configuration\"\n }).optional(),\n \n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-segments.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the lens segments file. example: my-segments.yaml\"\n })\n}\n\nexport const initLensSegmentsTool = (server: McpServer) => {\n server.tool(\n \"create-lens-segments\",\n description,\n toolSchema,\n async ({\n configurationType, segment, segments, bulkTemplate, outputFormat, tableName, path: p, fileName\n }) => {\n let finalSegments: any[] = [];\n \n // Helper function to generate SQL from template\n const generateSqlFromTemplate = (config: any): string => {\n // Validate template configuration\n const validationError = validateTemplateConfigCombination(config);\n if (validationError) {\n throw new Error(validationError);\n }\n\n const { template, column, values, operator, startDate, endDate, minValue, maxValue, checkType, pattern, sql } = config;\n \n switch (template) {\n case \"geographic_filter\":\n if (operator === \"IN\" && values.length > 1) {\n return `{TABLE}.${column} IN ('${values.join(\"', '\")}')`;\n } else if (operator === \"LIKE\") {\n return values.map(value => `{TABLE}.${column} LIKE '%${value}%'`).join(\" OR \");\n } else {\n return `{TABLE}.${column} ${operator || '='} '${values[0]}'`;\n }\n \n case \"date_range_filter\":\n if (startDate && endDate) {\n if (operator === \"BETWEEN\") {\n return `{TABLE}.${column} BETWEEN '${startDate}' AND '${endDate}'`;\n } else {\n return `{TABLE}.${column} >= '${startDate}' AND {TABLE}.${column} <= '${endDate}'`;\n }\n } else if (startDate) {\n return `{TABLE}.${column} ${operator || '>='} '${startDate}'`;\n } else if (endDate) {\n return `{TABLE}.${column} ${operator || '<='} '${endDate}'`;\n }\n break;\n \n case \"status_filter\":\n if (operator === \"IN\" && values.length > 1) {\n return `{TABLE}.${column} IN ('${values.join(\"', '\")}')`;\n } else if (operator === \"NOT IN\") {\n return `{TABLE}.${column} NOT IN ('${values.join(\"', '\")}')`;\n } else {\n return `{TABLE}.${column} ${operator || '='} '${values[0]}'`;\n }\n \n case \"category_filter\":\n if (operator === \"IN\" && values.length > 1) {\n return `{TABLE}.${column} IN ('${values.join(\"', '\")}')`;\n } else if (operator === \"LIKE\") {\n return values.map(value => `{TABLE}.${column} LIKE '%${value}%'`).join(\" OR \");\n } else {\n return `{TABLE}.${column} ${operator || '='} '${values[0]}'`;\n }\n \n case \"value_range_filter\":\n if (minValue !== undefined && maxValue !== undefined) {\n if (operator === \"BETWEEN\") {\n return `{TABLE}.${column} BETWEEN ${minValue} AND ${maxValue}`;\n } else {\n return `{TABLE}.${column} >= ${minValue} AND {TABLE}.${column} <= ${maxValue}`;\n }\n } else if (minValue !== undefined) {\n return `{TABLE}.${column} ${operator || '>='} ${minValue}`;\n } else if (maxValue !== undefined) {\n return `{TABLE}.${column} ${operator || '<='} ${maxValue}`;\n }\n break;\n \n case \"null_check_filter\":\n return `{TABLE}.${column} ${checkType}`;\n \n case \"pattern_match_filter\":\n return `{TABLE}.${column} ${operator || 'LIKE'} '${pattern}'`;\n \n case \"custom\":\n return sql;\n \n default:\n throw new Error(`Unsupported template: ${template}`);\n }\n \n throw new Error(`Unable to generate SQL for template: ${template}`);\n };\n \n // Helper function to create segment from configuration\n const createSegment = (config: any): any => {\n const segmentObj: any = {\n name: config.name,\n public: config.public !== undefined ? config.public : true\n };\n \n if (config.description) {\n segmentObj.description = config.description;\n }\n \n // Generate SQL based on segment type\n if (config.segmentType === \"template\" && config.templateConfig) {\n segmentObj.sql = generateSqlFromTemplate(config.templateConfig);\n } else if (config.sql) {\n segmentObj.sql = config.sql;\n } else {\n throw new Error(`Segment '${config.name}' must have either templateConfig or custom sql`);\n }\n \n // Add security configuration if enabled\n if (config.security?.enabled) {\n const metaObj: any = {};\n \n if (config.security.includeGroups || config.security.excludeGroups) {\n metaObj.secure = {\n user_groups: {}\n };\n \n if (config.security.includeGroups) {\n metaObj.secure.user_groups.includes = config.security.includeGroups;\n }\n \n if (config.security.excludeGroups) {\n metaObj.secure.user_groups.excludes = config.security.excludeGroups;\n }\n }\n \n if (config.meta?.tags) {\n metaObj.tags = config.meta.tags;\n }\n \n if (config.meta?.customProperties) {\n Object.assign(metaObj, config.meta.customProperties);\n }\n \n if (Object.keys(metaObj).length > 0) {\n segmentObj.meta = metaObj;\n }\n }\n \n return segmentObj;\n };\n \n try {\n // Process based on configuration type\n if (configurationType === \"single\") {\n if (!segment) {\n throw new Error(\"Segment configuration is required for single type\");\n }\n finalSegments.push(createSegment(segment));\n \n } else if (configurationType === \"multiple\") {\n if (!segments || segments.length === 0) {\n throw new Error(\"Segments array is required for multiple type\");\n }\n finalSegments = segments.map(createSegment);\n \n } else if (configurationType === \"bulk_template\") {\n if (!bulkTemplate) {\n throw new Error(\"Bulk template configuration is required for bulk_template type\");\n }\n \n const { baseTemplate, variations } = bulkTemplate;\n \n finalSegments = variations.map(variation => {\n const templateConfig: any = {\n template: baseTemplate\n };\n \n // Apply variation-specific configuration based on template type\n if (variation.values) {\n templateConfig.values = variation.values;\n }\n \n if (variation.customSql) {\n templateConfig.sql = variation.customSql;\n templateConfig.template = \"custom\";\n }\n \n return createSegment({\n name: variation.name,\n segmentType: \"template\",\n templateConfig,\n public: true\n });\n });\n }\n \n // Generate comments\n const generateComments = (): string => {\n const commentLines = [\n \"# Lens Segments Configuration\",\n \"# Reusable filters for consistent data access patterns\",\n \"# \",\n \"# Segments provide:\",\n \"# - Reusable filter logic across multiple queries\",\n \"# - Row-level security and data governance\",\n \"# - Consistent business rule application\",\n \"# - Performance optimization through pre-defined filters\",\n \"# \",\n `# Configuration Type: ${configurationType}`,\n `# Number of Segments: ${finalSegments.length}`,\n \"# \",\n \"# Usage in Lens models:\",\n \"# - Reference segments in measures and dimensions\",\n \"# - Apply as default filters in cubes\",\n \"# - Use for user group-based data access control\",\n \"# \",\n \"# Segment SQL uses {TABLE} placeholder for table reference\",\n \"# Example: {TABLE}.status = 'active' AND {TABLE}.created_date >= '2023-01-01'\",\n \"\"\n ];\n \n return commentLines.join(\"\\n\");\n };\n \n // Generate output based on format\n let fileContent: string;\n \n if (outputFormat === \"full_table_structure\") {\n const tableStructure = {\n name: tableName || \"example_table\",\n segments: finalSegments\n };\n fileContent = generateComments() + \"table:\\n\" + stringify(tableStructure).split('\\n').map(line => ` ${line}`).join('\\n');\n } else {\n fileContent = generateComments() + \"segments:\\n\" + stringify(finalSegments).split('\\n').map(line => ` ${line}`).join('\\n');\n }\n \n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`;\n \n const directory = path.dirname(fullPath);\n \n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true });\n }\n \n writeFileSync(fullPath, fileContent);\n \n return {\n content: [\n {\n type: \"text\",\n text: `Lens segments configuration created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `Generated ${finalSegments.length} segments using ${configurationType} configuration`\n },\n {\n type: \"text\",\n text: `File content:\\n${fileContent}`\n }\n ]\n };\n \n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens segments: ${error}`\n }]\n };\n }\n }\n );\n}; ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens Table Tool for creating comprehensive table definitions in DataOS Lens semantic layer.\nThis tool helps create logical table definitions with dimensions, measures, segments, and joins that form the foundation of Lens data models.\n\nLens tables are logical constructs that define core business entities (Customer, Product, Sales) by extending physical tables with dimensions (descriptive attributes), measures (aggregated values), segments (filters), and relationships (joins).\nExamples: Create customer tables with demographics and lifetime value, product tables with categories and inventory metrics, sales tables with revenue calculations and time-based segments.\n`\n\n// Common data types for Lens dimensions\nconst dimensionTypeSchema = z.enum([\n \"string\", \"number\", \"time\", \"boolean\", \"date\", \"timestamp\"\n], {\n description: \"Data type for dimensions - string (text), number (numeric), time (datetime), boolean (true/false), date (date only), timestamp (date with time)\"\n})\n\n// Measure types for aggregations\nconst measureTypeSchema = z.enum([\n \"count\", \"count_distinct\", \"count_distinct_approx\", \"sum\", \"avg\", \"min\", \"max\", \"string\", \"number\", \"boolean\", \"time\"\n], {\n description: \"Measure type - count (row count), count_distinct (unique values), sum (total), avg (average), min/max (extremes), string/number/boolean/time (calculated measures)\"\n})\n\n// Join relationship types\nconst relationshipTypeSchema = z.enum([\n \"one_to_one\", \"one_to_many\", \"many_to_one\"\n], {\n description: \"Relationship type between tables - one_to_one (1:1), one_to_many (1:N parent to children), many_to_one (N:1 children to parent)\"\n})\n\n// Data masking functions for security\nconst maskingFunctionSchema = z.enum([\n \"redact\", \"md5\"\n], {\n description: \"Data masking function - redact (replace with 'redact' string), md5 (hash with MD5 algorithm)\"\n})\n\n// User group security configuration\nconst userGroupSecuritySchema = z.object({\n includes: z.union([\n z.literal(\"*\"),\n z.array(z.string())\n ], {\n description: \"User groups to include - '*' for all users, or array of group names like ['analyst', 'engineer']\"\n }).optional(),\n excludes: z.array(z.string(), {\n description: \"User groups to exclude from access. Examples: ['reader', 'guest']\"\n }).optional()\n})\n\n// Security metadata for dimensions and segments\nconst securityMetaSchema = z.object({\n func: maskingFunctionSchema.optional(),\n user_groups: z.union([\n z.literal(\"*\"),\n userGroupSecuritySchema\n ], {\n description: \"User groups for security policy - '*' for all users, or object with includes/excludes\"\n }).optional()\n})\n\n// General metadata schema\nconst metadataSchema = z.object({\n secure: securityMetaSchema.optional(),\n additionalProperties: z.record(z.string(), z.any(), {\n description: \"Additional custom metadata as key-value pairs\"\n }).optional()\n})\n\n// Join definition schema\nconst joinSchema = z.object({\n name: z.string({\n description: \"Target table name for the join. Examples: 'orders', 'customers', 'products'\"\n }),\n relationship: relationshipTypeSchema,\n sql: z.string({\n description: \"Join condition using {TABLE} and {target_table} placeholders. Examples: '{TABLE.customer_id} = {orders.customer_id}', '{TABLE.product_id} = {inventory.product_id}'\"\n })\n})\n\n// Dimension definition schema\nconst dimensionSchema = z.object({\n name: z.string({\n description: \"Dimension name in snake_case. Examples: 'customer_id', 'product_name', 'order_date', 'email_address'\"\n }),\n title: z.string({\n description: \"Human-readable title for the dimension. Examples: 'Customer ID', 'Product Name', 'Order Date'\"\n }).optional(),\n description: z.string({\n description: \"Business description of the dimension's purpose and usage\"\n }),\n type: dimensionTypeSchema,\n sql: z.string({\n description: \"SQL expression or column name for the dimension. Examples: 'customer_id', 'UPPER(product_name)', 'DATE(created_at)'\"\n }),\n column: z.string({\n description: \"References the column defined in the table's SQL. Examples: 'customer_id', 'product_name', 'order_date'\"\n }).optional(),\n primary_key: z.boolean({\n description: \"Whether this dimension is a primary key for the table\"\n }).default(false),\n public: z.boolean({\n description: \"Whether the dimension is visible to all users (true) or hidden (false)\"\n }).default(true),\n sub_query: z.boolean({\n description: \"Set to true to reference a measure from another table in this dimension\"\n }).default(false),\n meta: metadataSchema.optional()\n})\n\n// Filter condition for measures\nconst filterConditionSchema = z.object({\n sql: z.string({\n description: \"SQL filter condition. Examples: '{TABLE}.status = \\\\'active\\\\'', '{TABLE}.amount > 100', '{TABLE}.category IN (\\\\'electronics\\\\', \\\\'books\\\\')'\"\n })\n})\n\n// Measure definition schema\nconst measureSchema = z.object({\n name: z.string({\n description: \"Measure name in snake_case. Examples: 'total_revenue', 'customer_count', 'avg_order_value', 'monthly_sales'\"\n }),\n title: z.string({\n description: \"Human-readable title for the measure. Examples: 'Total Revenue', 'Customer Count', 'Average Order Value'\"\n }).optional(),\n description: z.string({\n description: \"Business description of what this measure represents and how it's calculated\"\n }),\n type: measureTypeSchema,\n sql: z.string({\n description: \"SQL expression for the measure calculation. Examples: 'COUNT(customer_id)', 'SUM(order_amount)', 'AVG(product_price)', '{total_revenue} / {order_count}'\"\n }),\n public: z.boolean({\n description: \"Whether the measure is visible to all users (true) or hidden (false)\"\n }).default(true),\n filters: z.array(filterConditionSchema, {\n description: \"Filters to apply to this measure for specific conditions\"\n }).optional(),\n meta: metadataSchema.optional()\n})\n\n// Segment definition schema\nconst segmentSchema = z.object({\n name: z.string({\n description: \"Segment name in snake_case. Examples: 'active_customers', 'high_value_orders', 'premium_products'\"\n }),\n description: z.string({\n description: \"Business description of what this segment filters for\"\n }).optional(),\n sql: z.string({\n description: \"SQL filter condition using {TABLE} placeholder. Examples: '{TABLE}.status = \\\\'active\\\\'', '{TABLE}.amount > 1000', '{TABLE}.category = \\\\'premium\\\\' AND {TABLE}.stock > 0'\"\n }),\n public: z.boolean({\n description: \"Whether the segment is visible to all users (true) or hidden (false)\"\n }).default(true),\n meta: metadataSchema.optional()\n})\n\n// Main table schema\nconst lensTableSchema = z.object({\n name: z.string({\n description: \"Table name in snake_case following pattern ^[a-zA-Z][a-zA-Z0-9_]*$. Examples: 'customers', 'sales_orders', 'product_inventory'\"\n }),\n sql: z.string({\n description: \"SQL reference using load_sql function. Examples: '{{ load_sql(\\\\'customers\\\\') }}', '{{ load_sql(\\\\'sales_data\\\\') }}'\"\n }),\n description: z.string({\n description: \"Business description of the table's purpose and the entity it represents\"\n }),\n public: z.boolean({\n description: \"Whether the table is visible to all users (true) or hidden (false). Use true for widely accessible tables, false for sensitive data\"\n }).default(true),\n \n // Relationships\n joins: z.array(joinSchema, {\n description: \"Join relationships with other tables. All joins are LEFT JOINs in Lens\"\n }).optional(),\n \n // Data structure\n dimensions: z.array(dimensionSchema, {\n description: \"Dimensional attributes (descriptive columns) for slicing and dicing data\"\n }),\n measures: z.array(measureSchema, {\n description: \"Aggregated metrics and calculated values for quantitative analysis\"\n }).optional(),\n segments: z.array(segmentSchema, {\n description: \"Predefined filters for common data subsets and business rules\"\n }).optional()\n})\n\nconst toolSchema = {\n table: lensTableSchema,\n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-table.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the lens table file. example: my-table.yaml\"\n })\n}\n\nexport const initLensTableTool = (server: McpServer) => {\n server.tool(\n \"create-lens-table\",\n description,\n toolSchema,\n async ({ table, path: p, fileName }) => {\n const {\n name,\n sql,\n description: tableDescription,\n public: isPublic,\n joins = [],\n dimensions,\n measures = [],\n segments = []\n } = table;\n\n // Build the table definition\n const tableDefinition = {\n tables: [{\n name,\n sql,\n description: tableDescription,\n public: isPublic,\n \n // Add joins if they exist\n ...(joins.length > 0 && {\n joins: joins.map(join => ({\n name: join.name,\n relationship: join.relationship,\n sql: join.sql\n }))\n }),\n \n // Add dimensions\n dimensions: dimensions.map(dim => {\n const dimensionDef: any = {\n name: dim.name,\n type: dim.type,\n description: dim.description,\n sql: dim.sql,\n primary_key: dim.primary_key,\n public: dim.public\n };\n \n // Add optional fields\n if (dim.title) dimensionDef.title = dim.title;\n if (dim.column) dimensionDef.column = dim.column;\n if (dim.sub_query) dimensionDef.sub_query = dim.sub_query;\n if (dim.meta) dimensionDef.meta = dim.meta;\n \n return dimensionDef;\n }),\n \n // Add measures if they exist\n ...(measures.length > 0 && {\n measures: measures.map(measure => {\n const measureDef: any = {\n name: measure.name,\n type: measure.type,\n description: measure.description,\n sql: measure.sql,\n public: measure.public\n };\n \n // Add optional fields\n if (measure.title) measureDef.title = measure.title;\n if (measure.filters && measure.filters.length > 0) {\n measureDef.filters = measure.filters;\n }\n if (measure.meta) measureDef.meta = measure.meta;\n \n return measureDef;\n })\n }),\n \n // Add segments if they exist\n ...(segments.length > 0 && {\n segments: segments.map(segment => {\n const segmentDef: any = {\n name: segment.name,\n sql: segment.sql,\n public: segment.public\n };\n \n // Add optional fields\n if (segment.description) segmentDef.description = segment.description;\n if (segment.meta) segmentDef.meta = segment.meta;\n \n return segmentDef;\n })\n })\n }]\n };\n\n // Extract SQL file name for instructions\n const sqlFileName = sql.includes('load_sql') \n ? sql.match(/load_sql\\(['\"](.*?)['\"]\\)/)?.[1] || name\n : name;\n\n // Generate helpful comments for the YAML\n const comments = [\n `# Lens Table Definition: ${name}`,\n `# Description: ${tableDescription}`,\n `# Generated with ${dimensions.length} dimensions, ${measures.length} measures, ${segments.length} segments`,\n joins.length > 0 ? `# Joins: ${joins.map(j => j.name).join(', ')}` : '',\n ''\n ].filter(line => line !== '');\n\n const fileContent = comments.join('\\n') + stringify(tableDefinition);\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, fileContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Lens table file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${fileContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens table file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens Views serve as a layer atop the data graph of tables, presenting an abstraction of the entire data model with which consumers can interact. Views are essential for defining metrics and providing a simplified interface for end-users to interact with key business metrics.\n\nThere are two main approaches for designing views:\n\n1. **Entity-first approach**: Views built around entities (customer, product, transaction) as denormalized tables bringing measures and dimensions from different tables to fully describe the entity.\n\n2. **Metrics-first approach**: Views focused on specific performance metrics, each containing one key measure with relevant dimensions for grouping and filtering. Each view represents a specific business metric over time.\n\nViews reference dimensions, measures, and segments from multiple logical tables but don't have any measures, dimensions, or segments of their own.`\n\n// Cron expression schema for scheduled refresh\nconst cronExpressionSchema = z.string({\n description: \"Cron expression for scheduling (e.g., '*/5 * * * *' for every 5 minutes, '0 */6 * * *' for every 6 hours)\"\n}).regex(/^(\\*|([0-5]?\\d)) (\\*|([01]?\\d|2[0-3])) (\\*|([01]?\\d|[12]\\d|3[01])) (\\*|([01]?\\d)) (\\*|[0-6])$/, \"Invalid cron expression format\");\n\n// Metric configuration schema for metrics-first approach\nconst metricConfigSchema = z.object({\n expression: cronExpressionSchema.describe(\"Cron expression for metric refresh schedule (e.g., '*/5 * * * *', '0 */6 * * *')\"),\n timezone: z.string({\n description: \"Timezone for metric calculations in TZ database format (e.g., 'UTC', 'America/Vancouver', 'America/Toronto')\"\n }).default(\"UTC\"),\n window: z.enum([\"day\", \"week\", \"month\", \"quarter\", \"year\"], {\n description: \"Time window for metric aggregation - defines the granularity of metric calculation\"\n }),\n excludes: z.array(z.string(), {\n description: \"List of measures or dimensions to exclude from the metric view (e.g., ['purchases', 'source'])\"\n }).optional()\n});\n\n// Iris configuration schema for dashboard integration\nconst irisConfigSchema = z.object({\n timeseries: z.string({\n description: \"Time dimension for Iris dashboard visualization (format: 'table.column_name', e.g., 'sales.invoice_date')\"\n }),\n excludes: z.array(z.string(), {\n description: \"List of fields to exclude from Iris dashboard (e.g., ['sales.source', 'sales.invoice_date'])\"\n }).optional(),\n refresh: z.object({\n every: z.string({\n description: \"Refresh interval for Iris dashboard (e.g., '24h', '12h', '6h', '1h')\"\n }).regex(/^\\d+[hmd]$/, \"Format should be like '24h', '12h', '30m', '15m'\")\n }).optional()\n});\n\n// Meta configuration schema\nconst viewMetaSchema = z.object({\n title: z.string({\n description: \"Human-readable title for the view/metric (e.g., 'Customer Spending by Product Category')\"\n }).optional(),\n tags: z.array(z.string(), {\n description: \"Tags for categorization and discovery. Common patterns: ['DPDomain.{Domain}', 'DPUsecase.{UseCase}', 'DPTier.{Tier}'] (e.g., ['DPDomain.Sales', 'DPUsecase.Revenue Analysis', 'DPTier.Consumer Aligned'])\"\n }).optional(),\n export_to_iris: z.boolean({\n description: \"Whether to export this view to Iris dashboard for visualization (mainly for entity-first views)\"\n }).optional(),\n iris: irisConfigSchema.optional(),\n metric: metricConfigSchema.optional(),\n refresh: z.object({\n every: z.string({\n description: \"General refresh interval for the view (e.g., '24h', '12h', '6h')\"\n }).regex(/^\\d+[hmd]$/, \"Format should be like '24h', '12h', '30m'\")\n }).optional()\n});\n\n// Table inclusion schema\nconst viewTableSchema = z.object({\n join_path: z.string({\n description: \"Name of the logical table to include in the view. Must match a table defined in your Lens model (e.g., 'sales', 'customer', 'product', 'marketing_campaign')\"\n }),\n prefix: z.boolean({\n description: \"Whether to prefix the included fields with the table name. Set to true to avoid naming conflicts (e.g., 'customer_name' vs 'name')\"\n }).default(false),\n includes: z.array(z.string(), {\n description: \"List of specific measures, dimensions, or segments to include from this table (e.g., ['customer_id', 'total_revenue', 'invoice_date', 'churn_rate'])\"\n }),\n excludes: z.array(z.string(), {\n description: \"List of fields to exclude from this table (alternative to includes for when you want most fields)\"\n }).optional()\n});\n\n// Main view schema with discriminated union for different view types\nconst lensViewSchema = z.object({\n name: z.string({\n description: \"View name - should be descriptive and follow naming conventions. For metrics-first: use metric name (e.g., 'customer_churn_rate', 'monthly_revenue'). For entity-first: use entity name (e.g., 'customer_360', 'product_analysis')\"\n }),\n description: z.string({\n description: \"Detailed description of the view's purpose and what insights it provides (e.g., 'This metric tracks customer churn rate over time, helping identify retention trends and at-risk customer segments')\"\n }),\n public: z.boolean({\n description: \"Whether the view is publicly accessible to all users or restricted\"\n }).default(true),\n meta: viewMetaSchema.optional(),\n tables: z.array(viewTableSchema, {\n description: \"List of tables to include in this view with their specific field selections\"\n }).min(1, \"At least one table must be included in the view\")\n});\n\n// Multiple views schema for creating multiple views in one configuration\nconst multipleViewsSchema = z.object({\n views: z.array(lensViewSchema, {\n description: \"Array of view definitions - you can define multiple views for different use cases or metrics\"\n }).min(1, \"At least one view must be defined\")\n});\n\nconst toolSchema = {\n viewType: z.enum([\"single\", \"multiple\"], {\n description: \"Whether to create a single view or multiple views in one configuration\"\n }).default(\"single\"),\n \n // Single view configuration\n name: z.string({\n description: \"View name - descriptive identifier for the view (required for single view type)\"\n }).optional(),\n description: z.string({\n description: \"Detailed description of the view's purpose (required for single view type)\"\n }).optional(),\n public: z.boolean({\n description: \"Whether the view is publicly accessible\"\n }).default(true),\n \n // Approach selection for single views\n approach: z.enum([\"entity-first\", \"metrics-first\"], {\n description: \"Design approach: 'entity-first' for comprehensive entity views, 'metrics-first' for specific business metrics\"\n }).optional(),\n \n // Meta configuration\n meta: viewMetaSchema.optional(),\n \n // Tables configuration\n tables: z.array(viewTableSchema, {\n description: \"List of tables to include in this view (required for single view type)\"\n }).optional(),\n \n // Multiple views configuration\n views: z.array(lensViewSchema, {\n description: \"Array of view definitions (required for multiple view type)\"\n }).optional(),\n \n // Additional metadata\n comments: z.string({\n description: \"Additional comments or notes about the view configuration\"\n }).optional(),\n \n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-views.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the lens views file. example: my-views.yaml\"\n })\n}\n\nexport const initLensViewsTool = (server: McpServer) => {\n server.tool(\n \"create-lens-views\",\n description,\n toolSchema,\n async ({\n viewType, name, description, public: isPublic, approach, meta, tables, views, comments, path: p, fileName\n }) => {\n let viewsConfig;\n \n if (viewType === \"multiple\") {\n if (!views || views.length === 0) {\n throw new Error(\"Views array is required for multiple view type\");\n }\n viewsConfig = { views };\n } else {\n // Single view\n if (!name || !description || !tables || tables.length === 0) {\n throw new Error(\"Name, description, and tables are required for single view type\");\n }\n \n const singleView: any = {\n name,\n description,\n public: isPublic,\n tables\n };\n \n if (meta) {\n singleView.meta = meta;\n }\n \n viewsConfig = { views: [singleView] };\n }\n \n // Generate helpful comments based on approach and configuration\n const generateComments = () => {\n const commentLines: string[] = [];\n \n if (comments) {\n commentLines.push(`# ${comments}`);\n }\n \n if (approach) {\n if (approach === \"entity-first\") {\n commentLines.push(\"# Entity-first approach: Comprehensive view of entity with related measures and dimensions\");\n commentLines.push(\"# Use this for denormalized tables that describe entities fully\");\n } else {\n commentLines.push(\"# Metrics-first approach: Focused on specific business metrics\");\n commentLines.push(\"# Each view represents a key performance indicator with relevant dimensions\");\n }\n }\n \n commentLines.push(\"# Views reference dimensions, measures, and segments from logical tables\");\n commentLines.push(\"# Views don't define their own measures/dimensions - they include them from tables\");\n \n if (viewType === \"multiple\") {\n commentLines.push(\"# Multiple views defined for different use cases or metrics\");\n }\n \n return commentLines.join('\\n');\n };\n \n const yamlContent = stringify(viewsConfig);\n \n const finalContent = generateComments() + '\\n\\n' + yamlContent;\n\n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`\n const directory = path.dirname(fullPath);\n\n // Check if the directory exists, and create it if not\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true }); // recursive: true creates parent directories if needed\n }\n\n writeFileSync(fullPath, finalContent)\n\n return {\n content: [\n {\n type: \"text\",\n text: `Lens views file created successfully at ${fullPath}`\n },\n {\n type: \"text\",\n text: `File content: ${finalContent}`\n }\n ]\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens views file: ${error}`\n }]\n }\n }\n }\n )\n} ","import { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { stringify } from 'yaml'\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst description = `Lens User Groups are used to manage both data access and API scopes, which control access to specific functionalities and endpoints in the Lens semantic layer. This forms part of the access policy, ensuring users interact only with the data and features they are authorized to use.\n\nUser Groups provide:\n- **API Scope Management**: Control access to specific REST API endpoints (meta, data, graphql)\n- **Data Access Control**: Define who can access what data and functionality\n- **Granular Permissions**: Support for least privilege principle\n- **Group Priority**: First-listed group takes precedence when users belong to multiple groups\n- **Integration with Data Policies**: Work with dimension masking and segment filtering\n\nKey Features:\n- Flexible user inclusion/exclusion patterns\n- Support for wildcard (*) and specific user IDs\n- API scope-based endpoint access control\n- Integration with Lens Studio Interface\n- Support for organizational and regulatory compliance\n\nUser groups extend governance to the Lens Studio Interface, where access to specific tabs and functionalities can be controlled, supporting compliance with organizational and regulatory standards.`\n\n// API scopes enum with comprehensive descriptions\nconst apiScopeSchema = z.enum([\n \"meta\",\n \"data\", \n \"graphql\",\n \"jobs\",\n \"source\"\n], {\n description: `API scopes control access to specific Lens endpoints:\n - 'meta': Access to metadata endpoints (/v2/meta) - view sources, authors, timezones, security context\n - 'data': Access to data query endpoints (/v2/load, /v2/sql) - retrieve and analyze data\n - 'graphql': Access to GraphQL endpoint (/v2/graphql) - GraphQL-based queries\n - 'jobs': Access to job-related endpoints (advanced functionality)\n - 'source': Access to source-related endpoints (advanced functionality)`\n});\n\n// User pattern schema for flexible user specification\nconst userPatternSchema = z.union([\n z.literal(\"*\"),\n z.string().regex(/^users:id:.+$/, \"User ID must follow pattern 'users:id:username'\")\n], {\n description: \"User specification pattern: '*' for all users or 'users:id:username' for specific users (e.g., 'users:id:johndoe', 'users:id:iamgroot')\"\n});\n\n// User inclusion schema\nconst userInclusionSchema = z.union([\n z.literal(\"*\"),\n z.array(userPatternSchema, {\n description: \"List of users to include in this group. Use specific user IDs for small groups or '*' for all users\"\n })\n], {\n description: \"Users to include in this group. Use '*' to include all users or specify individual user IDs\"\n});\n\n// User exclusion schema\nconst userExclusionSchema = z.array(userPatternSchema, {\n description: \"List of users to exclude from this group (e.g., ['users:id:tempuser', 'users:id:guest'])\"\n});\n\n// Individual user group schema\nconst userGroupSchema = z.object({\n name: z.string({\n description: \"Unique group name - should be descriptive and follow naming conventions (e.g., 'data_analyst', 'data_engineer', 'business_user', 'admin')\"\n }),\n description: z.string({\n description: \"Brief description of the user group's purpose and the type of users it contains (e.g., 'Data analysts responsible for reporting and visualization tasks')\"\n }).optional(),\n api_scopes: z.array(apiScopeSchema, {\n description: \"List of API scopes this group can access. Follow principle of least privilege - grant only necessary access\"\n }).optional(),\n includes: userInclusionSchema,\n excludes: userExclusionSchema.optional()\n});\n\n// Predefined role templates for common organizational roles\nconst roleTemplateSchema = z.enum([\n \"data_analyst\",\n \"data_engineer\", \n \"data_scientist\",\n \"business_user\",\n \"admin\",\n \"viewer\",\n \"developer\",\n \"custom\"\n], {\n description: \"Predefined role templates with typical API scope configurations. Choose 'custom' for fully custom groups\"\n});\n\n// Template-based user group configuration\nconst templateUserGroupSchema = z.object({\n template: roleTemplateSchema,\n name: z.string({\n description: \"Group name - will be used as-is or can override template default\"\n }).optional(),\n description: z.string({\n description: \"Custom description for this group\"\n }).optional(),\n customApiScopes: z.array(apiScopeSchema, {\n description: \"Override default API scopes for this template\"\n }).optional(),\n includes: userInclusionSchema,\n excludes: userExclusionSchema.optional(),\n additionalProperties: z.record(z.string(), z.any(), {\n description: \"Additional custom properties for the group\"\n }).optional()\n});\n\n// Validate user group configuration combination\nconst validateUserGroupCombination = (config: any): string | null => {\n const { type, group } = config;\n \n switch (type) {\n case \"custom\":\n if (!group) {\n return \"Error: 'custom' type requires 'group' property with userGroupSchema configuration.\";\n }\n // For custom type, the group should have the required custom properties\n if (!group.name) {\n return \"Error: Custom user group requires 'name' property.\";\n }\n if (!group.includes) {\n return \"Error: Custom user group requires 'includes' property.\";\n }\n // Check for template-specific properties that shouldn't be in custom\n if (group.template || group.customApiScopes || group.additionalProperties) {\n return \"Error: Custom user group should not have template-specific properties ('template', 'customApiScopes', 'additionalProperties').\";\n }\n break;\n \n case \"template\":\n if (!group) {\n return \"Error: 'template' type requires 'group' property with templateUserGroupSchema configuration.\";\n }\n // For template type, the group should have the required template properties\n if (!group.template) {\n return \"Error: Template user group requires 'template' property.\";\n }\n if (!group.includes) {\n return \"Error: Template user group requires 'includes' property.\";\n }\n break;\n \n default:\n return `Error: Invalid user group configuration type '${type}'. Supported types are: custom, template.`;\n }\n \n return null; // No validation errors\n};\n\n// User group configuration with linear structure\nconst userGroupConfigSchema = z.object({\n type: z.enum([\"custom\", \"template\"], {\n description: \"Type of user group configuration: 'custom' for fully custom groups, 'template' for template-based groups\"\n }),\n group: z.object({\n // Common properties\n name: z.string({\n description: \"Group name - will be used as-is or can override template default\"\n }).optional(),\n description: z.string({\n description: \"Custom description for this group\"\n }).optional(),\n includes: userInclusionSchema,\n excludes: userExclusionSchema.optional(),\n \n // Custom group properties\n api_scopes: z.array(apiScopeSchema, {\n description: \"List of API scopes this group can access. Follow principle of least privilege - grant only necessary access\"\n }).optional(),\n \n // Template group properties\n template: roleTemplateSchema.optional(),\n customApiScopes: z.array(apiScopeSchema, {\n description: \"Override default API scopes for this template\"\n }).optional(),\n additionalProperties: z.record(z.string(), z.any(), {\n description: \"Additional custom properties for the group\"\n }).optional()\n })\n});\n\n// Multiple user groups configuration\nconst multipleUserGroupsSchema = z.object({\n groups: z.array(userGroupConfigSchema, {\n description: \"Array of user group configurations\"\n }).min(1, \"At least one user group must be defined\")\n});\n\n// Bulk template configuration for creating multiple similar groups\nconst bulkTemplateConfigSchema = z.object({\n baseTemplate: roleTemplateSchema,\n variations: z.array(z.object({\n name: z.string({\n description: \"Name for this variation (e.g., 'marketing_analyst', 'finance_analyst')\"\n }),\n description: z.string({\n description: \"Description for this variation\"\n }).optional(),\n customApiScopes: z.array(apiScopeSchema).optional(),\n includes: userInclusionSchema,\n excludes: userExclusionSchema.optional()\n }), {\n description: \"Variations of the base template to generate\"\n }).min(1, \"At least one variation must be specified\"),\n commonProperties: z.object({\n apiScopes: z.array(apiScopeSchema).optional(),\n excludes: userExclusionSchema.optional()\n }).optional()\n});\n\nconst toolSchema = {\n // Configuration type\n configurationType: z.enum([\"single\", \"multiple\", \"bulk_template\"], {\n description: \"Type of user group configuration: 'single' for one group, 'multiple' for several groups, 'bulk_template' for generating multiple groups from templates\"\n }).default(\"single\"),\n \n // Single user group configuration\n userGroup: userGroupConfigSchema.optional(),\n \n // Multiple user groups configuration\n userGroups: z.array(userGroupConfigSchema, {\n description: \"Array of user group configurations for multiple groups\"\n }).optional(),\n \n // Bulk template configuration\n bulkTemplate: bulkTemplateConfigSchema.optional(),\n \n // Global settings\n includeDefaultGroup: z.boolean({\n description: \"Whether to include a default group that gives all users basic access\"\n }).default(true),\n \n defaultGroupConfig: z.object({\n name: z.string().default(\"default\"),\n description: z.string().default(\"Default user group with basic access\"),\n api_scopes: z.array(apiScopeSchema).default([\"data\", \"graphql\"]),\n includes: userInclusionSchema.default(\"*\")\n }).optional(),\n \n // Output preferences\n outputFormat: z.enum([\"user_groups_only\", \"complete_file\"], {\n description: \"Whether to output only user groups or include them in a complete user_groups.yaml file structure\"\n }).default(\"complete_file\"),\n \n comments: z.string({\n description: \"Additional comments or notes about the user group configuration\"\n }).optional(),\n \n path: z.string({\n description: \"Absolute path where the file will be stored. example: ~/Documents/project-name/my-user-groups.yaml\"\n }),\n fileName: z.string({\n description: \"File name for the lens user groups file. example: my-user-groups.yaml\"\n })\n}\n\nexport const initLensUserGroupsTool = (server: McpServer) => {\n server.tool(\n \"create-lens-user-groups\",\n description,\n toolSchema,\n async ({\n configurationType, userGroup, userGroups, bulkTemplate, includeDefaultGroup, defaultGroupConfig, outputFormat, comments, path: p, fileName\n }) => {\n let userGroupsConfig: any[] = [];\n \n // Helper function to get default API scopes for role templates\n const getTemplateApiScopes = (template: string): string[] => {\n switch (template) {\n case \"data_analyst\":\n return [\"meta\", \"data\", \"graphql\"];\n case \"data_engineer\":\n return [\"meta\", \"data\", \"graphql\", \"jobs\"];\n case \"data_scientist\":\n return [\"meta\", \"data\", \"graphql\", \"jobs\", \"source\"];\n case \"business_user\":\n return [\"meta\", \"data\"];\n case \"admin\":\n return [\"meta\", \"data\", \"graphql\", \"jobs\", \"source\"];\n case \"viewer\":\n return [\"meta\"];\n case \"developer\":\n return [\"meta\", \"data\", \"graphql\", \"jobs\"];\n default:\n return [\"meta\", \"data\"];\n }\n };\n \n // Helper function to get default name for role templates\n const getTemplateName = (template: string): string => {\n return template === \"custom\" ? \"custom_group\" : template;\n };\n \n // Helper function to get default description for role templates\n const getTemplateDescription = (template: string): string => {\n switch (template) {\n case \"data_analyst\":\n return \"Data analysts responsible for reporting, visualization, and business intelligence tasks\";\n case \"data_engineer\":\n return \"Data engineers who build and maintain data pipelines, transformations, and infrastructure\";\n case \"data_scientist\":\n return \"Data scientists with full access to data, modeling capabilities, and source management\";\n case \"business_user\":\n return \"Business users who need access to view and analyze data for decision making\";\n case \"admin\":\n return \"Administrators with full access to all Lens functionality and management capabilities\";\n case \"viewer\":\n return \"Read-only users who can view metadata but cannot query data\";\n case \"developer\":\n return \"Developers who build applications and integrations using Lens APIs\";\n default:\n return \"Custom user group with specific access requirements\";\n }\n };\n \n // Helper function to create user group object\n const createUserGroup = (config: any): any => {\n // Perform validation\n const validationError = validateUserGroupCombination(config);\n if (validationError) {\n throw new Error(validationError);\n }\n\n if (config.type === \"template\") {\n const { group } = config;\n const template = group.template;\n \n return {\n name: group.name || getTemplateName(template),\n description: group.description || getTemplateDescription(template),\n api_scopes: group.customApiScopes || getTemplateApiScopes(template),\n includes: group.includes,\n ...(group.excludes && { excludes: group.excludes }),\n ...(group.additionalProperties && group.additionalProperties)\n };\n } else {\n // Custom group\n const { group } = config;\n return {\n name: group.name,\n ...(group.description && { description: group.description }),\n ...(group.api_scopes && { api_scopes: group.api_scopes }),\n includes: group.includes,\n ...(group.excludes && { excludes: group.excludes })\n };\n }\n };\n \n // Process different configuration types\n if (configurationType === \"single\") {\n if (!userGroup) {\n throw new Error(\"User group configuration is required for single type\");\n }\n userGroupsConfig.push(createUserGroup(userGroup));\n \n } else if (configurationType === \"multiple\") {\n if (!userGroups || userGroups.length === 0) {\n throw new Error(\"User groups array is required for multiple type\");\n }\n userGroupsConfig = userGroups.map(createUserGroup);\n \n } else if (configurationType === \"bulk_template\") {\n if (!bulkTemplate) {\n throw new Error(\"Bulk template configuration is required for bulk_template type\");\n }\n \n const { baseTemplate, variations, commonProperties } = bulkTemplate;\n \n userGroupsConfig = variations.map(variation => {\n const templateGroup = {\n name: variation.name,\n description: variation.description || getTemplateDescription(baseTemplate),\n api_scopes: variation.customApiScopes || commonProperties?.apiScopes || getTemplateApiScopes(baseTemplate),\n includes: variation.includes,\n excludes: variation.excludes || commonProperties?.excludes\n };\n \n return templateGroup;\n });\n }\n \n // Add default group if requested\n if (includeDefaultGroup) {\n const defaultGroup = {\n name: defaultGroupConfig?.name || \"default\",\n description: defaultGroupConfig?.description || \"Default user group with basic access\",\n api_scopes: defaultGroupConfig?.api_scopes || [\"data\", \"graphql\"],\n includes: defaultGroupConfig?.includes || \"*\"\n };\n userGroupsConfig.unshift(defaultGroup);\n }\n \n // Generate comments\n const generateComments = (): string => {\n const commentLines = [\n \"# Lens User Groups Configuration\",\n \"# This file defines user groups for access control in Lens semantic layer\",\n \"# \",\n \"# User groups control both API access and data visibility:\",\n \"# - API Scopes: Control access to specific REST endpoints\",\n \"# - Data Access: Define who can access what data through inclusion/exclusion\",\n \"# - Priority: First-listed group takes precedence for users in multiple groups\",\n \"# \",\n \"# API Scopes:\",\n \"# - meta: Metadata endpoints (/v2/meta) - sources, authors, timezones\",\n \"# - data: Data query endpoints (/v2/load, /v2/sql) - retrieve and analyze data\", \n \"# - graphql: GraphQL endpoint (/v2/graphql) - GraphQL-based queries\",\n \"# - jobs: Job-related endpoints (advanced functionality)\",\n \"# - source: Source-related endpoints (advanced functionality)\",\n \"# \",\n \"# User Patterns:\",\n \"# - '*': All users\",\n \"# - 'users:id:username': Specific user (e.g., 'users:id:johndoe')\",\n \"# \",\n ...(comments ? [`# Additional Notes:`, `# ${comments}`, \"# \"] : [])\n ];\n \n return commentLines.join(\"\\n\");\n };\n \n // Generate file content\n const fileContent = outputFormat === \"user_groups_only\" \n ? `${generateComments()}\\nuser_groups:\\n${stringify(userGroupsConfig).split('\\n').map(line => ` ${line}`).join('\\n')}`\n : `${generateComments()}\\nuser_groups:\\n${stringify(userGroupsConfig).split('\\n').map(line => ` ${line}`).join('\\n')}`;\n \n try {\n const fullPath = (p.includes(\".yaml\") || p.includes(\".yml\")) ? p : p.endsWith(\"/\") ? p + fileName : `${p}/${fileName}`;\n \n const directory = path.dirname(fullPath);\n \n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true });\n }\n \n writeFileSync(fullPath, fileContent);\n \n return {\n content: [\n {\n type: \"text\",\n text: `Lens user groups configuration created successfully at ${fullPath}`\n },\n {\n type: \"text\", \n text: `Generated ${userGroupsConfig.length} user groups with ${configurationType} configuration type`\n },\n {\n type: \"text\",\n text: `File content:\\n${fileContent}`\n }\n ]\n };\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: `Error creating lens user groups configuration: ${error}`\n }]\n };\n }\n }\n );\n}; ","import { BasicAuth, Trino } from \"trino-client\";\n\n\n\nexport function getTrinoClient({\n fqdn, apiKey, userId\n}: { fqdn: string; apiKey: string; userId: string }) {\n const trino: Trino = Trino.create({\n server: `https://tcp.${fqdn}:7432`,\n auth: new BasicAuth(userId, apiKey),\n });\n\n return trino\n}","\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getTrinoClient } from \"../client.js\";\n\nexport async function getTableMetadata({\n server, apiKey, fqdn\n}: { server: McpServer, apiKey?: string, fqdn?: string }): Promise<any> {\n\n server.tool(\n \"trino-metadata-query\",\n \"Retrieve the complete metadata and structure. This is essential before querying data.\",\n {\n\n },\n async ({ }): Promise<any> => {\n const catalog = \"icebase\";\n const schema = \"customer_360\";\n const table = \"customer\";\n const query = `DESCRIBE \"${catalog}\".\"${schema}\".\"${table}\"`;\n\n try {\n\n\n const client = getTrinoClient({\n fqdn,\n apiKey: \"asas\",\n userId: ''\n })\n\n const iter = await client.query({ query, catalog, schema });\n const data = await iter\n .map(r => r.data ?? [])\n .fold([], (row, acc) => [...acc, ...row]);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(data, null, 2)\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error executing query: ${error.message}`\n },\n ],\n isError: true,\n };\n }\n }\n )\n}"],"mappings":"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","names":["McpServer","StdioServerTransport","z","faker","zodToJsonSchema","baseFileSchema","z","faker","fileSchema","toolSchema","initFakerGenSchemaTools","server","zodToJsonSchema","z","toolSchema","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","connectionSecretSchema","commonDepotFields","validateDepotCombination","depot","type","spec","s3","abfss","wasbs","redshift","elasticsearch","opensearch","eventhub","pulsar","bigquery","gcs","kafka","mongodb","mysql","oracle","postgresql","snowflake","mssql","toolSchema","initDepotSourceTool","server","name","tags","owner","compute","source","external","connectionSecret","p","fileName","validationError","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","driverConfigSchema","executorConfigSchema","incrementalConfigSchema","inputDatasetSchema","outputDatasetSchema","flareFunction","transformCommandSchema","transformStepSchema","validateAssertionTestCombination","assertion","type","column","filter","validFormat","tests","sql","assertionTestSchema","commonWorkflowFields","toolSchema","initFlareWorkflowTool","server","name","tags","title","owner","workspace","compute","jobType","stack","tier","driver","executor","logLevel","explain","inputs","outputs","steps","assertions","scheduling","dependencies","notifications","p","fileName","validationError","jobConfig","stackSpec","workflowSpec","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","creds","commonInstanceSecretFields","validateInstanceSecretCombination","instanceSecret","type","files","toolSchema","initInstanceSecretsTool","server","name","version","secretMetadata","system","p","fileName","validationError","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","filterPatternSchema","sourceConnectionSchema","sourceConfigSchema","scheduleSchema","commonWorkflowFields","validateConnectionCombination","connection","method","depot","source","sourceConnection","toolSchema","initScannerWorkflowTool","server","name","tags","owner","workspace","schedule","jobName","jobDescription","jobTags","compute","runAsUser","stack","sourceConfig","p","fileName","validatedConnection","stackSpec","dag","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","checkAttributesSchema","samplesSchema","validationRulesSchema","schemaCheckConfigSchema","baseCheckSchema","validateSodaCheckCombination","check","checkType","column","operator","value","compareDataset","samples","name","filter","attributes","missingValues","missingRegex","validationRules","aggregationFunction","percentile","lengthType","sourceColumn","referenceDataset","referenceColumn","checkPattern","warn","fail","failCondition","failQuery","sodaCheckSchema","profileSchema","filterSchema","optionsSchema","datasetInputSchema","resourcesSchema","scheduleSchema","commonWorkflowFields","toolSchema","initQualityWorkflowTool","server","tags","owner","workspace","schedule","jobName","jobTitle","jobDescription","jobTags","compute","runAsUser","stack","logLevel","resources","inputs","fileName","input","validationError","dag","fileContent","fullPath","directory","error","initLensListResource","server","apiKey","fqdn","uri","result","lensList","text","description","initListLensTool","server","apiKey","fqdn","lensList","z","description","slugSchema","initSchemaTool","server","apiKey","fqdn","reqSlug","slug","meta","ResourceTemplate","initSchemaResource","server","apiKey","fqdn","reqSlug","uri","fetchMeta","ResourceTemplate","slug","href","result","meta","text","package_default","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","cronScheduleSchema","bundleScheduleSchema","bundleWorkspaceSchema","statusConditionSchema","runtimeConditionSchema","dependencyConditionSchema","bundleResourceSchema","data","bundleSpecSchema","toolSchema","initBundleTool","server","name","version","tags","owner","layer","workspace","bundle","p","fileName","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","refSchema","lensPortSchema","talosPortSchema","portsSchema","collaboratorSchema","metaSchema","useCaseSchema","commonDataProductFields","v1alphaSchema","v1betaSchema","toolSchema","initDataProductTool","server","params","version","v1alpha","v1beta","p","fileName","commonFields","versionSpecificContent","manifest","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","resourceRequestsSchema","resourceLimitsSchema","resourcesSchema","logLevelSchema","environmentVariablesSchema","secretConfigSchema","validateSourceConfigCombination","source","type","name","catalog","sourceConfigSchema","repoConfigSchema","autoScalingSchema","highAvailabilityConfigSchema","apiConfigSchema","workerConfigSchema","routerConfigSchema","lensConfigSchema","resourceMetaSchema","deploymentTemplateSchema","toolSchema","initLensManifestTool","server","version","tags","owner","layer","deploymentTemplate","lens","templateOverrides","workspace","p","fileName","validationError","finalLensConfig","template","lensConfig","config","manifest","fileContent","commentedContent","fullPath","directory","error","z","existsSync","mkdirSync","writeFileSync","path","description","sqlDataTypeSchema","measureTypeSchema","relationshipTypeSchema","viewTypeSchema","joinConditionSchema","columnSelectionSchema","calculatedFieldSchema","whereConditionSchema","groupBySchema","orderBySchema","lensViewSqlSchema","toolSchema","generateJoinClause","joins","join","generateWhereClause","conditions","condition","index","clause","formattedValues","v","formattedValue","generateSelectClause","dimensions","measures","dimensionCols","dim","fullColumn","measureCols","measure","initLensSqlTool","server","viewConfig","p","fileName","viewName","viewType","viewDescription","baseTables","whereConditions","groupBy","orderBy","limit","timeFilter","includeNulls","distinct","selectClause","fromClause","joinClause","whereClause","groupByClause","havingClause","orderByClause","o","limitClause","timeFilterClause","timeConditions","days","start","end","finalWhereClause","finalSql","part","lensMetadata","line","fileContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","userGroupSecuritySchema","segmentSecuritySchema","segmentMetaSchema","sqlExpressionSchema","segmentSchema","segmentTemplateSchema","validateTemplateConfigCombination","config","template","column","values","operator","startDate","endDate","minValue","maxValue","checkType","pattern","sql","templateConfigSchema","segmentConfigSchema","toolSchema","initLensSegmentsTool","server","configurationType","segment","segments","bulkTemplate","outputFormat","tableName","p","fileName","finalSegments","generateSqlFromTemplate","validationError","value","createSegment","segmentObj","metaObj","baseTemplate","variations","variation","templateConfig","generateComments","fileContent","tableStructure","line","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","dimensionTypeSchema","measureTypeSchema","relationshipTypeSchema","maskingFunctionSchema","userGroupSecuritySchema","securityMetaSchema","metadataSchema","joinSchema","dimensionSchema","filterConditionSchema","measureSchema","segmentSchema","lensTableSchema","toolSchema","initLensTableTool","server","table","p","fileName","name","sql","tableDescription","isPublic","joins","dimensions","measures","segments","tableDefinition","join","dim","dimensionDef","measure","measureDef","segment","segmentDef","sqlFileName","fileContent","j","line","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","cronExpressionSchema","metricConfigSchema","irisConfigSchema","viewMetaSchema","viewTableSchema","lensViewSchema","multipleViewsSchema","toolSchema","initLensViewsTool","server","viewType","name","isPublic","approach","meta","tables","views","comments","p","fileName","viewsConfig","singleView","generateComments","commentLines","yamlContent","finalContent","fullPath","directory","error","z","stringify","existsSync","mkdirSync","writeFileSync","path","description","apiScopeSchema","userPatternSchema","userInclusionSchema","userExclusionSchema","userGroupSchema","roleTemplateSchema","templateUserGroupSchema","validateUserGroupCombination","config","type","group","userGroupConfigSchema","multipleUserGroupsSchema","bulkTemplateConfigSchema","toolSchema","initLensUserGroupsTool","server","configurationType","userGroup","userGroups","bulkTemplate","includeDefaultGroup","defaultGroupConfig","outputFormat","comments","p","fileName","userGroupsConfig","getTemplateApiScopes","template","getTemplateName","getTemplateDescription","createUserGroup","validationError","baseTemplate","variations","commonProperties","variation","defaultGroup","generateComments","fileContent","line","fullPath","directory","error","BasicAuth","Trino","getTrinoClient","fqdn","apiKey","userId","getTableMetadata","server","apiKey","fqdn","catalog","schema","query","data","getTrinoClient","r","row","acc","error","version","package_default","main","apiKey","fqdn","slug","dev","server","McpServer","transport","StdioServerTransport","initFakerGenSchemaTools","initInstanceSecretsTool","initDepotSourceTool","initFlareWorkflowTool","initQualityWorkflowTool","initScannerWorkflowTool","initBundleTool","initDataProductTool","initLensManifestTool","initLensSqlTool","initLensSegmentsTool","initLensTableTool","initLensViewsTool","initLensUserGroupsTool","initLensDataTool","initLensListResource","initListLensTool","initSchemaTool","initSchemaResource","getTableMetadata"]}