thinair avatar

Data

co.thinair/data

A hosted MCP that gives Claude read-only access to PostgreSQL, MySQL, and SQL Server databases through 23 dialect-aware tools. You point it at your connection strings and get natural language access to query_sql, describe_schema, analyze_table, and cross_db_query without writing SQL yourself. Free tier covers discovery and profiling, paid tiers add query optimization, PII scanning, and cross-database joins. Every connection is protocol-level read-only with a static SQL firewall that blocks writes at the wire level. Nothing is stored except anonymized metrics. Setup is one URL in your MCP config, then browser-based OAuth on first use. Useful when you want to ask questions across multiple databases without context switching between pgAdmin and SSMS.

tools
23
auth
Secret needed
transport
HTTP
last updated
Oct 6, 2026

Tools

23 tools

Public tool metadata for what this MCP can expose to an agent.

query_sqlExecute a read-only SQL query against the target connection. ONLY SELECT / WITH / EXPLAIN permitted. Write dialect-appropriate SQL for the connection's engine — use PostgreSQL syntax for postgres connections (`SELECT NOW()`, `LIMIT`, `ILIKE`), T-SQL for mssql (`SELECT GETDATE(...3 params

Execute a read-only SQL query against the target connection. ONLY SELECT / WITH / EXPLAIN permitted. Write dialect-appropriate SQL for the connection's engine — use PostgreSQL syntax for postgres connections (`SELECT NOW()`, `LIMIT`, `ILIKE`), T-SQL for mssql (`SELECT GETDATE(...

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
limitnumber
Max rows to return (default 100, max 1000)
querystring
SQL SELECT query to execute
describe_schemaDiscover the full database schema: tables, columns, types, primary keys, foreign keys, and indexes. Results cached 1 hour. Call with refresh=true after schema changes.2 params

Discover the full database schema: tables, columns, types, primary keys, foreign keys, and indexes. Results cached 1 hour. Call with refresh=true after schema changes.

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
refreshboolean
Force live introspection, bypassing cache
analyze_tableQUICK statistical snapshot for ONE table — row count, null rates, cardinality, numeric min/max/avg, date ranges. Optionally drill into a specific column. Use this for a fast at-a-glance read. Use `data_profile` instead when the user wants a FULL quality report including PII de...3 params

QUICK statistical snapshot for ONE table — row count, null rates, cardinality, numeric min/max/avg, date ranges. Optionally drill into a specific column. Use this for a fast at-a-glance read. Use `data_profile` instead when the user wants a FULL quality report including PII de...

Parameters* required
columnstring
Specific column to deep-analyze
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
tablestring
Table name to analyze
detect_anomaliesScan a table for unusual patterns: volume drops/spikes, data gaps, value concentration, high null rates, stale data. Severity-ranked alerts. Tables > 100k rows use a sampled path (~5%) — when a finding has `sampled:true`, surface it to the user with a hedge like 'based on a ~5...3 params

Scan a table for unusual patterns: volume drops/spikes, data gaps, value concentration, high null rates, stale data. Severity-ranked alerts. Tables > 100k rows use a sampled path (~5%) — when a finding has `sampled:true`, surface it to the user with a hedge like 'based on a ~5...

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
date_columnstring
Date column for trend analysis (auto-detected if omitted)
tablestring
Table to scan for anomalies
suggest_queriesGenerate schema-aware query suggestions with ready-to-run SQL. Great for exploring unfamiliar databases or finding useful queries.2 params

Generate schema-aware query suggestions with ready-to-run SQL. Great for exploring unfamiliar databases or finding useful queries.

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
contextstring
Topic or goal to focus suggestions
test_connectionPing a connection (SELECT 1) and return server version + latency. Fast way to confirm credentials and network path without running describe_schema.1 params

Ping a connection (SELECT 1) and return server version + latency. Fast way to confirm credentials and network path without running describe_schema.

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
list_connectionsList every database connection registered for your tenant: name, id, dbType (postgres / mysql / mssql), createdAt. Flags duplicate names — only the first-added connection of a duplicate name is reachable by name. Returns nothing sensitive (no DSN, no credentials).

List every database connection registered for your tenant: name, id, dbType (postgres / mysql / mssql), createdAt. Flags duplicate names — only the first-added connection of a duplicate name is reachable by name. Returns nothing sensitive (no DSN, no credentials).

No parameter schema in public metadata yet.

quotaCheck current API usage, daily limit, plan name, and upgrade options.

Check current API usage, daily limit, plan name, and upgrade options.

No parameter schema in public metadata yet.

issue_api_keyIssue a fresh ta_data_* API key for your current tenant. Useful for pasting into /add-database or configuring a separate integration. The new key is tied to your existing plan tier. Rate-limited to 5 issuances per tenant per day.

