sqlglass
PYPI · SQLGLASS · SCANNED SEP 23
SQL Server / Azure SQL for agents: real schema, lint, read-only runs, plans, write previews.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 31 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability75
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 3079 tokens (~106/item across 29 items; 29 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
How do I install the sqlglass MCP server?
sqlglass runs locally as a PyPI package, launched with uvx sqlglass. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · sqlglass
claude mcp add s-curvelabs-sqlglass -- uvx sqlglass
{
"mcpServers": {
"s-curvelabs-sqlglass": {
"command": "uvx",
"args": [
"sqlglass"
]
}
}
} {
"servers": {
"s-curvelabs-sqlglass": {
"command": "uvx",
"args": [
"sqlglass"
]
}
}
} codex mcp add s-curvelabs-sqlglass -- uvx sqlglass
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"s-curvelabs-sqlglass": {
"type": "local",
"command": [
"uvx",
"sqlglass"
],
"enabled": true
}
}
} openclaw mcp add s-curvelabs-sqlglass --command uvx --arg sqlglass
mcp_servers:
s-curvelabs-sqlglass:
command: "uvx"
args: ["sqlglass"] {
"McpServers": {
"s-curvelabs-sqlglass": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"sqlglass"
]
}
}
} assistant mcp add s-curvelabs-sqlglass -t stdio -c uvx -a sqlglass
{
"mcpServers": {
"s-curvelabs-sqlglass": {
"command": "uvx",
"args": [
"sqlglass"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 23 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 22 Sept 26 50
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 23 Sept 2026 · Analysed pypi/sqlglass@0.1.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 31 packages
| Packages resolved | 31 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
analyze_sql ~37
What a query touches: tables/views, columns per table, CTEs, parameters and its output columns.
| Name | Type | Req | Description |
|---|---|---|---|
| sql | string | yes | – |
No output schema declared.
No examples provided.
build_create_table ~295
Generate a CREATE TABLE script (TEXT ONLY -- this server never runs DDL; the user reviews and runs it). Checked against the cached schema: the name must be free, foreign keys must point at a real primary/unique key with the same column types, FK columns get an index, constraints get conventional names, and the script is wrapped in IF OBJECT_ID(...) IS NULL so it can be re-run. Returns sql + undo_sql + notes. name: "dbo.VendorScore" columns: [{"name": "VendorScoreId", "type": "int", "identity": true}, {"name": "VendorId", "type": "int", "nullable": false}, {"name": "Score", "type": "decimal(5,2)", "nullable": false, "default": "0", "description": "0-100"}] primary_key: ["VendorScoreId"] foreign_keys: [{"columns": ["VendorId"], "references": "dbo.Vendor"}] (ref_columns default to the parent's primary key) indexes: [{"columns": ["ScoredOn"], "include": ["Score"], "unique": false}]
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | – |
| connection | string | – | – |
| description | string | – | – |
| foreign_keys | – | – | – |
| indexes | – | – | – |
| name | string | yes | – |
| primary_key | – | – | – |
No output schema declared.
No examples provided.
build_procedure ~153
Generate a CREATE OR ALTER PROCEDURE script (TEXT ONLY -- never executed here) around a query. Give inline 'sql', or a library 'query' -- then its header params (name, type, default) become the procedure's parameters automatically. Every @variable in the body must be a typed parameter. params: [{"name": "@StartDate", "type": "date", "default": "'2026-01-01'", "description": "first order date"}] Returns sql + undo_sql + notes (including an EXEC example).
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| name | string | yes | – |
| params | – | – | – |
| query | string | – | – |
| sql | string | – | – |
No output schema declared.
No examples provided.
build_select ~242
Generate a SELECT from the cached schema: names validated, joins inferred from foreign keys (bridge tables added automatically), aliases assigned, GROUP BY derived. Returns SQL text only; nothing is executed. tables: ["dbo.PoHeader", "dbo.Vendor"] (first = FROM; the rest are joined) columns: ["Vendor.Name", "PoHeader.OrderDate"] (Table.Column, or a bare Column when unambiguous) aggregates: [{"fn": "SUM", "column": "PoLine.Amount", "alias": "Total"}] fn: SUM COUNT COUNT_DISTINCT AVG MIN MAX filters: ["PoHeader.OrderDate >= @Start", "Vendor.Country = 'US'"] (ANDed; use @params for values) order_by: ["Total DESC"] top: 50 join_type: INNER | LEFT
| Name | Type | Req | Description |
|---|---|---|---|
| aggregates | – | – | – |
| columns | – | – | – |
| connection | string | – | – |
| distinct | boolean | – | – |
| filters | – | – | – |
| join_type | string | – | – |
| order_by | – | – | – |
| tables | array | yes | – |
| top | – | – | – |
No output schema declared.
No examples provided.
build_view ~77
Generate a CREATE OR ALTER VIEW script (TEXT ONLY -- never executed here) from a SELECT or a library query. Refuses what a view cannot contain: parameters, DECLARE, ORDER BY without TOP.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| name | string | yes | – |
| query | string | – | – |
| sql | string | – | – |
No output schema declared.
No examples provided.
delete_query ~45
Remove a query from the library. Its text is kept in a snapshot, so restore_snapshot brings it back.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| query | string | yes | – |
No output schema declared.
No examples provided.
describe_table ~63
Columns (type, nullability, identity/computed), primary key, indexes, foreign keys in both directions and row count of one table or view. Always do this before writing SQL against a table.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| table | string | yes | – |
No output schema declared.
No examples provided.
explain_query ~92
Estimated execution plan, summarised: the expensive operators, scans on big tables, key lookups, sorts, implicit conversions, optimizer warnings and missing-index suggestions. The query is compiled, NOT executed, so this is safe on heavy queries. (SQL Server login needs the SHOWPLAN permission.)
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| params | – | – | – |
| query | string | – | – |
| sql | string | – | – |
No output schema declared.
No examples provided.
extract_parameter ~95
Turn a hard-coded value in a saved query into a parameter: every occurrence of the literal ('2026-01-01', 100) becomes @param, and a '-- param:' header line is added with the old value as its default.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| dry_run | boolean | – | – |
| literal | string | yes | – |
| param | string | yes | – |
| query | string | yes | – |
No output schema declared.
No examples provided.
find_join_path ~54
How two tables relate: the shortest chain of declared foreign keys between them, as ready-to-use JOIN lines.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| from_table | string | yes | – |
| to_table | string | yes | – |
No output schema declared.
No examples provided.
find_usage ~56
Impact analysis: which saved queries read a given table/view (and optionally a given column of it). Ask this before a table or column is changed, renamed or retired.
| Name | Type | Req | Description |
|---|---|---|---|
| column | string | – | – |
| table | string | yes | – |
No output schema declared.
No examples provided.
format_sql ~62
Pretty-print T-SQL in one canonical style. Normalises cosmetics (adds AS to aliases, rewrites '[x] = expr' aliases to 'expr AS [x]'); meaning is unchanged. Comments inside expressions may move.
| Name | Type | Req | Description |
|---|---|---|---|
| sql | string | yes | – |
No output schema declared.
No examples provided.
get_query ~36
One saved query: header fields, parameters, the SQL, what tables it touches, and lint findings.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | – |
No output schema declared.
No examples provided.
lint_library ~49
Lint every saved query (against each query's cached connection schema when available). Catches queries broken by a schema change: run it after refresh_schema.
| Name | Type | Req | Description |
|---|---|---|---|
| min_severity | string | – | – |
No output schema declared.
No examples provided.
lint_sql ~89
Check a query for correctness traps (NOT IN + NULLs, LEFT JOIN turned INNER by WHERE, join without ON, TOP without ORDER BY), performance problems (functions on filtered columns, SELECT *, NOLOCK, leading-wildcard LIKE) and style. With a connection whose schema is cached, also verifies every table and column exists.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| sql | string | yes | – |
No output schema declared.
No examples provided.
list_connections ~41
List the configured database connections (from sqlglass.toml), which is the default, where the query library lives, and whether each connection has a cached schema.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_queries ~49
Browse the saved-query library. 'search' matches id, name, description and the SQL text; 'tag' filters by tag.
| Name | Type | Req | Description |
|---|---|---|---|
| search | string | – | – |
| tag | string | – | – |
No output schema declared.
No examples provided.
list_snapshots ~22
Before-images taken automatically ahead of every library write, newest first.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_tables ~68
List tables and views with row counts and descriptions. Filter by schema name and/or a name pattern ('*invoice*'). For a big database prefer search_schema.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| limit | integer | – | – |
| pattern | string | – | – |
| schema | string | – | – |
No output schema declared.
No examples provided.
preview_write ~197
Dry-run a write WITHOUT writing: converts one UPDATE / DELETE / INSERT into the read-only SELECT that shows what it would do, plus a COUNT(*) of affected rows. The write statement itself is never sent to the database. UPDATE -> key columns + each SET column as '[col (current)]' / '[col (new)]' (changed_only=true hides no-op rows) DELETE -> the rows that would be removed (and which child tables reference them) INSERT -> the rows that would be added, under the target's column names run=true also executes the preview (read-only, row-capped) and returns the affected-row count and first rows. This server cannot apply the write; hand the reviewed statement to the user to run themselves.
| Name | Type | Req | Description |
|---|---|---|---|
| changed_only | boolean | – | – |
| connection | string | – | – |
| params | – | – | – |
| run | boolean | – | – |
| sql | string | yes | – |
No output schema declared.
No examples provided.
profile_table ~73
Per-column row count, NULLs, distinct values, min and max, in one aggregate query. Use it to learn a column's grain and range before filtering or joining on it. Up to 15 columns per call.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | – | – | – |
| connection | string | – | – |
| table | string | yes | – |
No output schema declared.
No examples provided.
refresh_schema ~55
Re-read tables, views, columns, keys, indexes and foreign keys from the database into the local cache. Run this when a table or column seems to be missing, or after the database changed.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
No output schema declared.
No examples provided.
rename_in_library ~139
Follow a database rename through every saved query, token-aware (strings and comments untouched). kind='table': old='dbo.Vendor', new='dbo.Supplier' kind='column': table='dbo.Vendor', old='Name', new='VendorName' (alias-qualified references, and bare ones in single-table queries; ambiguous bare references are reported, not changed). dry_run defaults to TRUE: review the diff, then call again with dry_run=false.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| kind | string | yes | – |
| new | string | yes | – |
| old | string | yes | – |
| table | string | – | – |
No output schema declared.
No examples provided.
restore_snapshot ~62
Put the queries in a snapshot back to how they were before that write ('latest' = undo the last write). The restore is itself snapshotted, so it can be undone too.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| snapshot_id | string | – | – |
No output schema declared.
No examples provided.
run_query ~132
Run a read-only query and return the first rows. Give either inline 'sql' or a library 'query' (id or name). params: {"@Start": "2026-01-01"}; library queries fall back to their header defaults. Anything but SELECT/WITH is refused before reaching the database. Rows are capped at the connection's max_rows (lower it with max_rows=); to look at big data, aggregate in SQL.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| max_rows | – | – | – |
| params | – | – | – |
| query | string | – | – |
| sql | string | – | – |
No output schema declared.
No examples provided.
sample_table ~52
A few rows of a table or view, to see what the values actually look like.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | – | – | – |
| connection | string | – | – |
| rows | integer | – | – |
| table | string | yes | – |
No output schema declared.
No examples provided.
save_query ~223
Save a query to the library as <id>.sql (id may contain folders: 'purchasing/open-pos-by-vendor'). sql is the body only -- do not DECLARE the parameters in it; describe them in params: [{"name": "@Start", "type": "date", "default": "'2026-01-01'", "description": "first order date"}] Updating an existing query needs overwrite=true; header fields left empty keep their current value. kind='script' stores DDL text from build_create_table / build_procedure / build_view (e.g. id 'ddl/usp_open_pos'): kept and versioned with the queries, but never linted as a query and never executed.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| description | string | – | – |
| dry_run | boolean | – | – |
| id | string | yes | – |
| kind | string | – | – |
| name | string | – | – |
| overwrite | boolean | – | – |
| params | – | – | – |
| sql | string | yes | – |
| tags | – | – | – |
No output schema declared.
No examples provided.
search_schema ~58
Find tables and columns whose name contains the text (or matches a * ? wildcard pattern), plus tables whose description mentions it. The way to locate data in an unfamiliar database.
| Name | Type | Req | Description |
|---|---|---|---|
| connection | string | – | – |
| pattern | string | yes | – |
No output schema declared.
No examples provided.
translate_sql ~90
Translate a query between dialects (tsql, postgres, mysql, sqlite, snowflake, bigquery, databricks, oracle, duckdb, redshift): TOP<->LIMIT, ISNULL/COALESCE, GETDATE, DATEADD, string functions, quoting.
| Name | Type | Req | Description |
|---|---|---|---|
| from_dialect | string | – | – |
| sql | string | yes | – |
| to_dialect | string | yes | – |
No output schema declared.
No examples provided.
What is the sqlglass MCP server?
sqlglass is an MCP server listed in the public MCP registry as io.github.S-CurveLabs/sqlglass. SQL Server / Azure SQL for agents: real schema, lint, read-only runs, plans, write previews. This page covers its PyPI package (sqlglass).
Is the sqlglass MCP server safe to use?
sqlglass scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the sqlglass MCP server expose?
sqlglass exposes 29 tools: list_connections, refresh_schema, list_tables, describe_table, search_schema, and 24 more. Their descriptions and schemas cost roughly 2,706 tokens of context every time the server is loaded.
Is the sqlglass MCP server still maintained?
sqlglass is still listed as active in the MCP registry. We last reached this channel on 23 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.