StackQL MCP Server

Query and change cloud and SaaS resources with SQL through the StackQL engine

Official · StackQL Studios Go Local · stdio Cloud platformsDevOps and monitoring

53 popularity score ★ 1.1k ↓ 328/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add stackql -- npx -y @stackql/mcp-server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "stackql": {
      "command": "npx",
      "args": [
        "-y",
        "@stackql/mcp-server"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "stackql": {
      "command": "npx",
      "args": [
        "-y",
        "@stackql/mcp-server"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "stackql": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@stackql/mcp-server"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.stackql]
command = "npx"
args = ["-y", "@stackql/mcp-server"]
Gemini CLITerminal
gemini mcp add --scope user stackql npx -- -y @stackql/mcp-server
Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add stackql -- uvx stackql-mcp-server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "stackql": {
      "command": "uvx",
      "args": [
        "stackql-mcp-server"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "stackql": {
      "command": "uvx",
      "args": [
        "stackql-mcp-server"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "stackql": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "stackql-mcp-server"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.stackql]
command = "uvx"
args = ["stackql-mcp-server"]
Gemini CLITerminal
gemini mcp add --scope user stackql uvx -- stackql-mcp-server
Local (Docker)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add stackql -- docker run -i --rm stackql/stackql-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "stackql": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "stackql/stackql-mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "stackql": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "stackql/stackql-mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "stackql": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "stackql/stackql-mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.stackql]
command = "docker"
args = ["run", "-i", "--rm", "stackql/stackql-mcp"]
Gemini CLITerminal
gemini mcp add --scope user stackql docker -- run -i --rm stackql/stackql-mcp

Settings 6

GOOGLE_CREDENTIALS Optional: Google Cloud service account key, read when querying the google provider; each provider has its own variables.
STACKQL_GITHUB_USERNAME Optional: GitHub user name for the github provider, paired with STACKQL_GITHUB_PASSWORD.
STACKQL_GITHUB_PASSWORD Optional: GitHub token or password for the github provider.
OKTA_SECRET_KEY Optional: API key for the okta provider.
STACKQL_MCP_BIN Optional: npm/PyPI launcher: path to an existing stackql binary, skipping the download.
STACKQL_MCP_BUNDLE Optional: npm/PyPI launcher: path to a local .mcpb bundle to take the binary from, for testing; skips download and sha check.

In a container, a setting goes in with -e NAME=value after docker run.

What it does

StackQL maps the APIs of cloud and SaaS providers (AWS, Azure, Google Cloud, GitHub, Okta, Databricks and others) to tables, so resources can be read with SELECT and created, changed or removed with INSERT, UPDATE, REPLACE, DELETE and EXEC statements. Run with `stackql mcp`, the same engine serves those abilities to an MCP client: the assistant can browse which providers, services, resources and methods exist, install a provider definition from the StackQL registry, check a query plan without running it, and then run queries or lifecycle operations against your accounts.

The npm, PyPI and Docker packages are thin launchers. The npm and PyPI ones download the signed `stackql` binary for your platform from the matching GitHub release on first run, check it against sha256 pins in the package, and cache it under `~/.stackql/mcp-server-bin/`; per their package pages they also set `--approot` to `~/.stackql` and switch off the audit file by default, while the plain binary keeps audit on. `.mcpb` bundles for Claude Desktop and a GitHub Action for CI runs are also published.

What the README does not say: the server has 13 tools, and since the change to a default `mode: safe`, every INSERT, UPDATE, REPLACE, DELETE or EXEC asks the user to approve it through MCP elicitation. A client that does not support elicitation gets those calls refused unless the server is put in `full_access` mode (stackql.io/docs/command-line-usage/mcp).

What it needs

RuntimeNode.jsorPythonorDocker

Node.js with npx, or uv for uvx, or Docker; alternatively a native stackql binary (Homebrew, installers) run as `stackql mcp --mcp.server.type=stdio`. Internet access on first run to fetch the binary and provider definitions. Accounts and credentials for each cloud or SaaS provider you query, supplied as that provider's environment variables, a dotenv file via `--env.file`, or the `--auth` flag.

Limits

The mode (read_only, safe, delete_safe, full_access) is one setting for the whole server, with no per-tool override. In the default safe mode, writes need a client that supports MCP elicitation, otherwise they are refused. Since v0.12.742 a multi-statement payload is gated by its most privileged statement. Request body (HTTP) is capped at 4 MiB and a stdio frame at 8 MiB, neither configurable. A malformed or unreadable `--env.file` stops the server at startup; a missing one is ignored. The HTTP transport exits at startup unless a bearer token variable or `allow_unauthenticated` is configured. Enterprise CA support is marked experimental.

Who it suits

Suits platform and DevOps engineers who already use several clouds or SaaS tools and want one assistant interface that can both inventory and provision resources with SQL, across providers, from their own machine or a CI job. The approval-per-write default and read_only mode make it workable for exploration; full_access is meant for trusted automation with a reviewed audit log. Someone who needs only one provider's console features, or a client without elicitation support but does not want to grant full_access, may find a single-vendor server simpler.

Tools 13

server_info
Reports the name, version and runtime details of the running server
reload_credentials
Re-reads the --env.file dotenv file and reports credential status for each provider
list_providers
Lists providers already pulled into the local cache
list_services
Lists the services one provider offers
list_resources
Lists the resources within a provider service
list_methods
Lists the access methods available on a resource
describe_method
Shows the inputs and output fields of one access method
list_registry
Lists provider definitions and versions available in the StackQL registry
pull_provider
Downloads a provider definition from the registry into the local cache
validate_select_query
Parses and plans a SELECT without running it
run_select_query
Runs a SELECT against a provider, with an optional row limit
run_mutation_query
Runs an INSERT, UPDATE, REPLACE or DELETE against a provider, subject to the server mode
run_lifecycle_operation
Runs an EXEC lifecycle operation on a resource, subject to the server mode

Similar servers