Skip to main content
Glama
Coalesce-Software-Inc

coalesce-transform-mcp

Official

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
SNOWFLAKE_PATNoSnowflake Programmatic Access Token (alternative to key pair)
SNOWFLAKE_ROLENoSnowflake user role
COALESCE_ORG_IDNoFallback org ID for cancel-run. Also readable from orgID in the active ~/.coa/config profile.
COALESCE_PROFILENoSelects which ~/.coa/config profile to load.default
COALESCE_BASE_URLNoRegion-specific base URL.https://app.coalescesoftware.io (US)
SNOWFLAKE_ACCOUNTNoSnowflake 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_DIRNoBase 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_PATHNoLocal repo root for repo-backed tools and pipeline planning. Also readable from repoPath in the active ~/.coa/config profile.
SNOWFLAKE_USERNAMENoSnowflake account username
SNOWFLAKE_WAREHOUSENoSnowflake compute warehouse
COALESCE_ACCESS_TOKENNoBearer token from the Coalesce Deploy tab. Optional when ~/.coa/config provides a token.
COALESCE_MCP_READ_ONLYNoWhen 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_KEYNoPath to PEM-encoded private key (required if SNOWFLAKE_PAT not set)
COALESCE_MCP_SKILLS_DIRNoDirectory 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_PASSNoPassphrase for encrypted keys
COALESCE_MCP_LINEAGE_TTL_MSNoIn-memory lineage cache TTL in milliseconds.1800000
COALESCE_MCP_REQUEST_TIMEOUT_MSNoDefault per-request timeout for Coalesce API calls. Raise on large workspaces where paginated reads exceed the default.60000
COALESCE_MCP_AUTO_CACHE_MAX_BYTESNoJSON size threshold before auto-caching to disk.32768
COALESCE_MCP_INVENTORY_CACHE_TTL_MSNoIn-memory TTL for the workspace node-type inventory. Set to 0 to disable.300000
COALESCE_MCP_MAX_REQUEST_BODY_BYTESNoMax outbound API request body size.524288
COALESCE_MCP_DETAIL_FETCH_TIMEOUT_MSNoPer-page timeout for detail=true paginated fetches of large node lists.180000
COALESCE_MCP_NODE_INDEX_CACHE_TTL_MSNoIn-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_MSNoIn-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

CapabilityDetails
tasks
{
  "requests": {
    "tools": {
      "call": {}
    }
  }
}
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}
completions
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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:

  • limit (number, optional): Max results per page

  • startingFrom (string, optional): Pagination cursor from previous response

  • orderBy (string, optional): Sort field (requires startingFrom)

  • orderByDirection ('asc'|'desc', optional): Sort direction

  • detail (boolean, optional): Include expanded environment configuration

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:

  • environmentID (string, required): The environment ID

Returns: Full environment object with ID, name, project, connection settings, and configuration.

create_environmentA

Create a new Coalesce environment within a project.

Args:

  • projectID (string, required): The project to create the environment in

  • name (string, required): Name for the new environment

  • oauthEnabled (boolean, optional): Enable OAuth (default: false)

  • devEnv (boolean, optional): Mark as development environment (default: false)

  • connectionAccount (string, optional): Connection account identifier

  • runTimeParameters (object, optional): Runtime parameters for the environment

  • tagColors (object, optional): UI tag colors { backgroundColor, textColor }

Returns: Created environment object with assigned ID.

delete_environmentA

Permanently delete a Coalesce environment. This is destructive and cannot be undone.

Args:

  • environmentID (string, required): The environment ID to delete

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

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 hasMore: true, you have NOT seen all nodes — you must page (call again with startingFrom set to the returned next, same orderBy) before drawing any conclusion about the environment, or you will undercount it. When you know the node, prefer get_environment_node by ID rather than paging.

Args:

  • environmentID (string, required): The environment ID

  • detail (boolean, optional): Include full node details

  • limit, startingFrom, orderBy, orderByDirection: Pagination (limit defaults to 100, or 25 when detail=true)

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 hasMore: true, this is NOT the whole workspace — treating one page as complete will undercount it. Either page through the rest (call again with startingFrom set to the returned next, same orderBy), or better, switch tools: use analyze_workspace_patterns for a complete whole-workspace profile in one call, or search_workspace_content / get_workspace_node by ID to find specific nodes. Only page the full workspace when the user explicitly wants a full inventory.

