Skip to main content
Glama
coalesce-transform-mcp

coalesce-transform-mcp

Official

coalesce-transform-mcp

npm version Install in VS Code Install in VS Code Insiders Install in Cursor License: MIT

MCP server for Coalesce. Built for Snowflake Cortex Code (CoCo) - with first-class support for every other MCP client (Claude Code, Claude Desktop, Cursor, VS Code, Windsurf). Manage nodes, pipelines, environments, jobs, and runs, and drive the local-first Coalesce CLI from the same server: validate a project, preview DDL/DML, plan a deployment, and apply it to a cloud environment.


I want to…

Task

Jump to

πŸš€

Get running in 2 minutes

Quick Start

πŸŽ›οΈ

Customize agent behavior

Skills

πŸ”

Find a specific tool

Tools

πŸ“¦

Walk through the full setup

Full Installation

πŸ”‘

Authenticate (env var or ~/.coa/config)

Credentials

🌐

Run against multiple Coalesce environments

Multiple environments

πŸ“₯

Scaffold source nodes from warehouse tables

Tools β†’ warehouse source discovery

πŸ”’

Lock prod down to read-only

Safety model


Related MCP server: bricks-use

Quick Start

Each link below opens a short install guide with a click-to-install button (where supported) and the manual config.

TIP

❄️ Snowflake Cortex Code + coalesce-transform-mcp. CoCo is Snowflake's AI coding CLI - it already knows your warehouse, role, and data. Drop this MCP in and an agent can plan pipelines, create nodes, run DML, and verify results in a single session, all under Snowflake's auth model. Install in Cortex Code β†’

Why this pairing? Cortex Code is Snowflake's AI coding CLI - it already authenticates to your warehouse, runs under your Snowflake role, and has native tools for querying live data. Add coalesce-transform-mcp and a single agent session can plan pipelines, create nodes, run DML, and verify results against real rows without leaving the terminal.

One-liner (after installing the Cortex Code CLI):

cortex mcp add coalesce-transform npx coalesce-transform-mcp

Or edit ~/.snowflake/cortex/mcp.json directly:

