Skip to content

Releases: stackql/stackql

v0.12.778

Choose a tag to compare

@jeffreyaven jeffreyaven released this 11 Oct 20:55
27f7f4d

What's Changed

New Contributors

  • @github-actions[bot] made their first contribution in #802

Full Changelog: v0.12.732...v0.12.778

v0.12.732

Choose a tag to compare

@jeffreyaven jeffreyaven released this 30 Sep 03:44
adc0956

What's Changed

Full Changelog: v0.12.718...v0.12.732

Breaking change: describe_resource MCP tool retired

The describe_resource MCP tool has been removed (#796). It wrapped DESCRIBE provider.service.resource, which reports the schema of one select method resolved without WHERE parameters, while a SELECT routes by its parameters and can land on a method with a different shape.

describe_method is now the single column source for MCP clients. It returns the exact contract for the method a query routes to: inputs with param_type, and the output fields a SELECT can reference. The discovery path is list_providers -> list_services -> list_resources -> list_methods -> describe_method.

  • MCP clients, prompts or agent instructions that call describe_resource need to be updated to call list_methods followed by describe_method.
  • The SQL DESCRIBE statement is unchanged.
  • The embedded server instructions, prompts and the deploy-stack authoring resource have been repointed at describe_method output fields.

MCP protocol revision pinning (--mcp.protocol.version)

The MCP server now builds against github.com/modelcontextprotocol/go-sdk v1.8.0 (previously v1.7.0) and the newest protocol revision it advertises can be pinned (#796, issue #784). The setting is available as the --mcp.protocol.version flag, which overrides server.protocol_version in mcp.config.

Value Advertised Effect
auto (default) or absent every SDK revision negotiation per client: the highest revision both sides speak
2026-07-28 2026-07-28 only sessionless only; implies stateless for Streamable HTTP
2025-11-25 (or any older revision) that revision and everything before it handshake lifecycle only; a 2026-07-28 request is answered with JSON-RPC error -32022 whose data.supported lists the advertised revisions, so the client can renegotiate
stackql mcp --mcp.server.type=http --mcp.protocol.version=2026-07-28 --mcp.config '{"server": {"transport": "http", "address": "127.0.0.1:9992"} }'
stackql mcp --mcp.server.type=stdio --mcp.protocol.version=2025-11-25

Any other value fails config validation at startup with invalid server.protocol_version, naming the legal values.

Behaviour changes that come with SDK v1.8.0:

  • On stateful Streamable HTTP, a 2026-07-28 request is now answered with JSON-RPC error -32022 (UnsupportedProtocolVersion) rather than a plain HTTP 400.
  • Streamable HTTP request bodies are capped at the SDK default of 4 MiB (413 beyond it), and JSON nested deeper than 1000 levels is rejected before parsing. These limits are not configurable in mcp.config.

See docs/mcp.md for the full transport and negotiation detail.

DESC classed as read-only by the MCP policy gate

The MCP policy gate now classes DESC (and DESC EXTENDED) as read-only, the same as DESCRIBE (#795, issue #773). The parser already accepted DESC on every other path; previously the gate treated a statement beginning with DESC as an unknown query class.

OTLP/HTTP push exporter for --output otel

--output otel can now push records to an OTLP/HTTP logs endpoint in addition to writing them to stdout (#795, issue #755 phase 2). The exporter is configured through the new --otel.config flag, which takes a JSON or YAML string:

stackql exec --output otel \
  --otel.config '{"exporter": {"endpoint": "http://localhost:4318/v1/logs", "headers": {"authorization": "<token>"}}}' \
  "select name, location from google.storage.buckets where project = 'my-project';"
Key Required Default Description
exporter.endpoint yes Full OTLP/HTTP logs URL, for example http://collector:4318/v1/logs
exporter.headers no Headers sent on every export request, for example an ingestion token or API key
exporter.timeout_ms no 10000 Per-request timeout in milliseconds
exporter.batch_size no 512 Number of log records per export request
  • Records are sent as OTLP/JSON, batched per statement and chunked by batch_size; the remainder is shipped when the statement completes.
  • 429 and 5xx responses, and transport errors, are retried up to 4 attempts, honouring a delay-seconds Retry-After header (capped at 30 seconds) or otherwise an exponential backoff starting at 500 ms.
  • An export failure is reported on stderr.
  • No OTEL_EXPORTER_OTLP_* environment variables are read; all exporter settings come from --otel.config. A malformed value, or an exporter without an endpoint, fails startup.

Bug fix: JOIN without an ON clause

A JOIN with no ON clause crashed plan building with a nil pointer dereference (#794, fixes #793). A condition-less inner join is now treated as a CROSS JOIN, which both the SQLite and Postgres backends accept, so a query that joins two provider tables with the join condition in WHERE now runs.

Preview functionality (unstable)

Preview functionality is not stable. Behaviour, syntax and output may change or break between releases without notice. Do not rely on it in production.

The opt-in preview query path (--preview='{"unstable":true}') has been extended (#797). Statements over relations named stackql_unstable_<provider>.<service>.<resource> are resolved and run by omnisdk directly from the provider documents, with rows streamed to the output as they are produced rather than staged in the SQL backend.

  • A SELECT over these relations is now handed to omnisdk as a whole: INNER JOIN and LEFT JOIN between document-driven relations are supported, as are IN list filters. omnisdk decides which conditions become request parameters, which become edges between relations, and which become row filters.
  • LIMIT without ORDER BY is pushed down and stops the requests early. ORDER BY, GROUP BY, HAVING, DISTINCT and aggregates are refused on these relations.
  • A query that mixes these relations with any other relation is refused.
  • INSERT, UPDATE and DELETE against a document-driven relation are routed through omnisdk; a RETURNING list streams back the affected resource. INSERT and UPDATE are covered by the functional test suite in this release.
  • Each document-driven provider's configured stackql auth, including basic auth, is passed to omnisdk.
  • SHOW METHODS on these relations reports each method's SQL verb (SELECT, INSERT, UPDATE, ...), with EXEC for a method no verb maps to.
  • Use --output jsonl or --output otel to have each row written as it arrives; the default table output holds every row until the query completes.
stackql exec --preview='{"unstable":true}' --output jsonl \
"select b.name as bucket, i.role, i.members
from stackql_unstable_google.storage.buckets b
inner join stackql_unstable_google.storage.buckets_iam_policies i on i.bucket = b.name
where b.project = 'my-project';"

Developer documentation, including audit query examples for AWS, Azure and Google, is in docs/preview.md.

Dependency and packaging updates

  • github.com/modelcontextprotocol/go-sdk v1.7.0 -> v1.8.0
  • github.com/stackql-labs/omnisdk v0.1.2-beta02 -> v0.1.3-alpha05
  • MCP bundle package metadata for npm (@stackql/mcp-server) and PyPI (stackql-mcp-server) aligned to the 0.12.x line
  • Release process documentation updated (#792)

v0.12.718

Choose a tag to compare

@jeffreyaven jeffreyaven released this 22 Sep 04:09
0dba3cf

What's Changed

Full Changelog: v0.11.673...v0.12.718

Additional notes re pure Go SQLite backend (first release after the modernc migration)

The embedded SQLite backend is now modernc.org/sqlite (pure Go). All binaries are built with CGO_ENABLED=0 and are statically linked; no C toolchain is involved anywhere in the build.

The custom extension functions (split_part, regexp_like, regexp_substr, regexp_replace, json_equal, aws_policy_equal) are ported to pure Go in any-sdk; documented behaviour divergences (RE2 regexp limits) are listed in any-sdk public/sqlfuncs/DIVERGENCES.md.

Library embedders now inherit the modernc.org/sqlite dependency tree instead of mattn/go-sqlite3/cgo.

External loadable SQLite extensions (.load) are no longer supported.

Rollback anchor: the tag v0.11.707-final-cgo marks the last cgo commit on main.

v0.11.669

Choose a tag to compare

@jeffreyaven jeffreyaven released this 08 Sep 01:42
d0f18e3

What's Changed

New Contributors

Full Changelog: v0.10.605...v0.11.669

v0.10.605

Choose a tag to compare

@jeffreyaven jeffreyaven released this 19 Aug 01:59
eddb45c

What's Changed

New Contributors

Full Changelog: v0.10.601...v0.10.605

v0.10.601

Choose a tag to compare

@jeffreyaven jeffreyaven released this 15 Aug 22:03
cbba228

What's Changed

Full Changelog: v0.10.591...v0.10.601

v0.10.591

Choose a tag to compare

@jeffreyaven jeffreyaven released this 06 Aug 02:06
e16420b

What's Changed

  • fix: stdio malformed-frame resilience, JSON() param fan-out, window/CTE test coverage by @jeffreyaven in #702
  • feat: add local ChatGPT and Codex stdio plugin by @jeffreyaven in #703
  • build: consume any-sdk v0.5.4-alpha01 - OCI signing, server variable env resolution, pushdown $select superset, XML pagination token passthrough by @jeffreyaven in #707
  • jsonl-output by @general-kroll-4-life in #708
  • Add MCP Toplist rank badge by @chrstphe in #709

New Contributors

Full Changelog: v0.10.582...v0.10.591

v0.10.582

Choose a tag to compare

@jeffreyaven jeffreyaven released this 31 Jul 07:00
c926a33

What's Changed

Full Changelog: v0.10.559...v0.10.582

v0.10.559

Choose a tag to compare

@jeffreyaven jeffreyaven released this 22 Jul 05:00
a6513a8

What's Changed

Full Changelog: v0.10.557...v0.10.559

v0.10.557

Choose a tag to compare

@jeffreyaven jeffreyaven released this 19 Jul 22:48
d13d59d

What's Changed

  • feat: mcp credential (re)sourcing via server.env_file + reload_credentials tool (#688) by @jeffreyaven in #689
  • feat: add RedactHeaderValue utility to pushdown by @Sneha41sb in #685

Full Changelog: v0.10.542...v0.10.557