Args:

  • workspaceID (string, required): The workspace ID

  • detail (boolean, optional): Include full node details

  • limit, startingFrom, orderBy, orderByDirection: Pagination (limit defaults to 100, or 25 when detail=true)

Returns: { data: Node[], next?: string, hasMore?: boolean, retrieved?: number }

get_environment_nodeA

Get details of a specific node deployed in an environment.

Args:

  • environmentID (string, required): The environment ID

  • nodeID (string, required): The node ID

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID

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 name and metadata.columns to be provided. If you don't have column definitions yet, set completionLevel to 'created' or 'named' instead.

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID

  • body (object, required): Fields to update — name, description, nodeType, config, metadata.columns, etc.

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:

  • Applying column transforms (UPPER, LEFT, COALESCE, etc.) after node creation

  • Adding WHERE filters at the same time as column transforms

  • Converting from a simple join to GROUP BY aggregation

  • Completely replacing column definitions with aggregate functions

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID

  • columns (array, required): Complete new columns array

  • whereCondition (string, optional): WHERE filter to append

  • additionalChanges (object, optional): Additional fields to update

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:

  • Generates JOIN ON clauses from common columns between predecessors

  • Writes the complete FROM/JOIN/ON/GROUP BY clause to the node's joinCondition (no separate update needed)

  • Replaces columns with GROUP BY dimensions + aggregate measures

  • Infers datatypes from transform functions (COUNT → NUMBER, SUM → NUMBER(38,4), etc.)

  • Sets column-level attributes (isBusinessKey on GROUP BY columns, isChangeTracking on aggregates)

  • Validates that all non-aggregate columns are in GROUP BY

  • Runs intelligent config completion

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID of the join to convert

  • groupByColumns (string[], required): Columns to group by (dimensions)

  • aggregates (array, required): Aggregate columns with functions and expressions

  • joinType (string, optional): JOIN type (default: INNER JOIN)

  • maintainJoins (boolean, optional): Generate JOINs (default: true)

  • repoPath (string, optional): Local repo path for config completion

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID of the multi-predecessor node

  • joinType (enum, optional): 'INNER JOIN' | 'LEFT JOIN' | 'RIGHT JOIN' | 'FULL OUTER JOIN'. Defaults to INNER JOIN

  • whereClause (string, optional): WHERE filter to append after the JOIN (without the WHERE keyword)

  • qualifyClause (string, optional): QUALIFY clause to append (without the QUALIFY keyword)

  • joinColumnOverrides (array, optional): Explicit column mappings when column names differ across predecessors. Each entry: { leftPredecessor, rightPredecessor, leftColumn, rightColumn }

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:

  • columns + whereCondition: Replace auto-populated columns with specific transforms and add a WHERE filter — no separate replace_workspace_node_columns needed

  • groupByColumns + aggregates: Convert to an aggregation node with GROUP BY — no separate convert_join_to_aggregation needed These are mutually exclusive: use columns OR groupByColumns+aggregates, not both.

REQUIRED: Before calling this tool, call plan_pipeline with goal, sourceNodeIDs, and repoPath to discover and rank available node types. Use the nodeType from the plan result — do NOT guess or hardcode node types like 'Stage', 'View', or numeric IDs like '65'. The planner scans all committed node type definitions and scores them against your use case.

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:

  • Analyzes common columns between each predecessor pair

  • Returns joinSuggestions with normalized column names and their left/right counterparts

  • Reports which predecessors are represented in the resulting column references

  • Warns if any predecessor is missing from the auto-populated columns

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:

  • workspaceID (string, required): The workspace ID

  • nodeType (string, required): Node type from plan_pipeline

  • predecessorNodeIDs (string[], required): One or more predecessor node IDs

  • changes (object, optional): Partial fields to apply after creation

  • columns (array, optional): Replace auto-populated columns (mutually exclusive with groupByColumns)

  • whereCondition (string, optional): WHERE filter (only with columns)

  • groupByColumns (string[], optional): GROUP BY columns (with aggregates)

  • aggregates (array, optional): Aggregate columns (with groupByColumns)

  • joinType (string, optional): JOIN type for multi-predecessor aggregation

  • repoPath (string, optional): Local repo path for config completion

  • goal (string, optional): Intent for node type validation

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:

  1. Creating a node from predecessor(s) (auto-populates columns from source)

  2. Reconciling auto-populated columns against the external target schema

  3. Replacing columns to match the external schema exactly

