Semantic Rails MCP Server
OfficialThis server is the Architect MCP for Semantic Rails, enabling creation, editing, validation, and management of semantic layer projects.
Create projects with configurable defaults, previewing changes via dry-run.
Manage files – list, read, write, and archive project files atomically.
Upsert semantic models, metrics, and segments with idempotent, revision-safe mutations.
Validate projects across parse, runtime, examples, tests, impact, and release modes.
Diff projects against another path or a git base ref.
Assess impact and run promotion readiness checks for package changes.
Get guidance on Architect workflow and MCP client configuration hints.
Allows Semantic Rails to use ClickHouse as a warehouse target for governed semantic queries, metric discovery, validation, and execution.
Enables Semantic Rails to connect to Databricks as a warehouse target for running and validating semantic layer queries against Databricks data.
Provides DuckDB as the built-in local warehouse for Semantic Rails, supporting semantic queries, validation, and execution without additional connectors.
Enables Semantic Rails to use Snowflake as a warehouse target for governed metric queries, semantic validation, and query execution.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Semantic Rails MCP Servershow me total revenue by month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Semantic Rails
Semantic Rails is an open-source, agent-first semantic layer, licensed Apache-2.0. You define metrics, dimensions and join paths once, in YAML. Agents then discover those definitions, plan a query and run it as governed SQL through an MCP server, a CLI or an HTTP API, instead of writing joins and metric formulas by hand.
Runs locally on DuckDB with no account or server. Optional connectors cover Snowflake, BigQuery, Databricks, Postgres, Athena, ClickHouse, MotherDuck and DuckLake.
No telemetry and no update checks. The engine makes network connections only for what you configure; see Telemetry and network access.
Beta. See Project status for what is supported and what isn't yet.
Try it in one command
You need uv. It fetches a compatible Python (3.11 or newer) if your system Python is older.
uvx semantic-rails ask --package jaffle_shop "revenue by store" --runuvx runs Semantic Rails without installing it; the next section shows how to install it.
--package names a bundled sample package; pass your own package with --path.
This plans the question against the synthetic Jaffle Shop sample, then validates, compiles and runs the plan on DuckDB. It prints how it interpreted the question, the rows and any warnings, then the Query IR. Check that interpretation before you rely on the numbers; see Known limitations. Without uv, try the browser demo or the hosted MCP endpoint below.
Related MCP server: Semantic Metrics Modeling Assistant
Install
To keep a semantic-rails command on your PATH instead of running it through uvx:
uv tool install semantic-railsIf uv warns that its tool directory isn't on your PATH, run uv tool update-shell and
open a new terminal.
Or install it into a project environment. Pin the Python version: on a machine without
a uv-managed Python, a bare uv venv can pick up the system Python (3.9 on stock macOS,
3.10 on Ubuntu 22.04), and then the install fails.
uv venv --python 3.12
source .venv/bin/activate
uv pip install semantic-railsWith pip, run python -m pip install semantic-rails inside a Python 3.11+
environment. On Windows, activate the environment with .venv\Scripts\activate; see the
agent quickstart
for how MCP differs there. CI doesn't cover Windows yet.
Quickstart with your own package
Pass --path on commands that use your own package, or run them inside the package
directory. Without either, and without a saved profile, commands stop with
no_package_selected and list the ways to choose a package; at an interactive terminal,
ask first offers the bundled sample package.
uvx semantic-rails init my_package --yes
uvx semantic-rails project validate --path ./my_package
uvx semantic-rails ask --path ./my_package "total amount by event type" --runinit writes a runnable starter package (YAML models, metrics, examples, tests and
CSV data). Edit it to describe your own tables, then rerun project validate.
The interactive wizard, semantic-rails setup --interactive, walks through the same
steps and can register the MCP server with Claude Desktop or Codex. Run it from an
installed semantic-rails, not through uvx, for the reason given under
Claude Desktop below.
Inside semantic-rails repl, type author to add models, dimensions, measures, metrics and
segments with previews and validation.
Connect your agent
MCP clients may start in another directory, so give the package's absolute path.
Claude Code
claude mcp add semantic-rails -- uvx semantic-rails mcp stdio --path "$PWD/my_package"Codex CLI
codex mcp add semantic-rails -- uvx semantic-rails mcp stdio --path "$PWD/my_package"Claude Desktop. Install the command, then let Semantic Rails write the client config:
uv tool install semantic-rails
"$(uv tool dir --bin)/semantic-rails" mcp setup --path "$PWD/my_package" --client claude --mcp query --install --yesuv tool dir --bin finds the command even when uv's tool directory isn't on your
PATH yet. Run mcp setup without --install --yes to preview the change.
--client codex, --client claude-code (registers the server at user scope),
--client cursor (writes ~/.cursor/mcp.json, so the manual Cursor config below is
optional) and --client both (Claude Desktop and Codex) also work, and --mcp both
adds the Architect MCP, which can edit package files. Don't run mcp setup --install
through uvx: the config would point into uv's cache, which uv cache clean deletes.
Cursor. Install the command and print the two absolute paths the config needs:
uv tool install semantic-rails
echo "$(uv tool dir --bin)/semantic-rails"
echo "$PWD/my_package"Then add the server to .cursor/mcp.json:
{
"mcpServers": {
"semantic-rails": {
"command": "/absolute/path/to/semantic-rails",
"args": ["mcp", "stdio", "--path", "/absolute/path/to/my_package"]
}
}
}Hosted demo (no install). https://semantic-rails.com/mcp is a public Streamable
HTTP endpoint over the same synthetic Jaffle Shop data. It is anonymous and
rate-limited, and it can't load your package.
claude mcp add --transport http semantic-rails-demo https://semantic-rails.com/mcp
codex mcp add semantic-rails-demo --url https://semantic-rails.com/mcpThe agent loop, tool policy and HTTP routes are in
docs/AGENT_QUICKSTART.md.
The full MCP contract, including semantic-rails mcp http for a local HTTP server, is in
docs/MCP_INTERFACE.md.
How it works
An agent works through separate, inspectable steps instead of one SQL string:
discover -> plan -> executediscovermaps business terms to governed metric, dimension and segment IDs.inspectopens one object's card when the agent needs its aggregations, values or time roles.plandrafts Query IR from a natural-language question and checks the draft against the question. Run the draft when its status isokand it has no warnings; otherwise the response says what the draft misses.valid-values(and, over HTTP and the CLI,build-options) guide step-by-step builders instead.execute(the CLI'squery, HTTP/api/v1/query) validates, compiles and runs the Query IR where the package's connection lives. It rejects unknown fields, dimension mismatches, bad filters and policy failures with structured errors and, where possible, recovery hints.validateandcompileare optional dry runs of the same checks.validatereturns the diagnostics without running anything;compilealso renders SQL for the target warehouse. Atcompactverbosity (the CLI's default) orfull,compilereturns anexplainpayload: the chosen join path to each entity, the candidate paths it considered and the relationship contracts along the chosen path. On MCP they areexecutemodesvalidateandsql, which default tominimaland leaveexplainout.
The engine design is in docs/ARCHITECTURE.md, and the supported modeling surface is in docs/CAPABILITIES.md.
How it compares
dbt's Semantic Layer (MetricFlow), Cube, LookML and Malloy are more mature, and they reach warehouses Semantic Rails doesn't support yet: Cube alone connects to Redshift, SQL Server, Microsoft Fabric, MySQL and Trino. dbt, Cube and Looker also connect to far more BI tools and offer caching or pre-aggregation. Semantic Rails is narrower: an engine built around the agent loop above, which you can run locally or embed.
The comparison pack asks the same 16 questions of six modeled layers: Semantic Rails, MetricFlow, Cube, Malloy, Snowflake Semantic Views and KtX. It compares capability, not performance; its support labels describe the authored models, not each layer's limits. Nine questions were chosen to exercise primitives Semantic Rails ships. The output consistency check compares five layers on the current shared dataset, including Semantic Rails, against an independent SQL answer key: all 16 match. Cube's captured SQL was replayed on current data, but Cube itself was not rerun. Snowflake Semantic Views is a stale capture on an older dataset and is excluded from that count; it matches 14 questions and differs on q07 and q16. The authored models and shared data leave some intended semantics weakly tested, so matching outputs are not a ranking.
Coming from MetricFlow? Translate a MetricFlow YAML directory or a dbt
semantic_manifest.json into a new package. The importer is partial: models and
measures it can't translate are listed as warnings, but a metric that used them can
still be written out. project validate --mode parse then fails and names that
metric; remove it, or define the measure it names, before you rely on the import.
uvx semantic-rails import --from metricflow --source target/semantic_manifest.json \
--output . --package-id my_dbt_packageThe imported package targets DuckDB and names a seed script,
data/seed_my_dbt_package.sql, that the import doesn't create. Before
project validate, replace seed with your warehouse's connection (see
package.yml)
or add that script.
Warehouses
DuckDB is included. Add a connector only when you need it, for example Postgres:
uv tool install 'semantic-rails[postgres]'The other connector extras are snowflake, bigquery, databricks, athena and
clickhouse, and all installs every connector. In a project environment, use
uv pip install 'semantic-rails[all]'. MotherDuck and DuckLake use the core duckdb
dependency. Keep secrets in environment
variables or files, not in package YAML. See
docs/DEPLOYMENT.md and
docs/ADDING_A_DIALECT.md.
Telemetry and network access
Semantic Rails collects no telemetry and has no update check. The engine opens network connections only to:
the warehouses configured in your package's
connectionblock;DuckDB's extension repository (extensions.duckdb.org): DuckDB downloads an extension it doesn't bundle the first time a query needs one, for example for MotherDuck, DuckLake or remote files;
its own local MCP server, when
semantic-rails mcp startormcp statuschecks that server's/healthendpoint.
The hosted demo at semantic-rails.com is a separate deployment with its own privacy notice.
Project status
Semantic Rails is beta software. The supported core is the open-source runtime, the
CLI, the MCP stdio and HTTP servers, the /api/v1/* HTTP API, the DuckDB path and
Snowflake execution. The other connectors are supported with guardrails, and live
warehouse credentials are exercised on demand, not in every CI run. The
agent quickstart
lists what is experimental or out of scope.
Known limitations
In the current release:
planreports the parts of a question its draft doesn't honor, aslow_confidenceor aPLAN_UNMATCHED_TERMSwarning, but its checks don't cover every phrasing. For "revenue by store before today" it plans today alone and reportsokwith only that warning, andaskruns it. Check the Query IR, orask's "Interpreted as" line, before you rely on the numbers.askrounds its tables, but JSON results (query,ask --json, MCPexecuteand the HTTP API) return the warehouse's floating-point values as they are, for example486468.17999985756for a currency total.The MetricFlow importer is partial. It can keep a metric whose model or measure it dropped, and package validation then fails, naming that metric.
Roadmap
Work in progress, without dates:
Packaged agent integrations: Claude Code and Codex plugins and a Claude Desktop bundle.
mcp setupalready writes the client configs.A flagship example: a dbt project on an open dataset, modeled end to end.
Broader native-model coverage in the comparison pack and a refreshed Snowflake capture on the current dataset.
Import and export for Apache Ossie, the incubating Open Semantic Interchange specification.
Questions and proposals are welcome in GitHub Discussions.
Docs
Contributing
CONTRIBUTING.md covers scope, architecture ownership and the validation commands. To work from a source checkout:
git clone https://github.com/semantic-rails/semantic-rails.git
cd semantic-rails
uv sync --group dev
uv run semantic-rails packages
uv run semantic-rails query --package jaffle_shop --query-json '@examples/jaffle_shop_revenue_by_store.json' --verbosity minimal --sql-profile offExpected package output includes the bundled synthetic fixture:
jaffle_shopContributor release smoke for the bundled package:
uv run semantic-rails parse-config --path configs/semantic_rails/jaffle_shop
uv run semantic-rails validate-config --path configs/semantic_rails/jaffle_shop --quietBuild and verify the exact wheel and sdist before publishing:
uv build --out-dir dist
uv pip install --python .venv/bin/python --reinstall dist/semantic_rails-0.3.1-py3-none-any.whl
uv run python scripts/verify_package_distribution.py --dist-dir dist --no-buildPackage naming
Semantic Rails is the public product name. The PyPI distribution is
semantic-rails, the Python import package is semantic_rails, and the CLI is
semantic-rails. The published distribution also includes mf2sr, the
MetricFlow translator behind semantic-rails import.
Support, security and license
Support, issue reporting, conduct and security reporting are documented in SUPPORT.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md and SECURITY.md.
Semantic Rails is licensed under Apache 2.0; see LICENSE. Everything in this repository is open source, with no gated features. Semantic Rails, Inc., which runs semantic-rails.com, also offers a hosted service; nothing here requires it.
Available Tools
27 toolsarchitect_guidanceBRead-onlyIdempotent
Return the recommended Architect MCP workflow and safety guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| project_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, read-only call. The description adds the content focus on 'safety guidance' and 'workflow,' but does not reveal any behavioral details beyond what the annotations already provide (e.g., output size, rate limits, or effects of params). No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one direct sentence with no filler, front-loading the verb and object. It is concise while still making the tool's purpose identifiable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is adequate for a simple, safe meta-guidance tool with an output schema, so return format need not be spelled out. However, it omits any usage context and fails to explain the two optional parameters, leaving meaningful gaps in what the agent needs to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions goal or project_path, leaving both parameters completely unexplained. Although their names suggest a purpose, the description fails to explain how, or whether, they influence the returned guidance or what values are valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and a clear resource ('recommended Architect MCP workflow and safety guidance'). It distinguishes this meta-guidance tool from the operational sibling tools (create_project, upsert_model, validate_project, etc.), so an agent can tell at a glance it is asking for guidance rather than performing a project operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no indication of when to call this tool instead of a sibling, nor any exclusions or prerequisites. 'Recommended workflow' weakly implies a general or pre-flight use, but the definition does not state that the agent should consult it before project operations or how it relates to the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_project_fileADestructiveIdempotent
Move one package file into .architect/archive/; remove_object removes one object.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| dry_run | No | ||
| project_path | Yes | ||
| relative_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, and the description adds useful context: the file is moved (not copied) to .architect/archive/, and exactly one file is affected. But it does not disclose that expected_revision acts as a concurrency guard or what dry_run does, which are material behavioral traits for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the primary action front-loaded and zero filler. The semicolon splicing 'Move...' with 'remove_object removes...' is grammatically awkward because the subject shifts, but it is compact and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with 6 parameters and a required expected_revision, the description is too thin: it does not explain the optimistic-concurrency guard, the idempotency key's role, or dry-run behavior. The output schema covers return values and annotations cover the safety profile, but the operational contract for safe invocation is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, yet it only maps to relative_path (the package file to move) and loosely implies project path context. expected_revision, idempotency_key, dry_run, and reason receive no semantic explanation; their self-descriptive names hint at purpose but do not convey critical mechanics like the revision check gating the archive operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+destination: 'Move one package file into .architect/archive/'. The second clause explicitly contrasts it with remove_object ('removes one object'), so an agent can distinguish archiving from deletion without opening schemas or guessing from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names remove_object as the direct alternative and states its contrasting behavior ('removes one object'), which implies archive_project_file is for preservation/moving while remove_object is for deletion. However, it lacks explicit when-not conditions or prerequisites (e.g., 'use only if the file is not referenced'), so some inference remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectADestructiveIdempotent
Create a strict schema_version: 1 project. DuckDB packages use a two-row starter CSV (data=starter) or read a database another tool builds, such as dbt (data=external); other warehouses need connection_kind, with secrets named by environment variable only.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | starter | |
| dry_run | No | ||
| relation | No | raw_events | |
| overwrite | No | ||
| warehouse | No | duckdb | |
| default_db | No | ||
| package_id | Yes | ||
| description | No | Semantic Rails package managed through Architect MCP. | |
| primary_key | No | event_id | |
| time_column | No | occurred_at | |
| first_entity | No | event | |
| project_path | No | ||
| amount_column | No | ||
| connection_kind | No | ||
| connection_name | No | ||
| idempotency_key | Yes | ||
| dimension_column | No | ||
| expected_revision | Yes | ||
| connection_options | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only, idempotent, and destructive. The description adds useful behavior beyond that: it enforces a strict schema_version 1, and requires secrets to come from environment variables only. These are non-obvious constraints that help the agent understand side effects and security needs, so it earns a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that packs key information without fluff. It front-loads the core action and then branches into data and connection details. It is appropriately compact for the amount of content, though a slightly more structured format (e.g., breaking into two sentences) could improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 19 parameters, 0% schema coverage, and no description of return values, the description is far from complete. It addresses only the data and connection_kind branching, leaving many parameters undefined and no guidance on how idempotency or overwrite behaves. The output schema exists but the description does not mention what the tool returns. For a tool of this complexity, more is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains 'data' (starter/external) and 'connection_kind', but says nothing about the other 17 parameters, including required ones like package_id, expected_revision, and idempotency_key. Many parameters have defaults that are not explained, leaving the agent to guess their meaning. This is a significant gap for a complex tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create') and a precise resource ('a strict schema_version: 1 project'), which is unambiguous. It also differentiates from siblings by mentioning dbt as a source, implying this tool is for creating a project from scratch rather than importing one. The purpose is clear and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives conditional guidance for data (starter vs external) and connection_kind based on warehouse type, and notes the environment-variable secret requirement. However, it does not explicitly say when to use this tool versus alternatives like import_dbt_project or setup_project_dialog. The dbt mention hints at an alternative but leaves the choice implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableCRead-onlyIdempotent
Columns (type, nullability, default) and declared primary, unique and foreign keys.
| Name | Required | Description | Default |
|---|---|---|---|
| relation | Yes | ||
| duckdb_path | No | ||
| project_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the main safety profile is covered. The description adds no behavioral detail beyond the returned content — no mention of whether it opens a database, how paths are used, or what happens when the relation is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a short, front-loaded phrase that gets directly to what is returned and has no filler. It is a fragment, not a sentence, and misses a verb, but it is appropriately compact for a simple read-only tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, not describing return values is acceptable, and annotations cover read-only behavior. However, the tool has three parameters whose meaning is unresolved, and there is no guidance on when to choose this tool over related siblings, so the definition is incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not clarify relation, duckdb_path, or project_path. An agent cannot tell what the two path parameters mean or how they interact, so the description fails to compensate for the schema's lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the returned metadata — columns with type/nullability/default and primary, unique, foreign keys — which makes the tool's purpose clear without being a tautology. It also differentiates from siblings like list_tables and profile_columns because it targets schema structure. It lacks an explicit verb like 'describe' or 'retrieve', so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement about when to use this tool versus siblings such as list_tables, profile_columns, or preview_query, and no mention of prerequisites or context. The intended use is only implied by the name and the listed output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_projectARead-onlyIdempotent
Diff one project against another path or a git base ref.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | ||
| compare_path | No | ||
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat safety traits. It adds useful context about the two modes of comparison (path vs git ref) and implies the operation is a read-only diff. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. The core verb and resource are front-loaded, and the two comparison modes are clearly stated. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only diff tool with an output schema, the description covers the essential purpose and the two optional parameters. It does not mention edge cases like mutual exclusivity, but given the output schema exists and annotations cover safety, this is sufficiently complete for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It does explain that compare_path and base_ref are two alternative comparison targets, which clarifies their purpose. However, it does not specify whether they are mutually exclusive, precedence, or what happens if both are provided, leaving ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Diff') and resource ('one project') and clearly distinguishes between two comparison targets ('another path' vs 'a git base ref'), which differentiates it from sibling tools like project_status or list_project_files. It is unambiguous about the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when you need to compare a project to another path or a git ref) but does not explicitly name alternatives or conditions that would select this over another tool. No exclusions or 'use this instead' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
impact_projectBRead-onlyIdempotent
Return behavior-change impact, reviewer teams, and risk for a package change.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | ||
| compare_path | No | ||
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the tool returns three named categories of results, but it does not disclose additional behavioral context such as failure modes, perf expectations, or input constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler or repetition of annotation details. Every word contributes to the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters, zero schema descriptions, and many closely related siblings, the one-line description is insufficient. It relies on the output schema for return shape but leaves parameter semantics and tool-selection context unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to clarify project_path, base_ref, and compare_path; it mentions none of them. An agent cannot determine what base_ref and compare_path mean or how they relate to 'package change' from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and a concrete resource: behavior-change impact, reviewer teams, and risk for a package change. This clearly distinguishes it from siblings like diff_project or validate_project by naming its unique outputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus related siblings such as diff_project, validate_project, or promotion_check. The phrase 'for a package change' gives only weak context, with no exclusions, prerequisites, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_dbt_projectADestructiveIdempotent
Create or update package models from the selected dbt models in one transaction, writing their foreign keys as entity references. Review with suggest_models_from_dbt first; dry_run=true previews without writing. skipped_models and skipped_references say what was left out.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | dbt | |
| select | Yes | ||
| dry_run | No | ||
| target_dir | No | ||
| catalog_path | No | ||
| project_path | Yes | ||
| manifest_path | No | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and idempotent; the description adds useful behavioral context: the operation happens 'in one transaction,' dry_run previews without writing, and skipped_models/skipped_references report omissions. It does not elaborate on the destructive nature, but the annotation covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the main action is front-loaded, followed by workflow guidance and output expectations. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter import tool with required fields like expected_revision and idempotency_key, the description is too thin on parameter semantics. It does mention dry_run and skipped output, and an output schema exists, but the required non-obvious parameters are not explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only clarifies dry_run and the idea of 'selected dbt models' (select). Required parameters like expected_revision, idempotency_key, and project_path are left unexplained, leaving the agent to guess their meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Create or update package models from the selected dbt models in one transaction, writing their foreign keys as entity references.' It also distinguishes itself from the sibling suggest_models_from_dbt by positioning that tool as a prior review step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: 'Review with suggest_models_from_dbt first' and explains that 'dry_run=true previews without writing.' It does not explicitly enumerate when not to use the tool or compare with other upsert tools, but the workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_filesBRead-onlyIdempotent
List files inside a Semantic Rails project directory.
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds no extra behavioral detail (e.g., recursion, filtering, or path requirements) beyond restating the listing action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to understanding the tool's purpose, and the phrasing is direct and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one simple parameter, output schema exists, and annotations cover behavioral safety. The description supplies the key domain context (Semantic Rails project directory) and enough information for an agent to invoke it correctly. Minor gaps like recursion behavior are acceptable given the output schema and simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter project_path is not described in the schema (0% coverage) and the description only implies it is the path to the Semantic Rails project directory. This is a reasonable inference, but the description does not explicitly define the parameter format, semantics, or constraints, leaving some room for ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a resource ('files inside a Semantic Rails project directory'), and naturally distinguishes this from siblings like read_project_file (which reads a single file) and list_tables (which lists tables). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as read_project_file or list_tables. There is no mention of prerequisites, when not to use it, or which scenarios call for a different tool. The usage context is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesARead-onlyIdempotent
List tables and views (read-only) in a DuckDB package's database or a DuckDB file.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | ||
| duckdb_path | No | ||
| project_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The '(read-only)' phrasing and safety profile are already covered by readOnlyHint/idempotentHint/destructiveHint. The description does add the useful context that it can target either a DuckDB package database or a standalone DuckDB file, but it does not disclose behavior such as how the source is resolved when both parameters are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no filler, and the core object ('List tables and views') is front-loaded before the source scoping. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The short description is simple, and output schema plus read-only annotations reduce the burden, but the three optional parameters are unexplained and the two-target 'or' leaves ambiguity about when to supply duckdb_path versus project_path. An agent cannot reliably choose invocation arguments from this text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description needed to explain schema, duckdb_path, and project_path, but it only mentions 'database or DuckDB file.' It never maps parameters to those targets, clarifies the optional schema filter, or explains the all-empty-default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List tables and views') and scopes it to 'a DuckDB package's database or a DuckDB file.' This distinguishes it from siblings like describe_table, which targets individual tables, and list_project_files, which targets project files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the obvious use—enumerating tables/views before working with them—but does not explicitly state when to choose this tool over describe_table or preview_query. It gives no exclusion criteria or alternative routing, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_client_configCRead-onlyIdempotent
Return copy-ready client configuration hints for running Architect MCP.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | 127.0.0.1 | |
| port | No | ||
| transport | No | stdio |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only the 'copy-ready' aspect, which hints at output formatting but does not explain what the hints contain or whether they are exhaustive. It does not contradict annotations, but it adds minimal behavioral context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence that front-loads the purpose. It is concise and free of filler, though it is arguably too sparse to be maximally useful. Structure is fine, but content is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three optional parameters and an output schema, the description is inadequate. It does not explain the parameters' meanings, defaults, or how the output should be used. Although an output schema exists (not shown here), the description still needs to state that parameters are optional and what they control. An agent cannot correctly invoke this tool without external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. The description does not mention host, port, or transport at all, nor does it hint at their purpose or defaults. An agent has no idea what values to provide or why they matter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and names a precise resource ('copy-ready client configuration hints') with a clear context ('for running Architect MCP'). It is unambiguous and distinct from sibling tools, which focus on queries, projects, models, or validation. An agent can immediately understand what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. It does not explain that it is a configuration helper or that it might be used before setting up clients. No context about typical use cases is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_queryARead-onlyIdempotent
Run a semantic query on the package's warehouse, as the query server's execute does, and return at most max_rows rows (1-200), with truncated and total_row_count when there are more. Values are real warehouse data.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_rows | No | ||
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior, and the description aligns with this. It adds valuable context about the truncation behavior and that values are real warehouse data, which goes beyond annotations. No contradictions are present, and the description enriches the agent's understanding of what happens during execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and resource, then immediately details the return behavior. There is no redundancy or filler; every phrase adds meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (not shown but implied), the description need not explain all return fields, but it does mention truncation and total_row_count, which are keys. It covers the essential behavior for a read-only query tool. Some details like error handling or the exact format of the query object are omitted, but given the annotations and output schema, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, leaving the description to clarify parameter meanings. It explicitly documents the max_rows range (1-200) and the effect of truncation, and indicates that 'query' is a semantic query. It does not explain project_path, but that is self-evident from the tool's name and context. The description compensates well for the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Run a semantic query'), the resource ('the package's warehouse'), and the behavior of returning rows with truncation and total_row_count. It distinguishes itself from sibling tools like file management or validation tools, as it is the only query execution tool among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool vs alternatives, nor does it mention any conditions for use. It only implies that it executes queries like the server's 'execute' but does not explain when a preview might be preferred over other operations (e.g., for validation vs. full execution). No exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_columnsBRead-onlyIdempotent
Per-column counts, min/max and up to 20 samples (sample_limit=0 for none), sampling tables above max_rows (at most one million). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| columns | No | ||
| max_rows | No | ||
| relation | Yes | ||
| duckdb_path | No | ||
| project_path | No | ||
| sample_limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description's 'Read-only' is redundant. However, it adds real behavioral context about sampling limits, sample_limit=0 disabling samples, and the max_rows cap, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence, but the parenthetical stacking makes it awkward and slightly ambiguous. Every phrase is information-dense, yet the lack of clear structure reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return-value documentation is not required, but the description leaves several parameters unexplained and does not clarify the relationship between 'up to 20 samples' and the sample_limit default. For a tool with six parameters, this is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter semantics, but it only explains sample_limit and max_rows. Required parameters like relation and important optional parameters like columns, duckdb_path, and project_path are not described. The 'up to 20 samples' claim is also potentially confusing given the default sample_limit of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool produces: per-column counts, min/max, and samples. This is specific enough to identify it as a data-profiling tool rather than a schema or row-preview tool, though it never explicitly names a sibling to distinguish itself from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only and sampling behavior implies this is for quick exploratory profiling, but there is no explicit guidance on when to choose it over alternatives like describe_table or preview_query. The description gives context but no exclusions or comparison to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_statusARead-onlyIdempotent
Return the package's revision (pass it as expected_revision), files and parse report. Use first, and again when the package may have changed. Gotcha: include_runtime_checks also runs runtime validation, examples and tests, which query the warehouse.
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | ||
| include_runtime_checks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior accessories. The description adds a valuable behavioral gotcha: enabling include_runtime_checks triggers runtime validation, examples, and tests that query the warehouse. This is material context beyond the structured annotations and can affect cost or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the tool's outputs, and uses a clear 'Gotcha' label to highlight the important caveat. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and annotations carry a lot of the return-format and safety details, so the description can focus on workflow and caveats. It covers when to use the tool and the main gotcha, but the unresolved 'expected_revision' reference and missing project_path guidance leave small gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description usefully explains include_runtime_checks by describing what it causes, which goes beyond the boolean name and default. However, project_path is never described, and with 0% schema description coverage the description should compensate more. The 'expected_revision' phrase also introduces confusion because it is not a schema parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete output: the package's revision, files, and parse report, which makes the tool's purpose clear and distinct from sibling operations like validate_project or diff_project. However, the parenthetical '(pass it as expected_revision)' is ambiguous because expected_revision is not listed in the input schema, preventing a top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: 'Use first, and again when the package may have changed.' This tells the agent when to call the tool, though it does not name alternatives or state when not to use it, so it stops short of exhaustive usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promotion_checkBRead-onlyIdempotent
Return whether the package is ready for an environment: parse, runtime, examples, tests. Pass compare_path or base_ref to include impact. Gotcha: it queries the warehouse.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | ||
| environment | Yes | ||
| compare_path | No | ||
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds a valuable behavioral disclosure: 'Gotcha: it queries the warehouse.' This warns about a potential external dependency beyond the annotations, which is useful for agents expecting a purely local operation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. The purpose is front-loaded, and the gotcha is placed at the end as a useful warning. It is efficient and readable, though it could include a bit more parameter detail without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values are covered there. The description explains the core purpose and the gotcha, but misses guidance on when to use this tool over siblings, and leaves required parameters unexplained. For a 4-parameter tool with zero schema coverage, it is adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It explains compare_path and base_ref (for impact) but gives no explanation for the required project_path and environment, which are the most critical. The list of checks (parse, runtime, examples, tests) indirectly suggests the meaning of environment, but not explicitly. The description only partially compensates for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: returning whether a package is ready for an environment, listing the specific components checked (parse, runtime, examples, tests). It also notes the optional impact inclusion via compare_path or base_ref. However, it does not explicitly distinguish itself from sibling tools like project_status or validate_project, so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It only explains parameter usage ('Pass compare_path or base_ref to include impact') but does not mention any exclusions or alternative tools. For a read-only check with many siblings, the agent gets no routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_project_fileBRead-onlyIdempotent
Read a UTF-8 project file by relative path.
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | ||
| relative_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds a small behavioral constraint by specifying UTF-8 encoding, but does not disclose behavior for missing files, permission issues, or invalid paths. No contradictions with annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler or redundancy. It is front-loaded with the primary verb and resource, and every word contributes to the core meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with an output schema and rich safety annotations, the description is minimally adequate. However, it lacks key contextual details such as how project_path should be specified fairly, what happens when the file does not exist, and when to use sibling tools for discovering file paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that relative_path is a relative path, but project_path is left completely undefined. No information is provided about path formatting, separators, accepted encodings, or how the project path relates to the file path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') with a clear resource ('project file') and a precise scope ('by relative path'). It is immediately distinguishable from siblings like write_project_file, archive_project_file, and list_project_files, especially when combined with the tool name and title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention that list_project_files should be used to discover available relative paths, or that write_project_file is the counterpart for modifications. Usage context is only implicit through the verb 'read'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_objectADestructiveIdempotent
Remove a model, dimension, time, measure, metric, segment or relationship (a model's foreign key, keyed by its entity), archiving its YAML. model picks the model when several hold the key. A model takes its entity and relationships along. Refused if a metric would still name it; impact lists the behavior changes and the files still naming a removed id.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| kind | Yes | ||
| model | No | ||
| reason | No | ||
| dry_run | No | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/readOnlyHint annotations, it discloses archiving of YAML, cascade behavior for models (entity and relationships go along), refusal conditions, and that impact output lists behavior changes and remaining referencing files. This is substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the action and object, then add necessary edge-case behavior without fluff. Every sentence contributes operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with an output schema and annotations, the description covers core behavior, cascades, and refusal. It omits mention of dry_run and revision/idempotency semantics, but those are partially inferable from parameter names and the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains kind, key, and the model disambiguation, but it does not explain required project_path, expected_revision, idempotency_key, or optional reason and dry_run. The compensation is partial at best.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and enumerates the exact object kinds it removes (model, dimension, time, measure, metric, segment, relationship), plus the archiving side effect. This clearly distinguishes it from sibling upsert/archive/impact tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: the model parameter disambiguates when several models hold a key, and removal is refused if a metric still names the id. It does not explicitly name alternative tools or when-not-to-use conditions, but the conditions are concrete enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_project_dialogBRead-onlyIdempotent
Start a guided project setup dialog, using MCP elicitation when requested and supported.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| package_id | No | ||
| interactive | No | ||
| project_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and non-destructive hints, and the description adds the interactive 'guided dialog' nature plus the conditional MCP elicitation behavior. This is useful context beyond the annotations strands, though it does not explain whether the dialog can produce side effects outside the session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, repetition, or unnecessary detail. It front-loads the core action ('Start a guided project setup dialog') and adds the condition about MCP elicitation compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four optional but undocumented parameters, the description is too thin. It lacks an explanation of what inputs mean, what a successful dialog returns, or how the guided process advances. The read-only annotation helps, but the strong parameter coverage gap makes the description insufficient on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description gives no information about goal, package_id, interactive, or project_path. With no parameter explanations in either the schema or the description, the agent has no way to know how to populate these fields correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and object: 'Start a guided project setup dialog.' It conveys a distinct interactive behavior, but it does not explicitly differentiate itself from sibling tools like create_project or import_dbt_project, so an agent might still wonder exactly what the dialog produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as create_project. The only conditional mentioned is 'when requested and supported' for MCP elicitation, which is about a sub-behavior, not about selecting the tool itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_modelBRead-onlyIdempotent
Propose a key, times, dimensions, measures and foreign keys for a relation, with confidences, reasons and draft upsert_model arguments. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| relation | Yes | ||
| duckdb_path | No | ||
| project_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by mentioning confidences, reasons, and draft upsert_model arguments, and it reaffirms read-only behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence that front-loads the action and output substance. 'Read-only' is redundant with the annotations but harmless; otherwise there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values and the annotations cover side-effect behavior, but the description still leaves unresolved questions about parameter semantics and when to invoke this tool instead of related siblings. It is minimally viable but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to explain the three parameters. It only implies that 'relation' is the target relation and says nothing about duckdb_path or project_path, leaving the agent without enough information to set those correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Propose') with a clear resource ('a relation') and lists the concrete outputs: key, times, dimensions, measures, and foreign keys. This distinguishes it from write/sibling tools like upsert_model, though it does not explicitly differentiate it from the closely named suggest_models_from_dbt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as suggest_models_from_dbt, describe_table, or upsert_model. The only contextual hint is 'Read-only', which implies it is a non-mutating exploration step, but no explicit conditions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_models_from_dbtBRead-onlyIdempotent
suggest_model for each dbt model, from manifest.json and catalog.json (dbt never runs); keys, links and value sets come from dbt tests and contracts. select narrows by model name. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| select | No | ||
| target_dir | No | ||
| catalog_path | No | ||
| manifest_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: 'dbt never runs' and that keys/links/value sets come from dbt tests and contracts. It does not describe output format or error behavior, but the output schema exists to cover return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, two sentences, and front-loads the core purpose. The read-only note is useful and the parenthetical about dbt never running is valuable context. Minor redundancy with annotations (read-only) but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only suggestion tool with an output schema and strong annotations, the description covers the main inputs and behavior. However, target_dir is unexplained, and there is no guidance on how the tool relates to suggest_model or when to prefer one over the other. Given the 0% schema coverage, the description should do more to document parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the four parameters. It only explains 'select' (narrows by model name) and mentions manifest.json and catalog.json as sources, which maps to manifest_path and catalog_path, but target_dir is left unexplained. The description adds some meaning but leaves half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'suggest_model for each dbt model' from manifest.json and catalog.json, and notes that dbt never runs. It distinguishes from the sibling 'suggest_model' by the dbt-specific context, though it doesn't explicitly name the sibling. The read-only note and source files add clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it is for dbt models using manifest and catalog files, and 'select narrows by model name' gives a filtering condition. However, it does not explicitly state when to use this tool versus alternatives like suggest_model or import_dbt_project, nor does it mention prerequisites like having a dbt project already imported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_exampleADestructiveIdempotent
Upsert an example question in examples/: spec has query, and optionally question and expected_shape (columns, min_rows, max_rows). The query must validate. spec merges into an existing example.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| dry_run | No | ||
| file_name | No | core.yml | |
| example_key | Yes | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true. The description adds useful behavior beyond those annotations: it specifies that spec merges into an existing example (merge semantics) and that the query must validate. This provides context about state changes that annotations do not cover. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The core action is front-loaded, and the spec details are given in a compact, structured form. Every sentence contributes to understanding the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (7 parameters, nested spec, output schema, idempotency key, revision) and the schema has no descriptions. The description only covers the spec contents and merge behavior, leaving the other parameters and the output semantics unexplained. It does not address idempotency, expected_revision, dry_run, or the output. Given the complexity and low schema coverage, the description is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains the 'spec' parameter (query, optionally question, expected_shape) but leaves the other six parameters (project_path, example_key, expected_revision, idempotency_key, file_name, dry_run) completely unexplained. The names are somewhat self-explanatory but not enough for a tool with this many parameters. The description fails to provide meaning for most parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Upsert an example question in examples/<file_name>'. This distinguishes it from sibling upsert tools (upsert_model, upsert_relationship, etc.) because it targets a specific resource type. The verb 'upsert' and the resource 'example question' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by describing the spec content and merge semantics, but it does not explicitly state when to use this tool versus other upsert tools or provide exclusions. It mentions a prerequisite ('The query must validate') which is helpful, but there is no explicit routing to alternatives. The context of siblings makes the intended use clear, but the description itself could be more prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_metricADestructiveIdempotent
Upsert a metric from spec (kind, measure or inputs, value_type, label, description). A new metric goes in metrics/, or metrics//.yml; an existing one stays in its file. Fields merge; replace: true rewrites it, keeping its id. Gotcha: strict packages need an explicit value_type.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| group | No | core | |
| dry_run | No | ||
| replace | No | ||
| file_name | No | ||
| metric_key | Yes | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds valuable specifics: fields merge by default, replace:true rewrites while keeping the id, and a gotcha about strict packages requiring an explicit value_type. These details go beyond the annotation flags and help the agent predict behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose and then covering file placement and merge/replace behavior. The gotcha is appended at the end, which is fine. No filler or redundancy; it is efficient for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (9 parameters, 5 required, a nested spec object, and an output schema), the description is insufficient. It does not explain the meaning of required parameters like expected_revision or idempotency_key, nor the effect of dry_run or group. An agent would need to infer or seek additional documentation to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the contents of the spec object but does not clarify key top-level parameters like project_path, metric_key, expected_revision, idempotency_key, dry_run, group, or file_name. The required parameters are not described, making it hard for an agent to know how to populate them correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Upsert a metric') and the resource, listing the spec components (kind, measure or inputs, value_type, label, description). It also explains the file placement rules, which distinguishes it from sibling tools like upsert_model or upsert_relationship. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is for creating or updating metrics, but it does not explicitly state when to use this tool versus alternatives such as upsert_model or upsert_relationship. No exclusions or alternative routing are provided, though the resource type is clear enough for basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_modelCDestructiveIdempotent
Upsert a model and its graph entity. calendar: true makes it the package calendar for calendar_id (default "default", which a package with calendars needs): time.fill reads its date_day time and week_start, month_start, quarter_start and year_start kind: date dimensions. calendar: false reverts that. On a regular model, calendar_id binds its times to a calendar. Fields merge into an existing model; replace: true rewrites it from the arguments, keeping only its id, entities and calendar_id, and lists what it drops in dropped_fields.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | core | |
| joins | No | ||
| label | No | ||
| times | No | ||
| dry_run | No | ||
| replace | No | ||
| calendar | No | ||
| measures | No | ||
| model_id | Yes | ||
| relation | Yes | ||
| dimensions | No | ||
| entity_key | Yes | ||
| calendar_id | No | ||
| description | No | ||
| primary_key | Yes | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description usefully explains merge vs. replace behavior, that replace keeps only id, entities, and calendar_id, and that dropped fields are returned in dropped_fields. It also discloses calendar-related state changes. This aligns with the destructiveHint and idempotentHint annotations, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and run-on, with parenthetical asides and unexplained jargon such as 'time.fill' and 'kind: date dimensions.' The most important behavioral distinction (merge vs. replace) is buried near the end rather than front-loaded in a scannable structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 18-parameter mutation tool with zero schema descriptions, this is incomplete. It covers calendar and replace behavior but omits semantics for required fields, prerequisites, and concurrency/revision expectations. The presence of an output schema lowers the need to describe return values, but the operational gaps remain significant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter-semantics burden, but it only meaningfully explains calendar and replace. Most of the 18 parameters, including required ones like relation, primary_key, expected_revision, and idempotency_key, are left unexplained. The phrase 'default "default"' conflicts with the schema's calendar_id default of "", and 'time.fill' is ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Upsert a model and its graph entity,' and the title narrows it to a semantic model. This broadly distinguishes it from sibling upsert_* tools by object type, but it never explicitly names an alternative or clarifies the graph-entity concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over upsert_metric, upsert_relationship, or upsert_segment, and no exclusion criteria. The 'model' wording implies the target resource, but the description provides no explicit when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_relationshipBDestructiveIdempotent
Relate two entities: columns on from_entity's model hold to_entity's key, in key order. cardinality: many_to_one or one_to_one.
| Name | Required | Description | Default |
|---|---|---|---|
| columns | Yes | ||
| dry_run | No | ||
| to_entity | Yes | ||
| cardinality | No | many_to_one | |
| from_entity | Yes | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey idempotent and destructive behavior, so the description is not obligated to restate them and does not contradict them. However, the description adds no behavioral context beyond the schema/annotations, such as what the destructive operation replaces or how idempotency and expected_revision are enforced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact two-sentence definition with no filler, and the core relationship semantics are front-loaded. It could be slightly clearer by tying the cardinality note to the parameter name, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter destructive/idempotent mutation with zero schema descriptions, the definition leaves too much unexplained: required revision and idempotency semantics, dry-run behavior, and project scoping are absent. It is only minimally viable for an agent to call safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains the central relationship parameters—columns, key order, cardinality, from_entity, and to_entity—but leaves project_path, expected_revision, idempotency_key, and dry_run unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation ('Relate two entities') and clarifies the data model notion—columns on from_entity's model hold to_entity's key in key order. It is clearly distinct from the sibling upsert_model/upsert_metric tools by focusing on relationships, though it does not explicitly compare itself to them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool instead of the many sibling upsert_* tools, nor any prerequisites or exclusions. The agent must infer that relationship creation differs from model/metric/segment upserts based only on the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_segmentBDestructiveIdempotent
Upsert a segment in segments/: entity, basis_metric, label, membership. Fields merge; replace: true rewrites it, keeping its id. Gotcha: membership needs where, metric_filters or a time window, and fields outside membership: are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| dry_run | No | ||
| replace | No | ||
| file_name | No | core.yml | |
| segment_key | Yes | ||
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint and destructiveHint, and the description adds valuable behavior beyond them: fields merge, replace rewrites while keeping the id, and membership requires specific filters. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, then merge/replace behavior, then the critical gotcha. Every sentence earns its place, though the dense punctuation in the final sentence slightly reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an 8-parameter schema with 5 required fields, no schema descriptions, and no guidance on required parameter semantics, the description is incomplete. It explains some spec behavior and the replace flag but omits the meaning of essential fields and how they relate to the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters. It clarifies file_name, replace, and parts of spec, but leaves required parameters like project_path, segment_key, expected_revision, and idempotency_key unexplained. An agent would not know how to correctly populate these fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation ('Upsert'), the resource ('a segment'), its location ('segments/<file_name>'), and the core fields ('entity, basis_metric, label, membership'). This differentiates it from sibling tools like upsert_metric or upsert_model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention when not to use it, nor does it point to sibling tools for other object types. The 'Gotcha' sentence is about input constraints, not usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_testBDestructiveIdempotent
Upsert a package test in tests/. spec.kind is query_returns_columns (query, columns), query_row_count_bounds (query, min_rows and/or max_rows), query_matches_snapshot (query, expected_rows), validate_fails_with_code (query, code), explain_contains (query, text) or metric_equals_query (metric_query, expected_query). Queries must validate; a validate_fails_with_code query must fail with its code. spec merges into an existing test.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| dry_run | No | ||
| test_key | Yes | ||
| file_name | No | core.yml | |
| project_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint and destructiveHint. The description adds value by stating that 'spec merges into an existing test', clarifying the update semantics, and noting that 'queries must validate' with a special condition for validate_fails_with_code. However, it does not disclose error behaviors, conflict handling, or the impact on unspecified fields beyond the merge statement. The description aligns with annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused paragraph that front-loads the main purpose and then provides necessary spec details. Every sentence adds information about behavior or constraints, with no filler. It is compact and readable for the complexity involved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, a nested spec object, and an output schema, the description falls short. It covers the spec.kind structure thoroughly but omits explanations for key parameters like expected_revision (likely a concurrency check), idempotency_key (for idempotent retries), and dry_run (preview mode). The merge behavior is mentioned but its implications on existing test fields are not detailed. The presence of an output schema reduces the need to describe return values, but the description still lacks essential usage context for the other required inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document all parameters. It thoroughly explains the spec object and its supported kinds with their required sub-parameters, but it leaves other required fields (project_path, test_key, expected_revision, idempotency_key) and the dry_run flag unexplained. The description compensates only partially for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Upsert' and the resource 'a package test in tests/<file_name>', with detailed enumeration of allowed spec.kind values. This distinguishes it from sibling upsert_* tools (model, metric, relationship) by focusing on the test resource. It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use the tool (for creating or updating package tests) by explaining the spec structure and requirements, but it does not explicitly contrast with alternatives or state when not to use it. There is no mention of specific scenarios where a different tool (e.g., upsert_model) would be more appropriate. The guidance is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_projectARead-onlyIdempotent
Validate the package: mode parse, runtime, examples, tests, impact or release. Use parse after each change and runtime (compiles and queries every measure and metric) before trusting answers. Gotcha: runtime, examples, tests and release query the warehouse and may build a seeded DuckDB file; impact needs compare_path or base_ref.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | parse | |
| base_ref | No | ||
| environment | No | ||
| compare_path | No | ||
| project_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that runtime, examples, tests and release query the warehouse and may build a seeded DuckDB file, plus the special prerequisite for impact. This gives the agent important behavioral expectations that annotations alone do not capture. The idempotent/read-only annotations are not contradicted; building a seeded file is presented as a side effect consistent with a non-destructive cache-like operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences deliver the purpose, recommended usage order, and important gotchas with zero filler. The main purpose is front-loaded and every clause adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values. The mode list, usage order, warehouse side-effect warning, and impact prerequisite cover the behavioral and invocation context an agent needs to call the tool correctly. The required project_path is simple enough to leave to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It effectively explains the valid mode values and the relationship between impact, compare_path, and base_ref. It does not explicitly describe project_path or environment, though their names and the context make their roles reasonably inferable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Validate the package') and enumerates the distinct modes (parse, runtime, examples, tests, impact, release). This makes it easy for an agent to distinguish validation from sibling tools like project_status or preview_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage directives: use parse after each change, and run runtime before trusting answers. It also notes that impact requires compare_path or base_ref, providing meaningful when-to-use context. It stops short of saying when not to use this tool or how it compares with alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_project_fileADestructiveIdempotent
Write one UTF-8 package file. Gotcha: overwrite: false refuses an existing file.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| dry_run | No | ||
| overwrite | No | ||
| project_path | Yes | ||
| relative_path | Yes | ||
| idempotency_key | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| parse | No | |
| errors | No | |
| status | Yes | |
| changes | Yes | |
| dry_run | Yes | |
| revision | Yes | |
| project_path | Yes | |
| base_revision | Yes | |
| changed_files | Yes | |
| workspace_root | No | |
| idempotency_key | Yes | |
| current_revision | Yes | |
| expected_revision | Yes | |
| idempotent_replay | Yes | |
| proposed_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the read-only, idempotent, and destructive hints, so the description only needs to add context. It does so by specifying UTF-8 encoding and the critical overwrite=false behavior. This is genuinely useful beyond the structured annotations, though it could further mention revision checking or dry-run semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences with no filler. The 'Gotcha' section front-loads the most important operational caveat. It is concise without being overspecified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five required parameters and zero schema descriptions, the tool needs substantial contextual explanation. The current text ignores expected_revision and idempotency_key, which are non-obvious contract parameters, and does not explain dry_run behavior. An agent could guess at some fields, but would lack the necessary context to invoke the tool reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all seven parameters. It only clarifies the overwrite parameter and leaves content, project_path, relative_path, expected_revision, idempotency_key, and dry_run unexplained beyond their names. This is insufficient for an agent to correctly construct a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Write') and resource ('one UTF-8 package file'). This distinguishes it from sibling tools like read_project_file and archive_project_file by the write operation. The terse phrasing still conveys the essential purpose without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternative tools such as upsert_model, import_dbt_project, or archive_project_file. The description only states an operational gotcha ('overwrite: false refuses an existing file') but does not explain prerequisites, exclusions, or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v0.3.1- Changed
architect_guidance4 fields changed- removed
Input schema / properties / goal / titleRemoved value: -"Goal" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"architect_guidanceArguments" - removed
Output schema / titleRemoved value: -"architect_guidanceDictOutput"
- Changed
archive_project_file38 fields changed- removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / properties / reason / titleRemoved value: -"Reason" - removed
Input schema / properties / relative_path / titleRemoved value: -"Relative Path" - removed
Input schema / titleRemoved value: -"archive_project_fileArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
- Changed
create_project52 fields changed- changed
Input schema / properties / amount_column / defaultPrevious value: -"amount"New value: +"" - removed
Input schema / properties / amount_column / titleRemoved value: -"Amount Column" - added
Input schema / properties / connection_kindAdded value: +{ + "default": "", + "type": "string" +} - added
Input schema / properties / connection_nameAdded value: +{ + "default": "", + "type": "string" +} - added
Input schema / properties / connection_optionsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / dataAdded value: +{ + "default": "starter", + "enum": [ + "starter", + "external" + ], + "type": "string" +} - added
Input schema / properties / default_dbAdded value: +{ + "default": "", + "type": "string" +} - removed
Input schema / properties / description / titleRemoved value: -"Description" - added
Input schema / properties / dimension_columnAdded value: +{ + "default": "", + "type": "string" +} - removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Input schema / properties / first_entity / titleRemoved value: -"First Entity" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / overwrite / titleRemoved value: -"Overwrite" - removed
Input schema / properties / package_id / titleRemoved value: -"Package Id" - removed
Input schema / properties / primary_key / titleRemoved value: -"Primary Key" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / properties / relation / titleRemoved value: -"Relation" - removed
Input schema / properties / time_column / titleRemoved value: -"Time Column" - added
Input schema / properties / warehouseAdded value: +{ + "default": "duckdb", + "type": "string" +} - removed
Input schema / titleRemoved value: -"create_projectArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
- Added
describe_table - Changed
diff_project5 fields changed- removed
Input schema / properties / base_ref / titleRemoved value: -"Base Ref" - removed
Input schema / properties / compare_path / titleRemoved value: -"Compare Path" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"diff_projectArguments" - removed
Output schema / titleRemoved value: -"diff_projectDictOutput"
- Changed
impact_project5 fields changed- removed
Input schema / properties / base_ref / titleRemoved value: -"Base Ref" - removed
Input schema / properties / compare_path / titleRemoved value: -"Compare Path" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"impact_projectArguments" - removed
Output schema / titleRemoved value: -"impact_projectDictOutput"
- Added
import_dbt_project - Changed
list_project_files3 fields changed- removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"list_project_filesArguments" - removed
Output schema / titleRemoved value: -"list_project_filesDictOutput"
- Added
list_tables - Changed
mcp_client_config5 fields changed- removed
Input schema / properties / host / titleRemoved value: -"Host" - removed
Input schema / properties / port / titleRemoved value: -"Port" - removed
Input schema / properties / transport / titleRemoved value: -"Transport" - removed
Input schema / titleRemoved value: -"mcp_client_configArguments" - removed
Output schema / titleRemoved value: -"mcp_client_configDictOutput"
- Added
preview_query - Added
profile_columns - Changed
project_status4 fields changed- removed
Input schema / properties / include_runtime_checks / titleRemoved value: -"Include Runtime Checks" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"project_statusArguments" - removed
Output schema / titleRemoved value: -"project_statusDictOutput"
- Changed
promotion_check6 fields changed- removed
Input schema / properties / base_ref / titleRemoved value: -"Base Ref" - removed
Input schema / properties / compare_path / titleRemoved value: -"Compare Path" - removed
Input schema / properties / environment / titleRemoved value: -"Environment" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"promotion_checkArguments" - removed
Output schema / titleRemoved value: -"promotion_checkDictOutput"
- Changed
read_project_file4 fields changed- removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / properties / relative_path / titleRemoved value: -"Relative Path" - removed
Input schema / titleRemoved value: -"read_project_fileArguments" - removed
Output schema / titleRemoved value: -"read_project_fileDictOutput"
- Added
remove_object - Changed
setup_project_dialog6 fields changed- removed
Input schema / properties / goal / titleRemoved value: -"Goal" - removed
Input schema / properties / interactive / titleRemoved value: -"Interactive" - removed
Input schema / properties / package_id / titleRemoved value: -"Package Id" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"setup_project_dialogArguments" - removed
Output schema / titleRemoved value: -"setup_project_dialogDictOutput"
- Added
suggest_model - Added
suggest_models_from_dbt - Added
upsert_example - Changed
upsert_metric41 fields changed- removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - added
Input schema / properties / file_nameAdded value: +{ + "default": "", + "type": "string" +} - removed
Input schema / properties / group / titleRemoved value: -"Group" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / metric_key / titleRemoved value: -"Metric Key" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - added
Input schema / properties / replaceAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / spec / titleRemoved value: -"Spec" - removed
Input schema / titleRemoved value: -"upsert_metricArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
- Changed
upsert_model50 fields changed- added
Input schema / properties / calendarAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / calendar_idAdded value: +{ + "default": "", + "type": "string" +} - removed
Input schema / properties / description / titleRemoved value: -"Description" - removed
Input schema / properties / dimensions / titleRemoved value: -"Dimensions" - removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / entity_key / titleRemoved value: -"Entity Key" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Input schema / properties / group / titleRemoved value: -"Group" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / joins / titleRemoved value: -"Joins" - added
Input schema / properties / labelAdded value: +{ + "default": "", + "type": "string" +} - removed
Input schema / properties / measures / titleRemoved value: -"Measures" - removed
Input schema / properties / model_id / titleRemoved value: -"Model Id" - removed
Input schema / properties / primary_key / titleRemoved value: -"Primary Key" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / properties / relation / titleRemoved value: -"Relation" - added
Input schema / properties / replaceAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / times / titleRemoved value: -"Times" - removed
Input schema / titleRemoved value: -"upsert_modelArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
- Added
upsert_relationship - Changed
upsert_segment40 fields changed- removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Input schema / properties / file_name / titleRemoved value: -"File Name" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - added
Input schema / properties / replaceAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / segment_key / titleRemoved value: -"Segment Key" - removed
Input schema / properties / spec / titleRemoved value: -"Spec" - removed
Input schema / titleRemoved value: -"upsert_segmentArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
- Added
upsert_test - Changed
validate_project7 fields changed- removed
Input schema / properties / base_ref / titleRemoved value: -"Base Ref" - removed
Input schema / properties / compare_path / titleRemoved value: -"Compare Path" - removed
Input schema / properties / environment / titleRemoved value: -"Environment" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / titleRemoved value: -"validate_projectArguments" - removed
Output schema / titleRemoved value: -"validate_projectDictOutput"
- Changed
write_project_file39 fields changed- removed
Input schema / properties / content / titleRemoved value: -"Content" - removed
Input schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Input schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Input schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Input schema / properties / overwrite / titleRemoved value: -"Overwrite" - removed
Input schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Input schema / properties / relative_path / titleRemoved value: -"Relative Path" - removed
Input schema / titleRemoved value: -"write_project_fileArguments" - removed
Output schema / $defs / ArchitectFileChange / properties / after_bytes / titleRemoved value: -"After Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / after_sha256 / titleRemoved value: -"After Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / before_bytes / titleRemoved value: -"Before Bytes" - removed
Output schema / $defs / ArchitectFileChange / properties / before_sha256 / titleRemoved value: -"Before Sha256" - removed
Output schema / $defs / ArchitectFileChange / properties / content_encoding / titleRemoved value: -"Content Encoding" - removed
Output schema / $defs / ArchitectFileChange / properties / diff / titleRemoved value: -"Diff" - removed
Output schema / $defs / ArchitectFileChange / properties / operation / titleRemoved value: -"Operation" - removed
Output schema / $defs / ArchitectFileChange / properties / path / titleRemoved value: -"Path" - removed
Output schema / $defs / ArchitectFileChange / properties / proposed_content / titleRemoved value: -"Proposed Content" - removed
Output schema / $defs / ArchitectFileChange / titleRemoved value: -"ArchitectFileChange" - removed
Output schema / $defs / ArchitectMutationIssue / properties / code / titleRemoved value: -"Code" - removed
Output schema / $defs / ArchitectMutationIssue / properties / details / titleRemoved value: -"Details" - removed
Output schema / $defs / ArchitectMutationIssue / properties / message / titleRemoved value: -"Message" - removed
Output schema / $defs / ArchitectMutationIssue / titleRemoved value: -"ArchitectMutationIssue" - removed
Output schema / properties / base_revision / titleRemoved value: -"Base Revision" - removed
Output schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Output schema / properties / changes / titleRemoved value: -"Changes" - removed
Output schema / properties / current_revision / titleRemoved value: -"Current Revision" - removed
Output schema / properties / dry_run / titleRemoved value: -"Dry Run" - removed
Output schema / properties / errors / titleRemoved value: -"Errors" - removed
Output schema / properties / expected_revision / titleRemoved value: -"Expected Revision" - removed
Output schema / properties / idempotency_key / titleRemoved value: -"Idempotency Key" - removed
Output schema / properties / idempotent_replay / titleRemoved value: -"Idempotent Replay" - removed
Output schema / properties / ok / titleRemoved value: -"Ok" - removed
Output schema / properties / parse / titleRemoved value: -"Parse" - removed
Output schema / properties / project_path / titleRemoved value: -"Project Path" - removed
Output schema / properties / proposed_revision / titleRemoved value: -"Proposed Revision" - removed
Output schema / properties / revision / titleRemoved value: -"Revision" - removed
Output schema / properties / status / titleRemoved value: -"Status" - removed
Output schema / properties / workspace_root / titleRemoved value: -"Workspace Root" - removed
Output schema / titleRemoved value: -"ArchitectMutationResult"
16 tool updates
v0.2.0- First observed
architect_guidance - First observed
archive_project_file - First observed
create_project - First observed
diff_project - First observed
impact_project - First observed
list_project_files - First observed
mcp_client_config - First observed
project_status - First observed
promotion_check - First observed
read_project_file - First observed
setup_project_dialog - First observed
upsert_metric - First observed
upsert_model - First observed
upsert_segment - First observed
validate_project - First observed
write_project_file
TDQS
Scored across 27 tools
Most tools are clearly separated by resource and action, especially the upsert_* family and distinct read/list/write/archive file tools. A few release-oriented tools like validate_project, promotion_check, diff_project, and impact_project overlap enough to require careful reading, and archive_project_file vs remove_object could confuse an agent.
The majority of names follow a consistent snake_case verb-first pattern, and the upsert_* family is very uniform. Minor deviations like architect_guidance and mcp_client_config being noun phrases, plus suggest_model vs suggest_models_from_dbt, prevent a perfect score.
At 27 tools, the set is heavier than ideal and pushes beyond the typical 3-15 well-scoped range. The broad semantic-modeling workflow does justify most of these tools, but the sheer number makes the surface harder for an agent to scan.
The lifecycle is well covered: project creation, dbt import, object upserts, removal, validation, diffing, impact analysis, promotion checks, and warehouse inspection. There is no direct delete_project or dedicated object getter/list tool, but read_project_file, list_project_files, and project_status cover those needs indirectly.
Maintenance
Related MCP Connectors
The grounded data layer for any LLM: governed SQL, metrics, lineage and catalog over your data.
- AvoOAuthio.github.avohq
Define, ship & query your analytics tracking from one source of truth, trusted by humans and agents.
Query your Betterlytics web analytics from AI agents: traffic, funnels, journeys, errors, uptime.
Agent-Native Amplitude/Mixpanel - connect data sources, prompt for charts
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables agents to perform controlled enterprise data queries through semantic intent, with runtime validation of statistics, filters, granularity, permissions, and physical bindings. Exposes tools like semantic_query for safe, fail-closed access to data horizons and capabilities.-
- FlicenseNot gradedqualityCmaintenanceEnables data teams to define and validate metrics through conversation, inspect trust scores and lineage, and export definitions to Looker, Tableau, and dbt.-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with ClickHouse analytics through a semantic layer, exposing datasets and metrics for natural-language querying.-
- AlicenseNot gradedqualityCmaintenanceEnables agents to answer analytics questions with provable correctness by resolving metrics through the semantic layer, tracing lineage, traversing knowledge graphs, checking freshness, and searching glossary definitions, while enforcing access controls and logging every call.MIT