{
  "mcpServers": {
    "coalesce-transform": {
      "type": "stdio",
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

Drop the env block if you're using ~/.coa/config - Cortex Code and Coalesce can both pick the token up from the same profile. Full walkthrough: docs/installation-guides/cortex-code.md.

Click-to-install: Install in Cursor

Manual: paste into .cursor/mcp.json in your project root (or ~/.cursor/mcp.json for global):

{
  "mcpServers": {
    "coalesce-transform": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

Cursor does not expand ${VAR} - paste the literal token, or drop the env block and use ~/.coa/config (see Credentials).

Click-to-install: Install in VS Code

Manual: follow the VS Code MCP install guide and use this config:

{
  "name": "coalesce-transform",
  "command": "npx",
  "args": ["coalesce-transform-mcp"]
}

Add the COALESCE_ACCESS_TOKEN via VS Code's secret input prompt, or drop the token and use ~/.coa/config. Reload the VS Code window after install.

Click-to-install: Install in VS Code Insiders

Manual: identical to the stable VS Code install - Insiders reads the same MCP config.

One-liner:

claude mcp add coalesce-transform -- npx coalesce-transform-mcp

Pass env vars inline if you need them:

claude mcp add coalesce-transform \
  --env COALESCE_ACCESS_TOKEN=$COALESCE_ACCESS_TOKEN \
  -- npx coalesce-transform-mcp

Manual: paste into .mcp.json in your project root (or ~/.claude.json for global):

{
  "mcpServers": {
    "coalesce-transform": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_ACCESS_TOKEN": "${COALESCE_ACCESS_TOKEN}"
      }
    }
  }
}

Claude Code does expand ${VAR} from your shell env at load time - .mcp.json can stay safely committed to git with variable references. Omit the env block if using ~/.coa/config.

No deeplink yet - paste manually.

File: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).

{
  "mcpServers": {
    "coalesce-transform": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

Claude Desktop does not expand ${VAR} - paste the literal token, or drop the env block and use ~/.coa/config. Fully quit Claude Desktop (Cmd+Q) and relaunch after editing.

No deeplink yet - paste manually.

File: ~/.codeium/windsurf/mcp_config.json.

{
  "mcpServers": {
    "coalesce-transform": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

Windsurf does not expand ${VAR} - paste the literal token, or drop the env block and use ~/.coa/config. Restart Windsurf after editing.

TIP

πŸš€ Just installed?

Just say "help me get set up" β€” or run /coalesce-setup. Your agent will check your credentials and project setup, then walk you through fixing whatever's missing.


Skills

Skills are editable markdown that shapes how the agent reasons about your Coalesce project. Ship your team's naming conventions, grain definitions, and layering patterns as context - every agent on the server instantly picks them up. No fine-tuning, no prompt engineering, just markdown you edit and commit.

Set COALESCE_MCP_SKILLS_DIR to make skills editable on disk. Each skill resolves to default content, user-augmented content, or a full user override - see docs/context-skills.md for the resolution order and customization walkthrough.

25 skills, grouped into 6 families:

  • overview - General Coalesce concepts, response guidelines, and operational constraints

  • tool-usage - Best practices for tool batching, parallelization, and SQL conversion

  • id-discovery - Resolving project, workspace, environment, job, run, node, and org IDs

  • storage-mappings - Storage location concepts, {{ ref() }} syntax, and reference patterns

  • ecosystem-boundaries - Scope of this MCP vs adjacent data-engineering MCPs (Snowflake, Fivetran, dbt, Catalog)

  • data-engineering-principles - Node type selection, layered architecture, methodology detection, materialization strategies

  • sql-platform-selection - Determining the active SQL platform from project metadata

  • setup-guide - First-time MCP setup flow driven by diagnose_setup (pairs with the /coalesce-setup prompt)

  • sql-snowflake - Snowflake-specific SQL conventions for node SQL

  • sql-databricks - Databricks-specific SQL conventions for node SQL

  • sql-bigquery - BigQuery-specific SQL conventions for node SQL

  • node-creation-decision-tree - Choosing between predecessor-based creation, updates, and full replacements

  • node-payloads - Working with workspace node bodies, metadata, config, and array-replacement risks

  • hydrated-metadata - Coalesce hydrated metadata structures for advanced node payload editing

  • intelligent-node-configuration - How intelligent config completion works, schema resolution, automatic field detection

  • node-operations - Editing existing nodes: joins, columns, config fields, and SQL-to-graph conversion

  • aggregation-patterns - JOIN ON generation, GROUP BY detection, and join-to-aggregation conversion

  • node-type-selection-guide - When to use each Coalesce node type (Stage/Work vs Dimension/Fact vs specialized)

  • node-type-corpus - Node type discovery, corpus search, and metadata patterns

  • pipeline-workflows - Building pipelines end-to-end: node type selection, multi-node sequences, execution

  • intent-pipeline-guide - Using build_pipeline_from_intent to create pipelines from natural language

  • pipeline-review-guide - Using review_pipeline for pipeline analysis and optimization

  • pipeline-workshop-guide - Using pipeline workshop tools for iterative, conversational pipeline building

  • run-operations - Starting, retrying, polling, diagnosing, and canceling Coalesce runs

  • run-diagnostics-guide - Using diagnose_run_failure to analyze failed runs and determine fixes


Tools

NOTE

Legend

  • ⚠️ Destructive - the tool needs confirmed: true before it will run.

  • 🧰 Bundled coa CLI - runs locally against a project directory. The tool needs a projectPath pointing at a folder that contains data.yml.

  • Preflight validation - destructive 🧰 tools run a safety check before shelling out. See Safety model.

Environments, workspaces, projects

  • list_environments - List all available environments

  • get_environment - Get details of a specific environment

  • list_workspaces - List all workspaces

  • get_workspace - Get details of a specific workspace

  • list_projects - List all projects

  • get_project - Get project details

Nodes

  • list_environment_nodes - List nodes in an environment

  • list_workspace_nodes - List nodes in a workspace

  • get_environment_node - Get a specific environment node

  • get_workspace_node - Get a specific workspace node

  • analyze_workspace_patterns - Detect package adoption, pipeline layers, methodology, and generate recommendations

  • list_workspace_node_types - List distinct node types observed in current workspace nodes

Jobs, subgraphs, runs

  • list_environment_jobs - List all jobs for an environment

  • find_jobs_by_name - Fuzzy-match environment jobs by name and return each match with its recent runs

  • get_job_run_details_by_name - Fuzzy-match one environment job by name and return its latest run details + results

  • get_environment_job - Get details of a specific job

  • list_job_nodes - Resolve a workspace job's selectors into concrete nodes, grouped by subgraph

  • get_workspace_subgraph - Get details of a specific subgraph by UUID (the public API has no subgraph list endpoint β€” look up UUIDs via the repo's subgraphs/ folder or the local cache populated on create)

  • list_runs - List runs with optional filters

  • get_run - Get details of a specific run

  • get_run_results - Get results of a completed run

  • get_run_details - Run metadata plus results in one call

Search

  • search_workspace_content - Search node SQL, column names, descriptions, and config values

  • audit_documentation_coverage - Scan all workspace nodes/columns for missing descriptions

Local project & cloud CLI

  • 🧰 coa_list_project_nodes - List all nodes defined in a local project (pre-deploy)

Plan & build

  • plan_pipeline - Plan a pipeline from SQL or a natural-language goal without mutating the workspace; ranks best-fit node types from the local repo

  • create_pipeline_from_plan - Execute an approved pipeline plan using predecessor-based creation

  • create_pipeline_from_sql - Plan and create a pipeline directly from SQL

  • build_pipeline_from_intent - Build a pipeline from a natural language goal with automatic entity resolution and node type selection

  • review_pipeline - Analyze an existing pipeline for redundant nodes, missing joins, layer violations, naming issues, and optimization opportunities

  • parse_sql_structure - Parse a SQL statement into structural components (CTEs, source tables, projected columns) without touching the workspace

  • select_pipeline_node_type - Rank and select the best Coalesce node type for a pipeline step

Workshop (iterative, conversational)

  • pipeline_workshop_open - Open an iterative pipeline builder session with workspace context pre-loaded

  • pipeline_workshop_instruct - Send a natural language instruction to modify the current workshop plan

  • get_pipeline_workshop_status - Get the current state of a workshop session

  • pipeline_workshop_close - Close a workshop session and release resources

Local project validation & planning

  • 🧰 coa_validate - Validate YAML schemas and scan a local project for configuration problems

  • 🧰 coa_plan - Generate a deployment plan JSON by diffing a local project against a cloud environment (non-destructive)

Create

  • create_workspace_node_from_scratch - Create a workspace node with no predecessors

  • create_workspace_node_from_predecessor - Create a node from predecessor nodes with column coverage verification

  • create_node_from_external_schema - Create a workspace node whose columns match an existing warehouse table or external schema

Update

  • set_workspace_node - Replace a workspace node with a full body

  • update_workspace_node - Safely update selected fields of a workspace node

  • replace_workspace_node_columns - Replace metadata.columns wholesale

  • delete_workspace_node - Delete a node from a workspace ⚠️

Configure

  • complete_node_configuration - Intelligently complete a node's configuration by analyzing context

  • apply_join_condition - Auto-generate and write a FROM/JOIN/ON clause for a multi-predecessor node

  • convert_join_to_aggregation - Convert a join-style node into an aggregated fact-style node

Disk ↔ cloud round-trip

  • serialize_workspace_node_to_disk_yaml - Convert a cloud workspace node to the on-disk nodes/*.yml shape coa reads (drop into a coa project for dry-run rendering)

  • parse_disk_node_to_workspace_body - Convert an on-disk coa node YAML back into a cloud workspace-node body for set_workspace_node / update_workspace_node

  • apply_sql_to_workspace_node - Round-trip user edits on rendered DDL/DML SQL (coa_dry_run_create / coa_dry_run_run output) back into a cloud node β€” column diff, source-mapping inference, GROUP BY / ORDER BY / LIMIT, INSERT-target rename

Subgraphs & jobs

  • create_workspace_subgraph - Create a subgraph to group nodes visually

  • update_workspace_subgraph - Update a subgraph's name and node membership

  • delete_workspace_subgraph - Delete a subgraph (nodes are NOT deleted) ⚠️

  • create_workspace_job - Create a job in a workspace with node include/exclude selectors

  • update_workspace_job - Update a job's name and node selectors

  • delete_workspace_job - Delete a job ⚠️

  • start_run - Start a new run; requires Snowflake auth

  • run_and_wait - Start a run and poll until completion

  • run_status - Check status of a running job

  • retry_run - Retry a failed run

  • retry_and_wait - Retry a failed run and poll until completion

  • cancel_run - Cancel a running job ⚠️

  • diagnose_run_failure - Classify errors, surface root cause, suggest actionable fixes

  • get_environment_overview - Environment details with full node list

  • get_environment_health - Dashboard: node counts, run statuses, failed runs in last 24h, stale nodes, dependency health

Local execution (bundled CLI)

  • 🧰 coa_dry_run_create - Preview DDL without executing (does not validate columns/types exist in warehouse)

  • 🧰 coa_dry_run_run - Preview DML without executing (same caveat)

  • 🧰 coa_create - Run DDL (CREATE/REPLACE) against the warehouse for selected nodes ⚠️

  • 🧰 coa_run - Run DML (INSERT/MERGE) to populate selected nodes ⚠️

  • 🧰 coa_deploy - Apply a plan JSON to a cloud environment ⚠️

  • 🧰 coa_refresh - Run DML for selected nodes in an already-deployed environment (no local project required) ⚠️

Warehouse source discovery (bundled CLI, new in v0.10)

Pair these three to onboard warehouse tables as source nodes without hand-writing YAML. Typical flow: list to see per-location counts, add (scoped by location) to scaffold, optionally remove to drop nodes when a location is retired. Each add populates the source node's database/schema from the workspace config β€” no placeholder values to fix up afterward.

  • 🧰 coa_list_warehouse_sources - List warehouse tables per storage location; summary or per-table detail (with alreadyExists flags)

  • 🧰 coa_add_warehouse_sources ⚠️ - Scaffold source-node YAML files from warehouse tables; supports dryRun: true for preview

  • 🧰 coa_remove_warehouse_sources ⚠️ - Delete scaffolded source-node YAML; hand-renamed files are skipped

  • get_upstream_nodes - Walk the full upstream dependency graph for a node

  • get_downstream_nodes - Walk the full downstream dependency graph for a node

  • get_column_lineage - Trace a column through the pipeline upstream and downstream

  • analyze_impact - Downstream impact of changing a node or specific column - impacted counts, grouped by depth, and critical path

  • propagate_column_change - Update all downstream columns after a column rename or data type change ⚠️

  • list_repo_packages - List package aliases and enabled node-type coverage from a committed Coalesce repo

  • list_repo_node_types - List exact resolvable committed node-type identifiers from nodeTypes/

  • get_repo_node_type_definition - Resolve one node type and return its outer definition plus parsed nodeMetadataSpec

  • generate_set_workspace_node_template - Generate a YAML-friendly set_workspace_node body template

  • search_node_type_variants - Search the committed node-type corpus by normalized family, package, primitive, or support status

  • get_node_type_variant - Load one exact node-type corpus variant by variant key

  • generate_set_workspace_node_template_from_variant - Generate a template from a committed corpus variant

  • create_environment - Create a new environment within a project

  • delete_environment - Delete an environment ⚠️

  • create_project - Create a new project

  • update_project - Update a project

  • delete_project - Delete a project ⚠️

  • list_git_accounts - List all git accounts

  • get_git_account - Get git account details

  • create_git_account - Create a new git account

  • update_git_account - Update a git account

  • delete_git_account - Delete a git account ⚠️

  • list_org_users - List all organization users

  • get_user_roles - Get roles for a specific user

  • list_user_roles - List all user roles

  • set_org_role - Set organization role for a user

  • set_project_role - Set project role for a user

  • delete_project_role - Remove project role from a user ⚠️

  • set_env_role - Set environment role for a user

  • delete_env_role - Remove environment role from a user ⚠️

Cache snapshots

  • cache_workspace_nodes - Fetch every page of workspace nodes, write a full snapshot, and return cache metadata

  • cache_environment_nodes - Fetch every page of environment nodes, write a full snapshot

  • cache_runs - Fetch every page of run results, write a full snapshot

  • cache_org_users - Fetch every page of organization users, write a full snapshot

  • clear_data_cache - Delete all cached snapshots, auto-cached responses, and plan summaries ⚠️

Skills & setup

  • personalize_skills - Export bundled skill files to a local directory for customization

  • diagnose_setup - Stateless probe reporting configured setup pieces; pairs with the /coalesce-setup MCP prompt

  • 🧰 coa_doctor - Check config, credentials, and warehouse connectivity end-to-end for a local project

  • 🧰 coa_bootstrap_workspaces ⚠️ - Run coa doctor --fix to write a starter workspaces.yml from locations.yml (placeholder values β€” user must edit before running warehouse operations)

  • 🧰 coa_describe - Fetch a section of COA's self-describing documentation by topic + optional subtopic (also available as coalesce://coa/describe/* resources)


Full Installation

Requirements:

  • Node.js 22+

  • A Coalesce account with a workspace

  • An MCP-compatible AI client (see Quick Start)

  • Snowflake credentials - only if you plan to use run tools or coa_create/coa_run (see Credentials)

  • Install footprint is ~76 MB unpacked (the bundled @coalescesoftware/coa CLI ships its own runtime; the MCP tarball itself is under 1 MB)

1. Clone your project. If your team already has a Coalesce project in Git, clone it locally - the bundled coa CLI operates on a project directory, so most local create/run tools require one on disk:

git clone <your-coalesce-project-repo-url>
cd my-project

Don't have a Git-linked project yet? In the Coalesce UI, open your workspace β†’ Settings β†’ Git and connect a repo (or create one via your Git provider and paste the URL). Coalesce will commit the project skeleton on first push; clone that repo locally once it's populated.

my-project/
β”œβ”€β”€ data.yml                 # Root metadata (fileVersion, platformKind)
β”œβ”€β”€ locations.yml            # Storage location manifest
β”œβ”€β”€ nodes/                   # Pipeline nodes (.yml for V1, .sql for V2)
β”œβ”€β”€ nodeTypes/               # Node type definitions with templates
β”œβ”€β”€ environments/            # Environment configs with storage mappings
β”œβ”€β”€ macros/                  # Reusable SQL macros
β”œβ”€β”€ jobs/                    # Job definitions
└── subgraphs/               # Subgraph definitions

V1 vs V2 - the format is pinned by fileVersion in data.yml. V1 (fileVersion: 1 or 2) stores each node as a single YAML file with columns, transforms, and config inline. V2 (fileVersion: 3) is SQL-first: the node body lives in a .sql file using @id / @nodeType annotations and {{ ref() }} references, with YAML retained for config. New projects default to V2; existing V1 projects keep working unchanged.

NOTE

V2 status as of v0.10. V2 is supported. Earlier versions of this MCP required a v2Acknowledged: true flag on coa_create / coa_run / coa_plan because the V2 parser had silent failure modes. COA 7.35 fixed the two biggest (bidirectional config-annotation sync, UNION ALL preservation), so the flag has been removed. Two minor rough edges remain when authoring V2 β€” coa validate false positives on aliased columns, and parse errors rendering to zero-column CREATE TABLE ... AS SELECT WHERE 1=0. The V2_DETECTED preflight warning surfaces both; the coalesce://context/sql-node-v2-policy resource has the full playbook.

Point the MCP at this directory by setting repoPath in ~/.coa/config or COALESCE_REPO_PATH in your env block.

2. Create workspaces.yml. This file is required for coa_create / coa_run and their dry-run variants. It maps each storage location declared in locations.yml to a physical database + schema for local development. It's typically gitignored (per-developer), so cloning the project does not give it to you - you have to create it.

The /coalesce-setup prompt detects a missing workspaces.yml and walks you through it. If you'd rather do it directly, pick one of:

  • Ask your agent to bootstrap it (easiest): prompt the agent to call the coa_bootstrap_workspaces tool (it needs confirmed: true, so the agent will ask before running).

    WARNING

    The generated file contains placeholder values. The bootstrap tool seeds database/schema with defaults that won't match your real warehouse. Ask the agent to open the file with you and replace every placeholder before calling coa_create / coa_run - otherwise the generated DDL/DML will target the wrong (or non-existent) database.

  • Hand-write it. Ask the agent to fetch the authoritative schema via the coa_describe tool (topic: "schema", subtopic: "workspaces") - no top-level wrapper, no fileVersion.

    # workspaces.yml - keys are workspace names; `dev` is the default if --workspace is omitted
    dev:
      connection: snowflake          # required - name of the connection block COA should use
      locations:                     # optional - one entry per storage location name from locations.yml
        SRC_INGEST_TASTY_BITES:
          database: JESSE_DEV        # required
          schema: INGEST_TASTY_BITES # required
        ETL_STAGE:
          database: JESSE_DEV
          schema: ETL_STAGE
        ANALYTICS:
          database: JESSE_DEV
          schema: ANALYTICS

Ask your agent to verify the setup - e.g. "Run coa_doctor on my project and summarize the results." It checks data.yml, workspaces.yml, credentials, and warehouse connectivity end to end.

COA 7.35 (the version bundled with v0.10) also accepts a workspace.yml (note: singular, not the plural workspaces.yml above). It's just a flat locations: map β€” no top-level workspace names, no connection: block β€” and is suitable when you only need local storage mappings and don't need to switch between named workspaces.

# workspace.yml (singular) - per-repo local storage mappings only
locations:
  SRC_INGEST_TASTY_BITES:
    database: JESSE_DEV
    schema: INGEST_TASTY_BITES
  ANALYTICS:
    database: JESSE_DEV
    schema: ANALYTICS

The two files are independent: workspaces.yml (plural) handles multi-workspace cloud profiles, workspace.yml (singular) handles per-repo local mappings. Pick the simpler shape if multi-workspace isn't a need. Fetch the canonical schema via coa_describe (topic: "schema", subtopic: "workspace").

3. Pick an auth path:

Simplest for first-time MCP users. Generate a COALESCE_ACCESS_TOKEN from Coalesce β†’ Deploy β†’ User Settings, then include it in your client config:

{
  "env": {
    "COALESCE_ACCESS_TOKEN": "<YOUR_TOKEN>"
  }
}

Best if you already use the coa CLI - the server reads the same profile file, so nothing to duplicate. Drop the env block entirely:

{
  "command": "npx",
  "args": ["coalesce-transform-mcp"]
}

See Credentials for the profile schema.

When both sources set a field, the env var wins.

4. Install the server via one of the Quick Start paths above.

5. Restart your client, then run the /coalesce-setup prompt to verify everything is wired up.

If you have more than one Coalesce environment to manage, see Multiple environments.

Credentials

The server reads credentials from two sources and merges them with env-wins precedence - a matching env var always overrides the profile value, so you can pin a single field per session without editing the config file. Call diagnose_setup to see which source supplied each value.

Source 1: ~/.coa/config (shared with the coa CLI)

COA stores credentials in a standard INI file. You create it by hand, or let coa write it as you use the CLI. The MCP reads the profile selected by COALESCE_PROFILE (default [default]) and maps the keys below onto their matching env vars.

[default]
token=<your-coalesce-refresh-token>
domain=https://your-org.app.coalescesoftware.io
snowflakeAccount=<your-snowflake-account>   # e.g., abc12345.us-east-1 - required by coa CLI
snowflakeUsername=YOUR_USER
snowflakeRole=YOUR_ROLE
snowflakeWarehouse=YOUR_WAREHOUSE
snowflakeKeyPairKey=/Users/you/.coa/rsa_key.p8
snowflakeAuthType=KeyPair
orgID=<your-org-id>              # optional; fallback for cancel-run
repoPath=/Users/you/path/to/repo # optional; for repo-backed tools
cacheDir=/Users/you/.coa/cache   # optional; per-profile cache isolation

[staging]
# …additional profiles; select with COALESCE_PROFILE

Key mapping - each profile key maps to an env var of the same concept:

Profile key

Env var

token

COALESCE_ACCESS_TOKEN

domain

COALESCE_BASE_URL

snowflake* (all keys)

SNOWFLAKE_* (matching suffix)

orgID

COALESCE_ORG_ID

repoPath

COALESCE_REPO_PATH

cacheDir

COALESCE_CACHE_DIR

Notes:

  • snowflakeAuthType is read by COA itself (no env var) - include it when using key-pair auth.

  • orgID, repoPath, and cacheDir are MCP-specific - the COA CLI ignores them.

  • Only the fields the MCP needs are shown above. COA's config supports many more - run npx @coalescesoftware/coa describe config for the authoritative reference. Unknown keys are ignored.

If ~/.coa/config doesn't exist the server runs env-only - startup never fails on a missing or malformed profile file; it just logs a stderr warning.

Source 2: env vars in your MCP config

Variable

Description

Default

COALESCE_ACCESS_TOKEN

Bearer token from the Coalesce Deploy tab. Optional when ~/.coa/config provides a token.

β€”

COALESCE_PROFILE

Selects which ~/.coa/config profile to load.

default

COALESCE_BASE_URL

Region-specific base URL.

https://app.coalescesoftware.io (US)

COALESCE_ORG_ID

Fallback org ID for cancel-run. Also readable from orgID in the active ~/.coa/config profile.

β€”

COALESCE_REPO_PATH

Local repo root for repo-backed tools and pipeline planning. Also readable from repoPath in the active ~/.coa/config profile.

β€”

COALESCE_CACHE_DIR

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_MCP_AUTO_CACHE_MAX_BYTES

JSON size threshold before auto-caching to disk.

32768

COALESCE_MCP_INLINE_RESPONSES

Forces large responses inline as text instead of auto-caching them to disk and returning a resource_link (and suppresses per-field cache resource links). The server already auto-enables this for clients known not to support MCP resources (e.g. Snowflake Cortex), which otherwise render the link as unreadable "binary data" and retry in a loop. Set true to force it on for an unrecognised client, or false to disable auto-detection. Leave unset for Claude/Cursor to keep large payloads out of context.

false (auto-enabled for resource-less clients)

COALESCE_MCP_LINEAGE_TTL_MS

In-memory lineage cache TTL in milliseconds.

1800000

COALESCE_MCP_MAX_REQUEST_BODY_BYTES

Max outbound API request body size.

524288

COALESCE_MCP_REQUEST_TIMEOUT_MS

Default per-request timeout for Coalesce API calls. Raise on large workspaces where paginated reads exceed the default.

60000

COALESCE_MCP_DETAIL_FETCH_TIMEOUT_MS

Per-page timeout for detail=true paginated fetches of large node lists.

180000

COALESCE_MCP_NODE_TYPE_RANKING_TIMEOUT_MS

Deadline for the best-effort workspace-adoption node-type ranking lookup inside node creation. Advisory only β€” creation proceeds without a ranking suggestion if this trips.

15000

COALESCE_MCP_INVENTORY_CACHE_TTL_MS

In-memory TTL for the workspace node-type inventory. Set to 0 to disable.

300000

COALESCE_MCP_NODE_INDEX_CACHE_TTL_MS

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

In-memory TTL for the workspace node-detail (full body) cache used by review and predecessor lookups. Set to 0 to disable.

300000

COALESCE_MCP_READ_ONLY

When true, hides all write/mutation tools during registration. Only read, list, search, cache, analyze, review, diagnose, and plan tools are exposed.

false

COALESCE_MCP_SKILLS_DIR

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 credentials (run tools only)

start_run, retry_run, run_and_wait, retry_and_wait, and the warehouse-touching COA tools (coa_create, coa_run) need Snowflake credentials. These normally come from ~/.coa/config. Override any field via env var:

Variable

Required

Description

SNOWFLAKE_ACCOUNT

Yes

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.

SNOWFLAKE_USERNAME

Yes

Snowflake account username

SNOWFLAKE_KEY_PAIR_KEY

No

Path to PEM-encoded private key (required if SNOWFLAKE_PAT not set)

SNOWFLAKE_PAT

No

Snowflake Programmatic Access Token (alternative to key pair)

SNOWFLAKE_KEY_PAIR_PASS

No

Passphrase for encrypted keys

SNOWFLAKE_WAREHOUSE

Yes

Snowflake compute warehouse

SNOWFLAKE_ROLE

Yes

Snowflake user role

"Required" means one of env OR the matching ~/.coa/config field must supply the value. SNOWFLAKE_PAT is env-only - COA's config uses snowflakePassword for Basic auth (a different concept), which this server deliberately doesn't read.

Field-level overrides

{
  "coalesce-transform": {
    "command": "npx",
    "args": ["coalesce-transform-mcp"],
    "env": {
      "COALESCE_PROFILE": "staging",
      "SNOWFLAKE_ROLE": "TRANSFORMER_ADMIN"
    }
  }
}

Reads: "use the [staging] profile, but override its snowflakeRole."

Multiple environments

If you work across several Coalesce environments (dev/staging/prod, or multiple orgs), register the package once per profile under distinct server names:

{
  "mcpServers": {
    "coalesce-prod": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": {
        "COALESCE_PROFILE": "prod",
        "COALESCE_MCP_READ_ONLY": "true"
      }
    },
    "coalesce-dev": {
      "command": "npx",
      "args": ["coalesce-transform-mcp"],
      "env": { "COALESCE_PROFILE": "dev" }
    }
  }
}

Why this pattern:

  • Namespaced tools. The client surfaces coalesce-prod__* vs coalesce-dev__*, so an agent can't accidentally mutate the wrong environment.

  • Per-environment safety. Pair prod with COALESCE_MCP_READ_ONLY=true to hide every write tool on that server while leaving dev fully writable.

  • No per-call profile juggling. Each server is pinned at startup.

Skip this pattern if you only use one environment - a single registration is simpler. For 2–3 environments it's worth the extra config; beyond that, each server is a separate Node process, so consider whether you actually need them all loaded at once.

Safety model

Three layers prevent destructive surprises. See docs/safety-model.md for the full breakdown (tool annotations, read-only mode, explicit confirmation, COA preflight validation).

  • Tool annotations - every tool carries MCP readOnlyHint / destructiveHint / idempotentHint. The ⚠️ marker in Tools marks destructiveHint: true tools.

  • COALESCE_MCP_READ_ONLY=true hides all write/mutation tools at server startup. Use it for audits, agent sandboxes, or pairing with a prod profile.

  • Explicit confirmation on destructive ops - delete_*, propagate_column_change, cancel_run, clear_data_cache, coa_create, coa_run, coa_deploy, coa_refresh all require confirmed: true.

More configuration


Design notes

  • SQL override is disallowed. Nodes are built via YAML/config (columns, transforms, join conditions), not raw SQL. Template generation strips overrideSQLToggle, and write helpers reject overrideSQL fields.

  • Caching. Large responses are auto-cached to disk. Use cache_workspace_nodes and siblings when you want a reusable snapshot. Configure the threshold with COALESCE_MCP_AUTO_CACHE_MAX_BYTES.

  • Repo-backed tools. Set COALESCE_REPO_PATH (or add repoPath= to your ~/.coa/config profile) to your local Coalesce repo root (containing nodeTypes/, nodes/, packages/), or pass repoPath on individual tool calls. The server does not clone repos or install packages.

  • COA CLI versioning. The bundled COA CLI is pinned to an exact alpha version - not a floating @next tag. Every release of this MCP ships with a known-good COA build.

  • COA describe cache. COA describe output is cached under ~/.cache/coalesce-transform-mcp/coa-describe/<coa-version>/ after first access. Cache is version-keyed - upgrading the MCP automatically invalidates stale content.


Resource

πŸ“˜

Coalesce Docs

Product documentation

πŸ”Œ

Coalesce API Docs

REST API reference

🧰

Coalesce CLI (coa)

Bundled CLI docs

πŸ›’

Coalesce Marketplace

Node type packages

πŸ”—

Model Context Protocol

MCP spec & ecosystem


Contributing

Issues and PRs welcome.

License

MIT Β© Coalesce - built on top of the open Model Context Protocol.

Available Tools

115 tools
analyze_impactAnalyze ImpactA
Read-onlyIdempotent

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.

Inputs: nodeID (required), workspaceID (required), columnID. Returns: byDepth, criticalPath, sourceNodeID, impactedNodes, +7 more

analyze_workspace_patternsAnalyze Workspace PatternsA
Read-onlyIdempotent

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.

Inputs: workspaceID (required). Returns: nodeCount, analyzedAt, methodology, workspaceID, +3 more

apply_join_conditionApply Join ConditionA
Idempotent

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? }

Inputs: nodeID (required), workspaceID (required), joinType, whereClause, +2 more. Returns: nodeID, created, warning, nextSteps, +5 more

apply_sql_to_workspace_nodeApply SQL Edits to Workspace NodeA

Round-trip a user's edits on a rendered DDL/DML SQL document back to the cloud workspace node it came from. Parses the SQL's column list, diffs it against the node's current metadata.columns[], and updates the node via set_workspace_node (unless dryRun: true). Both DDL and DML inputs feed the same node metadata β€” a DDL edit and a DML edit on the same node update the same metadata.columns[].

Column-level diff (structural changes β€” joins, CTEs, WHERE/GROUP BY, custom expressions on the join itself β€” are NOT reverse-engineered; those live in the node YAML):

  • Removed columns (in YAML, missing in SQL) β†’ dropped

  • Type changes (matching name, different dataType) β†’ updated in place; existing sources / columnReferences / lineage metadata is preserved

  • Renamed columns (DML only β€” same transform, new AS alias) β†’ renamed in place, lineage preserved (column id stays stable so downstream refs keep working). Detection requires unambiguous transform pairing; ambiguous cases fall back to drop+add.

  • Expression-changed columns (DML only β€” same name, edited transform) β†’ sources[].transform is updated and source-mapping inference is re-run to refresh columnReferences if the new transform references different upstream columns.

  • New columns β†’ for DML inputs, source-mapping inference resolves the column's transform against upstream predecessors (alias-prefix match, all-pred name fallback, multi-source COALESCE/GREATEST). For DDL inputs, new columns are added with empty columnReferences[] (DDL doesn't carry transforms); fill them in via the cloud UI.

Block-level diff (DML only β€” single-sourceMapping nodes):

  • WHERE / ON-condition edits β†’ written to sourceMapping[0].join.joinCondition with table refs rewritten to {{ ref('LOC', 'NAME') }} form.

  • Adding or removing a predecessor source via SQL is REJECTED β€” add/remove the predecessor in the cloud UI first, then re-render.

Tail-clause diff (DML only):

  • GROUP BY presence toggle β†’ flips config.groupByAll. Coalesce derives the actual GROUP BY column list from non-aggregate columns at render time.

  • ORDER BY adds / changes / removes β†’ config.orderby flag and config.orderbycolumn.items[] array of {sortColName, sortOrder}.

  • LIMIT adds / changes / removes β†’ appended to / stripped from the trailing position of sourceMapping[0].join.joinCondition. Coalesce has no native limit config field for typical SQL nodes; the apply path warns when groupByAll/orderby is set (the auto-rendered tail clauses would land AFTER LIMIT, producing invalid SQL).

INSERT header diff (DML only β€” INSERT-shaped inputs):

  • Target identifier change (INSERT INTO "DB"."LOC"."NAME") β†’ updates the cloud node's top-level database / locationName / name fields. Renames/relocates the node; downstream references are unaffected (they use the node id, not the name).

  • INSERT column list out-of-sync with the SELECT projection β†’ REJECTED. Coalesce auto-generates the INSERT list from metadata.columns[]; edit the SELECT (using AS aliases) to add/rename/reorder columns.

Args:

  • workspaceID (string, required)

  • nodeID (string, required)

  • sql (string, required): Either a CREATE [OR REPLACE] TABLE statement (DDL, from coa_dry_run_create) OR a SELECT/INSERT statement (DML, from coa_dry_run_run). The shape is auto-detected.

  • dryRun (boolean, optional): If true, return the diff without writing.

Returns: { applied, dryRun, inputKind, diff: { unchanged, typeChanged, renamed, expressionChanged, removed, added }, joinDiff: { kind: 'identical' | 'whereOrJoinEdit' | 'newSource' | 'removedSource' | 'unsupported', ... }, tailDiff: { groupBy: { kind: 'identical' | 'added' | 'removed', ... }, orderBy: { kind: 'identical' | 'added' | 'changed' | 'removed', ... } }, limitDiff: { kind: 'identical' | 'added' | 'changed' | 'removed' | 'unsupported', ... }, insertHeaderDiff: { kind: 'identical' | 'targetChanged' | 'columnListMismatch' | 'notApplicable', ... }, body?, warnings?, error? }

Inputs: sql (required), nodeID (required), workspaceID (required), dryRun.

audit_documentation_coverageAudit Documentation CoverageA
Read-onlyIdempotent

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).

Inputs: workspaceID (required). Returns: auditedAt, totalNodes, workspaceID, totalColumns, +9 more

build_pipeline_from_intentBuild 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.

Inputs: intent (required), workspaceID (required), dryRun, schema, +7 more. Returns: plan, error, dryRun, reason, +11 more

cache_environment_nodesCache Environment NodesA
Idempotent

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.

Inputs: environmentID (required), detail, orderBy, pageSize, +1 more. Returns: detail, fileUri, message, metaUri, +17 more

cache_org_usersCache Org UsersA
Idempotent

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.

Inputs: orderBy, pageSize, orderByDirection. Returns: detail, fileUri, message, metaUri, +17 more

cache_runsCache RunsA
Idempotent

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.

Inputs: detail, orderBy, runType, pageSize, +3 more. Returns: detail, fileUri, message, metaUri, +17 more

cache_workspace_nodesCache Workspace NodesA
Idempotent

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.

Inputs: workspaceID (required), detail, orderBy, pageSize, +1 more. Returns: detail, fileUri, message, metaUri, +17 more

cancel_runCancel RunA
Destructive

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.

Inputs: runID (required), environmentID (required), orgID, confirmed. Returns: message, runStatus, runCounter

clear_data_cacheClear Data CacheA
Destructive

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 }

Inputs: confirmed. Returns: sizeMB, deleted, message, fileCount, +1 more

coa_add_warehouse_sourcesCOA Add Warehouse Sources (scaffold source nodes)A
Destructive

Scaffold source-node YAML files from warehouse tables. Wraps coa sources add --json. Database and schema are read from the workspace's storage-location config and copied onto each scaffolded source node β€” no separate placeholders to fix up afterward, but verify the workspace config itself is correct first (the bootstrap tool seeds placeholders into it).

DESTRUCTIVE: writes files into the project's nodes/ tree. Requires confirmed: true. Existing source nodes are skipped unless overwrite: true.

MUST pass exactly one of location or all (the CLI enforces this in non-TTY mode and so do we).

DRY-RUN: pass dryRun: true to list what would be imported without writing files. The JSON shape is the same as a real write, with wouldImport reflecting the delta. confirmed: true is still required for consistency, but no files are created.

Profile resolution: input profile > COALESCE_PROFILE env > [default].

Usage pattern: call coa_list_warehouse_sources --location <name> first to preview, then call this with the same scope.

Args:

  • projectPath (string, required)

  • location (string) OR all (boolean): exactly one required

  • include (string, optional): glob filter

  • overwrite (boolean, optional): re-import existing nodes

  • dryRun (boolean, optional): preview without writing

  • profile (string, optional)

  • confirmed (boolean): must be true to execute. Required even when dryRun: true, for consistency with other destructive tools β€” no files are written in that case.

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

Inputs: no named parameters. Returns: Tool-specific JSON object output. Oversized responses may be replaced with cach…

coa_bootstrap_workspacesCOA Bootstrap workspaces.yml (doctor --fix)A
Destructive

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 }

Inputs: projectPath (required), confirmed, workspace. Returns: json, stderr, stdout, command, +5 more

coa_createCOA Create (DDL)A
Destructive

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 }

Inputs: projectPath (required), exclude, include, confirmed, +1 more. Returns: json, stderr, stdout, command, +5 more

coa_deployCOA DeployA
Destructive

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 }

Inputs: plan (required), environmentID (required), token, profile, +1 more. Returns: json, stderr, stdout, command, +5 more

coa_describeCOA DescribeA
Read-onlyIdempotent

Fetch a section of COA's self-describing documentation. Wraps coa describe <topic> [<subtopic>].

Well-known topics (also available as coalesce://coa/describe/* resources): overview, commands, selectors, schemas, workflow, structure, concepts, sql-format, node-types, config.

Use subtopic for the parameterized topics:

  • topic='command', subtopic='' β€” deep-dive on a specific command

  • topic='schema', subtopic='' β€” full JSON schema for a file type

Args:

  • topic (string, required)

  • subtopic (string, optional)

  • refresh (boolean, optional): bypass the on-disk cache and re-run COA

Returns: { topic, subtopic?, source (memory|disk|coa), content, coaVersion }

Inputs: topic (required), refresh, subtopic. Returns: topic, source, content, subtopic, +1 more

coa_doctorCOA DoctorA
Read-onlyIdempotent

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? }

Inputs: projectPath (required), workspace. Returns: json, stderr, stdout, command, +5 more

coa_dry_run_createCOA Dry Run Create (DDL preview)A
Read-onlyIdempotent

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 }

Inputs: projectPath (required), exclude, include, workspace. Returns: json, stderr, stdout, command, +5 more

coa_dry_run_runCOA Dry Run Run (DML preview)A
Read-onlyIdempotent

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 }

Inputs: projectPath (required), exclude, include, workspace. Returns: json, stderr, stdout, command, +5 more

coa_list_project_nodesCOA List Project NodesA
Read-onlyIdempotent

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 }

Inputs: projectPath (required), workspace. Returns: json, stderr, stdout, command, +5 more

coa_list_warehouse_sourcesCOA List Warehouse SourcesA
Read-onlyIdempotent

List warehouse tables visible to each storage location in a COA project. Wraps coa sources list --json.

Three modes via flags:

  • Neither location nor all: returns per-location SUMMARY counts (totalTables, importedTables, newTables). Cheap; use this first on unfamiliar projects.

  • location: <name>: returns per-table detail for that one location, each row marked alreadyExists: true if a source node has already been scaffolded for it.

  • all: true: per-table detail for every location. Potentially large β€” prefer scoping when you can.

Use this to (a) figure out which locations have un-imported tables before calling coa_add_warehouse_sources, or (b) audit which scaffolded source nodes still match the warehouse.

Read-only: queries the warehouse via the COA cloud profile, writes nothing. Profile resolution: input profile > COALESCE_PROFILE env > [default].

Args:

  • projectPath (string, required)

  • location (string, optional)

  • all (boolean, optional): mutually exclusive with location

  • include (string, optional): glob filter on table names

  • profile (string, optional)

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

Inputs: no named parameters. Returns: Tool-specific JSON object output. Oversized responses may be replaced with cach…

coa_planCOA 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 }

Inputs: projectPath (required), environmentID (required), out, token, +4 more. Returns: json, stderr, stdout, command, +5 more

coa_refreshCOA RefreshA
Destructive

Run DML for selected nodes in a deployed environment. Does not require a local project β€” operates purely on the cloud environment.

DESTRUCTIVE: modifies warehouse data in the environment. Requires confirmed=true.

Args:

  • environmentID (string, required)

  • include, exclude, jobID, parallelism, parameters (optional)

  • forceIgnoreEnvironmentStatus (optional)

  • profile, token (optional)

  • confirmed (boolean): must be true to execute

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

Inputs: environmentID (required), jobID, token, exclude, +6 more. Returns: json, stderr, stdout, command, +5 more

coa_remove_warehouse_sourcesCOA Remove Warehouse Sources (delete scaffolded YAML)A
Destructive

Delete scaffolded source-node YAML files from the project. Wraps coa sources remove --json --yes (the MCP layer handles confirmation; --yes is always passed to the CLI).

DESTRUCTIVE: removes files from disk. Requires confirmed: true. Hand-renamed ("unmanaged") files are reported but NOT removed β€” the CLI considers them user-owned.

MUST pass exactly one of location or all.

PROFILE LIMITATION: unlike list/add, the underlying coa sources remove does NOT accept a --profile flag in COA 7.35 (errors unknown option '--profile'). Profile resolution falls back to [default] in ~/.coa/config. If that diverges from the agent's intended profile, the agent should temporarily set [default] or wait for the upstream patch.

Usage pattern: when re-onboarding a location or cleaning up after a schema rename. Pair with coa_list_warehouse_sources to confirm scope first.

Args:

  • projectPath (string, required)

  • location (string) OR all (boolean): exactly one required

  • include (string, optional): glob filter (e.g. 'OLD_*')

  • confirmed (boolean): must be true to execute

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

Inputs: no named parameters. Returns: Tool-specific JSON object output. Oversized responses may be replaced with cach…

coa_runCOA Run (DML)A
Destructive

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 }

Inputs: projectPath (required), exclude, include, confirmed, +1 more. Returns: json, stderr, stdout, command, +5 more

coa_validateCOA ValidateA
Read-onlyIdempotent

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 }

Inputs: projectPath (required), exclude, include, workspace. Returns: json, stderr, stdout, command, +5 more

complete_node_configurationComplete Node ConfigurationA
Idempotent

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? }

Inputs: nodeID (required), workspaceID (required), repoPath. Returns: nodeID, created, warning, nextSteps, +5 more

convert_join_to_aggregationConvert Join to AggregationA
Idempotent

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.

Inputs: nodeID (required), aggregates (required), workspaceID (required), groupByColumns (required), +3 more. Returns: nodeID, created, warning, nextSteps, +5 more

create_environmentCreate 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.

Inputs: name (required), projectID (required), devEnv, tagColors, +3 more. Returns: id, name, message

create_git_accountCreate 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.

Inputs: name (required), gitToken (required), gitUsername (required), gitAuthorName (required), +3 more. Returns: id, name, message

create_node_from_external_schemaCreate 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 }

Inputs: nodeType (required), workspaceID (required), targetColumns (required), predecessorNodeIDs (required), +4 more. Returns: nodeID, created, warning, nextSteps, +5 more

create_pipeline_from_planCreate 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[] }

Inputs: plan (required), workspaceID (required), dryRun, confirmed, +1 more. Returns: plan, error, dryRun, reason, +11 more

create_pipeline_from_sqlCreate 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.

Inputs: sql (required), workspaceID (required), goal, dryRun, +10 more. Returns: plan, error, dryRun, reason, +11 more

create_projectCreate 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.

Inputs: name (required), platformKind (required), gitRepo, gitBranch, +2 more. Returns: id, name, message

create_workspace_jobCreate 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.

Inputs: name (required), workspaceID (required), excludeSelector (required), includeSelector (required). Returns: id, name, message

create_workspace_node_from_predecessorCreate 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? }

Inputs: nodeType (required), workspaceID (required), predecessorNodeIDs (required), goal, +7 more. Returns: nodeID, created, warning, nextSteps, +5 more

create_workspace_node_from_scratchCreate 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.

Inputs: nodeType (required), workspaceID (required), goal, name, +7 more. Returns: nodeID, created, warning, nextSteps, +5 more

create_workspace_subgraphCreate 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.

Inputs: name (required), steps (required), workspaceID (required). Returns: id, name, message

delete_environmentDelete EnvironmentA
Destructive

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.

Inputs: environmentID (required), confirmed. Returns: id, name, message

delete_env_roleDelete Env RoleA
Destructive

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.

Inputs: userID (required), environmentID (required), confirmed. Returns: id, name, message

delete_git_accountDelete Git AccountA
Destructive

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.

Inputs: gitAccountID (required), confirmed, accountOwner. Returns: id, name, message

delete_projectDelete ProjectA
Destructive

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.

Inputs: projectID (required), confirmed. Returns: id, name, message

delete_project_roleDelete Project RoleA
Destructive

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.

Inputs: userID (required), projectID (required), confirmed. Returns: id, name, message

delete_workspace_jobDelete Workspace JobA
Destructive

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.

Inputs: jobID (required), workspaceID (required), confirmed. Returns: id, name, message

delete_workspace_nodeDelete Workspace NodeA
Destructive

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.

Inputs: nodeID (required), workspaceID (required), confirmed. Returns: nodeID, created, warning, nextSteps, +5 more

delete_workspace_subgraphDelete Workspace SubgraphA
Destructive

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.

Inputs: workspaceID (required), repoPath, confirmed, subgraphID, +1 more. Returns: id, name, message

diagnose_run_failureDiagnose Run FailureA
Read-onlyIdempotent

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.

Inputs: runID (required). Returns: runID, endTime, runType, summary, +7 more

diagnose_setupDiagnose SetupA
Read-onlyIdempotent

Stateless probe that reports which first-time-setup pieces are configured: Coalesce access token, Snowflake credentials (for run tools + coa_create/coa_run), local repo path + whether it's a COA project, and a best-effort coa doctor check when applicable.

Returns a structured report plus ordered nextSteps. Use this during or after the /coalesce-setup prompt flow to confirm progress between phases.

Never throws. Safe to call repeatedly.

Returns: { accessToken: { status, ... }, snowflakeCreds: { status, ... }, repoPath: { status, ... }, coaDoctor: { status, ... }, nextSteps: string[], ready: boolean }

Inputs: no named parameters. Returns: ready, repoPath, coaConfig, coaDoctor, +4 more

find_jobs_by_nameFind Environment Jobs by NameA
Read-onlyIdempotent

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 } }

Inputs: jobName (required), environmentID (required), runLimitPerJob. Returns: Tool-specific JSON object output. Oversized responses may be replaced with cach…

generate_set_workspace_node_templateGenerate Set Workspace Node TemplateA
Read-onlyIdempotent

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.

Inputs: nodeID, schema, database, nodeName, +5 more. Returns: warnings, comparison, nodeDefinition, nodeMetadataSpecYaml, +2 more

generate_set_workspace_node_template_from_variantGenerate Set Workspace Node Template from VariantA
Read-onlyIdempotent

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.

Inputs: variantKey (required), nodeID, schema, database, +5 more. Returns: warnings, comparison, nodeDefinition, nodeMetadataSpecYaml, +2 more

get_column_lineageGet Column LineageA
Read-onlyIdempotent

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.

Inputs: nodeID (required), columnID (required), workspaceID (required). Returns: nodeID, columnID, nodeName, upstream, +4 more

get_downstream_nodesGet Downstream NodesA
Read-onlyIdempotent

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.

Inputs: nodeID (required), workspaceID (required). Returns: nodeID, nodeName, nodeType, ancestors, +3 more

get_environmentGet EnvironmentA
Read-onlyIdempotent

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.

Inputs: environmentID (required). Returns: id, name, message

get_environment_healthGet Environment HealthA
Read-onlyIdempotent

Get a comprehensive health dashboard for a deployed environment. Composes multiple API calls into a single health summary.

This tool paginates through all environment nodes and all environment runs before scoring health, so it may take longer on large or busy environments.

Args:

  • environmentID (string, required): The environment ID

Returns: { environmentID, assessedAt, totalNodes, nodesByType: { Stage: 5, Dimension: 3, ... }, nodeRunStatus: [{ nodeID, nodeName, lastRunStatus, lastRunTime }], failedRunsLast24h: [{ runID, runStatus, startTime, endTime }], staleNodes: [{ nodeID, nodeName, nodeType, lastRunTime, daysSinceLastRun }], dependencyHealth: { orphanNodes: [...], totalDependencyEdges }, healthScore: "healthy" | "warning" | "critical", healthReasons: ["..."] }

Inputs: environmentID (required). Returns: assessedAt, staleNodes, totalNodes, healthScore, +6 more

get_environment_jobGet Environment JobA
Read-onlyIdempotent

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.

Inputs: jobID (required), environmentID (required). Returns: id, name, message

get_environment_nodeGet Environment NodeA
Read-onlyIdempotent

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.

Inputs: nodeID (required), environmentID (required). Returns: id, name, message

get_environment_overviewGet Environment OverviewA
Read-onlyIdempotent

Get environment details and all its deployed nodes in a single call.

Args:

  • environmentID (string, required): The environment ID

Returns: { environment: EnvironmentObject, nodes: NodeObject[] }

Inputs: environmentID (required). Returns: nodes, environment

get_git_accountGet Git AccountA
Read-onlyIdempotent

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.

Inputs: gitAccountID (required), accountOwner. Returns: id, name, message

get_job_run_details_by_nameGet Latest Run Details by Job NameA
Read-onlyIdempotent

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? }

Inputs: jobName (required), environmentID (required), includeResults. Returns: Tool-specific JSON object output. Oversized responses may be replaced with cach…

get_node_type_variantGet Node Type VariantA
Read-onlyIdempotent

Get one node-type corpus variant from the committed snapshot by variantKey. Use search_node_type_variants first when you need discovery.

Inputs: variantKey (required). Returns: warnings, variantKey, supportStatus, nodeDefinition, +1 more

get_pipeline_workshop_statusPipeline Workshop StatusA
Read-onlyIdempotent

Get the current state of a pipeline workshop session, including all planned nodes, their configuration, and the instruction history.

Inputs: sessionID (required). Returns: error, nodes, history, warnings, +6 more

get_projectGet ProjectA
Read-onlyIdempotent

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.

Inputs: projectID (required), includeJobs, includeWorkspaces. Returns: id, name, message

get_repo_node_type_definitionGet Repo Node Type DefinitionA
Read-onlyIdempotent

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.

Inputs: nodeType (required), repoPath. Returns: repoPath, warnings, filePaths, parseError, +9 more

get_runGet RunA
Read-onlyIdempotent

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.

Inputs: runID (required). Returns: id, name, message

get_run_detailsGet Run DetailsA
Read-onlyIdempotent

Get run metadata and execution results in a single call. Combines get_run and get_run_results.

Args:

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

Returns: { run: RunObject, results: ResultsObject, resultsError?: ErrorObject }

Inputs: runID (required). Returns: run, results, resultsError

get_run_resultsGet Run ResultsA
Read-onlyIdempotent

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.

Inputs: runID (required). Returns: id, name, message

get_upstream_nodesGet Upstream NodesA
Read-onlyIdempotent

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).

Inputs: nodeID (required), workspaceID (required). Returns: nodeID, nodeName, nodeType, ancestors, +3 more

get_user_rolesGet User RolesB
Read-onlyIdempotent

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.

Inputs: userID (required), projectID, environmentID. Returns: id, name, message

get_workspaceGet WorkspaceA
Read-onlyIdempotent

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.

Inputs: workspaceID (required). Returns: id, name, message

get_workspace_nodeGet Workspace NodeA
Read-onlyIdempotent

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.

Inputs: nodeID (required), workspaceID (required). Returns: id, name, message

get_workspace_subgraphGet Workspace SubgraphA
Read-onlyIdempotent

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.

Inputs: subgraphID (required), workspaceID (required). Returns: id, name, message

list_environment_jobsList Environment JobsA
Read-onlyIdempotent

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 }

Inputs: environmentID (required), limit, orderBy, startingFrom, +1 more. Returns: data, next, total

list_environment_nodesList Environment NodesA
Read-onlyIdempotent

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 }

Inputs: environmentID (required), limit, detail, orderBy, +2 more. Returns: data, next, total

list_environmentsList EnvironmentsA
Read-onlyIdempotent

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.

Inputs: limit, detail, orderBy, startingFrom, +1 more. Returns: data, next, total

list_git_accountsList Git AccountsA
Read-onlyIdempotent

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 }

Inputs: accountOwner. Returns: data, next, total

list_job_nodesList Job Nodes (grouped by subgraph)A
Read-onlyIdempotent

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) }

Inputs: no named parameters. Returns: job, summary, unattached, unresolved, +1 more

list_org_usersList Org UsersA
Read-onlyIdempotent

List all users in the Coalesce organization.

Args:

  • limit, startingFrom, orderBy, orderByDirection: Pagination controls

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

Inputs: limit, orderBy, startingFrom, orderByDirection. Returns: data, next, total

list_projectsList ProjectsA
Read-onlyIdempotent

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 }

Inputs: includeJobs, includeWorkspaces. Returns: data, next, total

list_repo_node_typesList Repo Node TypesA
Read-onlyIdempotent

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.

Inputs: repoPath, inUseOnly, packageAlias. Returns: summary, nodeTypes

list_repo_packagesList Repo PackagesA
Read-onlyIdempotent

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.

Inputs: repoPath. Returns: summary, packages

list_runsList RunsA
Read-onlyIdempotent

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 }

Inputs: limit, detail, orderBy, runType, +4 more. Returns: data, next, total

list_user_rolesList User RolesB
Read-onlyIdempotent

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 }

Inputs: projectID, environmentID. Returns: data, next, total

list_workspace_nodesList Workspace NodesA
Read-onlyIdempotent

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 }

Inputs: workspaceID (required), limit, detail, orderBy, +2 more. Returns: data, next, total

list_workspace_node_typesList Workspace Node TypesA
Read-onlyIdempotent

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.

Inputs: workspaceID (required). Returns: basis, total, counts, nodeTypes, +1 more

list_workspacesList WorkspacesA
Read-onlyIdempotent

List all Coalesce workspaces.

Returns workspace IDs needed by node, job, and subgraph tools. Each workspace includes its projectID.

Returns: { data: Workspace[] }

Inputs: no named parameters. Returns: data, next, total

parse_disk_node_to_workspace_bodyParse Disk Node YAML to Workspace BodyB
Read-onlyIdempotent

Convert an on-disk coa node YAML (the nodes/*.yml format) into a cloud workspace-node body suitable for set_workspace_node or update_workspace_node. Returns the cloud-shape object.

Use this when local-dev edits to a YAML node need to be pushed back to a cloud workspace without manually translating the schema (operation: β†’ flat top-level, stepCounter/columnCounter β†’ nodeID/columnID, sourceColumnReferences[] β†’ sources[]).

For nodes that originated in the cloud, UUIDs round-trip and the cloud will treat the result as an idempotent update. For nodes authored from scratch on disk, the UUIDs are local-only β€” use create_workspace_node_from_predecessor or create_workspace_node_from_scratch instead of pushing this body via set/update.

Provide one of:

  • yaml: raw YAML string (will be parsed)

  • diskNode: pre-parsed disk-shape object

Inputs: no named parameters.

parse_sql_structureParse SQL StructureA
Read-onlyIdempotent

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.

Inputs: sql (required). Returns: ctes, hasCtes, hasJoin, cteCount, +8 more

personalize_skillsPersonalize SkillsA
Idempotent

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.

Inputs: directory. Returns: created, directory, configHint, totalSkills, +1 more

pipeline_workshop_closePipeline Workshop CloseA
Idempotent

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.

Inputs: sessionID (required). Returns: error, closed, message

pipeline_workshop_instructPipeline 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.

Inputs: sessionID (required), instruction (required). Returns: error, action, changes, warnings, +3 more

pipeline_workshop_openPipeline 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.

Inputs: workspaceID (required), intent. Returns: error, nodes, history, warnings, +6 more

plan_pipelinePlan PipelineA
Read-onlyIdempotent

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.

Inputs: workspaceID (required), sql, goal, schema, +8 more. Returns: sql, goal, nodes, intent, +18 more

propagate_column_changePropagate Column ChangeA
Destructive

⚠️ 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.

Inputs: nodeID (required), changes (required), columnID (required), workspaceID (required), +1 more. Returns: errors, changes, snapshotPath, sourceNodeID, +4 more

replace_workspace_node_columnsReplace Workspace Node ColumnsA
Idempotent

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? }

Inputs: nodeID (required), columns (required), workspaceID (required), whereCondition, +1 more. Returns: nodeID, created, warning, nextSteps, +5 more

retry_and_waitRetry and WaitA

Retry a failed Coalesce run and poll until completion or timeout. Returns a task that can be polled for status.

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

  • parameters (object, optional): Runtime parameters

  • pollInterval (number, optional): Seconds between checks (default: 10)

  • timeout (number, optional): Max wait seconds (default: 1800)

Returns: { status, results, resultsError?, incomplete?, timedOut? }

Inspect timedOut, incomplete, and resultsError fields before continuing.

Inputs: runDetails (required), timeout, parameters, pollInterval. Returns: status, results, timedOut, incomplete, +1 more

retry_runRetry 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.

Inputs: runDetails (required), parameters. Returns: message, runStatus, runCounter

review_pipelineReview PipelineA
Read-onlyIdempotent

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).

Inputs: workspaceID (required), nodeIDs. Returns: scope, summary, findings, warnings, +5 more

run_and_waitRun and WaitA

Start a Coalesce refresh run and poll until completion or timeout. Returns a task that can be polled for status.

Requires Snowflake auth via environment variables (Key Pair or PAT). Provide exactly one of runDetails.environmentID or runDetails.workspaceID. If the user provides a job name instead of an ID, look it up with find_jobs_by_name (or list_environment_jobs) first.

Args:

  • runDetails.environmentID (string, optional): Target deployed environment (numeric ID as string)

  • runDetails.workspaceID (string, optional): Target workspace for a development run (numeric ID as string)

  • runDetails.jobID (string, optional): Specific job to run

  • runDetails.includeNodesSelector (string, optional): Node filter

  • runDetails.excludeNodesSelector (string, optional): Node exclusion

  • runDetails.parallelism (number, optional): Max parallel nodes

  • runDetails.forceIgnoreWorkspaceStatus (boolean, optional): Force run

  • confirmRunAllNodes (boolean): Required when no job/node scope

  • parameters (object, optional): Runtime parameters

  • pollInterval (number, optional): Seconds between checks (default: 10, range: 5–300)

  • timeout (number, optional): Max wait seconds (default: 1800, range: 30–3600)

Returns: { status, results, resultsError?, incomplete?, timedOut? }

Inspect timedOut, incomplete, and resultsError fields before continuing.

Inputs: runDetails (required), timeout, parameters, pollInterval, +1 more. Returns: status, results, timedOut, incomplete, +1 more

run_statusRun StatusA
Read-onlyIdempotent

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 }

Inputs: runCounter (required). Returns: message, runStatus, runCounter

search_node_type_variantsSearch Node Type VariantsA
Read-onlyIdempotent

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.

Inputs: limit, primitive, packageName, supportStatus, +1 more. Returns: matches, summary, matchedCount, totalMatches, +1 more

search_workspace_contentSearch Workspace ContentA
Read-onlyIdempotent

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).

Inputs: query (required), workspaceID (required), limit, fields, +1 more. Returns: query, fields, results, cacheAge, +4 more

select_pipeline_node_typeSelect Pipeline Node TypeA
Read-onlyIdempotent

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.

Inputs: sourceCount (required), workspaceID (required), sql, goal, +6 more. Returns: warning, warnings, selection, autoExecutable, +7 more

serialize_workspace_node_to_disk_yamlSerialize Workspace Node to Disk YAMLA
Read-onlyIdempotent

Fetch a workspace node from the cloud and convert it to the on-disk coa YAML shape (the nodes/*.yml format). Returns both the parsed disk-shape object and a YAML string ready to write to disk.

Use this when an editor or local-dev workflow needs the disk representation of a cloud node β€” for example, to drop the YAML into a coa project and run coa create --dry-run to preview the generated SQL without an extra round-trip.

The conversion handles the schema diff (top-level β†’ operation: wrapper, nodeID/columnID β†’ stepCounter/columnCounter, sources[] β†’ sourceColumnReferences[], synthesized columnReference per column, fileVersion: 1 header).

UUIDs round-trip; a node serialized this way and pushed back via parse_disk_node_to_workspace_body produces the same cloud body. The converter is lossy on cloud-only metadata (createdAt, updatedAt, etc.) β€” those are dropped.

Inputs: nodeID (required), workspaceID (required).

set_env_roleSet Env RoleA
Idempotent

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.

Inputs: role (required), userID (required), environmentID (required). Returns: id, name, message

set_org_roleSet Org RoleA
Idempotent

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.

Inputs: role (required), userID (required). Returns: id, name, message

set_project_roleSet Project RoleA
Idempotent

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.

Inputs: role (required), userID (required), projectID (required). Returns: id, name, message

set_workspace_nodeSet Workspace NodeA
Idempotent

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.

Inputs: body (required), nodeID (required), workspaceID (required). Returns: nodeID, created, warning, nextSteps, +5 more

start_runStart RunA

Start a new Coalesce refresh run. Returns a task that resolves once the run has been submitted.

Requires Snowflake auth β€” credentials read from environment variables (Key Pair: SNOWFLAKE_KEY_PAIR_KEY, or PAT: SNOWFLAKE_PAT, plus SNOWFLAKE_USERNAME, SNOWFLAKE_WAREHOUSE, SNOWFLAKE_ROLE).

Provide exactly one of runDetails.environmentID or runDetails.workspaceID. If the user provides a job name, look up the ID with find_jobs_by_name (or list_environment_jobs) first.

Args:

  • runDetails.environmentID (string, optional): Target deployed environment (numeric ID as string)

  • runDetails.workspaceID (string, optional): Target workspace for a development run (numeric ID as string)

  • runDetails.jobID (string, optional): Specific job to run

  • runDetails.includeNodesSelector (string, optional): Node filter for ad-hoc runs

  • runDetails.excludeNodesSelector (string, optional): Node exclusion filter

  • runDetails.parallelism (number, optional): Max parallel nodes (default: 16)

  • runDetails.forceIgnoreWorkspaceStatus (boolean, optional): Allow run even if last deploy failed

  • confirmRunAllNodes (boolean): Required when no job/node scope is provided

  • parameters (object, optional): Key-value runtime parameters

Returns: { runCounter: number, runStatus: string, message: string }

Prefer run_and_wait when you need the final outcome in a single call.

Inputs: runDetails (required), parameters, confirmRunAllNodes. Returns: message, runStatus, runCounter

update_git_accountUpdate Git AccountA
Idempotent

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.

Inputs: gitAccountID (required), name, gitToken, provider, +4 more. Returns: id, name, message

update_projectUpdate ProjectA
Idempotent

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.

Inputs: projectID (required), name, gitRepo, gitBranch, +4 more. Returns: id, name, message

update_workspace_jobUpdate 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.

Inputs: name (required), jobID (required), workspaceID (required), excludeSelector (required), +1 more. Returns: id, name, message

update_workspace_nodeUpdate Workspace NodeA
Idempotent

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

Inputs: nodeID (required), changes (required), workspaceID (required). Returns: nodeID, created, warning, nextSteps, +5 more

update_workspace_subgraphUpdate 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".

Inputs: name (required), steps (required), workspaceID (required), repoPath, +2 more. Returns: id, name, message

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 115 tools

    Disambiguation2/5

    The tool set contains many overlapping tools for similar operations. For example, there are multiple node-creation tools (create_workspace_node_from_scratch, create_workspace_node_from_predecessor, create_node_from_external_schema, create_pipeline_from_plan, create_pipeline_from_sql, build_pipeline_from_intent, pipeline_workshop) and multiple update tools (set_workspace_node, update_workspace_node, replace_workspace_node_columns, apply_join_condition, convert_join_to_aggregation) whose boundaries require very detailed descriptions to disambiguate. Similarly, run-related tools (start_run, run_and_wait, retry_run, retry_and_wait, get_run, get_run_details, run_status, get_run_results) heavily overlap in purpose.

    Naming Consistency3/5

    Naming is mostly snake_case verb_noun (list_workspaces, create_environment, get_run), but there is inconsistency: some tools use different verb forms (set_env_role vs delete_env_role; create vs update vs set), some omit the noun (run_status vs get_run_status), and there are several variants that break the pattern (coa_doctor, coa_bootstrap_workspaces, pipeline_workshop_open, plan_pipeline). The coa_* prefix family is consistent internally but the overall set mixes generic verbs (get, list, create, update, delete, set, run, start, retry, build, plan) without a clear convention about which verb to use for which operation.

    Tool Count1/5

    115 tools is an extreme count for an MCP server. Even for a full Coalesce platform surface (projects, environments, workspaces, nodes, jobs, runs, roles, git accounts, pipelines, coa CLI), the count is bloated by many composite/derived tools (get_run_details, get_environment_overview, run_and_wait, retry_and_wait) and near-duplicate variants. This will cause selection overhead and confusion for an agent.

    Completeness5/5

    Within its broad domain, the tool surface is remarkably complete: CRUD for projects, environments, workspaces, node mutations, role management, git accounts, jobs, runs, subgraphs, plus pipeline planning/creation, lineage analysis, caching, and a full coa CLI wrapper. There are no obvious dead ends β€” even setup diagnosis and skill personalization are covered.

    Maintenance

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      This MCP server enables database migration between heterogeneous systems (Oracle, PostgreSQL, SQL Server, Netezza to PostgreSQL or SQL Server) through AI assistants by providing tools for command preview, execution, validation, and workflow suggestions.
      6
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for executing Databricks SQL queries and comparing table data, supporting CLI and VS Code integration.
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that provides tools to interact with dbt, including dbt Core, Cloud CLI, Semantic Layer, and Discovery API.
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enterprise-grade MCP server for Microsoft SQL Server, enabling semantic schema discovery, table profiling, safe data operations with preview/confirm, and multi-environment support.
      36
      MIT