Search / io.github.mcpsmiths/cost-guard-mcp
Cost Guard MCP
L0· runs locallyPre-flight query cost and result-size guardrails for AI agents on BigQuery, Snowflake, Databricks
v0.5.0 · active · repository · descriptor JSON · versions
Search / io.github.mcpsmiths/cost-guard-mcp
L0· runs locallyPre-flight query cost and result-size guardrails for AI agents on BigQuery, Snowflake, Databricks
v0.5.0 · active · repository · descriptor JSON · versions
{
"mcpServers": {
"cost-guard-mcp": {
"command": "uvx",
"args": [
"cost-guard-mcp==0.5.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "${GOOGLE_APPLICATION_CREDENTIALS}",
"SNOWFLAKE_PRIVATE_KEY_PATH": "${SNOWFLAKE_PRIVATE_KEY_PATH}",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}",
"SNOWFLAKE_PASSWORD": "${SNOWFLAKE_PASSWORD}",
"DATABRICKS_TOKEN": "${DATABRICKS_TOKEN}",
"DATABRICKS_CLIENT_SECRET": "${DATABRICKS_CLIENT_SECRET}"
}
}
}
}claude mcp add cost-guard-mcp -e "GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS}" -e "SNOWFLAKE_PRIVATE_KEY_PATH=${SNOWFLAKE_PRIVATE_KEY_PATH}" -e "SNOWFLAKE_PRIVATE_KEY_PASSPHRASE=${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}" -e "SNOWFLAKE_PASSWORD=${SNOWFLAKE_PASSWORD}" -e "DATABRICKS_TOKEN=${DATABRICKS_TOKEN}" -e "DATABRICKS_CLIENT_SECRET=${DATABRICKS_CLIENT_SECRET}" -- uvx cost-guard-mcp==0.5.0[mcp_servers.cost-guard-mcp]
command = "uvx"
args = ["cost-guard-mcp==0.5.0"]
env = { "GOOGLE_APPLICATION_CREDENTIALS" = "${GOOGLE_APPLICATION_CREDENTIALS}", "SNOWFLAKE_PRIVATE_KEY_PATH" = "${SNOWFLAKE_PRIVATE_KEY_PATH}", "SNOWFLAKE_PRIVATE_KEY_PASSPHRASE" = "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}", "SNOWFLAKE_PASSWORD" = "${SNOWFLAKE_PASSWORD}", "DATABRICKS_TOKEN" = "${DATABRICKS_TOKEN}", "DATABRICKS_CLIENT_SECRET" = "${DATABRICKS_CLIENT_SECRET}" }
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cost-guard-mcp": {
"type": "local",
"command": [
"uvx",
"cost-guard-mcp==0.5.0"
],
"enabled": true,
"environment": {
"GOOGLE_APPLICATION_CREDENTIALS": "{env:GOOGLE_APPLICATION_CREDENTIALS}",
"SNOWFLAKE_PRIVATE_KEY_PATH": "{env:SNOWFLAKE_PRIVATE_KEY_PATH}",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "{env:SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}",
"SNOWFLAKE_PASSWORD": "{env:SNOWFLAKE_PASSWORD}",
"DATABRICKS_TOKEN": "{env:DATABRICKS_TOKEN}",
"DATABRICKS_CLIENT_SECRET": "{env:DATABRICKS_CLIENT_SECRET}"
}
}
}
}{
"mcpServers": {
"cost-guard-mcp": {
"command": "uvx",
"args": [
"cost-guard-mcp==0.5.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "${GOOGLE_APPLICATION_CREDENTIALS}",
"SNOWFLAKE_PRIVATE_KEY_PATH": "${SNOWFLAKE_PRIVATE_KEY_PATH}",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}",
"SNOWFLAKE_PASSWORD": "${SNOWFLAKE_PASSWORD}",
"DATABRICKS_TOKEN": "${DATABRICKS_TOKEN}",
"DATABRICKS_CLIENT_SECRET": "${DATABRICKS_CLIENT_SECRET}"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=cost-guard-mcp&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJjb3N0LWd1YXJkLW1jcD09MC41LjAiXSwiZW52Ijp7IkdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUyI6IiR7R09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTfSIsIlNOT1dGTEFLRV9QUklWQVRFX0tFWV9QQVRIIjoiJHtTTk9XRkxBS0VfUFJJVkFURV9LRVlfUEFUSH0iLCJTTk9XRkxBS0VfUFJJVkFURV9LRVlfUEFTU1BIUkFTRSI6IiR7U05PV0ZMQUtFX1BSSVZBVEVfS0VZX1BBU1NQSFJBU0V9IiwiU05PV0ZMQUtFX1BBU1NXT1JEIjoiJHtTTk9XRkxBS0VfUEFTU1dPUkR9IiwiREFUQUJSSUNLU19UT0tFTiI6IiR7REFUQUJSSUNLU19UT0tFTn0iLCJEQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVQiOiIke0RBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVH0ifX0%3D"
}{
"servers": {
"cost-guard-mcp": {
"type": "stdio",
"command": "uvx",
"args": [
"cost-guard-mcp==0.5.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "${GOOGLE_APPLICATION_CREDENTIALS}",
"SNOWFLAKE_PRIVATE_KEY_PATH": "${SNOWFLAKE_PRIVATE_KEY_PATH}",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}",
"SNOWFLAKE_PASSWORD": "${SNOWFLAKE_PASSWORD}",
"DATABRICKS_TOKEN": "${DATABRICKS_TOKEN}",
"DATABRICKS_CLIENT_SECRET": "${DATABRICKS_CLIENT_SECRET}"
}
}
}
}{
"mcpServers": {
"cost-guard-mcp": {
"command": "uvx",
"args": [
"cost-guard-mcp==0.5.0"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "${GOOGLE_APPLICATION_CREDENTIALS}",
"SNOWFLAKE_PRIVATE_KEY_PATH": "${SNOWFLAKE_PRIVATE_KEY_PATH}",
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}",
"SNOWFLAKE_PASSWORD": "${SNOWFLAKE_PASSWORD}",
"DATABRICKS_TOKEN": "${DATABRICKS_TOKEN}",
"DATABRICKS_CLIENT_SECRET": "${DATABRICKS_CLIENT_SECRET}"
}
}
}
}extensions:
"cost-guard-mcp":
enabled: true
name: "cost-guard-mcp"
type: stdio
cmd: "uvx"
args:
- "cost-guard-mcp==0.5.0"
envs:
"GOOGLE_APPLICATION_CREDENTIALS": "${GOOGLE_APPLICATION_CREDENTIALS}"
"SNOWFLAKE_PRIVATE_KEY_PATH": "${SNOWFLAKE_PRIVATE_KEY_PATH}"
"SNOWFLAKE_PRIVATE_KEY_PASSPHRASE": "${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}"
"SNOWFLAKE_PASSWORD": "${SNOWFLAKE_PASSWORD}"
"DATABRICKS_TOKEN": "${DATABRICKS_TOKEN}"
"DATABRICKS_CLIENT_SECRET": "${DATABRICKS_CLIENT_SECRET}"
timeout: 300
Placeholders to fill from your own secret store: ${GOOGLE_APPLICATION_CREDENTIALS}, ${SNOWFLAKE_PRIVATE_KEY_PATH}, ${SNOWFLAKE_PRIVATE_KEY_PASSPHRASE}, ${SNOWFLAKE_PASSWORD}, ${DATABRICKS_TOKEN}, ${DATABRICKS_CLIENT_SECRET}. The registry never accepts secret values.
This is a local package: the command runs on your machine.
Not scored: fewer than three checks apply, usually because no remote answered a credential-free probe or the server is a local package.
protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)auth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptions, tools.description_length, tools.schemas, tools.annotations, tools.directory_hints, tools.token_cost, tools.api_dumptool list unknown (behind auth, not probed, or empty)stability.changes, stability.rug_pulltool list unknownNo tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo ~liveness-unmeasured +updated-4d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
[email protected] PyPIthis version is not known to the dependency resolver
Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
cost-guard-mcp | pypi | 0.5.0 | – | GOOGLE_APPLICATION_CREDENTIALS, SNOWFLAKE_PRIVATE_KEY_PATH, SNOWFLAKE_PRIVATE_KEY_PASSPHRASE, SNOWFLAKE_PASSWORD, DATABRICKS_TOKEN, DATABRICKS_CLIENT_SECRET |
No tools observed. Local packages are never executed by the registry.
Schemas: list_tools.
{
"name": "io.github.mcpsmiths/cost-guard-mcp",
"title": "Cost Guard MCP",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"version": "0.5.0",
"packages": [
{
"version": "0.5.0",
"transport": {
"type": "stdio"
},
"identifier": "cost-guard-mcp",
"registryType": "pypi",
"environmentVariables": [
{
"name": "GOOGLE_APPLICATION_CREDENTIALS",
"isSecret": true,
"description": "BigQuery: path to a service-account key file (Application Default Credentials). Required to use the bigquery engine."
},
{
"name": "SNOWFLAKE_ACCOUNT",
"description": "Snowflake: account identifier. Required to use the snowflake engine."
},
{
"name": "SNOWFLAKE_USER",
"description": "Snowflake: username. Required to use the snowflake engine."
},
{
"name": "SNOWFLAKE_ROLE",
"description": "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 tool call; the server process itself starts regardless, so a bad role surfaces as a failed check_credentials or a tool error, not as a startup exit)."
},
{
"name": "SNOWFLAKE_SECONDARY_ROLES",
"description": "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."
},
{
"name": "SNOWFLAKE_PRIVATE_KEY_PATH",
"isSecret": true,
"description": "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."
},
{
"name": "SNOWFLAKE_PRIVATE_KEY_PASSPHRASE",
"isSecret": true,
"description": "Snowflake: passphrase for an encrypted SNOWFLAKE_PRIVATE_KEY_PATH key file, if the key is encrypted."
},
{
"name": "SNOWFLAKE_PASSWORD",
"isSecret": true,
"description": "Snowflake: password (discouraged; prefer SNOWFLAKE_PRIVATE_KEY_PATH). Either this or SNOWFLAKE_PRIVATE_KEY_PATH is required to use the snowflake engine."
},
{
"name": "SNOWFLAKE_EDITION",
"description": "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."
},
{
"name": "DATABRICKS_SERVER_HOSTNAME",
"description": "Databricks: SQL warehouse server hostname (e.g. my-workspace.cloud.databricks.com, no scheme, no trailing slash). Required to use the databricks engine."
},
{
"name": "DATABRICKS_HTTP_PATH",
"description": "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."
},
{
"name": "DATABRICKS_TOKEN",
"isSecret": true,
"description": "Databricks: personal access token (simplest auth option). Either this or DATABRICKS_CLIENT_ID + DATABRICKS_CLIENT_SECRET is required to use the databricks engine."
},
{
"name": "DATABRICKS_CLIENT_ID",
"description": "Databricks: OAuth machine-to-machine service-principal client ID (preferred for automated use). Requires DATABRICKS_CLIENT_SECRET as well."
},
{
"name": "DATABRICKS_CLIENT_SECRET",
"isSecret": true,
"description": "Databricks: OAuth machine-to-machine service-principal client secret. Requires DATABRICKS_CLIENT_ID as well."
},
{
"name": "COST_GUARD_ALLOW_MULTI_STATEMENT_SQL",
"description": "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 pinned to MULTI_STATEMENT_COUNT=1), and max_rows wraps the whole text in one LIMIT subquery, so use the opt-out without max_rows."
},
{
"name": "COST_GUARD_ALLOW_WRITE_STATEMENTS",
"description": "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 followed by a SELECT or VALUES - because warehouse rows re-enter the model's context and can steer the next call. The gate is defence in depth: the authorisation boundary is the credential's grants (deploy a read-only principal). With COST_GUARD_ALLOW_MULTI_STATEMENT_SQL=1 every statement in the text must be a read, so BigQuery scripts (DECLARE/SET/BEGIN) need both opt-outs. Any other value leaves the gate on."
},
{
"name": "COST_GUARD_MAX_IN_FLIGHT_QUERIES",
"description": "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 opened."
},
{
"name": "COST_GUARD_DATABRICKS_ALLOW_WAREHOUSE_START",
"description": "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 through the Warehouses API (GET /api/2.0/sql/warehouses/<id>, CAN_VIEW/CAN_USE suffices) and, unless it is RUNNING - also when the state cannot be read - check_credentials returns ok=false and estimate_query_cost returns no byte or dollar figure, without opening a session. run_query_bounded is not gated: its own pre-execution estimate and the execution may start the warehouse. Any other value leaves the guard on."
},
{
"name": "COST_GUARD_SNOWFLAKE_ALLOW_WAREHOUSE_RESUME",
"description": "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 auto-suspends. Off by default: those statements are skipped unless the pinned warehouse's SHOW WAREHOUSES state is STARTED (also skipped when no warehouse is pinned or the state cannot be read), and the QUERY_HISTORY read is skipped whenever estimate_query_cost is called without a warehouse argument; estimate_query_cost then prices at Gen1 rates with the byte-tier heuristic and says so in a caveat, and check_credentials returns ok=true with a detail built from the SHOW WAREHOUSES row. USE WAREHOUSE, EXPLAIN USING JSON, SHOW WAREHOUSES and SELECT CURRENT_WAREHOUSE() always run; run_query_bounded is not gated. Any other value leaves the guard on."
}
]
}
],
"repository": {
"url": "https://github.com/mcpsmiths/cost-guard-mcp",
"source": "github"
},
"description": "Pre-flight query cost and result-size guardrails for AI agents on BigQuery, Snowflake, Databricks"
}