Reconciliation logic:

  • Matched columns (by name): Preserves source linkage from predecessor, overrides dataType to match external schema

  • New columns (in target but not predecessor): Added without source mapping, flagged as needing a transform

  • Dropped columns (in predecessor but not target): Removed from the node

The response includes a reconciliation object showing exactly what was matched, added, dropped, and which types changed.

REQUIRED: Call plan_pipeline first to discover the correct nodeType.

Args:

  • workspaceID (string, required): The workspace ID

  • nodeType (string, required): Node type from plan_pipeline

  • predecessorNodeIDs (string[], required): One or more predecessor node IDs

  • targetColumns (array, required): External column definitions to match

  • targetName (string, optional): Name for the new node (e.g., 'STG_ORDER_HEADER')

  • locationName (string, optional): Storage location name

  • repoPath (string, optional): Local repo path for config completion

  • goal (string, optional): Intent for node type validation

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:

  • workspaceID (string, required): The workspace ID to analyze

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:

  • workspaceID (string, required): The workspace ID

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

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:

  • workspaceID (string, required): The workspace ID

  • nodeID (string, required): The node ID

  • repoPath (string, optional): Local repo path for type definition lookup

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 planSummaryUri MCP resource for the ranked node type summary so you can reuse that guidance throughout the pipeline without calling the planner again.

IMPORTANT — DO NOT WRITE SQL: The sql parameter is ONLY for converting SQL that the USER provided (pasted or typed). If you are building a pipeline yourself, provide goal + sourceNodeIDs instead.

PREREQUISITE: Before calling this tool, use list_workspace_nodes to discover available source/upstream nodes and their IDs in the workspace.

Preferred approach: Provide goal AND sourceNodeIDs. The planner selects the best node type and scaffolds the pipeline. Without sourceNodeIDs, the planner returns clarification questions.

User-provided SQL: When a user pastes SQL, pass it in sql. The planner parses refs and column projections.

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:

  • workspaceID (string, required): The workspace ID

  • plan (object, required): The exact plan object returned by plan_pipeline

  • confirmed (boolean, optional): Set to true after user approves the plan. Must be paired with confirmationToken

  • confirmationToken (string, optional): Token from prior STOP_AND_CONFIRM response. Required when confirmed=true

  • dryRun (boolean, optional): When true, validate without creating nodes

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:

  • "combine customers and orders by customer_id, aggregate total revenue by region"

  • "stage the raw payments table"

  • "join products with inventory on product_id"

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:

  • Redundant passthrough nodes (no transforms added)

  • Missing join conditions (multi-predecessor nodes without FROM/JOIN)

  • Layer violations (skipping staging/intermediate layers)

  • Node type mismatches (View used for joins, Dimension in staging layer)

  • Orphan nodes (disconnected from the pipeline)

  • Deep chains (8+ nodes deep)

  • High fan-out risk (10+ downstream dependents)

  • Naming inconsistencies

  • Unused columns (>50% not referenced downstream)

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:

  • runType ('deploy'|'refresh', optional): Filter by type

  • runStatus ('completed'|'failed'|'canceled'|'running'|'waitingToRun', optional): Filter by status

  • environmentID (string, optional): Filter by environment

  • detail (boolean, optional): Include full run details

  • limit, startingFrom, orderBy, orderByDirection: Pagination controls

Returns: { data: Run[], next?: string, total?: number }

get_runA

Get details of a specific Coalesce run.

Args:

  • runID (string, required): Numeric run ID (integer, e.g. '401'). Use the runCounter value from start_run or run_status — not the UUID from run URLs.

