Ai-skills mssql

Execute read-only SQL queries against multiple Microsoft SQL Server databases. Use when: (1) querying MSSQL/SQL Server databases, (2) exploring database schemas/tables, (3) running SELECT queries for data analysis, (4) checking database contents. Supports multiple database connections with descriptions for intelligent auto-selection. Blocks all write operations (INSERT, UPDATE, DELETE, DROP, etc.) for safety.

install
source · Clone the upstream repo
git clone https://github.com/sanjay3290/ai-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sanjay3290/ai-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/mssql" ~/.claude/skills/sanjay3290-ai-skills-mssql && rm -rf "$T"
manifest: skills/mssql/SKILL.md
source content

MSSQL Read-Only Query Skill

Execute safe, read-only queries against configured Microsoft SQL Server databases.

Requirements

  • Python 3.8+
  • pymssql:
    pip install -r requirements.txt

Setup

Create

connections.json
in the skill directory or
~/.config/claude/mssql-connections.json
.

Security: Set file permissions to

600
since it contains credentials:

chmod 600 connections.json
{
  "databases": [
    {
      "name": "production",
      "description": "Main app database - users, orders, transactions",
      "host": "db.example.com",
      "port": 1433,
      "database": "app_prod",
      "user": "readonly_user",
      "password": "your-password",
      "encrypt": true,
      "tds_version": "7.3"
    }
  ]
}

Config Fields

FieldRequiredDescription
nameYesIdentifier for the database (case-insensitive)
descriptionYesWhat data this database contains (used for auto-selection)
hostYesDatabase hostname
portNoPort number (default: 1433)
databaseYesDatabase name
userYesUsername
passwordYesPassword
encryptNoEnable TLS encryption (default: false)
tds_versionNoTDS protocol version: 7.0, 7.1, 7.2, 7.3, 7.4 (default: auto)

Usage

List configured databases

python3 scripts/query.py --list

Query a database

python3 scripts/query.py --db production --query "SELECT TOP 10 * FROM users"

List tables

python3 scripts/query.py --db production --tables

Show schema

python3 scripts/query.py --db production --schema

Limit results

python3 scripts/query.py --db production --query "SELECT * FROM orders" --limit 100

Note: MSSQL uses

TOP N
instead of
LIMIT
. The
--limit
flag automatically inserts
TOP N
after SELECT.

Database Selection

Match user intent to database

description
:

User asks aboutLook for description containing
users, accountsusers, accounts, customers
orders, salesorders, transactions, sales
analytics, metricsanalytics, metrics, reports
logs, eventslogs, events, audit

If unclear, run

--list
and ask user which database.

Safety Features

  • Read-only enforcement: Query validation blocks write operations (use a
    db_datareader
    role user for server-side protection)
  • Query validation: Only SELECT, SHOW, EXPLAIN, WITH, SP_HELP queries allowed
  • Single statement: Multiple statements per query rejected
  • TLS support: Configurable encryption for secure connections
  • Query timeout: 30-second timeout enforced via pymssql
  • Connection timeout: 10-second login timeout
  • Memory protection: Max 10,000 rows per query to prevent OOM
  • Column width cap: 100 char max per column for readable output
  • Credential sanitization: Error messages don't leak passwords

Troubleshooting

ErrorSolution
Config not foundCreate
connections.json
in skill directory
Authentication failedCheck username/password in config
Connection timeoutVerify host/port, check firewall/VPN
TDS version errorTry
"tds_version": "7.3"
or
"7.4"
Encryption errorSet
"encrypt": true
for Azure SQL
Permission warningRun
chmod 600 connections.json

Exit Codes

  • 0: Success
  • 1: Error (config missing, auth failed, invalid query, database error)

Workflow

  1. Run
    --list
    to show available databases
  2. Match user intent to database description
  3. Run
    --tables
    or
    --schema
    to explore structure
  4. Execute query with appropriate
    --limit
    (auto-converts to TOP N)