NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3670 most downloaded on PyPI
The Clickhouse plugin for dbt (data build tool)
Last release 19 days ago
15 Sep 2026
Release timing varies
gaps range from 2 weeks to 4 months
Most releases are documented
notes for 53 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
77 releases · first in 2021
One column per quarter.
Unlocks support for dbt-core 1.12 and tests against it. Widens the dbt-adapters upper bound to <1.25.0 ( #718 ).
dbt-core 1.12 and tests against it. Widens the dbt-adapters upper bound to <1.25.0 (#718).lightweight_deletes_sync=3 to the default connection settings so lightweight deletes wait for all active replicas before returning. Like the other defaults, it can be overridden via custom_settings (#715).docs. See CONTRIBUTING.md for how to update it (#728).delete+insert incremental strategy occasionally missing deletes on database_engine: Shared when the replica serving the subquery had not yet synced the newly inserted data (#715).run_query() on statements that return no column metadata over HTTP (e.g. GRANT ... ON CLUSTER) failed with zip() argument 2 is longer than argument 1 (#743).requests in the development requirements to fix PYSEC-2026-2275 (#716).actions/checkout and actions/setup-python in the CI workflows to their current major versions (#725).primary_key model config now also accepts a list of columns, and an empty value omits the PRIMARY KEY clause instead of emitting invalid DDL (#678).get_catalog_results_sql and friends) are now prefixed with clickhouse__ to avoid clashing with dbt-core macros. Update any project that overrides them (#678).Full Changelog: v1.10.2...v1.10.3
Update refreshable materialized view parameters ( interval , randomize , depends_on ) in place on dbt run via MODIFY REFRESH . Converting between regu
interval, randomize, depends_on) in place on dbt run via MODIFY REFRESH. Converting between regular and refreshable MVs, or toggling append, still requires --full-refresh (#688).external_id argument to clickhouse_s3source() for S3 role-based access (#698).server_host_name profile option so TLS certificate verification can use a different hostname than the connection target (#687).reuse_connections profile option (default true). When false, dbt opens a fresh connection per model so multi-replica clusters can load-balance connections across replicas (#670), (#686).index parameter to the projections model config as syntax sugar for _part_offset index projections (#651).database_engine (#697).compression without structure (#695).TABLE_ALREADY_EXISTS on an orphaned <snapshot>__dbt_tmp after an interrupted run (#692).DROP + CREATE when replacing views on filesystems that do not support atomic rename (#684).insert_overwrite failing on ClickHouse 26.6+ when replacing a partition from an empty source (#680).-- comment precedes the first marker (#683).query_settings during contract validation and schema-change introspection (#689).catchup=false (#690).Full Changelog: v1.10.1...v1.10.2
Starting with this release the dbt-clickhouse packages will be published to PyPI using Github Actions as a Trusted Publisher . This will improve both
dbt-clickhouse packages will be published to PyPI using Github Actions as a Trusted Publisher. This will improve both the usability and the security of the release process. By @koletzilla in #614query_id in AdapterResponse for every executed query. The query ID is generated as a UUID4 and forwarded to ClickHouse, making it available via adapter_response in dbt artifacts and enabling tools like Elementary to correlate dbt model runs with entries in system.query_log. By @29antonioac in #634EXCHANGE TABLES capability check. On ClickHouse Cloud (Shared engine), the check now short-circuits immediately after detecting the engine — skipping 5 DDL round-trips (2× CREATE TABLE, EXCHANGE TABLES, 2× DROP TABLE) that were previously run on every connection open. For all other engine types, the result is cached behind a process-level lock so the DDL test runs at most once per dbt invocation regardless of thread count. By @29antonioac in #653<1.22.6 to <1.23.0 and dbt-core from ==1.10.* to ==1.11.* for local testing. By @koletzilla in #638dbt clone improvements: tables backed by a MergeTree-family engine are cloned with ClickHouse's zero-copy CREATE OR REPLACE TABLE ... CLONE AS ...; other engines and Distributed tables fall back to dbt's view behavior. By @igorvoltaic in #655clickhouse__get_catalog_relations. By @dataders in #657AI_POLICY.md describes the rules, and AGENTS.md/CLAUDE.md files were added to guide AI agents working in this repository. By @BentsiLeviav in #628 and @koletzilla in #636docker-compose commands with docker compose (V2) and updated the GitHub Actions workflow to use Docker Compose V2. By @vrkirillov in #647Full Changelog: v1.10.0...v1.10.1
This is an interesting release with many changes! Please take some time to review the notes before upgrading it. All changes are expected to be backwa
This is an interesting release with many changes! Please take some time to review the notes before upgrading it. All changes are expected to be backward compatible, but some of them may require adjustments in your code.
catchup in materializataion: materialized_view configuration flag during full refresh operations for materialized views. When catchup: False is set, the target table will not be backfilled with historical data during full refresh, providing consistent behavior across initial creation and redeployment scenarios by @dlouseiro in #589select_sequential_consistency=1 setting for SharedMergeTree (database_engine: Shared) to ensure read-after-write consistency. Shared engine also uses stricter mutations_sync=3 and alter_sync=3 defaults. All connection settings now use setdefault() allowing users to override defaults via custom_settings. Those settings are expected to be safe for all dbt workloads so it's safe in production, but in specific performance critical situations you may want to override it by @koletzilla in #596materializataion: dictionary the settings update_field and update_lag, which is used in https://clickhouse.com/docs/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime and make lifetime optional by @herbert-allium in #580dbt-adapters version to 1.22 by @koletzilla in #609ON CLUSTER when the table exists on a single shard. The can_on_cluster flag now also considers the cluster configuration from the profile, not just the actual shard distribution by @ShimonSte in #599s3source were not read when defined outside the macro call:
aws_access_key_id and aws_secret_access_key by @ShimonSte in #601role_arn by @sarahdasko in #440Full Changelog: v1.9.8...v1.10.0
This is a special release packed with community contributions! Thank you all for your PRs, they're really making the connector more useful and easier
This is a special release packed with community contributions! Thank you all for your PRs, they're really making the connector more useful and easier to use.
--empty flag works when tables are used with an alias by @Romano-arist in #487dbt-adapters version to 1.16.7 to fix a compatibility issue that breaks tests if an older version is installed vy @ty44 in #578local_suffix configuration by @sergeykuprikov in #569dbt run, if the columns change, the target table will not change), but you can use the on_schema_changes setting to control the behavior by @pkotikalapudi in #534Full Changelog: v1.9.7...v1.9.8
--empty flag works when tables are used with an alias (#487).dbt run, if the columns change, the target table will not change), but you can use the on_schema_changes setting to control the behavior (#534).dbt-adapters version to 1.16.7 to fix a compatibility issue that breaks tests if an older version is installed (#578).local_suffix configuration (#569).We have validated that the code doesn't raise warnings related to deprecations for future dbt versions
--sample flag (docs) works. Add tests to cover the implementation (#570).Full Changelog: v1.9.6...v1.9.7
Important for cloud users, who use the Shared Catalog feature - Allow db_engine = 'Shared' in supports_atomic_exchange() by @herbert-allium in #543
Shared Catalog feature - Allow db_engine = 'Shared' in supports_atomic_exchange() by @herbert-allium in #543Full Changelog: v1.9.5...v1.9.6
Shard Catalog feature - Allow db_engine = 'Shared' in supports_atomic_exchange() (#543).Fix v.1.9.4 Regression: macro 'dbt_macro__get_expected_sql' takes not more than 2 argument(s) error when executing dbt test by @koletzilla in #548
macro 'dbt_macro__get_expected_sql' takes not more than 2 argument(s) error when executing dbt test by @koletzilla in #548Full Changelog: v1.9.4...v1.9.5
v1.9.4 that causes the error macro 'dbt_macro__get_expected_sql' takes not more than 2 argument when executing dbt test command (#548).Drop internal MV when a model is changed from materialized_view to view by @koletzilla in #516 and #536
Bugs and features:
Repository maintenance:
test_cloud_results.yml placeholder workflow by @slvrtrn in #525Full Changelog: v1.9.3...v1.9.4
dbt-adapters version to avoid incompatibilities caused by unexpected version upgrades (#530 and #537).chore: Substitute deprecated pkg_resources by @enqueue in #471
Bugs and features:
Repository maintenance:
Full Changelog: v1.9.2...v1.9.3
query_settings not being correctly read when values are strings (#497).replicated_deduplication_window is only applied for *MergeTree engines (#504).shared (#498).Limit dbt-core version to <1.10.X to avoid compatibility issues by @BentsiLeviav in #453
Shared database engine in can_exchange by @tavplubix in #460Full Changelog: v1.9.1...v1.9.2
2.35 and fixed in (#468)hot fix missing database_engine error by @BentsiLeviav in https://github.com/ClickHouse/dbt-clickhouse/pull/450
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.9.0...v1.9.1
chore(deps): upgrade dbt-core to ~=1.9.0 by @canbekley in https://github.com/ClickHouse/dbt-clickhouse/pull/403
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.9...v1.9.0
Added ability to set SQL Security for normal views (#379).
Add support for "microbatch" incremental strategy (#404)
Added support for TTL (time-to-live) as a column configuration for table and ephemeral materializations. This feature is implemented as a custom constraint, which requires model contracts to be enforced (#442)
For example:
-- test_ttl.sql
{{ config(order_by='(ts)', engine='MergeTree()', materialized='table') }}
SELECT now() AS ts,
'Some value that should expire!' AS col_ttl
models:
- name: test_ttl
description: 'Testing column-level TTL'
config:
contract:
enforced: true
columns:
- name: ts
data_type: timestamp
- name: col_ttl
data_type: String
ttl: ts + INTERVAL 1 DAY
fix: create materialized view on cluster by @flytrap in https://github.com/ClickHouse/dbt-clickhouse/pull/384
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.8...v1.8.9
client_cert and client_cert_key profile parameters. (#413)Add force on cluster config option by @benjamin-awd in https://github.com/ClickHouse/dbt-clickhouse/pull/328
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.7...v1.8.8
Use CREATE OR REPLACE DICTIONARY to avoid data loss (#392) by @the4thamigo-uk in https://github.com/ClickHouse/dbt-clickhouse/pull/393
CREATE OR REPLACE DICTIONARY to avoid data loss (#392) by @the4thamigo-uk in https://github.com/ClickHouse/dbt-clickhouse/pull/393Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.6...v1.8.7
Make mv data catchup configurable by @BentsiLeviav in https://github.com/ClickHouse/dbt-clickhouse/pull/399
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.5...v1.8.6
adding extra credentials argument to s3source by @mitchbregs in https://github.com/ClickHouse/dbt-clickhouse/pull/356
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.3...v1.8.5
Nothing published for this version
Restructure and rephrase the latest CHANGELOG.md release section by @BentsiLeviav in https://github.com/ClickHouse/dbt-clickhouse/pull/346
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.2...v1.8.3
Add documentation for codec column configuration by @PJDuszynski in https://github.com/ClickHouse/dbt-clickhouse/pull/317
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.1...v1.8.2
table materialization, and partly supported for distributed_table materialization.
The projection config should be added to the model config (#342), for instance:{
{
config(
materialized='%s',
projections=[{'name': 'your_projection_name', 'query': 'your_projection_query'}],
)
}
}
__dbt_backup tables in the schema. After the fix, these backup tables are now properly dropped. (#326)docker compose command in our tests. (#334)insert_overwrite, which replaces existing data in a target table partition by partition. This ensures that only the specified partitions are overwritten, helping to maintain performance and data consistency. Note that this feature has not been tested with distributed models and may not work with such materializations.
Anton Bryzgalov Thank you for your contribution! (#201)sync_all_column option.
Can Bekleyici huge thanks for your contribution. (#332)Refresh the materialized_view table only if --full-refresh is speci… by @the4thamigo-uk in https://github.com/ClickHouse/dbt-clickhouse/pull/294
--full-refresh is speci… by @the4thamigo-uk in https://github.com/ClickHouse/dbt-clickhouse/pull/294Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.8.0...v1.8.1
--full-refresh is specified.Upgrade to dbt core 1.8 by @BentsiLeviav in https://github.com/ClickHouse/dbt-clickhouse/pull/287
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.7...v1.8.0
Beginning in v1.8, dbt-core and adapters are decoupled. Going forward, your installations should explicitly include both dbt-core and the desired adapter. The new pip installation command should look like this:
pip install dbt-core dbt-clickhouse
ttl setting has been added to model configuration that will insert the provided ClickHouse TTL expression in the appropriate place.
Thanks to Evan Rusackas for the contribution!dbt test command with a LIMIT clause were broken due to parsing error when having settings in the query (issue).
We added a dedicated limit placer, that takes into account the settings section (using a comment flag -- end_of_sql within the query).allow_nondetermistic_mutations was not enabled and the user did not have permission
to apply it. This condition is now detected on startup, and an exception will be thrown if use_lw_deletes is configured
in the profile. Otherwise, a warning will be logged that incremental models will be slower (because such models will
be downgraded to use the legacy incremental strategy). This should prevent the confusing behavior in
https://github.com/ClickHouse/dbt-clickhouse/issues/197 by throwing an early exception for an unsupported configuration.on_schema_change configuration value for incremental models was effectively being ignored. This has been fixed
with a very limited implementation. Closes https://github.com/ClickHouse/dbt-clickhouse/issues/199. Because of the way that
ORDER BY/SORT BY/PARTITION BY/PRIMARY KEYS work in ClickHouse, plus the complexities of correctly transforming ClickHouse data types,
sync_all_columns is not currently supported (although an implementation that works for non-key columns is theoretically possible,
such an enhancement is not currently planned). Accordingly, only ignore, fail, and append_new_columns values are supported
for on_schema_change. It is also not currently supported for Distributed tables.Note that actually appending new columns requires a fallback to the legacy incremental strategy, which is quite inefficient,
so while theoretically possible, using append_new_columns is not recommended except for very small data volumes.
allow_automatic_deduplication setting was not being correctly propagated to the adapter, so setting it to True
did not have the intended affect. In addition, this setting is now ignored for older ClickHouse versions that
do not support CREATE TABLE AS SELECT ... EMPTY, since the automatic deduplication window is required to allow correct
inserts in Replicated tables on those older versions. Fixes https://github.com/ClickHouse/dbt-clickhouse/issues/216.clone feature is not supported, as ClickHouse has no native "light weight"
clone functionality, and copying tables without actual data transfer is not possible in ClickHouse (barring file manipulation
outside ClickHouse itself).TO form with the name <model_name>_mv and the associated target
table <model_name>. It's highly recommended to fully understand how ClickHouse materialized views work before using
this materialization.ON CLUSTER clause was in the incorrect place for legacy incremental materializations. This has been fixed. Thanks to
Steven Reitsma for the fix!ON CLUSTER DDL for drop tables did not include a SYNC modifier, which might be the cause of some "table already exists"
errors. The SYNC modifier has been added to the on_cluster macro when dropping relations.allow_nullable_key would break "legacy" incremental materializations. Closes
https://github.com/ClickHouse/dbt-clickhouse/issues/209. Also see the new model config property insert_settings described
below.replicated_deduplication_window=0 table setting when creating the incremental relations. This
behavior can be overridden by setting the new profile parameter allow_automatic_deduplication to True, although for
general dbt operations this is probably not necessary and not recommended. Finally thanks to Andy(https://github.com/andy-miracl)
for the report and debugging help!allow_automatic_deduplication, which defaults to False. ClickHouse Replicated deduplication is
now disable for incremental inserts, but this property can be set to true if for some reason the default ClickHouse behavior
for inserted blocks is desired.config property query_settings for any ClickHouse settings that should be sent with the INSERT INTO
or DELETE_FROM queries used with materializations. Note this is distinct from the existing property settings which is
used for ClickHouse "table" settings in DDL statements like CREATE TABLE ... AS.https:// prefix. Closes https://github.com/ClickHouse/dbt-clickhouse/issues/192.on_cluster macro that would break the exchange tables step of incremental materializations
with an active cluster. Thanks to Andrew Davis for the PR. Closes
https://github.com/ClickHouse/dbt-clickhouse/issues/167execute. This would cause an exception when running hooks. Thanks to
Sergey Reshetnikov for the PR. Closed https://github.com/ClickHouse/dbt-clickhouse/issues/161distributed_table.sql include file. Thanks to
gladkikhtutu for the contribution.delete+insert incremental materializations to allow parallel transformations on the same
table. In general parallel transformations are risky, so this approach should only be used when transformations are explicitly limited
to non-overlapping data ranges. Closes https://github.com/ClickHouse/dbt-clickhouse/issues/150delete+insert incremental strategy. Note that incremental
predicates that depend on "non-deterministic" data (such as a subquery using a table that is accepting inserts) could lead to
unexpected results for ReplicatedMergeTree tables depending on the timing of the incremental materialization.use_lw_deletes profile value to True will now attempt to enable the allow_experimental_lightweight_delete
setting for the dbt session (if user has such permissions on the ClickHouse server). See https://github.com/ClickHouse/dbt-clickhouse/issues/133threads=4 (soon to be the dbt default).delete+insert incremental strategy. In most cases this strategy should be significantly faster
than the existing "legacy" custom strategy (which is still the default). To enable delete+insert incremental materialization, the flag allow_experimental_lightweight_delete
must be enabled on your ClickHouse server. This flag is NOT currently considered production ready, so use at your own risk. To use this strategy
as the "default" incremental strategy, the new configuration value use_lw_deletes must be set to True. Otherwise, to use it for a particular model,
set the model's incremental_strategy to delete+insert. Important caveats about this strategy:
append as an incremental strategy. This is the same as using the custom model configuration value inserts_only.{uuid} macro in the path to avoid name conflicts. Thanks to Saurabh Bikramapply and revoke grants macros now correctly work with roles as well as user. Again thanks to Saurabh Bikramkey1, key2) now works correctly with incremental models</br></br>
</br></br>
</br></br>
</br></br>
</br></br>
</br></br>
</br></br>
</br></br>
</br></br>
ON CLUSTER clause for main cases()allows to add a comment in table's or view's metadata by @dstsimokha in https://github.com/ClickHouse/dbt-clickhouse/pull/228
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.6...v1.7.7
fix(clients): syntax error when retrieving query columns by @tevariou in https://github.com/ClickHouse/dbt-clickhouse/pull/262
agate by @dwreeves in https://github.com/ClickHouse/dbt-clickhouse/pull/263Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.5...v1.7.6
Release 1.7.4 housekeeping by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/261
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.4...v1.7.5
Add materialization macro for dictionaries by @SoryRawyer in https://github.com/ClickHouse/dbt-clickhouse/pull/255
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.3...v1.7.4
Bug/223 relationship test with limit by @BentsiLeviav in https://github.com/ClickHouse/dbt-clickhouse/pull/249
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.2...v1.7.3
fix: use correct schema for MV target tables by @SoryRawyer in https://github.com/ClickHouse/dbt-clickhouse/pull/244
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.1...v1.7.2
Wrap columns_in_query query in select statement by @ptemarvelde in https://github.com/ClickHouse/dbt-clickhouse/pull/222
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.7.0...v1.7.1
Release 1 7 0 by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/220
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.6.2...v1.7.0
Release 1 6 2 by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/219
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.6.1...v1.6.2
Release 1 6 1 by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/217
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.6.0...v1.6.1
Add materialization macro for materialized view by @SoryRawyer in https://github.com/ClickHouse/dbt-clickhouse/pull/207
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.5.2...v1.6.0
Fix creation of replicated tables when using legacy strategy and unique_key by @StevenReitsma in https://github.com/ClickHouse/dbt-clickhouse/pull/208
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.5.1...v1.5.2
Update test and dependency versions. by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/211
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.5.0...v1.5.1
Release 1 5 0 by @genzgd in https://github.com/ClickHouse/dbt-clickhouse/pull/210
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.4.9...v1.5.0
Incorporates better distributed table support with tests.
Incorporates better distributed table support with tests.
Fixes some issues with Distributed table materializations.
Fixes some issues with Distributed table materializations.
Fixes "legacy" incremental materializations which were broken as a result of distributed table handling.
Fixes "legacy" incremental materializations which were broken as a result of distributed table handling.
Fixes an issue where lightweight deletes could fail in load balanced environments such as ClickHouse Cloud
Fixes an issue where lightweight deletes could fail in load balanced environments such as ClickHouse Cloud
Adds community contribution for distributed table materializations
Adds community contribution for distributed table materializations
Add space to exchange_tables_atomic macro by @damirbk in https://github.com/ClickHouse/dbt-clickhouse/pull/168
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.4.3...v1.4.4
Fix database creation when cluster name is defined by @codenation-nl in https://github.com/ClickHouse/dbt-clickhouse/pull/154
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.4.1...v1.4.2
Sync replica before exchange on exchange_tables_atomic by @saurabhbikram in https://github.com/ClickHouse/dbt-clickhouse/pull/139
exchange_tables_atomic by @saurabhbikram in https://github.com/ClickHouse/dbt-clickhouse/pull/139ON CLUSTER to persist docs by @saurabhbikram in https://github.com/ClickHouse/dbt-clickhouse/pull/147Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.4.0...v1.4.1
add a pr template by @mshustov in https://github.com/ClickHouse/dbt-clickhouse/pull/132
Full Changelog: https://github.com/ClickHouse/dbt-clickhouse/compare/v1.3.3...v1.4.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fixes a major bug in incremental materializations
Fixes a major bug in incremental materializations
Support dbt 1.2.1 https://github.com/ClickHouse/dbt-clickhouse/issues/79
Support Atomic exchange, model settings fix
Support Atomic exchange, model settings fix
Fix brackets regex in column - support Array with nullable values type
FIX
Support for create as select in Replicated databases
ADD
Ensure database exist before connection
FIX
ADD
Nothing published for this version
Nothing published for this version
Allow using custom database/schemas
FIX
ADD
Fixed pre-hooks and empty fields in CSV seed
FIX
Your coding agent can read these notes before it upgrades. Set up the MCP server →