Returns: Full run object with status, timing, node results, and configuration.

get_run_resultsA

Get the execution results of a specific Coalesce run.

Args:

  • runID (string, required): Numeric run ID (integer). Use runCounter, not the UUID.

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:

  • runCounter (number, required): The numeric run counter

Returns: { runCounter, runStatus, message }

retry_runA

Retry a failed Coalesce run. Requires Snowflake auth via environment variables (Key Pair or PAT).

Args:

  • runDetails.runID (string, required): The run ID to retry

  • runDetails.forceIgnoreWorkspaceStatus (boolean, optional): Force retry even if deploy failed

  • parameters (object, optional): Runtime parameters

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:

  • runID (string, required): Numeric run ID to cancel

  • environmentID (string, required): Environment the run belongs to

  • orgID (string, optional): Organization ID. Falls back to COALESCE_ORG_ID env var or orgID in the active ~/.coa/config profile.

  • confirmed (boolean, optional): Set to true after the user explicitly confirms cancellation

Returns: Confirmation with updated run status.

list_projectsA

List all Coalesce projects.

Args:

  • includeWorkspaces (boolean, optional): Include nested workspace data

  • includeJobs (boolean, optional): Include nested job data for all workspaces

Returns: { data: Project[], next?: string, total?: number }

get_projectA

Get details of a specific Coalesce project.

Args:

  • projectID (string, required): The project ID

  • includeWorkspaces (boolean, optional): Include nested workspace data

  • includeJobs (boolean, optional): Include nested job data

Returns: Full project object with ID, name, description, git configuration.

create_projectA

Create a new Coalesce project.

Args:

  • name (string, required): Project name

  • platformKind (enum, required): Target platform — 'snowflake', 'databricks', 'starburst', or 'spark'

  • description (string, optional): Project description

  • gitAccountID (string, optional): Git account to link

  • gitRepo (string, optional): Git repository URL

  • gitBranch (string, optional): Default git branch

Returns: Created project object with assigned ID.

update_projectA

Update an existing Coalesce project. Partial update — only provided fields are changed.

Args:

  • projectID (string, required): The project ID

  • name (string, optional): Updated name

  • description (string, optional): Updated description

  • gitAccountID, gitRepo, gitBranch (string, optional): Updated git settings

  • includeWorkspaces, includeJobs (boolean, optional): Expand response

Returns: Updated project object.

delete_projectA

Permanently delete a Coalesce project. This is destructive and cannot be undone.

Args:

  • projectID (string, required): The project ID

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

Returns: Confirmation message.

list_git_accountsA

List all Git accounts configured in Coalesce.

Args:

  • accountOwner (string, optional): User ID of the account owner. Org admins can manage other users' accounts

Returns: { data: GitAccount[], next?: string, total?: number }

get_git_accountA

Get details of a specific Git account.

Args:

  • gitAccountID (string, required): The Git account ID

  • accountOwner (string, optional): User ID of the account owner

Returns: Git account object with connection details.

create_git_accountB

Create a new Git account in Coalesce.

Args:

  • name (string, required): Account name

  • gitUsername (string, required): Git username for authentication

  • gitAuthorName (string, required): Author name for git commits

  • gitAuthorEmail (string, required): Email address for git commits

  • gitToken (string, required): Personal access token for the git provider

  • provider (enum, optional): 'github' | 'gitlab' | 'bitbucket' | 'azureDevOps'

  • accountOwner (string, optional): User ID of the account owner

Returns: Created Git account with assigned ID.

update_git_accountA

Update an existing Git account. Partial update — only provided fields are changed.

Args:

  • gitAccountID (string, required): The account ID

  • name (string, optional): Updated name

  • gitUsername (string, optional): Updated git username

  • gitAuthorName (string, optional): Updated author name for git commits

  • gitAuthorEmail (string, optional): Updated email for git commits

  • gitToken (string, optional): Updated personal access token

  • provider (enum, optional): 'github' | 'gitlab' | 'bitbucket' | 'azureDevOps'

  • accountOwner (string, optional): User ID of the account owner

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:

  • gitAccountID (string, required): The account ID

  • accountOwner (string, optional): User ID of the account owner

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

