coalesce-transform-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SNOWFLAKE_PAT | No | Snowflake Programmatic Access Token (alternative to key pair) | |
| SNOWFLAKE_ROLE | No | Snowflake user role | |
| COALESCE_ORG_ID | No | Fallback org ID for cancel-run. Also readable from orgID in the active ~/.coa/config profile. | |
| COALESCE_PROFILE | No | Selects which ~/.coa/config profile to load. | default |
| COALESCE_BASE_URL | No | Region-specific base URL. | https://app.coalescesoftware.io (US) |
| SNOWFLAKE_ACCOUNT | No | Snowflake account identifier (e.g., abc12345.us-east-1). Required by the local coa CLI and coa doctor; not used by the MCP's REST run path. | |
| COALESCE_CACHE_DIR | No | Base directory for the local data cache. When set, cache files are written here instead of the working directory. Also readable from cacheDir in the active ~/.coa/config profile. | |
| COALESCE_REPO_PATH | No | Local repo root for repo-backed tools and pipeline planning. Also readable from repoPath in the active ~/.coa/config profile. | |
| SNOWFLAKE_USERNAME | No | Snowflake account username | |
| SNOWFLAKE_WAREHOUSE | No | Snowflake compute warehouse | |
| COALESCE_ACCESS_TOKEN | No | Bearer token from the Coalesce Deploy tab. Optional when ~/.coa/config provides a token. | |
| COALESCE_MCP_READ_ONLY | No | When true, hides all write/mutation tools during registration. Only read, list, search, cache, analyze, review, diagnose, and plan tools are exposed. | false |
| SNOWFLAKE_KEY_PAIR_KEY | No | Path to PEM-encoded private key (required if SNOWFLAKE_PAT not set) | |
| COALESCE_MCP_SKILLS_DIR | No | Directory for customizable AI skill resources. When set, reads context resources from this directory and seeds defaults on first run. Users can augment or override any skill. | |
| SNOWFLAKE_KEY_PAIR_PASS | No | Passphrase for encrypted keys | |
| COALESCE_MCP_LINEAGE_TTL_MS | No | In-memory lineage cache TTL in milliseconds. | 1800000 |
| COALESCE_MCP_REQUEST_TIMEOUT_MS | No | Default per-request timeout for Coalesce API calls. Raise on large workspaces where paginated reads exceed the default. | 60000 |
| COALESCE_MCP_AUTO_CACHE_MAX_BYTES | No | JSON size threshold before auto-caching to disk. | 32768 |
| COALESCE_MCP_INVENTORY_CACHE_TTL_MS | No | In-memory TTL for the workspace node-type inventory. Set to 0 to disable. | 300000 |
| COALESCE_MCP_MAX_REQUEST_BODY_BYTES | No | Max outbound API request body size. | 524288 |
| COALESCE_MCP_DETAIL_FETCH_TIMEOUT_MS | No | Per-page timeout for detail=true paginated fetches of large node lists. | 180000 |
| COALESCE_MCP_NODE_INDEX_CACHE_TTL_MS | No | In-memory TTL for the workspace node-index (id/name/type/location) cache used by SQL- and intent-ref resolution. Set to 0 to disable. | 300000 |
| COALESCE_MCP_NODE_DETAIL_CACHE_TTL_MS | No | In-memory TTL for the workspace node-detail (full body) cache used by review and predecessor lookups. Set to 0 to disable. | 300000 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tasks | {
"requests": {
"tools": {
"call": {}
}
}
} |
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_environmentsA | List all available Coalesce environments with optional pagination. Returns environment IDs, names, and configuration. Use this to discover environment IDs needed by run, node, and job tools. Args:
Returns: { data: Environment[], next?: string, total?: number } Use get_environment for a single environment by ID. |
| get_environmentA | Get details of a specific Coalesce environment by ID. Returns full environment configuration including connection details, runtime parameters, and tag colors. Args:
Returns: Full environment object with ID, name, project, connection settings, and configuration. |
| create_environmentA | Create a new Coalesce environment within a project. Args:
Returns: Created environment object with assigned ID. |
| delete_environmentA | Permanently delete a Coalesce environment. This is destructive and cannot be undone. Args:
Returns: Confirmation message. |
| list_environment_nodesA | List nodes deployed in a Coalesce environment. Returns ONE page (default 100 nodes, or 25 when detail=true). If the response has Args:
Returns: { data: Node[], next?: string, hasMore?: boolean, retrieved?: number } |
| list_workspace_nodesA | List nodes in a Coalesce workspace (use list_workspaces to find workspace IDs). Returns ONE page (default 100 nodes, or 25 when detail=true). IMPORTANT: if the response has Args:
Returns: { data: Node[], next?: string, hasMore?: boolean, retrieved?: number } |
| get_environment_nodeA | Get details of a specific node deployed in an environment. Args:
Returns: Full node object with columns, config, metadata, and deployment state. |
| get_workspace_nodeA | Get details of a specific node in a workspace. Use list_workspaces to find workspace IDs. Args:
Returns: Full workspace node with columns, transforms, joins, config, and metadata. |
| create_workspace_node_from_scratchA | Create a workspace node from scratch with NO predecessors. Only use this when the node truly has no upstream nodes — for example, a standalone utility node. If the node has ANY upstream/source nodes, use create_workspace_node_from_predecessor instead. REQUIRED: Before calling this tool, call plan_pipeline with goal + repoPath to discover the correct nodeType. Do not guess or hardcode node types — the planner ranks all available types and returns the best match. SPECIALIZED TYPES WARNING: Do NOT use Dynamic Tables, Incremental Load, Materialized View, or other specialized types unless the user explicitly requests that pattern (e.g., 'near-real-time refresh', 'incremental processing'). For standard batch ETL, CTE decomposition, and general transforms, use Stage or Work. The response includes nodeTypeValidation.warning if a specialized pattern was detected without matching context. Defaults to completionLevel='configured', which REQUIRES both AUTOMATIC CONFIG: When repoPath is provided, this tool automatically runs intelligent config completion after creation — reading the node type definition, setting node-level config defaults, and applying column-level attributes. The configCompletion result shows what was applied. Do not use overrideSQL or override.* fields; SQL override is disallowed in this project. |
| set_workspace_nodeA | Update a workspace node's full body. Reads current state, merges changes, validates, and writes back. This is the primary mutation tool for workspace nodes. It handles column linkage preservation, passthrough transform stripping, required API field injection, and metadata cleaning automatically. Args:
Returns: { nodeID, created, warning?, validation?, configCompletion? } Do NOT set overrideSQL or metadata.sourceMapping through this tool. Use apply_join_condition or convert_join_to_aggregation for join/aggregation changes. |
| update_workspace_nodeA | Safely update selected fields of a workspace node by fetching the current node, applying partial changes, then writing back the full merged body. Object fields are deep-merged; arrays replace the existing array when provided. Use list_workspaces to find workspace IDs. Do not use overrideSQL or override.* fields; SQL override is disallowed in this project. NOTE: Arrays (like metadata.columns) are replaced, not merged. For complex column transformations (e.g., converting from join to aggregation), consider using replace_workspace_node_columns instead. For guidance on SQL platforms and tool usage patterns, see resources: coalesce://context/sql-platform-selection, coalesce://context/tool-usage |
| replace_workspace_node_columnsA | Replace all columns in a workspace node with a new set of columns, optionally applying a WHERE filter and additional changes in a single call. Do not use overrideSQL or override.* fields; SQL override is disallowed in this project. Use this when:
Prefer this over separate update_workspace_node calls. Combine column replacement + WHERE filter in one call. Example: Apply transforms and filter in one call: { columns: [ { name: 'CUSTOMER_ID', transform: '"CUSTOMER_LOYALTY"."CUSTOMER_ID"' }, { name: 'CITY', transform: 'UPPER("CUSTOMER_LOYALTY"."CITY")' }, { name: 'CONTACT_INFO', transform: 'COALESCE("CUSTOMER_LOYALTY"."E_MAIL", "CUSTOMER_LOYALTY"."PHONE_NUMBER")' } ], whereCondition: '"CUSTOMER_LOYALTY"."CUSTOMER_ID" IS NOT NULL AND ("CUSTOMER_LOYALTY"."E_MAIL" IS NOT NULL OR "CUSTOMER_LOYALTY"."PHONE_NUMBER" IS NOT NULL)' } IMPORTANT: Use whereCondition for WHERE filters — do NOT construct {{ ref() }} syntax yourself. The FROM clause is already set up from node creation. The whereCondition is appended to the existing joinCondition automatically. Args:
Returns: { nodeID, warning?, validation? } |
| convert_join_to_aggregationA | Convert an existing join node into an aggregated fact table with GROUP BY. This is the REQUIRED follow-up after creating a multi-predecessor node — it completes the join setup. This tool automatically:
Use this to transform a simple join (row-level) into an aggregated fact table (summary-level). Example: Convert order detail join to customer metrics: { workspaceID: "1", nodeID: "fact-node-id", groupByColumns: ['"STG_ORDER_HEADER"."CUSTOMER_ID"'], aggregates: [ { name: "TOTAL_ORDERS", function: "COUNT", expression: 'DISTINCT "STG_ORDER_HEADER"."ORDER_ID"' }, { name: "LIFETIME_VALUE", function: "SUM", expression: '"STG_ORDER_HEADER"."ORDER_TOTAL"' }, { name: "AVG_ORDER_VALUE", function: "AVG", expression: '"STG_ORDER_HEADER"."ORDER_TOTAL"' } ], joinType: "INNER JOIN" } Args:
Returns: Updated node with new columns, joinCondition, GROUP BY analysis, and config completion results. |
| apply_join_conditionA | Write a FROM/JOIN/ON clause to a workspace node's sourceMapping.join.joinCondition by analyzing predecessor columns and generating the join automatically. Use this for multi-predecessor nodes where you need to combine data via JOIN. The tool inspects predecessor columns, finds common column names for ON conditions, and writes the full joinCondition to the node. Args:
Returns: { nodeID, joinCondition, warning?, validation? } |
| create_workspace_node_from_predecessorA | Create a workspace node from one or more predecessor nodes, fetch it, and verify that columns were auto-populated from those predecessors before applying any optional changes. SINGLE-CALL WORKFLOW: You can create a node AND apply column transforms, WHERE filters, or aggregation in one call:
REQUIRED: Before calling this tool, call SPECIALIZED TYPES WARNING: Do NOT use Dynamic Tables, Incremental Load, Materialized View, or other specialized types unless the user explicitly requests that pattern (e.g., 'near-real-time refresh', 'continuous refresh', 'incremental processing'). For standard batch ETL, CTE decomposition, and general transforms, use Stage or Work. The response includes nodeTypeValidation.warning if a specialized pattern was detected without matching context — always check this field. JOIN INTELLIGENCE: For multi-predecessor nodes (joins), this tool automatically:
AUTOMATIC CONFIG: When repoPath is provided, this tool automatically runs intelligent config completion after creation — reading the node type definition, setting node-level config defaults, and applying column-level attributes (isBusinessKey, isChangeTracking, etc.). The configCompletion result shows what was applied. Do not use overrideSQL or override.* fields; SQL override is disallowed in this project. For guidance on node types, storage locations, and SQL patterns, see resources: coalesce://context/data-engineering-principles, coalesce://context/storage-mappings, coalesce://context/sql-platform-selection Args:
Returns: { nodeID, created, joinSuggestions?, nodeTypeValidation?, configCompletion? } |
| create_node_from_external_schemaA | Create a workspace node whose output columns match an external table schema (e.g., from Snowflake DESCRIBE TABLE, dbt manifest, or any metadata source). This tool automates the workflow of:
Reconciliation logic:
The response includes a REQUIRED: Call Args:
Returns: { node, reconciliation: { matched, added, dropped, typeChanges }, predecessors, validation, configCompletion?, configCompletionSkipped?, nodeTypeValidation?, nextSteps } |
| analyze_workspace_patternsA | Analyze workspace node patterns to detect package adoption, pipeline layers, data modeling methodology, and generate recommendations. This performs a whole-workspace scan (summary-level, all nodes) and returns a compact profile. Use it for profiling/overview tasks, NOT for finding a specific node — for that use search_workspace_content or get_workspace_node. If you want a reusable local snapshot of full node bodies, use cache_workspace_nodes (an explicit full pull). Args:
Returns: Workspace profile with package adoption, pipeline layers, naming conventions, and recommendations. |
| list_workspace_node_typesA | List distinct node types observed in current workspace nodes. This scans existing nodes only; it is not a true installed-type registry. WARNING: Do NOT use these values directly as the nodeType parameter for create_workspace_node_from_predecessor or create_workspace_node_from_scratch. The observed values may be bare numeric IDs (e.g. '31') that differ from the proper package-prefixed format (e.g. 'base-nodes:::Stage'). Always call plan_pipeline first to discover the correct nodeType. Args:
Returns: { nodeTypes: string[], counts: Record<string, number>, total: number } — nodeTypes is sorted by frequency descending; counts maps each type to its usage count. |
| delete_workspace_nodeA | Permanently delete a workspace node. Destructive — check for downstream dependencies first. Before mutating, the tool resolves the node via get_workspace_node and blocks the delete if the ID does not exist. Args:
Returns: Confirmation message plus the resolved node name. |
| complete_node_configurationA | Run intelligent configuration completion on a workspace node. Analyzes the node's type definition, existing config, and column layout to fill in required and recommended configuration fields. Both creation tools call this internally, but you can invoke it separately after manual edits. Args:
Returns: { nodeID, configCompletion? | configCompletionSkipped? } |
| plan_pipelineA | Plan a Coalesce pipeline by discovering and ranking all available node types from the repo. ALWAYS call this before creating nodes to get the correct node type. The planner scans the repo for all committed node type definitions, scores them against your use case, and returns ranked candidates. When available, it also returns a cached IMPORTANT — DO NOT WRITE SQL: The PREREQUISITE: Before calling this tool, use list_workspace_nodes to discover available source/upstream nodes and their IDs in the workspace. Preferred approach: Provide User-provided SQL: When a user pastes SQL, pass it in Consult coalesce://context/node-type-corpus for node type patterns and metadata structures. |
| create_pipeline_from_planA | Create a Coalesce pipeline from a previously approved plan. Pass the exact plan object returned by plan_pipeline. Projection-capable node types execute by creating predecessor-based nodes first and then persisting the final full node body via set_workspace_node. Args:
Returns: { created: boolean, nodes?: CreatedNode[], warnings?: string[] } |
| create_pipeline_from_sqlA | Plan and create a Coalesce pipeline from user-provided SQL. Pass the user's EXACT SQL unchanged. The SQL may use raw table names or already contain Coalesce {{ ref() }} syntax if that is what the user provided. Do NOT rewrite between styles or otherwise modify the query. The planner resolves workspace sources automatically and generates a Coalesce-compatible joinCondition for the final node. If you are building a pipeline yourself, use declarative tools directly: create_workspace_node_from_predecessor → convert_join_to_aggregation → replace_workspace_node_columns. This tool validates candidate node types against currently observed workspace nodes. If a selected type is not observed, the plan will include a warning asking the user to confirm installation in Coalesce. Consult coalesce://context/node-type-corpus for node type patterns and metadata structures. |
| build_pipeline_from_intentA | Build a Coalesce pipeline from a natural language description. Describe what you want in plain English and this tool resolves workspace nodes, selects node types, and creates the pipeline nodes. Examples:
The tool parses the intent, fuzzy-matches entity names to existing workspace nodes, and selects appropriate node types. When confirmed, it creates the pipeline nodes directly. Alternatively, set dryRun=true to get the plan without creating nodes, then pass it to create_pipeline_from_plan. If entity names cannot be resolved or the intent is ambiguous, the tool returns clarification questions instead of a plan. |
| review_pipelineA | Analyze an existing pipeline in a Coalesce workspace and suggest improvements. Walks the node DAG, inspects column transforms, join conditions, node types, naming conventions, and layer architecture to identify issues and optimization opportunities. Returns findings sorted by severity (critical → warning → suggestion) with actionable fix suggestions. Checks for:
Use nodeIDs to scope the review to a specific pipeline section (e.g., from a subgraph). |
| parse_sql_structureA | Parse a SQL statement into its structural components without touching the workspace. Returns CTEs (if any), source table references (FROM/JOIN), and projected columns (SELECT list). Use this as the first step in a multi-step pipeline creation workflow to inspect the SQL decomposition before choosing node types or building a plan. For CTE-based SQL, each CTE is returned with its columns (with transform detection), WHERE filters, source tables, structural flags (hasJoin, hasGroupBy), and inter-CTE dependency references. For non-CTE SQL, returns the parsed source refs and SELECT items with column/expression classification. This tool is pure parsing — no workspace reads, no node type selection, no mutations. |
| select_pipeline_node_typeA | Rank and select the best Coalesce node type for a specific pipeline step. When repoPath or COALESCE_REPO_PATH is configured, scans the local repo for committed node type definitions. Otherwise, falls back to workspace-observed node types. Scores candidates against the provided context and returns ranked candidates with confidence levels. Use this after parse_sql_structure to select node types for each structural piece (e.g., each CTE, or the main query). Provide structural hints like sourceCount, hasJoin, hasGroupBy for more accurate selection. The tool runs the full deliberative selection loop: score all candidates, challenge the top pick against the intent corpus, disqualify if challenged, re-rank, and challenge again (2 rounds max). Returns the selected node type, confidence level, full ranking with scores, and any warnings. Use the selectedNodeType in subsequent plan_pipeline, create_workspace_node_from_predecessor, or create_workspace_node_from_scratch calls. This tool reads workspace node type inventory for ranking but does not mutate anything. |
| list_runsA | List Coalesce runs with optional filters for type, status, and environment. Args:
Returns: { data: Run[], next?: string, total?: number } |
| get_runA | Get details of a specific Coalesce run. Args:
Returns: Full run object with status, timing, node results, and configuration. |
| get_run_resultsA | Get the execution results of a specific Coalesce run. Args:
Returns: Run results including per-node execution status, row counts, and errors. |
| run_statusA | Get the current status of a Coalesce run by run counter. Terminal statuses: completed, failed, canceled. Non-terminal: waitingToRun, running. Args:
Returns: { runCounter, runStatus, message } |
| retry_runA | Retry a failed Coalesce run. Requires Snowflake auth via environment variables (Key Pair or PAT). Args:
Returns: { runCounter, runStatus, message } Prefer retry_and_wait when you need the final outcome in a single call. |
| diagnose_run_failureA | Diagnose a failed Coalesce run. Fetches run metadata and per-node results, classifies each failure (SQL error, missing object, permission issue, data type mismatch, timeout, configuration error), and returns actionable fix suggestions. Use this when a run has failed and the user wants to understand what went wrong and how to fix it. Works best with completed (failed) runs — for in-progress runs, use run_status instead. Returns: run summary, per-node failure diagnosis with error classification, and prioritized recommendations. |
| cancel_runA | Cancel an in-progress Coalesce run. Destructive — the run will be terminated immediately. Canceling a running pipeline mid-execution can leave data in an inconsistent state (partial loads, half-transformed tables). There is no 'undo cancel'. Args:
Returns: Confirmation with updated run status. |
| list_projectsA | List all Coalesce projects. Args:
Returns: { data: Project[], next?: string, total?: number } |
| get_projectA | Get details of a specific Coalesce project. Args:
Returns: Full project object with ID, name, description, git configuration. |
| create_projectA | Create a new Coalesce project. Args:
Returns: Created project object with assigned ID. |
| update_projectA | Update an existing Coalesce project. Partial update — only provided fields are changed. Args:
Returns: Updated project object. |
| delete_projectA | Permanently delete a Coalesce project. This is destructive and cannot be undone. Args:
Returns: Confirmation message. |
| list_git_accountsA | List all Git accounts configured in Coalesce. Args:
Returns: { data: GitAccount[], next?: string, total?: number } |
| get_git_accountA | Get details of a specific Git account. Args:
Returns: Git account object with connection details. |
| create_git_accountB | Create a new Git account in Coalesce. Args:
Returns: Created Git account with assigned ID. |
| update_git_accountA | Update an existing Git account. Partial update — only provided fields are changed. Args:
Returns: Updated Git account object. |
| delete_git_accountA | Permanently delete a Git account. Destructive and cannot be undone — if this is the only git account linked to a project, it breaks the CI/CD connection. Args:
Returns: Confirmation message. |
| list_org_usersA | List all users in the Coalesce organization. Args:
Returns: { data: User[], next?: string, total?: number } |
| get_user_rolesB | Get roles assigned to a specific user, optionally scoped to a project or environment. Args:
Returns: Role assignments for the user. |
| list_user_rolesB | List roles for all users in the organization, optionally scoped. Args:
Returns: { data: RoleAssignment[], next?: string, total?: number } |
| set_org_roleA | Set the organization-level role for a user. Idempotent — safe to call multiple times. Args:
Returns: Updated role assignment. |
| set_project_roleA | Set a user's role for a specific project. Idempotent. Args:
Returns: Updated role assignment. |
| delete_project_roleA | Remove a user's role from a specific project. Destructive — the user will lose project access immediately. Args:
Returns: Confirmation message. |
| set_env_roleA | Set a user's role for a specific environment. Idempotent. Args:
Returns: Updated role assignment. |
| delete_env_roleA | Remove a user's role from a specific environment. Destructive — the user will lose environment access immediately. Args:
Returns: Confirmation message. |
| search_node_type_variantsA | Search the generated node-type corpus snapshot by normalized family, package, primitive, or support status. This tool queries the committed snapshot and does not require access to the original external node source repo at runtime. |
| get_node_type_variantA | Get one node-type corpus variant from the committed snapshot by variantKey. Use search_node_type_variants first when you need discovery. |
| generate_set_workspace_node_template_from_variantA | Generate a set_workspace_node body template from a node-type corpus variant stored in the committed snapshot. This avoids requiring the original external node source repo at runtime, rejects partial variants unless allowPartial=true, and can optionally compare the inferred template against a live workspace node. SQL override controls are removed from returned templates because they are disallowed in this project. |
| list_repo_packagesA | Inspect a committed local Coalesce repo and list package aliases from packages/*.yml. Use this when a local repo is available and you want repo-backed node-type discovery before falling back to the corpus. |
| list_repo_node_typesA | Inspect a committed local Coalesce repo and list exact resolvable node-type identifiers from nodeTypes/, optionally filtered to one package alias. Repo-backed discovery is preferred when the repo contains the committed definition; otherwise use the corpus tools. |
| get_repo_node_type_definitionA | Resolve one exact node type from a committed local Coalesce repo. Supports direct identifiers like Stage or 65 and package-backed identifiers like alias:::id. If the repo cannot resolve the definition exactly, use the corpus tools as the fallback path. |
| generate_set_workspace_node_templateA | Generate a YAML-friendly set_workspace_node body template either from a raw node definition object or by resolving a committed node type from a local repo. Prefer repo mode when a local committed repo contains the definition; use the corpus tools when repo-backed resolution is unavailable. SQL override controls are removed from returned templates because they are disallowed in this project. |
| list_job_nodesA | Resolve a workspace job's selectors into concrete workspace nodes, grouped by subgraph. Composes getWorkspaceJob + listWorkspaceNodes + the local repo's subgraphs/ folder to evaluate the includeSelector/excludeSelector DSL (supported clauses: { subgraph: NAME } and { location: LOC name: NAME }, joined by OR). Subgraph resolution note: the public Coalesce API has no subgraph list endpoint. Args:
Returns: { job: { id, name, includeSelector, excludeSelector }, summary: { totalNodes, subgraphCount, unattachedCount, unresolvedCount, warnings }, nodesBySubgraph: [{ subgraphID, subgraphName, nodes: [{ id, name, location, nodeType }] }], unattached: [...], // nodes matched by the job but not in any subgraph unresolved: [{ term, reason }] // selector terms that matched nothing (stale selectors or missing repoPath) } |
| find_jobs_by_nameA | Fuzzy-match jobs in an environment by name (case-insensitive substring), and return each match with its most recent runs. Use this when the user references a job by name and you need the job's ID or recent execution history. Scans the last 50 runs in the environment and groups them by matched job. Runs that fall outside that window are not returned — for older history call list_runs with explicit pagination. Args:
Returns: { matches: [{ job: {id, name, includeSelector, excludeSelector}, recentRuns: [{runID, runCounter, runStatus, runType, runStartTime, runEndTime}] }], summary: { jobsMatched, totalRunsReturned, runScanLimit } } |
| get_job_run_details_by_nameA | Fuzzy-match a single environment job by name and return the full details of its most recent run (and optionally run results). Errors if the name matches zero or multiple jobs — use find_jobs_by_name first to disambiguate. Looks at the last 50 runs in the environment to find the job's latest run. Older runs are not considered. Args:
Returns: { job, run, results? } |
| list_environment_jobsA | List all jobs deployed to a Coalesce environment. Jobs define which nodes run together — pair this with list_environment_nodes when planning a refresh, or with create_workspace_job when authoring new schedules. Different from listing workspace-side jobs: this returns the jobs currently deployed to the target environment (what the scheduler will execute), not the in-flight workspace edits that may not be deployed yet. Args:
Returns: { data: Job[], next?: string, total?: number } |
| create_workspace_jobA | Create a new job in a Coalesce workspace. Jobs define which nodes to run together. Args:
Returns: Created job with assigned ID. |
| get_environment_jobA | Get details of a specific job in an environment. Args:
Returns: Job object with name, node list, schedule, and configuration. |
| update_workspace_jobB | Update an existing workspace job. Args:
Returns: Updated job object. |
| delete_workspace_jobA | Delete a job from a workspace. Destructive — jobs define which nodes run together; deleting the wrong one breaks scheduled pipelines. Args:
Returns: Confirmation message. |
| get_workspace_subgraphA | Get details of a specific subgraph. Args:
Returns: Subgraph object with name and node steps. |
| create_workspace_subgraphA | Create a subgraph in a Coalesce workspace. Subgraphs group nodes visually. The assigned UUID is cached locally so future edits can reference the subgraph by name. Args:
Returns: { subgraphID, subgraph, cached, message } — subgraphID is the UUID; cache it if you need to edit this subgraph later. |
| update_workspace_subgraphA | Update a subgraph's name and member nodes. Replaces the entire steps array. Pass either subgraphID (fastest) or subgraphName — if only the name is given, the ID is resolved from (1) the local UUID cache, (2) {repoPath}/subgraphs/*.yml. The public Coalesce API has no subgraph list endpoint, so a subgraph created outside this MCP session cannot be resolved by name without a repo checkout. Args:
Returns: { subgraphID, subgraph, resolvedFrom } where resolvedFrom is "input" | "cache" | "repo". |
| delete_workspace_subgraphA | Delete a subgraph from a workspace. Destructive — the subgraph is removed but its member nodes are NOT deleted. Pass either subgraphID (preferred) or subgraphName with optional repoPath. Args:
Returns: Confirmation message. |
| list_workspacesA | List all Coalesce workspaces. Returns workspace IDs needed by node, job, and subgraph tools. Each workspace includes its projectID. Returns: { data: Workspace[] } |
| get_workspaceA | Get details of a specific Coalesce workspace by ID. Args:
Returns: Full workspace object with ID, name, project association, and settings. |
| cache_workspace_nodesA | Fetch and cache the ENTIRE workspace's nodes to disk — a full snapshot of every node. Run this ONLY when the user explicitly wants the whole workspace cached. For targeted work, prefer search_workspace_content, get_workspace_node, or get_workspace_subgraph; for a profile use analyze_workspace_patterns. detail=false is much cheaper and sufficient for inventory; detail=true on a large workspace produces a very large snapshot. Note: the result is a coalesce://cache/... resource link, which clients that do not support MCP resources (e.g. Snowflake Cortex Code) cannot read. Args:
Returns: Cache metadata with resourceUri (coalesce://cache/...) for accessing the cached data via MCP resource read. |
| cache_environment_nodesA | Fetch and cache all environment nodes to disk for efficient repeated access. Args:
Returns: Cache metadata with resourceUri (coalesce://cache/...) for accessing the cached data via MCP resource read. |
| cache_runsA | Fetch and cache runs to disk with optional filters for efficient repeated access. Args:
Returns: Cache metadata with resourceUri (coalesce://cache/...) for accessing the cached data via MCP resource read. |
| cache_org_usersA | Fetch and cache all organization users to disk for efficient repeated access. Args:
Returns: Cache metadata with resourceUri (coalesce://cache/...) for accessing the cached data via MCP resource read. |
| clear_data_cacheA | Clear the MCP server's local data cache. Removes all cached artifacts from disk. Args:
Returns: { deleted: boolean, fileCount: number, totalBytes: number, message: string } |
| pipeline_workshop_openA | Open a new pipeline workshop session for iterative, conversational pipeline building. The workshop maintains state between calls so you can incrementally add nodes, change join keys, add filters, rename nodes, and refine the plan before creating anything. Optionally provide an initial intent (e.g., 'join customers and orders on customer_id') to bootstrap the session with initial nodes. Returns a sessionID that must be passed to subsequent workshop calls. |
| pipeline_workshop_instructA | Send a natural language instruction to an open pipeline workshop session. The instruction modifies the current plan — you can:
Each instruction is processed against the current session state, and the updated plan is returned. |
| get_pipeline_workshop_statusA | Get the current state of a pipeline workshop session, including all planned nodes, their configuration, and the instruction history. |
| pipeline_workshop_closeA | Close a pipeline workshop session and clean up the session state. If there are uncreated nodes in the plan, use build_pipeline_from_intent or plan_pipeline to create them before closing. |
| get_upstream_nodesA | Walk the full upstream dependency graph for a node and return every ancestor with its depth level. Args: workspaceID: Workspace to query nodeID: Starting node whose upstream lineage to trace Returns: Array of ancestor nodes with nodeID, nodeName, nodeType, and depth (1 = direct parent). Traverses the entire graph with no depth limit. Nodes are deduplicated. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call (may take a moment for large workspaces). Subsequent calls use the cached graph (default TTL: 30 min). |
| get_downstream_nodesA | Walk the full downstream dependency graph for a node and return every dependent with its depth level. Args: workspaceID: Workspace to query nodeID: Starting node whose downstream dependents to trace Returns: Array of dependent nodes with nodeID, nodeName, nodeType, and depth (1 = direct child). Traverses the entire graph with no depth limit. Nodes are deduplicated. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call. |
| get_column_lineageA | Trace a specific column through the entire pipeline — upstream to its sources and downstream to every column that depends on it. Args: workspaceID: Workspace to query nodeID: Node that contains the column columnID: Column ID to trace Returns: Array of column lineage entries with nodeID, nodeName, nodeType, columnID, columnName, direction (upstream/downstream), and depth. Uses column-level references (metadata.columns[].sources[].columnReferences[]) to trace the full path. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call. |
| analyze_impactA | Analyze the downstream impact of changing a node or a specific column. Args: workspaceID: Workspace to query nodeID: Node to analyze impact for columnID: (optional) Specific column — if omitted, analyzes impact of the entire node Returns: Impacted node count, impacted column count, nodes grouped by depth level, and the critical path (longest dependency chain from source to leaf). Without columnID: shows all downstream nodes and all columns across them that depend on any column of this node. With columnID: shows only nodes/columns that specifically depend on that column. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call. |
| propagate_column_changeA | ⚠️ WRITE operation — Updates all downstream columns that depend on a source column. Use this after renaming a column or changing its data type to propagate the change through the entire pipeline. Args: workspaceID: Workspace to modify nodeID: Node containing the source column columnID: Column ID that was changed changes: Object with optional columnName and/or dataType to propagate Returns: Pre-mutation snapshot summary (column-level changes), snapshotPath to a disk file with full node bodies, list of updated nodes/columns, total count, and any errors encountered. The disk snapshot at snapshotPath captures each downstream node's complete nodeBody before mutation, enabling manual reversal of partial failures via set_workspace_node. Each downstream node is fetched, its column updated, and the full node PUT back via API. The lineage cache is invalidated after propagation. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call. Note: Propagation targets are determined from the cached lineage graph (up to 30 min old). Downstream nodes added after the cache was built will not be included. Refresh lineage first if the workspace structure has changed recently. |
| search_workspace_contentA | Search across node names, SQL, column names, descriptions, and config values in a workspace using the lineage cache as the data source. Args: workspaceID: Workspace to search query: Text to search for (case-insensitive substring match) fields: (optional) Array of fields to search — any of: name, nodeType, sql, columnName, columnDataType, description, config. Defaults to all fields. nodeType: (optional) Filter results to a specific node type limit: (optional) Max results to return (1-200, default 50) Returns: Matching nodes with the fields that matched and content snippets. Efficient for large workspaces — searches the in-memory cache instead of making per-node API calls. Requires a populated lineage cache — will fetch all workspace nodes with detail=true on first call (may take a moment for large workspaces). Subsequent calls use the cached data (default TTL: 30 min). |
| audit_documentation_coverageA | Scan all nodes and columns in a workspace and report documentation coverage statistics. Args: workspaceID: Workspace to audit Returns: Total and documented counts for nodes and columns, percentage coverage, and lists of undocumented nodes and columns (column list capped at 200). A node is 'documented' if it has a non-empty description. A column is 'documented' if its metadata.columns[] entry has a non-empty description field. Requires a lineage cache — will fetch all workspace nodes with detail=true on first call (may take a moment for large workspaces). Subsequent calls use the cached graph (default TTL: 30 min). |
| personalize_skillsA | Export all bundled Coalesce skill files to a local directory for customization. Each skill gets two files: coalesce_skills.{name}.md (the default) and user_skills.{name}.md (your overrides). Edit user_skills files to augment or override the defaults. Idempotent — never overwrites existing files. |
| coa_doctorA | Run KNOWN ISSUE (CD-16983): doctor reports the profile selected via Args:
Returns: { command, exitCode, stdout, stderr, timedOut, json?, coaVersion, preflightWarnings? } |
| coa_bootstrap_workspacesA | Run IMPORTANT: the generated file contains placeholder database/schema values. The user MUST open it and set real values before running coa_create / coa_run — otherwise warehouse operations will target non-existent databases. KNOWN ISSUE (CD-16983): the DESTRUCTIVE: writes a new file to the project directory. Requires confirmed=true after explicit user approval. Args:
Returns: { command, exitCode, stdout, stderr, json?, coaVersion } |
| coa_validateA | Run Known issue: V2 SQL nodes may produce false-positive column reference errors from the Column References scanner. Those don't block coa_dry_run_create / coa_dry_run_run. Args:
Returns: { command, exitCode, stdout, stderr, json?, coaVersion } |
| coa_list_project_nodesA | List all nodes defined in a local COA project (pre-deploy). Wraps Different from list_environment_nodes (which lists deployed nodes in a cloud environment via the REST API). Args:
Returns: { command, exitCode, stdout, json?, coaVersion } |
| coa_dry_run_createA | Preview the DDL that Runs entirely offline against local project files — no Coalesce cloud authentication or API calls. OUTPUT SHAPE (CD-16959+): dry-run reports pass/fail for every selected node rather than stopping at the first template error. Scan the full stdout — a non-zero exit code means one or more nodes failed, but successful nodes still render their generated SQL above/below the failures. Do not assume early output implies all-clear. Check the stdout: table names should resolve (not blank), column types should not be UNKNOWN (indicates broken ref() targets), and SQL should look correct. For V2 nodes specifically, watch for LIMITATION: dry-run only exercises the SQL generator. It does NOT validate that referenced columns or types exist in the actual warehouse — a dry-run can succeed with column references that will fail at run-time with 'invalid identifier'. Use cortex or another Snowflake-capable MCP to confirm the schema when that matters. Args:
Returns: { command, exitCode, stdout, stderr, coaVersion } |
| coa_dry_run_runA | Preview the DML that Runs entirely offline against local project files — no Coalesce cloud authentication or API calls. OUTPUT SHAPE (CD-16959+): dry-run reports pass/fail for every selected node rather than stopping at the first template error. Scan the full stdout — a non-zero exit code means one or more nodes failed, but successful nodes still render their generated SQL above/below the failures. LIMITATION: dry-run only exercises the SQL generator. It does NOT validate that referenced columns or types exist in the actual warehouse — a dry-run can succeed with column references that will fail at run-time with 'invalid identifier'. Use cortex or another Snowflake-capable MCP to confirm the schema when that matters. Args:
Returns: { command, exitCode, stdout, stderr, coaVersion } |
| coa_createA | Execute DESTRUCTIVE: modifies warehouse schema. Requires confirmed=true after explicit user approval. Pre-flight checks run before execution (double-quoted refs, missing workspaces.yml, bad selector patterns). Errors block execution; warnings are returned alongside the result. V2 NOTICE: when the project contains V2 artifacts (fileVersion: 2 node types or .sql nodes), a Args:
Returns: { command, exitCode, stdout, stderr, preflightWarnings?, coaVersion } |
| coa_runA | Execute DESTRUCTIVE: modifies warehouse data. Requires confirmed=true. Same pre-flight checks as coa_create. A Args:
Returns: { command, exitCode, stdout, stderr, preflightWarnings?, coaVersion } |
| coa_planA | Generate a deployment plan. Reads the local project, diffs against the target environment, and writes a plan JSON (default coa-plan.json in the project root). Non-destructive: produces a plan file only. Safe to call without confirmation. The plan is then applied via coa_deploy. Requires COA cloud credentials (~/.coa/config or profile/token) and an environmentID. V2 NOTICE: when the project contains V2 artifacts, a Args:
Returns: { command, exitCode, stdout, stderr, preflightWarnings?, coaVersion } |
| coa_deployA | Apply a plan JSON to a cloud environment. Changes environment schema/state. DESTRUCTIVE: modifies the deployed environment. Requires confirmed=true. The plan file must exist (produced by coa_plan). Does NOT re-validate project contents — validates the plan structure only. Args:
Returns: { command, exitCode, stdout, stderr, coaVersion } |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| coalesce-start-here | Discover projects, workspaces, environments, jobs, and node IDs before calling mutating tools. |
| safe-pipeline-planning | Planner-first pipeline workflow, including review and approval before any workspace mutation. |
| run-operations-guide | Choose the right run helper and interpret run statuses, results, warnings, and timeouts correctly. |
| large-result-handling | Use cache tools and coalesce://cache resource URIs when payloads are too large to return inline. |
| diagnose-failing-node | Step-by-step workflow for diagnosing why a node failed in a run. |
| prepare-for-deployment | Guided workflow to assess workspace readiness before deploying to an environment. |
| audit-workspace | Comprehensive workspace audit covering structure, quality, documentation, and lineage. |
| cross-server-workflow | Patterns for combining this MCP with Snowflake, Fivetran, dbt, or Catalog MCPs for end-to-end data workflows. |
| coalesce-setup | Guided first-time setup. Credentials can come from a `COALESCE_ACCESS_TOKEN` env var OR from `~/.coa/config` — whichever the user prefers. Use this the first time a user connects the MCP to a new machine. |
| column-change-workflow | Safely rename or retype a column across the pipeline with impact analysis and propagation. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Coalesce Overview | General Coalesce concepts, response guidelines, and operational constraints for AI assistants |
| SQL Platform Selection | How to determine the active SQL platform from project metadata and existing node SQL before choosing a dialect-specific resource |
| SQL Rules: Snowflake | Snowflake-specific SQL conventions for Coalesce node SQL |
| SQL Rules: Databricks | Databricks-specific SQL conventions for Coalesce node SQL |
| SQL Rules: BigQuery | BigQuery-specific SQL conventions for Coalesce node SQL |
| Data Engineering Principles | Data engineering best practices for node type selection, layered architecture, methodology detection, materialization strategies, and dependency management |
| Storage Locations and References | Storage location concepts, {{ ref() }} syntax, and reference patterns in Coalesce SQL |
| Tool Usage Patterns | Best practices for tool batching, parallelization, SQL conversion, and node operations |
| ID Discovery | How to resolve project, workspace, environment, job, run, node, and org IDs before calling Coalesce tools |
| Node Creation Decision Tree | How to choose between predecessor-based creation, updates, and full replacements for workspace nodes |
| Node Payloads | Practical guidance for working with workspace node bodies, including top-level fields, metadata, config, and array-replacement risks |
| Hydrated Metadata | Practical summary of Coalesce hydrated metadata structures for advanced node payload editing |
| Run Operations | Guidance for starting, retrying, polling, diagnosing, and canceling Coalesce runs |
| Node Type Corpus | Node type discovery, corpus search, metadata patterns (consult BEFORE creating or editing nodes) |
| Aggregation Patterns | Automatic JOIN ON generation, GROUP BY detection, datatype inference, and patterns for converting joins to aggregations |
| Intelligent Node Configuration | How intelligent config completion works for workspace nodes, including schema resolution, intelligence rules, and automatic field detection |
| Pipeline Workflows | Building pipelines end-to-end: node type selection, multi-node sequences, incremental setup, and pipeline execution |
| Node Operations | Editing existing nodes: join conditions, column operations, config fields, rename safety, SQL-to-graph conversion, and debugging |
| Node Type Selection Guide | When to use each Coalesce node type: Stage/Work for general transforms, Dimension/Fact only for dimensional modeling, and when to avoid Dynamic Tables, Incremental Loads, and other specialized patterns |
| Intent Pipeline Guide | How to use build_pipeline_from_intent to create pipelines from natural language descriptions, including entity resolution, operation detection, and the clarification flow |
| Run Diagnostics Guide | How to use diagnose_run_failure to analyze failed runs, classify node-level errors, and determine actionable fixes |
| Pipeline Review Guide | How to use review_pipeline to analyze existing pipelines for redundant nodes, missing joins, layer violations, naming issues, and optimization opportunities |
| Pipeline Workshop Guide | How to use the pipeline workshop tools for iterative, conversational pipeline building with session state |
| Ecosystem Boundaries | Scope of this MCP vs adjacent data engineering MCPs (Snowflake, Fivetran, dbt, Catalog) with cross-server workflow patterns |
| Setup Guide | How to walk a user through first-time Coalesce MCP setup conversationally — driven by diagnose_setup output. Load when the user is getting configured for the first time or a tool error points at missing credentials/profile/repo path. |
| SQL Node V1 vs V2 Policy | Default-V1 policy for local COA project authoring. Covers how to detect project shape, when V2 is permitted (explicit user ask + alpha warning), and the full V2 node-type + .sql file setup. Load before editing anything in a COA project on disk. |
| COA Describe: Overview | Top-level COA CLI overview — core workflow, commands, and pointers into the rest of the describe topics. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Commands | Full CLI command reference — flags, arguments, and examples for every coa subcommand. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Selectors | Node selector syntax for --include and --exclude (e.g., `{ STG_ORDERS }`, `{ location: "SRC" }`). Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Schemas | List of YAML schema types supported by COA (data.yml, locations.yml, workspaces.yml, etc.). Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Workflow | Iterative local development workflow: define → dry-run → create → run → verify → iterate. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Structure | COA workspace directory layout — where nodes, nodeTypes, environments, and macros belong. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Concepts | Coalesce object and workflow model — node types, pipeline architecture, data engineering guidance. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: SQL Format | V2 .sql file format: annotations (@id, @nodeType, config annotations), ref() syntax, and gotchas. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Node Types | Node type authoring — fileVersion, nodeMetadataSpec, create.sql.j2 and run.sql.j2 template patterns. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
| COA Describe: Config | ~/.coa/config file shape, multi-profile setups, and platform credential formats. Authoritative for CLI concepts (selectors, YAML schemas, command flags, config file, SQL format). For cloud-REST tools and cross-surface decisions, see `coalesce://context/*`. |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Coalesce-Software-Inc/coalesce-transform-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server