linkit-sql
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkit-sqlshow me the first 10 rows from the users table in staging"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
linkit-dev-sql-mcp
MCP server for read-only SQL Server queries across LinkIt environments:
internal / staging / uat / preprod / prod / au.
Same UX as teamwork-mcp: connections are stored in the OS keychain
(or an AES-256-GCM encrypted file), so MCP client config files never contain secrets.
The first tool call without a configured env opens a local setup page where you
enter host + database + user + password per env (each connection is tested before saving).
Features
MCP server over stdio
Read-only by construction: only single
SELECT/WITH...SELECTstatements pass validation —INSERT/UPDATE/DELETE/MERGE, DDL, andEXECare blocked (inspect procedures withexplore/procedure_infoinstead of executing them). Still, prefer adb_datareaderlogin for defense in depth.Multi-env: every tool takes an explicit
envparam — there is no default, soprodis only touched when you sayenv="prod".Smart result guard:
maxRows(default 50, max 500), server-sideSET ROWCOUNTcap when your query has noTOP/OFFSET, long-text cell trimming, ~120 KB response byte-cap,truncatedflag + hints, opt-incountTotal.Catalog discovery for huge DBs: all
exploreactions are paginated (page/pageSize, max 100) withLIKEsearch — never dumps the whole catalog.Setup page + CLI (
auth/status/test/logout), CI overrides via env vars.
Related MCP server: MSSQL MCP Server
Install as a Claude Code / Cowork plugin (easiest, no config editing)
claude plugin marketplace add sondv5/linkit-dev-sql-mcp
claude plugin install linkit-sql@linkit-dev-sql-mcpThe first time anyone calls a SQL tool for an unconfigured env, the guided setup page opens automatically for them to enter their own per-env connections (stored locally in their OS keychain) — nothing to configure by hand.
Install / Run
npx -y linkit-dev-sql-mcp@latestThe first time you call any tool for an env with no connection, the server will:
Open your browser to a local setup page (
http://127.0.0.1:<port>/setup/<nonce>)You enter host + port + database + user + password for that env → the server tests the connection, then saves it
Retry the tool you just called — everything works, no restart needed
For local development:
npm install
npm run build
node dist/bin.jsA CLI is also available for terminal users:
npx -y linkit-dev-sql-mcp@latest auth # pick envs, enter connections, test and save
npx -y linkit-dev-sql-mcp@latest status # show configured envs
npx -y linkit-dev-sql-mcp@latest test # test connectivity (or: test prod)
npx -y linkit-dev-sql-mcp@latest logout # remove all stored connectionsMCP Client Config
{
"mcpServers": {
"linkit-sql": {
"command": "npx",
"args": ["-y", "linkit-dev-sql-mcp@latest"]
}
}
}Ready-made templates are included in this repository:
.cursor/mcp.json
.mcp.json
.codex/config.toml
opencode.json(See teamwork-mcp README for per-client instructions — same pattern, server name linkit-sql.)
Tools (3 grouped tools, action-dispatched)
Tool | Type | Actions (via |
| read |
|
| read |
|
| local |
|
Typical flow for a big unknown DB:
explore/list_databases(orsystem/statusto see what's configured)explore/search_objectswith a keyword, orexplore/list_tableswithsearchexplore/table_infofor the shortlistquery/selectwith a filteredSELECT ... WHERE ...and smallmaxRows
Environment Variables (optional, for CI)
Per-env overrides (they win over stored connections):
LINKIT_SQL_<ENV>_HOST / _PORT / _DB / _USER / _PASSWORD / _ENCRYPT / _TRUST_CERTENV is one of INTERNAL, STAGING, UAT, PREPROD, PROD, AU.
Note: env vars are plaintext — prefer the keychain for interactive use.
Security
The server is read-only at the SQL-text layer, but SQL Server cannot enforce that by itself — always connect with a read-only login (
db_datareader, nodb_owner/db_ddladmin), especially forprod.EXEC/sp_executesql/SELECT...INTOare blocked, so stored procedures can be inspected but not executed through this server.envis required on every tool — there is no implicit default env, so an agent cannot "accidentally" query prod while meaning staging.Never pass credentials via
argsinmcp.json(visible in process lists).The server only logs to stderr; stdout is reserved for JSON-RPC.
Dev
npm install
npm run build # tsc -> dist/
npm run dev # watch mode
node dist/bin.js --helpLicense
MIT
Available Tools
3 toolsexploreLinkIt SQL: exploreARead-only
Discover database objects with paginated, capped results (safe for catalogs with thousands of tables/procs): list_databases, list_tables, table_info (columns/keys/FKs/rowcount), list_views, list_procedures, procedure_info (params + definition), list_functions, function_info, search_objects.
| Name | Required | Description | Default |
|---|---|---|---|
| env | Yes | Target env: internal | staging | uat | preprod | prod | au (always explicit, no default) | |
| page | No | Page number (default 1) | |
| table | No | Table/view name (table_info) | |
| types | No | Object types to include (search_objects, default all) | |
| action | Yes | Discovery action | |
| schema | No | Schema filter, e.g. dbo (default: all schemas) | |
| search | No | Case-insensitive name filter (LIKE %...%) | |
| routine | No | Procedure/function name (procedure_info/function_info) | |
| database | No | Override the env default database | |
| pageSize | No | Rows per page (default 20, max 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description does not need to restate it. The description adds valuable context: paginated, capped results safe for large catalogs, and details per action (e.g., table_info returns columns/keys/FKs/rowcount). This goes beyond the annotation without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the main purpose front-loaded, followed by a compact list of all actions. No redundant words; the structure efficiently communicates scope and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all actions and key behavioral traits (pagination, capping), but it does not explicitly address usage guidelines or explain pagination parameters (page, pageSize), though those are in the schema. For a discovery tool with this complexity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description does not add parameter-specific semantics beyond the schema; it only provides high-level action context. Baseline 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool discovers database objects and enumerates all nine actions (list_databases, list_tables, etc.). It is specific and easily distinguishes itself from query and system, which are for executing queries and system info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for discovery but does not explicitly state when to use it over siblings (query, system) or when not to use it. No alternatives or exclusions are mentioned, leaving the agent to infer from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryLinkIt SQL: queryARead-only
Run a READ-ONLY SELECT/WITH query against a LinkIt SQL Server env. INSERT/UPDATE/DELETE/DDL/EXEC are blocked. Results are auto-capped (maxRows default 50, max 500) with truncation hints; set countTotal for COUNT(*).
| Name | Required | Description | Default |
|---|---|---|---|
| env | Yes | Target env: internal | staging | uat | preprod | prod | au (always explicit, no default) | |
| sql | Yes | Single SELECT or WITH...SELECT statement | |
| action | No | select | select |
| maxRows | No | Max rows returned (default 50, max 500) | |
| database | No | Override the env default database | |
| trimChars | No | Trim long text cells at N chars (default 500) | |
| countTotal | No | Also run COUNT(*) over the query (default false; can be slow on huge scans) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint: true, and the description reinforces this. It adds meaningful behavioral details beyond annotations: results are auto-capped with maxRows default 50 and max 500, truncation hints are provided, and countTotal triggers an additional COUNT(*) that may be slow. This gives the agent practical expectations for execution without contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely compact: two sentences. The first sentence states purpose and restrictions, the second covers row caps and countTotal. Every clause earns its place, and the most critical information (read-only, query type) is front-loaded. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and no output schema, the description provides sufficient execution context: allowed query forms, blocked operations, row limits, truncation hints, and an optional slow-mode flag. It does not describe error behavior or the exact output format, but the readOnlyHint and implicit SELECT semantics cover the main risks. Answers what an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all 7 parameters, including defaults and bounds for maxRows and countTotal. The description adds marginal value by mentioning 'truncation hints' and the behavior of countTotal on huge scans, but this does not substantially exceed what the schema already states. Baseline 3 is appropriate given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Run a READ-ONLY SELECT/WITH query against a LinkIt SQL Server env' – a specific verb, resource, and query type. It names the blocked statement types, which further clarifies the tool's exact scope. This clearly distinguishes it from the sibling tools 'system' and 'explore' without needing to reference them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the read-only intent explicit and states that INSERT/UPDATE/DELETE/DDL/EXEC are blocked, which tells the agent when not to use the tool. However, it does not name sibling alternatives or state explicit conditions for choosing this tool over 'explore' or 'system'. The usage context is implied rather than directly contrasted with other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
systemLinkIt SQL: systemARead-only
Local connections: which envs are configured (status), test connectivity per env (test), remove all stored connections (logout).
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Limit test to one env (test) | |
| action | Yes | status | test | logout |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly says logout will 'remove all stored connections', which is a destructive mutation of stored state. The annotations mark the tool with readOnlyHint: true, implying no state changes. This is a direct contradiction, so behavioral transparency must be 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence packs the domain ('Local connections'), all three actions, and their effects without wasted words. The core resource is front-loaded, making the tool's scope immediately obvious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all actions and parameters adequately, but there is no output schema, and the description does not explain what status or test return. More importantly, it leaves the destructive logout contradicting the readOnlyHint annotation, which is a significant completeness gap for an agent relying on the definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers both parameters with descriptions, but the tool description adds functional meaning beyond the bare enum values, mapping each action to its real-world effect (status → configured envs, test → connectivity, logout → removal). This enriches the schema's terse descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies distinct actions (status, test, logout) on the resource 'local connections', giving each a clear purpose. This clearly distinguishes the tool from siblings query and explore, which are about data access rather than connection management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each action does, implying when the tool would be used (e.g., check configured envs, test connectivity, clear stored connections). However, it does not explicitly mention alternatives or state when not to use this tool, leaving usage guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
explore - First observed
query - First observed
system
TDQS
Scored across 3 tools
The three tools have clearly distinct purposes: query executes SQL, explore discovers schema/metadata, and system manages connections. There is no overlap in their core functions, so an agent can easily select the right tool.
Tool names are all single-word, lowercase, which is consistent in style. However, 'query' and 'explore' are verbs while 'system' is a noun, creating a minor deviation from a uniform verb-based pattern.
With only three tools, the server is well-scoped for its purpose. Each tool covers a broad but necessary area—querying, exploration, and system management—without unnecessary bloat or missing essentials.
For a read-only SQL server, the tool surface is complete: query handles data retrieval, explore provides full schema discovery (databases, tables, views, procedures, functions), and system manages connectivity. No obvious gaps exist within the stated domain.
Maintenance
Related MCP Connectors
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Generate, fix, explain and run read-only SQL on PostgreSQL, MySQL and SQL Server
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables secure database operations on SQL Server instances through a three-tier safety system, supporting schema exploration, query execution, performance analysis, and data export with configurable security levels from read-only to full development access.1677 npm6MIT
- AlicenseNot gradedqualityCmaintenanceProvides read-only access to Microsoft SQL Server databases using Windows Authentication, enabling AI assistants to safely explore schemas and query data with built-in security controls.31 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Microsoft SQL Server databases through T-SQL query execution, table exploration, and schema inspection. Supports configurable write protection and row limiting for safe database operations.3,162 npmMIT
- FlicenseNot gradedqualityDmaintenanceProvides secure, read-only access to Microsoft SQL Server with multi-layer protection, enabling safe query execution, schema discovery, and SQL script analysis through natural language.1-