Returns: Confirmation message.

list_org_usersA

List all users in the Coalesce organization.

Args:

  • limit, startingFrom, orderBy, orderByDirection: Pagination controls

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:

  • userID (string, required): The user ID

  • projectID (string, optional): Scope to a specific project

  • environmentID (string, optional): Scope to a specific environment

Returns: Role assignments for the user.

list_user_rolesB

List roles for all users in the organization, optionally scoped.

Args:

  • projectID (string, optional): Scope to a project

  • environmentID (string, optional): Scope to an environment

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:

  • userID (string, required): The user ID

  • role (string, required): Role to assign (e.g., 'admin', 'member', 'viewer')

Returns: Updated role assignment.

set_project_roleA

Set a user's role for a specific project. Idempotent.

Args:

  • userID (string, required): The user ID

  • projectID (string, required): The project ID

  • role (string, required): Role to assign (e.g., 'admin', 'developer', 'viewer')

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:

  • userID (string, required): The user ID

  • projectID (string, required): The project ID

  • confirmed (boolean, optional): Set to true after the user explicitly confirms the role removal

Returns: Confirmation message.

set_env_roleA

Set a user's role for a specific environment. Idempotent.

Args:

  • userID (string, required): The user ID

  • environmentID (string, required): The environment ID

  • role (string, required): Role to assign

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:

  • userID (string, required): The user ID

  • environmentID (string, required): The environment ID

  • confirmed (boolean, optional): Set to true after the user explicitly confirms the role removal

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. { subgraph: NAME } terms can only be resolved when repoPath is set (or COALESCE_REPO_PATH). Without a repo, such terms land in unresolved and a warning is added to summary.warnings.

Args:

  • workspaceID (string, required): The workspace that owns the job

  • jobID (string, optional): The job ID. Preferred when known.

  • jobName (string, optional): The job name. Resolved against workspace jobs when jobID is absent.

  • repoPath (string, optional): Coalesce repo path for subgraph YAML lookup. Falls back to COALESCE_REPO_PATH or the coa profile.

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:

  • environmentID (string, required): The environment ID

  • jobName (string, required): Substring to match (case-insensitive)

  • runLimitPerJob (integer, optional): Max recent runs per matched job (default 5)

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:

  • environmentID (string, required): The environment ID

  • jobName (string, required): Substring to match (case-insensitive). Must match exactly one job.

  • includeResults (boolean, optional): Include per-node run results (default true)

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:

  • environmentID (string, required): The environment ID

  • limit, startingFrom, orderBy, orderByDirection: Pagination

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:

  • workspaceID (string, required): The workspace ID

  • name (string, required): Job name

  • includeSelector (string, required): Node selector. Format: '{ location: LOC name: NAME } OR { location: LOC name: NAME }'. Use empty string to include nothing

  • excludeSelector (string, required): Node exclusion selector. Same format as includeSelector. Use empty string to exclude nothing

Returns: Created job with assigned ID.

get_environment_jobA

Get details of a specific job in an environment.

Args:

  • environmentID (string, required): The environment ID

  • jobID (string, required): The job ID

Returns: Job object with name, node list, schedule, and configuration.

update_workspace_jobB

Update an existing workspace job.

Args:

  • workspaceID (string, required): The workspace ID

  • jobID (string, required): The job ID

  • name (string, required): Updated job name

  • includeSelector (string, required): Node selector. Format: '{ location: LOC name: NAME } OR { location: LOC name: NAME }'

  • excludeSelector (string, required): Node exclusion selector. Same format as includeSelector

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:

  • workspaceID (string, required): The workspace ID

  • jobID (string, required): The job ID

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

Returns: Confirmation message.

get_workspace_subgraphA

Get details of a specific subgraph.

