Skip to content

Releases

v2.0.2

Choose a tag to compare

@github-actions github-actions released this 06 Nov 04:19

Catatan Rilis v2.0.2

Basis: main, commit bump 49181b6 (chore(release): 2.0.2; PR #10–#13 merge di 9d4651d8).
Tanggal rilis: 2026-11-06.

Ringkasan

v2.0.2 adalah patch rilis berisi empat PR yang merge 6 November 2026:
perbaikan flag --profile, publikasi benchmark token, perbaikan deskripsi
manifest .mcpb, dan CI token budget. Tidak ada perubahan nama tool atau
bentuk parameter.

Verifikasi yang mendasari draf

Gate Hasil
PR #10 post-merge CI (run 42153676380) SUCCESS (5/5)
PR #11 post-merge CI (run 42147780436) SUCCESS
PR #12 post-merge CI (run 42148823517) SUCCESS
PR #13 post-merge CI (run 42154773462) SUCCESS (6/6, termasuk job Token budget)
Review independen PR #10 (regresi direproduksi FAIL lalu PASS, E2E 11/11) 0 temuan
Review + QA independen PR #13 0 blocking (2 NIT, menyusul di PR docs)
Binary rilis lokal (dari commit bump) strut-stack-sql 2.0.2

PR #10 — Perbaikan flag --profile yang diabaikan binary v2.0.1

Binary v2.0.1 mengabaikan --profile: build_policy dipanggil dengan
cli.full_tools mentah (config.rs:1243 untuk TOML, config.rs:1366 untuk
--url/ephemeral), sehingga hanya 3 tool inti yang aktif. Dampak keamanan
tidak ada (fail-closed); dampak operasional tidak ada (semua 8 konfigurasi
live memakai --full-tools). PR ini memperbaikinya; review independen 0
temuan (regresi direproduksi FAIL lalu PASS oleh reviewer sendiri, E2E 11/11);
post-merge CI SUCCESS.

PR #11 — Publikasi benchmark token

Benchmark token terukur (dua run byte-identical): lite 3 tool 625 token,
standard 13 tool 1313, full 20 tool 2549 (o200k_base). Budget yang
diadopsi: lite ≤750 / full ≤3000 (ditegakkan CI oleh PR #13).

PR #12 — Perbaikan deskripsi manifest .mcpb + CI guard

Lima manifest .mcpb masih membawa deskripsi 3-engine (sumber hardcoded di
mcpb/manifest.json:5); diperbaiki + urutan engine diselaraskan + CI guard
ditambahkan. Post-merge CI SUCCESS.

PR #13 — CI token budget

Job CI baru token-budget menegakkan lite ≤750 / full ≤3000 pada binary
DEBUG milik PR itu sendiri (harness ter-commit, tiktoken==0.14.0
ter-pin). CI 6/6 hijau termasuk job Token budget (15m6s). Post-merge CI SUCCESS.

v2.0.1

Choose a tag to compare

@rzlco666 rzlco666 released this 05 Nov 17:45
805d18f

Catatan Rilis v2.0.1

Basis: main, merge commit 805d18f (PR #8 fix/server-json-description; PR #7 fix/mcp-v2-test-findings).
Tanggal rilis: 2026-11-06.

Ringkasan

v2.0.1 adalah patch rilis dari temuan uji V2. Tidak ada perubahan nama tool
atau bentuk parameter yang disengaja; yang berubah adalah penolakan argumen
tak dikenal, kejujuran metadata limit, pembatasan page_size, efisiensi
schema_context, kelonggaran drop_column, saran advisor, allowlist database
opt-in, dan ukuran payload tools/list.

Verifikasi yang mendasari draf

Gate Hasil
Conformance (scripts/conformance/runner.py) 54 check, 0 fail
stdio.tools.list.default_bytes 2643 B (cap 3072)
stdio.tools.list.full_bytes 10853 B (cap 12000)
http.tools.list.full_bytes 10853 B (cap 12000)
cargo clippy -D warnings (5 crate, all-targets) bersih
Lib tests guard 108, core 69, tools 92, server 8
Root tests http_integration 46 (5 ignored), param_strictness 7, sqlite_integration 12, table_policy 7, unit 14

Catatan: conformance dijalankan terhadap binary debug hasil source commit ini;
payload JSON-RPC tidak bergantung profil build. Release binary tetap dibangun
oleh CI.

V1 — Allowlist database opt-in

--allow-databases db1,db2 / STRUT_STACK_SQL_ALLOW_DATABASES menolak
statement yang qualifier tabelnya menunjuk database lain:

  • MySQL/ClickHouse: prefix database di luar daftar ditolak;
  • SQLite: database hasil ATTACH di luar daftar ditolak;
  • SQL Server: nama three-part di luar daftar ditolak;
  • SHOW ditolak selama allowlist aktif karena outputnya tidak bisa difilter;
  • list_schemas hanya menampilkan database yang diizinkan; tool katalog
    menolak schema: "*" dan nama schema yang tidak terdaftar;
  • allowlist bersifat process-wide; grant ber-scope tidak bisa memperlebarnya.

Bukti: guard lib 108 test (4 test allowlist baru), core lib 69,
table_policy 7 (1 test baru database_allowlist_filters_list_schemas),
tools lib 92.

Batas: nama tabel tanpa qualifier tetap resolve ke database koneksi dan
karena itu tetap terjangkau — isolasi keras harus datang dari kredensial
database ber-scope. Qualifier PostgreSQL/DuckDB adalah schema/catalog, bukan
database, dan tidak dibatasi flag ini.

V2 — Argumen tool tak dikenal ditolak

Semua struct parameter tool memakai serde(deny_unknown_fields), termasuk
opsi summary dan entri batch queries[]. Salah ketik seperti keywords,
page_size pada list_tables, atau focuss kini gagal dengan
invalid_params yang menyebut field tak dikenal dan daftar field valid;
sebelumnya argumen itu dibuang diam-diam. get_relationship_graph tetap
menerima focus sebagai alias table.

Bukti: param_strictness 7/7 lulus (7 test baru, termasuk alias
focus dan penolakan typo), tools lib 92, conformance memvalidasi schema 20
tool tanpa error.

V3 — Truncation dilaporkan jujur

Guard menambahkan LIMIT max_rows + 1; lapisan eksekusi membuang baris probe
dan menetapkan meta.truncated = true hanya bila baris itu ada. Tabel dengan
tepat max_rows baris kini melaporkan truncated: false, bukan hasil yang
tidak bisa diverifikasi. meta.limit_injected tidak berubah.

Bukti: 2 test baru di sqlite_integration
(injected_limit_marks_truncated_when_probe_row_exists,
injected_limit_does_not_mark_truncated_at_exactly_max_rows);
sqlite_integration 12/12, unit 14/14.

V4 — page_size dibatasi max_rows di semua engine

Sebelumnya hanya SQL Server yang meng-clamp page_size. page_size: 500
dengan max_rows: 100 pada tabel 142 baris mengembalikan seluruh baris dan
has_more: false. Kini guard meng-clamp pagination server dan lapisan eksekusi
meng-clamp page klien untuk semua engine: 100 baris, has_more: true.
Clamping LIMIT eksplisit (meta.limit_clamped) tidak berubah.

Bukti: 1 test baru
(oversized_page_size_is_capped_by_max_rows), sqlite_integration 12/12.

V5 — get_schema_context memakai cache schema

Packer tidak lagi menjalankan dua scan semua-tabel plus introspection index
langsung pada setiap panggilan. Ia membaca schema overview dan daftar index
yang sudah di-cache; panggilan warm tidak melakukan introspection driver.

Bukti (benchmark commit, SQLite in-memory 300 tabel × 8 kolom):

Jalur Waktu
Urutan lima panggilan lama 25.1 ms
Panggilan cold baru (4 cache miss) 28.4 ms
Panggilan warm baru (4 cache hit, 0 miss) 3.4 ms

Caveat: angka ini bukan pengukuran jaringan MySQL. Laporan 1.2 detik
sebelumnya berasal dari schema MySQL berjaringan, tetapi belum ada pengukuran
terkontrol MySQL-network untuk rilis ini. Jangan mengklaim percepatan jaringan
dari angka di atas.

V6 — drop_column cukup dengan nama kolom

column.type opsional dan diabaikan untuk drop_column; add_column dan
alter_column tetap mewajibkannya dan mengembalikan error yang bisa
ditindaklanjuti bila hilang. Validasi tipe kolom menerima dan membuang
qualifier NULL / NOT NULL di akhir (nullability punya field sendiri),
tetapi tetap menolak upaya injeksi. ColumnDef juga menolak field tak dikenal.

Bukti: 4 test unit baru di ddl.rs (tools lib 92/92) mencakup
pembuangan qualifier, penolakan injeksi, drop_column hanya nama, dan error
add_column tanpa tipe; param_strictness 7/7.

V7 — Saran advisor menyebut kolom sebenarnya

Saran full-scan menyebut kolom yang benar-benar dibandingkan plan dan
merekomendasikan index komposit untuk filter multi-kolom. Scanner filter
mem-tokenize identifier sehingga string literal, placeholder, dan nama tipe
cast tidak lagi dianggap kolom. Saran nested-loop besar menyebut equality join
key bila plan mengeksposnya. Lookup primary key SQLite mempertahankan plan node
dan tidak menghasilkan temuan.

Bukti: 5 test unit baru di explain.rs (tools lib 92/92) mencakup
filter satu kolom, index komposit, join key, lookup PK SQLite, dan pengabaian
literal/cast/placeholder.

Advisory konfigurasi P0 (belum diterapkan)

Perintah berikut adalah contoh untuk operator. Draf ini tidak menjalankan
perintah apa pun dan tidak mengubah database atau konfigurasi.

1. User database least-privilege (hanya SELECT)

PostgreSQL:

CREATE ROLE strut_ro LOGIN PASSWORD '<secret>';
GRANT CONNECT ON DATABASE app TO strut_ro;
GRANT USAGE ON SCHEMA public TO strut_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO strut_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO strut_ro;

MySQL/MariaDB:

CREATE USER 'strut_ro'@'%' IDENTIFIED BY '<secret>';
GRANT SELECT, SHOW VIEW ON app.* TO 'strut_ro'@'%';
-- jangan beri PROCESS, SHOW DATABASES, INSERT/UPDATE/DELETE, atau DDL

SQL Server:

CREATE LOGIN strut_ro WITH PASSWORD = '<secret>';
CREATE USER strut_ro FOR LOGIN strut_ro;
GRANT SELECT ON SCHEMA::dbo TO strut_ro;

Jalankan server dengan kredensial tersebut (default read-only; jangan tambah
--allow-writes/--allow-ddl untuk peran ini):

export DATABASE_URL='postgres://strut_ro:<secret>@db.internal:5432/app'
strut-stack-sql --url-env DATABASE_URL --deny-columns password,salt

2. Redaksi kolom sensitif

strut-stack-sql --url-env DATABASE_URL --deny-columns password,salt

--deny-columns adalah redaksi, bukan kontrol akses: kolom dengan nama
yang cocok persis (case-insensitive) diganti "[redacted]", nama kolom tetap
terlihat, dan alias (SELECT password AS p) melewati pencocokan. Isolasi
sebenarnya tetap berasal dari user database least-privilege dan view yang tidak
memilih kolom rahasia.

What's Changed

  • docs: README overhaul + one-command AI setup in install.sh by @rzlco666 in #6
  • fix: MCP v2.0.0 test findings — patch release 2.0.1 by @rzlco666 in #7
  • docs: list all six engines in server.json description by @rzlco666 in #8

Full Changelog: v2.0.0...v2.0.1

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 02:10
b6b0872

Strut Stack SQL v2.0.0

MCP SQL server with pluggable drivers — Postgres, MySQL, SQLite, DuckDB
(embedded analytics), SQL Server, ClickHouse — plus a policy engine, tool
profiles, and token thrift. All 29 Project Tracker V2 tasks (8 feat/v2 +
21 R1–R4) are complete, each with a merge/PR/tag URL as evidence in Notion.

What is new (per PR, verified)

  • PR #1 (feat/v2 → main, merged 2026-11-04 08:54 WIB, 9ff62ca): 18
    R1/R2/R4 tasks — the v2 foundation (pluggable drivers, tool profiles,
    schema intelligence, query advisor, OAuth 2.1 + policy engine, measured
    gates).
  • PR #2 (DuckDB R3-01 → main, merged 2026-11-04 21:13 WIB, 7f69c9a):
    embedded DuckDB driver (the real C++ engine via official Rust bindings),
    AST guard blocking read_csv/read_text/query_table/ATTACH/INSTALL/LOAD,
    normalized EXPLAIN/EXPLAIN ANALYZE. Gates: 403 tests pass, conformance
    51/0, CI all required PASS.
  • PR #3 (ClickHouse R3-03 → main, merged 2026-11-05 02:14 WIB, 63b650c):
    ClickHouse HTTP driver (reqwest, pooled client), clickhouse:// and
    clickhouses:// URLs, X-ClickHouse-User / X-ClickHouse-Key auth,
    JSONCompactEachRowWithNamesAndTypes, readonly=1 + max_execution_time,
    typed ? → {pN:Type} parameters, ClickHouseDialect guard + denylist,
    backtick DDL + MODIFY COLUMN + EXPLAIN PLAN. Gates: fmt 0, clippy 1.99 0,
    workspace tests 0, real-DB integration 5/5, conformance 51/0/3,
    audit 0. CI run 41892311748 all required PASS.
  • PR #4 (SQL Server R3-02 → main, merged 2026-11-05 08:08 WIB, a5a687b):
    SQL Server driver (Tiberius 0.13/Rustls, sqlserver:// + mssql:// alias,
    trust_server_certificate + encrypt, TOP/OFFSET FETCH, EXEC/SET/USE
    denylist, full-AST policy notes). Gates: fmt 0, clippy 1.99 0, workspace
    tests 0, live driver 6/6, live root 5/5, BUILD 0, conformance 51/0/3,
    audit 0. CI run 41945395064 all required PASS.

Breaking changes

  • Version 2.0.0; there is NO V1 runtime compatibility layer.
  • The mcp-sql-rust alias was removed (per PR #1).
  • jsonwebtoken patch: crypto-bigint 0.5.5 → 0.7.10 via [patch.crates-io]
    to upstream PR #551 rev 3739623a (not yet merged upstream) — fixing
    RUSTSEC-2026-0387, with NO audit ignore.
  • DuckDB, ClickHouse, SQL Server: additive, no breaking changes.

Honest limitations

  • DuckDB: row_cap limits decoded rows (not native materialization);
    UUID/JSON parameters need explicit casts; :memory: read-only relies on
    the guard.
  • ClickHouse: HTTP-only driver (not the native protocol); keyset treats
    ClickHouse PKs as NOT unique; Binary → hex.
  • SQL Server: live verification ran only against a disposable SQL Server
    2022 container, not production SQL Server; no production install or
    deploy is included in this release.
  • Still-open PRD gaps (not claimed done): full tools/list token
    measurement, cursor pagination, further masking/row-filter policy,
    approval + migration tools, doctor/migrate CLI, HTTP benchmark misses.

This release is the tag + notes. Production install/deploy needs a
separate go-ahead.

Release mechanics note

  • PR #5 (release workflow fix → main, merged 2026-11-05 08:53 WIB,
    b6b0872): workflow-only, no product code changed. It unblocked this
    release after run 41947059951 failed two Linux builds: Linux x64 size
    budget 16,000,000 → 50,000,000 (the v2 binary embeds DuckDB, ~45MB) and
    Linux arm64 builds moved from the cross-rs image (whose g++ lacks C++
    headers) to Ubuntu host cross toolchain. The tag points to
    b6b0872; product code is identical to a5a687b plus this workflow fix.

v1.0.4

Choose a tag to compare

@github-actions github-actions released this 24 Jul 16:51

Full Changelog: v1.0.2...v1.0.4

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 24 Jul 16:14

Full Changelog: v1.0.1...v1.0.2

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 24 Jul 15:19

Full Changelog: v1.0.0...v1.0.1

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 24 Jul 13:05