Pre-flight query cost and result-size guardrails for AI agents on BigQuery, Snowflake, Databricks
Connect Runs on your machine
claude mcp add cost-guard-mcp -e GOOGLE_APPLICATION_CREDENTIALS=<GOOGLE_APPLICATION_CREDENTIALS> -e SNOWFLAKE_ACCOUNT=<SNOWFLAKE_ACCOUNT> -e SNOWFLAKE_USER=<SNOWFLAKE_USER> -e SNOWFLAKE_ROLE=<SNOWFLAKE_ROLE> -e SNOWFLAKE_SECONDARY_ROLES=<SNOWFLAKE_SECONDARY_ROLES> -e SNOWFLAKE_PRIVATE_KEY_PATH=<SNOWFLAKE_PRIVATE_KEY_PATH> -e SNOWFLAKE_PRIVATE_KEY_PASSPHRASE=<SNOWFLAKE_PRIVATE_KEY_PASSPHRASE> -e SNOWFLAKE_PASSWORD=<SNOWFLAKE_PASSWORD> -e SNOWFLAKE_EDITION=<SNOWFLAKE_EDITION> -e DATABRICKS_SERVER_HOSTNAME=<DATABRICKS_SERVER_HOSTNAME> -e DATABRICKS_HTTP_PATH=<DATABRICKS_HTTP_PATH> -e DATABRICKS_TOKEN=<DATABRICKS_TOKEN> -e DATABRICKS_CLIENT_ID=<DATABRICKS_CLIENT_ID> -e DATABRICKS_CLIENT_SECRET=<DATABRICKS_CLIENT_SECRET> -e COST_GUARD_ALLOW_MULTI_STATEMENT_SQL=<COST_GUARD_ALLOW_MULTI_STATEMENT_SQL> -e COST_GUARD_ALLOW_WRITE_STATEMENTS=<COST_GUARD_ALLOW_WRITE_STATEMENTS> -e COST_GUARD_MAX_IN_FLIGHT_QUERIES=<COST_GUARD_MAX_IN_FLIGHT_QUERIES> -e COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START=<COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START> -e COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME=<COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME> -- uvx cost-guard-mcp==0.6.0
{
"mcpServers": {
"cost-guard-mcp": {
"command": "uvx",
"args": [
"cost-guard-mcp==0.6.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "<GOOGLE_APPLICATION_CREDENTIALS>",
"SNOWFLAKE_ACCOUNT": "<SNOWFLAKE_ACCOUNT>",
"SNOWFLAKE_USER": "<SNOWFLAKE_USER>",
"SNOWFLAKE_ROLE": "<SNOWFLAKE_ROLE>",
"SNOWFLAKE_SECONDARY_ROLES": "<SNOWFLAKE_SECONDARY_ROLES>",
"SNOWFLAKE_PRIVATE_KEY_PATH": "<SNOWFLAKE_PRIVATE_KEY_PATH>",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "<SNOWFLAKE_PRIVATE_KEY_PASSPHRASE>",
"SNOWFLAKE_PASSWORD": "<SNOWFLAKE_PASSWORD>",
"SNOWFLAKE_EDITION": "<SNOWFLAKE_EDITION>",
"DATABRICKS_SERVER_HOSTNAME": "<DATABRICKS_SERVER_HOSTNAME>",
"DATABRICKS_HTTP_PATH": "<DATABRICKS_HTTP_PATH>",
"DATABRICKS_TOKEN": "<DATABRICKS_TOKEN>",
"DATABRICKS_CLIENT_ID": "<DATABRICKS_CLIENT_ID>",
"DATABRICKS_CLIENT_SECRET": "<DATABRICKS_CLIENT_SECRET>",
"COST_GUARD_ALLOW_MULTI_STATEMENT_SQL": "<COST_GUARD_ALLOW_MULTI_STATEMENT_SQL>",
"COST_GUARD_ALLOW_WRITE_STATEMENTS": "<COST_GUARD_ALLOW_WRITE_STATEMENTS>",
"COST_GUARD_MAX_IN_FLIGHT_QUERIES": "<COST_GUARD_MAX_IN_FLIGHT_QUERIES>",
"COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START": "<COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START>",
"COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME": "<COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME>"
}
}
}
}
{
"mcpServers": {
"cost-guard-mcp": {
"command": "uvx",
"args": [
"cost-guard-mcp==0.6.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "<GOOGLE_APPLICATION_CREDENTIALS>",
"SNOWFLAKE_ACCOUNT": "<SNOWFLAKE_ACCOUNT>",
"SNOWFLAKE_USER": "<SNOWFLAKE_USER>",
"SNOWFLAKE_ROLE": "<SNOWFLAKE_ROLE>",
"SNOWFLAKE_SECONDARY_ROLES": "<SNOWFLAKE_SECONDARY_ROLES>",
"SNOWFLAKE_PRIVATE_KEY_PATH": "<SNOWFLAKE_PRIVATE_KEY_PATH>",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "<SNOWFLAKE_PRIVATE_KEY_PASSPHRASE>",
"SNOWFLAKE_PASSWORD": "<SNOWFLAKE_PASSWORD>",
"SNOWFLAKE_EDITION": "<SNOWFLAKE_EDITION>",
"DATABRICKS_SERVER_HOSTNAME": "<DATABRICKS_SERVER_HOSTNAME>",
"DATABRICKS_HTTP_PATH": "<DATABRICKS_HTTP_PATH>",
"DATABRICKS_TOKEN": "<DATABRICKS_TOKEN>",
"DATABRICKS_CLIENT_ID": "<DATABRICKS_CLIENT_ID>",
"DATABRICKS_CLIENT_SECRET": "<DATABRICKS_CLIENT_SECRET>",
"COST_GUARD_ALLOW_MULTI_STATEMENT_SQL": "<COST_GUARD_ALLOW_MULTI_STATEMENT_SQL>",
"COST_GUARD_ALLOW_WRITE_STATEMENTS": "<COST_GUARD_ALLOW_WRITE_STATEMENTS>",
"COST_GUARD_MAX_IN_FLIGHT_QUERIES": "<COST_GUARD_MAX_IN_FLIGHT_QUERIES>",
"COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START": "<COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START>",
"COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME": "<COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME>"
}
}
}
}
{
"servers": {
"cost-guard-mcp": {
"type": "stdio",
"command": "uvx",
"args": [
"cost-guard-mcp==0.6.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "<GOOGLE_APPLICATION_CREDENTIALS>",
"SNOWFLAKE_ACCOUNT": "<SNOWFLAKE_ACCOUNT>",
"SNOWFLAKE_USER": "<SNOWFLAKE_USER>",
"SNOWFLAKE_ROLE": "<SNOWFLAKE_ROLE>",
"SNOWFLAKE_SECONDARY_ROLES": "<SNOWFLAKE_SECONDARY_ROLES>",
"SNOWFLAKE_PRIVATE_KEY_PATH": "<SNOWFLAKE_PRIVATE_KEY_PATH>",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "<SNOWFLAKE_PRIVATE_KEY_PASSPHRASE>",
"SNOWFLAKE_PASSWORD": "<SNOWFLAKE_PASSWORD>",
"SNOWFLAKE_EDITION": "<SNOWFLAKE_EDITION>",
"DATABRICKS_SERVER_HOSTNAME": "<DATABRICKS_SERVER_HOSTNAME>",
"DATABRICKS_HTTP_PATH": "<DATABRICKS_HTTP_PATH>",
"DATABRICKS_TOKEN": "<DATABRICKS_TOKEN>",
"DATABRICKS_CLIENT_ID": "<DATABRICKS_CLIENT_ID>",
"DATABRICKS_CLIENT_SECRET": "<DATABRICKS_CLIENT_SECRET>",
"COST_GUARD_ALLOW_MULTI_STATEMENT_SQL": "<COST_GUARD_ALLOW_MULTI_STATEMENT_SQL>",
"COST_GUARD_ALLOW_WRITE_STATEMENTS": "<COST_GUARD_ALLOW_WRITE_STATEMENTS>",
"COST_GUARD_MAX_IN_FLIGHT_QUERIES": "<COST_GUARD_MAX_IN_FLIGHT_QUERIES>",
"COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START": "<COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START>",
"COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME": "<COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME>"
}
}
}
}
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools
This server runs locally, so its tools are listed by your MCP client once it starts.
Environment variables
| Name | Description |
|---|---|
GOOGLE_APPLICATION_CREDENTIALSOptional, secret | BigQuery: path to a service-account key file (Application Default Credentials). Required to use the bigquery engine. |
SNOWFLAKE_ACCOUNTOptional | Snowflake: account identifier. Required to use the snowflake engine. |
SNOWFLAKE_USEROptional | Snowflake: username. Required to use the snowflake engine. |
SNOWFLAKE_ROLEOptional | Snowflake: role to assume. Required to use the snowflake engine; has no default and must never be ACCOUNTADMIN (ACCOUNTADMIN, SECURITYADMIN and ORGADMIN are rejected before any Snowflake connection is opened - the check runs when the Snowflake configuration is first loaded, on the first Snowflake t… |
SNOWFLAKE_SECONDARY_ROLESOptional | Snowflake: secondary roles activated at login. NONE (default) means only SNOWFLAKE_ROLE is active in the session; ALL is the explicit opt-out that activates every role granted to SNOWFLAKE_USER. |
SNOWFLAKE_PRIVATE_KEY_PATHOptional, secret | Snowflake: path to an RSA private key file for key-pair auth (preferred over SNOWFLAKE_PASSWORD). Either this or SNOWFLAKE_PASSWORD is required to use the snowflake engine. |
SNOWFLAKE_PRIVATE_KEY_PASSPHRASEOptional, secret | Snowflake: passphrase for an encrypted SNOWFLAKE_PRIVATE_KEY_PATH key file, if the key is encrypted. |
SNOWFLAKE_PASSWORDOptional, secret | Snowflake: password (discouraged; prefer SNOWFLAKE_PRIVATE_KEY_PATH). Either this or SNOWFLAKE_PRIVATE_KEY_PATH is required to use the snowflake engine. |
SNOWFLAKE_EDITIONOptional | Snowflake: account edition that sets the USD/credit price of estimates - standard (default), enterprise, business_critical or vps. The per-call edition argument can only raise it. |
DATABRICKS_SERVER_HOSTNAMEOptional | Databricks: SQL warehouse server hostname (e.g. my-workspace.cloud.databricks.com, no scheme, no trailing slash). Required to use the databricks engine. |
DATABRICKS_HTTP_PATHOptional | Databricks: SQL warehouse HTTP path (from the warehouse's Connection Details tab, e.g. /sql/1.0/warehouses/<warehouse-id>). Required to use the databricks engine. |
DATABRICKS_TOKENOptional, secret | Databricks: personal access token (simplest auth option). Either this or DATABRICKS_CLIENT_ID + DATABRICKS_CLIENT_SECRET is required to use the databricks engine. |
DATABRICKS_CLIENT_IDOptional | Databricks: OAuth machine-to-machine service-principal client ID (preferred for automated use). Requires DATABRICKS_CLIENT_SECRET as well. |
DATABRICKS_CLIENT_SECRETOptional, secret | Databricks: OAuth machine-to-machine service-principal client secret. Requires DATABRICKS_CLIENT_ID as well. |
COST_GUARD_ALLOW_MULTI_STATEMENT_SQLOptional | Set to 1 to let estimate_query_cost/run_query_bounded accept text containing more than one SQL statement. Off by default: the cost cap is only known to cover the single statement the dry run/EXPLAIN priced. Skips only this server's scanner: Snowflake still rejects multi-statement text (sessions are… |
COST_GUARD_ALLOW_WRITE_STATEMENTSOptional | Set to 1 (exactly that value) to let estimate_query_cost/run_query_bounded accept statements that are not reads. Off by default: only text whose first keyword (after comments and opening parentheses) is SELECT, WITH, VALUES, SHOW, DESCRIBE, DESC or EXPLAIN is estimated or run - a WITH must be follo… |
COST_GUARD_MAX_IN_FLIGHT_QUERIESOptional | Maximum number of run_query_bounded calls allowed in flight at once (positive integer, default 8). A cancelled call keeps its slot until its warehouse query completes or the 120 s watchdog fires; a call over the cap fails with a tool error naming this variable before any warehouse connection is ope… |
COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_STARTOptional | Set to true (exactly that value) to let the read-only Databricks tools (check_credentials, estimate_query_cost) open a session on a SQL warehouse that is not RUNNING, which starts the warehouse and bills compute until it auto-stops. Off by default: the server first reads the warehouse's state throu… |
COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUMEOptional | Set to true (exactly that value) to let the read-only Snowflake tools run SELECT CURRENT_REGION(), the INFORMATION_SCHEMA.QUERY_HISTORY read and check_credentials' session-context SELECT on a warehouse that is not STARTED, which can resume a suspended AUTO_RESUME warehouse and bill compute until it… |
Details
| Package | [email protected] (PYPI, stdio) |
| First published | 19 Oct 2026 |
| Last updated | 19 Oct 2026 |
| Registry name | io.github.mcpsmiths/cost-guard-mcp |
More databases servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