Args:

  • workspaceID (string, required): The workspace ID

  • subgraphID (string, required): The subgraph ID

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:

  • workspaceID (string, required): The workspace ID

  • name (string, required): Subgraph name

  • steps (string[], required): Array of node IDs to include

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:

  • workspaceID (string, required): The workspace ID

  • subgraphID (string, optional): The subgraph ID. Preferred when known.

  • subgraphName (string, optional): The subgraph name. Used to resolve the ID when subgraphID is absent.

  • repoPath (string, optional): Coalesce repo path for subgraph YAML lookup.

  • name (string, required): Updated name

  • steps (string[], required): Updated node IDs

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:

  • workspaceID (string, required): The workspace ID

  • subgraphID (string, optional): The subgraph ID. Preferred when known.

  • subgraphName (string, optional): The subgraph name. Resolved via cache → repo when subgraphID is absent (the Coalesce API has no subgraph list endpoint).

  • repoPath (string, optional): Coalesce repo path for subgraph YAML lookup.

  • confirmed (boolean, optional): Set to true after the user explicitly confirms deletion

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:

  • workspaceID (string, required): The workspace ID

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:

  • workspaceID (string, required): The workspace ID

  • detail (boolean, optional): Fetch expanded node details. Defaults to true

  • pageSize (number, optional): API page size for collection. Defaults to 250, max 500

  • orderBy (string, optional): Sort field for paginated collection. Defaults to id

  • orderByDirection ('asc'|'desc', optional): Sort direction

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:

  • environmentID (string, required): The environment ID

  • detail (boolean, optional): Fetch expanded node details. Defaults to true

  • pageSize (number, optional): API page size for collection. Defaults to 250, max 500

  • orderBy (string, optional): Sort field for paginated collection. Defaults to id

  • orderByDirection ('asc'|'desc', optional): Sort direction

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:

  • runType (enum, optional): Filter by 'deploy' or 'refresh'

  • runStatus (enum, optional): Filter by 'completed' | 'failed' | 'canceled' | 'running' | 'waitingToRun'

  • environmentID (string, optional): Filter by environment ID

  • detail (boolean, optional): Fetch expanded run details. Defaults to false

  • pageSize (number, optional): API page size for collection. Defaults to 250, max 500

  • orderBy (string, optional): Sort field for paginated collection. Defaults to id

  • orderByDirection ('asc'|'desc', optional): Sort direction

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:

  • pageSize (number, optional): API page size for collection. Defaults to 250, max 500

  • orderBy (string, optional): Sort field for paginated collection. Defaults to id

  • orderByDirection ('asc'|'desc', optional): Sort direction

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:

  • confirmed (boolean, optional): Set to true after the user explicitly confirms cache clearing

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:

  • Add nodes: 'add a staging node for PAYMENTS'

  • Join sources: 'join CUSTOMERS and ORDERS on CUSTOMER_ID'

  • Add aggregation: 'aggregate total REVENUE by REGION'

  • Change join key: 'change the join key to ORDER_ID'

  • Add filters: 'add filter for STATUS = active'

  • Add/remove columns: 'add column FULL_NAME' or 'remove column MIDDLE_NAME'

  • Rename nodes: 'rename STG_ORDERS to STG_SALES'

  • Remove nodes: 'remove the ORPHAN node'

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 coa doctor against a local COA project — checks data.yml, workspaces.yml, credentials, and warehouse connectivity.

KNOWN ISSUE (CD-16983): doctor reports the profile selected via workspaces.yml / --workspace, but coa_plan / coa_deploy / coa_refresh resolve profile differently — they fall through to the [default] profile in ~/.coa/config unless --profile or COALESCE_PROFILE is set. A green doctor result does NOT guarantee that plan/deploy will authenticate against the same cloud account. When a user reports plan/deploy auth mismatches, suspect profile divergence before blaming credentials. Platform fix approach still under discussion.

Args:

  • projectPath (string, required): Path to the COA project root (directory with data.yml)

  • workspace (string, optional): workspaces.yml workspace name (default: dev)

Returns: { command, exitCode, stdout, stderr, timedOut, json?, coaVersion, preflightWarnings? }

coa_bootstrap_workspacesA

Run coa doctor --fix — writes a starter workspaces.yml in the project root, seeded from locations.yml. Safe to re-run; coa will not overwrite a valid existing file.

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 workspaces.yml profile controls coa create/run, but coa plan/deploy/refresh fall through to [default] in ~/.coa/config. After bootstrap, check that the two profiles point at the same cloud account before relying on plan/deploy results.