Issue a fresh ta_data_* API key for your current tenant. Useful for pasting into /add-database or configuring a separate integration. The new key is tied to your existing plan tier. Rate-limited to 5 issuances per tenant per day.

No parameter schema in public metadata yet.

explain_queryAnalyze a SQL query's execution plan and return plain-English performance recommendations. Runs EXPLAIN ANALYZE (Postgres) or EXPLAIN FORMAT=JSON (MySQL). [BUILD tier]2 params

Analyze a SQL query's execution plan and return plain-English performance recommendations. Runs EXPLAIN ANALYZE (Postgres) or EXPLAIN FORMAT=JSON (MySQL). [BUILD tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
sqlstring
The SELECT query to analyze
optimize_querySuggest a rewritten, optimized version of a SQL query with explanations. Identifies sequential scans, missing indexes, sort spills, join inefficiencies, and suggests index DDL. [BUILD tier]2 params

Suggest a rewritten, optimized version of a SQL query with explanations. Identifies sequential scans, missing indexes, sort spills, join inefficiencies, and suggests index DDL. [BUILD tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
querystring
SQL query to optimize
data_profileFULL data quality + compliance report for a table: per-column stats PLUS a 0-100 health score, type-gated PII detection (email / phone / SSN / etc.), and insight warnings. Slower than `analyze_table` but returns everything needed to audit a table for ownership / compliance / o...2 params

FULL data quality + compliance report for a table: per-column stats PLUS a 0-100 health score, type-gated PII detection (email / phone / SSN / etc.), and insight warnings. Slower than `analyze_table` but returns everything needed to audit a table for ownership / compliance / o...

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
tablestring
Table to profile
query_historyReturn recent queries executed through ThinAir with timing, row counts, and status. [BUILD tier]2 params

Return recent queries executed through ThinAir with timing, row counts, and status. [BUILD tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
limitnumber
Number of recent queries (default 20, max 100)
saved_queriesManage your personal library of reusable SELECT queries. action=save stores a query by name; action=run executes a saved query; action=list returns all your saved queries; action=delete removes one. [BUILD tier]8 params

Manage your personal library of reusable SELECT queries. action=save stores a query by name; action=run executes a saved query; action=list returns all your saved queries; action=delete removes one. [BUILD tier]

Parameters* required
actionstring
save | run | list | deleteone of save · run · list · delete
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
descriptionstring
Freeform description (action=save)
idstring
Query ID (alternative to name for run/delete)
namestring
Query name (save/run/delete)
sqlstring
SQL to store (required for action=save)
tagstring
Filter by tag (action=list)
tagsarray
Tags (action=save)
generate_migrationGenerate dialect-correct ALTER TABLE migration SQL + rollback from a plain-English intent. Output uses the connection's exact dialect (ALTER TABLE for all three, plus pg-specific `USING` casts / mssql-specific `sp_rename` / mysql-specific `MODIFY COLUMN`). Never executes. Chec...2 params

Generate dialect-correct ALTER TABLE migration SQL + rollback from a plain-English intent. Output uses the connection's exact dialect (ALTER TABLE for all three, plus pg-specific `USING` casts / mssql-specific `sp_rename` / mysql-specific `MODIFY COLUMN`). Never executes. Chec...

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
intentstring
Plain English: 'add soft delete to users', 'add index on trips.driver_id'
generate_seed_dataGenerate realistic, schema-aware INSERT statements for development and testing. Respects types, constraints, and FK relationships. Never executes. [BUILD tier]4 params

Generate realistic, schema-aware INSERT statements for development and testing. Respects types, constraints, and FK relationships. Never executes. [BUILD tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
formatstring
Output format (default sql)one of sql · csv
row_countnumber
Number of rows (default 100, max 1000)
tablestring
Table to generate seed data for
show_locksList active sessions + blocking locks. Uses the dialect's own system view — `pg_stat_activity` on postgres, `information_schema.processlist` on mysql, `sys.dm_exec_requests` joined with `sys.dm_tran_locks` on mssql. No dialect arg needed — inferred from the connection. **Requi...1 params

List active sessions + blocking locks. Uses the dialect's own system view — `pg_stat_activity` on postgres, `information_schema.processlist` on mysql, `sys.dm_exec_requests` joined with `sys.dm_tran_locks` on mssql. No dialect arg needed — inferred from the connection. **Requi...

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
pii_scanSweep string columns across tables for common PII patterns (email, SSN, credit card, phone, JWT, bearer tokens). Heuristic-only — not a compliance guarantee. [BUILD tier]3 params

Sweep string columns across tables for common PII patterns (email, SSN, credit card, phone, JWT, bearer tokens). Heuristic-only — not a compliance guarantee. [BUILD tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
max_tablesnumber
Max tables to sample (default 25, cap 50)
sample_rowsnumber
Rows sampled per table (default 20, cap 100)
watch_tableMonitor a table's row count and latest record. Compares to previous snapshot to show changes. Built-in scheduler. [ARCHITECT tier]4 params

Monitor a table's row count and latest record. Compares to previous snapshot to show changes. Built-in scheduler. [ARCHITECT tier]

Parameters* required
columnstring
Date column to track latest
conditionstring
What to watch: 'new rows', 'row count drops'
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
tablestring
Table to monitor
find_n_plus_oneDetect N+1 query patterns from recent query history. Fingerprints queries and flags repeated patterns. [ARCHITECT tier]2 params

Detect N+1 query patterns from recent query history. Fingerprints queries and flags repeated patterns. [ARCHITECT tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
min_executionsnumber
Minimum executions to flag (default 5)
query_firewallManage per-connection SQL rules: block dangerous patterns, require WHERE on large tables, log PII access. [ARCHITECT tier]7 params

Manage per-connection SQL rules: block dangerous patterns, require WHERE on large tables, log PII access. [ARCHITECT tier]

Parameters* required
actionstring
What to doone of add_rule · remove_rule · list_rules · test_query
block_actionstring
Action when matched (default block)one of block · warn · log
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
messagestring
Message shown when rule triggers
patternstring
Regex pattern to match
rule_namestring
Rule name
sqlstring
SQL to test against rules
impact_analysisAnalyze the blast radius of a proposed schema change: FK dependencies, affected views, row count, risk score. [ARCHITECT tier]2 params

Analyze the blast radius of a proposed schema change: FK dependencies, affected views, row count, risk score. [ARCHITECT tier]

Parameters* required
connectionstring
Target connection name from this tenant's inventory. Call `list_connections` to see every name + dialect, then match semantically to the user's intent (e.g. 'analytics' → a connection named `*-anal...
intentstring
Describe the change: 'rename customer_id to account_id', 'drop column X'
cross_db_query⚠️ SQL MUST BE VALID IN EVERY DIALECT YOU TARGET — stick to ANSI-ish SELECT syntax when mixing pg/mysql/mssql. `SELECT TOP 10` (mssql) or `LIMIT` (others) will fail on the wrong side. Run the same query across 2-4 connections in parallel; returns per-connection rows + errors f...2 params

⚠️ SQL MUST BE VALID IN EVERY DIALECT YOU TARGET — stick to ANSI-ish SELECT syntax when mixing pg/mysql/mssql. `SELECT TOP 10` (mssql) or `LIMIT` (others) will fail on the wrong side. Run the same query across 2-4 connections in parallel; returns per-connection rows + errors f...

Parameters* required
connectionsarray
Array of 2-4 connection NAMES (not IDs) from list_connections output. Examples: ['mssql-reporting-us', 'mssql-reporting-eu'] for regional compare, ['prod-postgres-fleet', 'prod-mysql-app'] for cros...
sqlstring
SQL query to run on each connection. Must be valid in every dialect targeted — prefer ANSI SELECT syntax when mixing dialects.

Sponsors

Details

Website
data.thinair.co
Categories
Databases, Data & Analytics
Transport
HTTP
Auth
Required
Registry
MCP registry, active

More from thinair

Related Databases MCP servers

View all
1shyamolkonwar avatarRivtorshyamolkonwar/rivtor-cliDeploy full-stack apps (frontend, backend, Postgres, Redis) from your agent and get live URLs.0stars
2daedalus avatarMcp Psycopg2daedalus/mcp-psycopg2MCP server exposing psycopg2 PostgreSQL database adapter functionality0stars
3mironovisa avatardatamcp — Hosted Model Context Protocol for Databases, APIs, and Agent Memoryio.github.mironovisa/datamcpPostgreSQL, MySQL, OpenAPI/Swagger, and shared Agent Memory with scoped access.0stars
4mukundakatta avatarSqlfmt Mcpmukundakatta/mcp-stackDeterministic SQL formatting across 19 dialects (postgres, mysql, snowflake, bigquery, etc.).0stars
5optisol-business avatarDb Metadata Extractor Mcpoptisol-business/db-metadata-extractor-mcpExtract database metadata from PostgreSQL, Snowflake, SQL Server, BigQuery, and Oracle.0stars
6googleapis avatarMCP Toolbox for Databasesgoogleapis/mcp-toolboxMCP Toolbox for Databases enables your agent to connect to your database.16.9Kstars