DESTRUCTIVE: writes a new file to the project directory. Requires confirmed=true after explicit user approval.

Args:

  • projectPath (string, required): Path to the COA project root (directory with data.yml)

  • workspace (string, optional): workspaces.yml workspace name (default: dev)

  • confirmed (boolean): must be true to execute

Returns: { command, exitCode, stdout, stderr, json?, coaVersion }

coa_validateA

Run coa validate — scans a project's YAML schemas, storage locations, column references, and types.

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:

  • projectPath (string, required)

  • workspace (string, optional)

  • include / exclude (string, optional): Node selector

Returns: { command, exitCode, stdout, stderr, json?, coaVersion }

coa_list_project_nodesA

List all nodes defined in a local COA project (pre-deploy). Wraps coa create --list-nodes.

Different from list_environment_nodes (which lists deployed nodes in a cloud environment via the REST API).

Args:

  • projectPath (string, required)

  • workspace (string, optional)

Returns: { command, exitCode, stdout, json?, coaVersion }

coa_dry_run_createA

Preview the DDL that coa create would execute, without hitting the warehouse. Forces --dry-run --verbose.

Runs entirely offline against local project files — no Coalesce cloud authentication or API calls. coa create (and coa run) are the offline local-dev commands; do not confuse with the scheduler-aware coa deploy / coa plan / coa refresh which target cloud environments.

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 CREATE TABLE ... AS SELECT WHERE 1=0 with zero columns — this means the SELECT has a parse error and the dry-run reports success despite producing broken DDL. See coalesce://context/sql-node-v2-policy.

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:

  • projectPath (string, required)

  • workspace (string, optional)

  • include / exclude (string, optional): Node selector

Returns: { command, exitCode, stdout, stderr, coaVersion }

coa_dry_run_runA

Preview the DML that coa run would execute, without hitting the warehouse. Forces --dry-run --verbose.

Runs entirely offline against local project files — no Coalesce cloud authentication or API calls. coa run (and coa create) are the offline local-dev commands; do not confuse with the scheduler-aware coa deploy / coa plan / coa refresh which target cloud environments.

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:

  • projectPath (string, required)

  • workspace (string, optional)

  • include / exclude (string, optional): Node selector

Returns: { command, exitCode, stdout, stderr, coaVersion }

coa_createA

Execute coa create — runs DDL (CREATE/REPLACE) for the selected nodes against the configured warehouse.

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 V2_DETECTED preflight warning attaches to the result. Execution is no longer blocked — annotation sync (CD-16972) and UNION ALL shipped in COA 7.35 closed the biggest V2 risks. Two rough edges remain: coa validate false positives on aliased columns, and zero-column CTAS when a SELECT has a parse error. See coalesce://context/sql-node-v2-policy.

Args:

  • projectPath (string, required)

  • workspace, include, exclude (optional)

  • confirmed (boolean): must be true to execute

Returns: { command, exitCode, stdout, stderr, preflightWarnings?, coaVersion }

coa_runA

Execute coa run — runs DML (INSERT/MERGE) to populate the selected nodes.

DESTRUCTIVE: modifies warehouse data. Requires confirmed=true.

Same pre-flight checks as coa_create. A V2_DETECTED preflight warning attaches for V2 projects but does not block execution (see coa_create for the V2 NOTICE). Uses a 30-minute timeout.

Args:

  • projectPath (string, required)

  • workspace, include, exclude (optional)

  • confirmed (boolean): must be true to execute

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 V2_DETECTED preflight warning attaches to the result (same shape as coa_create / coa_run). Execution is not blocked; see coalesce://context/sql-node-v2-policy for the two remaining rough edges.

Args:

  • projectPath (string, required)

  • environmentID (string, required)

  • out (string, optional): plan output path

  • gitsha, enableCache (optional)

  • profile, token (optional)

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:

  • environmentID (string, required)

  • plan (string, required): path to coa-plan.json

  • profile, token (optional)

  • confirmed (boolean): must be true to execute

Returns: { command, exitCode, stdout, stderr, coaVersion }

Prompts

Interactive templates invoked by user choice

NameDescription
coalesce-start-hereDiscover projects, workspaces, environments, jobs, and node IDs before calling mutating tools.
safe-pipeline-planningPlanner-first pipeline workflow, including review and approval before any workspace mutation.
run-operations-guideChoose the right run helper and interpret run statuses, results, warnings, and timeouts correctly.
large-result-handlingUse cache tools and coalesce://cache resource URIs when payloads are too large to return inline.
diagnose-failing-nodeStep-by-step workflow for diagnosing why a node failed in a run.
prepare-for-deploymentGuided workflow to assess workspace readiness before deploying to an environment.
audit-workspaceComprehensive workspace audit covering structure, quality, documentation, and lineage.
cross-server-workflowPatterns for combining this MCP with Snowflake, Fivetran, dbt, or Catalog MCPs for end-to-end data workflows.
coalesce-setupGuided 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-workflowSafely rename or retype a column across the pipeline with impact analysis and propagation.

Resources

Contextual data attached and managed by the client

NameDescription
Coalesce OverviewGeneral Coalesce concepts, response guidelines, and operational constraints for AI assistants
SQL Platform SelectionHow to determine the active SQL platform from project metadata and existing node SQL before choosing a dialect-specific resource
SQL Rules: SnowflakeSnowflake-specific SQL conventions for Coalesce node SQL
SQL Rules: DatabricksDatabricks-specific SQL conventions for Coalesce node SQL
SQL Rules: BigQueryBigQuery-specific SQL conventions for Coalesce node SQL
Data Engineering PrinciplesData engineering best practices for node type selection, layered architecture, methodology detection, materialization strategies, and dependency management
Storage Locations and ReferencesStorage location concepts, {{ ref() }} syntax, and reference patterns in Coalesce SQL
Tool Usage PatternsBest practices for tool batching, parallelization, SQL conversion, and node operations
ID DiscoveryHow to resolve project, workspace, environment, job, run, node, and org IDs before calling Coalesce tools
Node Creation Decision TreeHow to choose between predecessor-based creation, updates, and full replacements for workspace nodes
Node PayloadsPractical guidance for working with workspace node bodies, including top-level fields, metadata, config, and array-replacement risks
Hydrated MetadataPractical summary of Coalesce hydrated metadata structures for advanced node payload editing
Run OperationsGuidance for starting, retrying, polling, diagnosing, and canceling Coalesce runs
Node Type CorpusNode type discovery, corpus search, metadata patterns (consult BEFORE creating or editing nodes)
Aggregation PatternsAutomatic JOIN ON generation, GROUP BY detection, datatype inference, and patterns for converting joins to aggregations
Intelligent Node ConfigurationHow intelligent config completion works for workspace nodes, including schema resolution, intelligence rules, and automatic field detection
Pipeline WorkflowsBuilding pipelines end-to-end: node type selection, multi-node sequences, incremental setup, and pipeline execution
Node OperationsEditing existing nodes: join conditions, column operations, config fields, rename safety, SQL-to-graph conversion, and debugging
Node Type Selection GuideWhen 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 GuideHow to use build_pipeline_from_intent to create pipelines from natural language descriptions, including entity resolution, operation detection, and the clarification flow
Run Diagnostics GuideHow to use diagnose_run_failure to analyze failed runs, classify node-level errors, and determine actionable fixes
Pipeline Review GuideHow to use review_pipeline to analyze existing pipelines for redundant nodes, missing joins, layer violations, naming issues, and optimization opportunities
Pipeline Workshop GuideHow to use the pipeline workshop tools for iterative, conversational pipeline building with session state
Ecosystem BoundariesScope of this MCP vs adjacent data engineering MCPs (Snowflake, Fivetran, dbt, Catalog) with cross-server workflow patterns
Setup GuideHow 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 PolicyDefault-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: OverviewTop-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: CommandsFull 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: SelectorsNode 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: SchemasList 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: WorkflowIterative 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: StructureCOA 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: ConceptsCoalesce 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 FormatV2 .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 TypesNode 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

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