MySQL MCP Server
MySQL MCP Server
Eine Implementierung des Model Context Protocol (MCP), die eine sichere Interaktion mit MySQL-Datenbanken ermöglicht. Diese Serverkomponente stellt die Kommunikation zwischen KI-Anwendungen (Host/Client) und einer MySQL-Datenbank her und macht die Erkundung und Analyse der Datenbank über eine kontrollierte Schnittstelle sicherer und strukturierter.
Hinweis: MySQL MCP Server unterstützt sowohl den Standard-Ein-/Ausgabe-Transport (STDIO) als auch Streamable HTTP (SSE). Für entfernte/self-hosted Bereitstellungen wird der SSE-Modus empfohlen.
Bereitstellung
Gehostet — Fronteir AI betreibt den Server für Sie, ohne lokale Konfiguration.
Lokal — Smithery installiert und startet den Server auf Ihrem eigenen Rechner.
Related MCP server: mysql-mcp-server
Funktionen
Auflisten verfügbarer MySQL-Tabellen als Ressourcen (resources)
Lesen von Tabelleninhalten
Ausführen von SQL-Abfragen mit umfassender Fehlerbehandlung
Mehrdatenbank-Modus (optional
MYSQL_DATABASE)SSE/HTTP-Transportunterstützung (
MCP_TRANSPORT=sse)SSH-Tunnel-Unterstützung
Vollständige Informationen zur Tabellenstruktur
Stichproben aus Tabellendaten
Sicherer Datenbankzugriff über Umgebungsvariablen
Umfassende Protokollierung
Installation
Manuelle Installation
pip install mysql-mcp-serverInstallation über Smithery
Verwenden Sie Smithery, um MySQL MCP Server automatisch für Claude Desktop zu installieren:
npx -y @smithery/cli install designcomputer/mysql-mcp-server --client claudeInstallation über die Claude Code CLI
claude mcp add --transport stdio designcomputer-mysql_mcp_server uvx mysql_mcp_serverInstallation über die Autohand Code CLI
autohand mcp add mysql env MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USER=your_username MYSQL_PASSWORD=your_password MYSQL_DATABASE=your_database uvx mysql_mcp_serverMit --scope project nach mcp add bleibt die Registrierung im aktuellen Arbeitsbereich erhalten. Aktuelle CLI-Details finden Sie unter Autohand Code.
Konfiguration
Legen Sie die folgenden Umgebungsvariablen fest:
MYSQL_HOST=localhost # 数据库主机
MYSQL_PORT=3306 # 可选:数据库端口(不指定时默认 3306)
MYSQL_USER=your_username
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=your_database # 可选:留空则进入多数据库模式
# 高级配置
MYSQL_SSL_MODE=DISABLED # DISABLED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY
MYSQL_CONNECT_TIMEOUT=10 # 超时时间(秒)
# 连接行为(可选)
MYSQL_SQL_MODE=TRADITIONAL # 连接所应用的 SQL mode(默认:TRADITIONAL)
# 兼容性(可选)
MYSQL_CHARSET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
MYSQL_AUTH_PLUGIN= # 例如旧版 MySQL 使用 mysql_native_password
MYSQL_USE_PURE=false # 强制使用纯 Python 连接器(默认:false)
MYSQL_RAISE_ON_WARNINGS=false # 出现 SQL 警告时抛出异常(默认:false)
# SSE 传输(可选)
MCP_TRANSPORT=stdio # stdio 或 sse
MCP_SSE_HOST=0.0.0.0 # 监听所有网卡(Docker/托管部署需要)
PORT=8000 # HTTP 端口(MCP_SSE_PORT 的回退值)
MCP_SSE_ALLOWED_HOSTS= # 逗号分隔的允许 Host 头(默认:localhost:{port},127.0.0.1:{port})
# SSH 隧道(可选)
MYSQL_SSH_ENABLE=false # 设为 true 启用
MYSQL_SSH_HOST= # SSH 跳板机
MYSQL_SSH_PORT=22 # SSH 端口
MYSQL_SSH_USER= # SSH 用户名
MYSQL_SSH_KEY_PATH= # SSH 私钥路径
MYSQL_SSH_REMOTE_HOST=localhost # 从跳板机视角看的目标主机
MYSQL_SSH_REMOTE_PORT=3306
MYSQL_LOCAL_PORT=3330Laden einer .env-Datei
Beim Start lädt der Server die .env-Datei automatisch über python-dotenv. Für die lokale Nutzung genügt:
cp .env.example .env # 然后填入你的凭据Die Datei wird aus dem Arbeitsverzeichnis des Prozesses (und dessen übergeordneten Verzeichnissen) gelesen. Wenn Sie den Server selbst im Projektverzeichnis starten, funktioniert dies einwandfrei.
⚠️ Claude Code / Claude Desktop: Diese Hosts starten den Server aus ihrem eigenen Arbeitsverzeichnis und finden die
.envim Projekt daher nicht; Sie sehen dannMissing required database configuration. Tragen Sie dieMYSQL_*-Werte in denenv-Block der MCP-Konfiguration ein (siehe „Verwendung“ unten) und verlassen Sie sich nicht auf.env.
Mehrdatenbank-Modus
Wenn MYSQL_DATABASE nicht gesetzt ist, wechselt der Server in den Mehrdatenbank-Modus:
list_resourcesgibt alle Benutzerdatenbanken zurück (Systemdatenbanken werden herausgefiltert)Verwenden Sie in SQL-Abfragen vollständig qualifizierte Tabellennamen wie
mydb.mytableHinweis: Es wird nur eine einzelne SQL-Anweisung unterstützt; Mehrfachanweisungen (z. B.
USE db; SELECT ...) sind nicht möglich.
Verwaltungsseite und Mehrdatenbank-Aliase (SSE-Modus)
Wenn Sie den Server im SSE-Modus starten, können Sie über die integrierte Verwaltungsseite mehrere Datenbankverbindungen verwalten. Für jede Verbindung lassen sich getrennte Lese-/Schreibkonten konfigurieren:
# Windows PowerShell
$env:MCP_TRANSPORT="sse"; $env:MCP_SSE_PORT="8000"; python -m mysql_mcp_server
# Linux/macOS
MCP_TRANSPORT=sse MCP_SSE_PORT=8000 python -m mysql_mcp_serverVerwaltungsseite: http://127.0.0.1:8000/admin/ (nur Loopback-Zugriff – die Verwaltungs-API und die Seite lehnen Nicht-Loopback-Clients und unbekannte Host-Header ab; nicht hinter einen Reverse-Proxy stellen).
Jeder Alias kann konfiguriert werden:
Feld | Zweck |
Verbindung (host/port/database) | Verbindungsziel. Wenn database leer bleibt, ist der Mehrdatenbank-Modus aktiv. |
Lese-Benutzer (read_user) | Für SELECT / SHOW / DESCRIBE / EXPLAIN |
Schreib-Benutzer (write_user) | Für DML/DDL nach Bestätigung |
write_policy |
|
allow_delete | Hauptschalter für DELETE / TRUNCATE / DROP (standardmäßig deaktiviert) |
Clients verbinden sich über den Alias: http://127.0.0.1:8000/sse?alias=db1
(wird alias weggelassen, wird der Standard-Alias verwendet). Wenn config/databases.json keine Einträge enthält, dienen die vorhandenen MYSQL_*-Umgebungsvariablen weiterhin als abwärtskompatibler Einzel-Datenbank-Fallback (in diesem Modus verwenden Lese- und Schreibvorgänge dasselbe Konto).
Hinweis zum Unterschied zum Mehrdatenbank-Modus oben: In jenem Modus werden mehrere Schemata über eine einzelne Verbindung exponiert; die Aliase verwalten dagegen mehrere Verbindungen, jeweils mit eigenen Konten und Schreibstrategien.
So werden Schreibvorgänge bestätigt: Der Server stuft jede Anweisung dreistufig ein (Lesen / Schreiben / Löschen). Lesevorgänge werden direkt mit dem Abfragekonto ausgeführt; Schreib- und Löschvorgänge lösen einen MCP-Elicitation-Dialog aus, der das vollständige SQL anzeigt – bei Annahme wird mit dem Schreibkonto ausgeführt, bei Ablehnung abgebrochen. Wenn der Client keine Elicitation unterstützt, entscheidet die write_policy des Alias über das Fallback-Verhalten (siehe Tabelle oben). Alle Schreibversuche werden im Audit-Log der Verwaltungsseite festgehalten (auf der Festplatte unter logs/audit.log).
Verfügbare Tools
execute_sql
Führt beliebige Standard-SQL-Abfragen aus.
Parameter:
query(String)Funktionen: Unterstützt
SELECT,SHOW,DESCRIBEund DML (INSERT,UPDATE,DELETE). DML-Operationen sind als potenziell zerstörerisch gekennzeichnet.Einschränkung: Es wird nur eine einzelne Anweisung unterstützt, keine Mehrfachanweisungen.
Datenbankübergreifend: Unabhängig von
MYSQL_DATABASEkann mit der Schreibweisedatabase.tablejede Datenbank abgefragt werden.
get_schema_info
Liefert detaillierte Metadaten zur Datenbankstruktur.
Parameter:
table_name(optionaler String)Ausgabe: Spaltennamen, Typen, NULL-Zulässigkeit, Standardwerte und Kommentare.
Datenbankübergreifend: Mit
database.tablekönnen Datenbanken außerhalb vonMYSQL_DATABASEabgefragt werden; ein Tabellenname ohne Präfix verwendet die konfigurierte Datenbank.Bezeichnerregeln: Namen dürfen nur alphanumerische Zeichen, Unterstriche und
$enthalten (ein Punkt als Trennzeichen fürdatabase.tableist erlaubt).
get_table_sample
Ruft repräsentative Datenstichproben ab.
Parameter:
table_name(String),limit(optionaler Integer, maximal 20)Zweck: Schnelles Verständnis von Datenformat und -inhalt, ohne große Ergebnismengen abrufen zu müssen.
Datenbankübergreifend: Mit
database.tablekönnen Stichproben aus Datenbanken außerhalb vonMYSQL_DATABASEgezogen werden; ein Tabellenname ohne Präfix verwendet die konfigurierte Datenbank.Bezeichnerregeln: Namen dürfen nur alphanumerische Zeichen, Unterstriche und
$enthalten (ein Punkt als Trennzeichen fürdatabase.tableist erlaubt).
Verfügbare Prompts
Neben den Tools bietet der Server auch MCP-Prompts an – geführte, mehrstufige Workflows, die der Client bei Bedarf starten kann. In Claude Code erscheinen sie als Slash-Befehle (/mcp__<server>__<prompt>); in Claude Desktop finden Sie sie im Prompt-Menü (+).
Prompt | Parameter | Beschreibung |
| (keine) | Systematische Erkundung der Datenbank: verfügbare Tabellen entdecken, Tabellenstrukturen ansehen, Daten stichprobenartig prüfen und Inhalte zusammenfassen. |
|
| Detaillierte Analyse der angegebenen Tabelle: Tabellenstruktur abrufen, Daten stichprobenartig prüfen und praktische Abfrageempfehlungen geben. Unterstützt datenbankübergreifende Abfragen mit |
Beispiel (Claude Code):
/mcp__mysql__explore_database
/mcp__mysql__analyze_table customersBeide Prompts orchestrieren die vorhandenen Tools get_schema_info und get_table_sample; explore_database nutzt zusätzlich die Ressourcenliste, um Tabellen aufzulisten.
Verwendung
Mit Claude Desktop
Fügen Sie Folgendes zur claude_desktop_config.json hinzu:
{
"mcpServers": {
"mysql": {
"command": "uv",
"args": [
"--directory",
"path/to/mysql_mcp_server",
"run",
"mysql_mcp_server"
],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "your_username",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}Detailliertere Beispiele und agentenspezifische Anleitungen finden Sie in MCP_USECASES.md.
Mit Visual Studio Code
Fügen Sie Folgendes zur mcp.json hinzu:
{
"mcpServers": {
"mysql": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"mysql-mcp-server",
"mysql_mcp_server"
],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "your_username",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}Hinweis: uv muss zuerst installiert sein.
Debuggen mit MCP Inspector
MySQL MCP Server ist nicht dafür ausgelegt, eigenständig oder direkt über die Python-Befehlszeile gestartet zu werden; Sie können ihn jedoch mit MCP Inspector debuggen.
MCP Inspector bietet eine bequeme Möglichkeit, MCP-Implementierungen zu testen und zu debuggen:
# 安装依赖
pip install -r requirements.txt
# 使用 MCP Inspector 调试(不要直接用 Python 运行)MySQL MCP Server ist für die Integration in KI-Anwendungen wie Claude Desktop konzipiert und sollte nicht als eigenständiges Python-Programm direkt ausgeführt werden.
Entwicklung
# 克隆仓库
git clone https://github.com/designcomputer/mysql_mcp_server.git
cd mysql_mcp_server
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows 上用 `venv\Scripts\activate`
# 安装开发依赖
pip install -r requirements-dev.txt
# 复制示例配置并填入你的凭据
cp .env.example .env
# 编辑 .env,填入 MySQL 连接信息
# 运行测试
pytestSicherheitshinweise
Bezeichnerprüfung: Die an
get_schema_infoundget_table_sampleübergebenen Tabellen- und Datenbanknamen werden streng per Whitelist geprüft (nur alphanumerische Zeichen, Unterstriche und$; ein Punkt als Trennzeichen fürdatabase.tableist erlaubt). Alle anderen Sonderzeichen werden abgelehnt, um SQL-Injection zu verhindern.Verschlüsselter Zugriff: Volle Unterstützung für SSL/TLS und SSH-Tunnel, um Remote-Verbindungen abzusichern.
Datenschutz in Protokollen: Passwörter und SSH-Private Keys werden in Serverprotokollen automatisch maskiert.
Minimale Rechte: Verwenden Sie stets einen dedizierten MySQL-Benutzer mit minimalen Berechtigungen.
Der SSE-Transport hat keine eingebaute Authentifizierung. Der SSE-Server bindet standardmäßig an
0.0.0.0und akzeptiert Verbindungen ohne Anmeldedaten. Wenn er außerhalb von localhost erreichbar sein soll, platzieren Sie ihn hinter einem Reverse-Proxy mit erzwungener Authentifizierung (nginx, Caddy, Traefik). Beispiel für nginx + HTTP Basic Auth:location /sse { auth_basic "MCP"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_buffering off; } location /messages/ { auth_basic "MCP"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; }Setzen Sie
MCP_SSE_HOST=127.0.0.1, damit der Server nur auf der Loopback-Adresse lauscht und der Proxy der einzige öffentliche Zugang bleibt. Setzen SieMCP_SSE_ALLOWED_HOSTSauf den vom Proxy weitergeleiteten öffentlichen Hostnamen (z. B.MCP_SSE_ALLOWED_HOSTS=myserver.example.com:443).
Eine vollständige Anleitung für den sicheren Einsatz finden Sie in SECURITY.md.
Bewährte Sicherheitspraktiken
Diese MCP-Implementierung benötigt Datenbankzugriff, um zu funktionieren. Zur Sicherheit:
Erstellen Sie einen dedizierten MySQL-Benutzer und gewähren Sie minimale Berechtigungen
Verwenden Sie niemals Root-Anmeldedaten oder Administratorkonten
Beschränken Sie den Datenbankzugriff auf die erforderlichen Vorgänge
Aktivieren Sie die Protokollierung für die Prüfung
Überprüfen Sie den Datenbankzugriff regelmäßig auf Sicherheit
Detaillierte Anweisungen finden Sie im MySQL-Sicherheitskonfigurationsleitfaden, darunter:
Erstellen eines eingeschränkten MySQL-Benutzers
Festlegen geeigneter Berechtigungen
Überwachen des Datenbankzugriffs
Bewährte Sicherheitspraktiken
⚠️ Wichtig: Befolgen Sie beim Konfigurieren des Datenbankzugriffs unbedingt das Prinzip der geringsten Rechte.
Lizenz
MIT-Lizenz – Einzelheiten finden Sie in der Datei LICENSE.
Mitwirken
Forken Sie dieses Repository
Erstellen Sie einen Feature-Branch (
git checkout -b feature/amazing-feature)Committen Sie Ihre Änderungen (
git commit -m 'Add some amazing feature')Pushen Sie den Branch (
git push origin feature/amazing-feature)Erstellen Sie einen Pull Request
Available Tools
3 toolsexecute_sqlADestructive
Execute a SQL statement against the MySQL server. Use for SELECT, DML (INSERT/UPDATE/DELETE), SHOW, DESCRIBE, and ad-hoc queries. Supports cross-database queries using database.table notation. Single statements only — use fully qualified names instead of USE statements. Write/delete statements require user confirmation: depending on the client, either a confirmation prompt appears, or the first call returns a confirm_token — show the SQL to the user, and after explicit consent re-call with the same query plus confirm_token. Use the optional alias parameter to target a different configured database within a single connection.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | 数据库别名,或管理页面 /admin 中为该库配置的项目名称(项目文件夹名)。在单个 SSE 连接内通过此参数切换不同库;省略时用连接 URL ?alias 指定的别名或默认别名。建议优先传当前项目文件夹名自动匹配对应数据库。 | |
| query | Yes | The SQL statement to execute. Single statements only. | |
| confirm_token | No | One-time confirmation token returned by a previous write attempt. Pass it with the SAME query after the user explicitly approved the SQL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as destructive, and the description substantially expands on this by detailing the confirmation workflow: a prompt appears, or a confirm_token is returned and must be re-sent with the same query after explicit user consent. It also discloses single-statement-only behavior and cross-database support, going well beyond the annotation flags.
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 dense but well-structured, front-loading the main purpose, then constraints, confirmation flow, and alias behavior. Every clause contributes essential information without redundancy, and its length is justified by the tool's complexity.
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 destructive SQL tool with no output schema, this description covers all critical operational aspects: statement types, single-statement enforcement, cross-db notation, the confirmation protocol, and alias usage. The only gap is return-format details, but that is standard SQL client behavior and not essential for correct invocation.
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 schema already covers all parameters, so the baseline is 3. The description adds meaningful semantics for confirm_token (one-time token from a prior write attempt, pass with the same query after approval) and alias (switch database within a single connection), enriching the raw schema definitions.
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 identifies the tool as executing SQL statements against a MySQL server and enumerates supported statement types (SELECT, DML, SHOW, DESCRIBE, ad-hoc queries). It is distinct from sibling inspection tools by its general-purpose scope, though it does not explicitly name or contrast 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?
It provides direct usage guidance by enumerating applicable statement types and imposing constraints: single statements only, fully qualified names instead of USE statements, and confirmation for writes/deletes. It does not explicitly discuss when to prefer sibling tools like get_schema_info, but the implied distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_infoARead-only
Get column metadata for a table or all tables in the configured database: column names, data types, nullability, default values, and comments. Call this before querying an unfamiliar table. Omit table_name to see all tables at once. Accepts bare table names (uses MYSQL_DATABASE) or database.table for cross-database lookups. Use alias to target a different configured database.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | 数据库别名,或管理页面 /admin 中为该库配置的项目名称(项目文件夹名)。在单个 SSE 连接内通过此参数切换不同库;省略时用连接 URL ?alias 指定的别名或默认别名。建议优先传当前项目文件夹名自动匹配对应数据库。 | |
| table_name | No | Optional: bare table name, or database.table for a cross-database lookup. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds behavioral context: it can return metadata for all tables when table_name is omitted, accepts database.table for cross-database lookups, and uses bare names with MYSQL_DATABASE, plus alias switching behavior. This goes beyond the annotations without contradicting them.
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 compact and front-loaded with the core purpose, then provides usage details in logical order. Every sentence contributes useful information without excessive verbosity.
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?
Given the tool's simplicity, annotations, and full schema coverage, the description is complete enough for an agent to select and invoke it. It covers scoping, naming, and alias switching. Minor gaps like return format are acceptable since no output schema exists and the tool is a read-only metadata lookup.
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 the schema documents both parameters. The description still adds meaning by explaining the semantic effects of omitting table_name, the database.table format, bare-name resolution via MYSQL_DATABASE, and alias behavior.
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 retrieves column metadata (names, data types, nullability, defaults, comments) for a table or all tables, with a specific resource and verb. It also distinguishes itself from sibling tools by positioning it as the pre-query metadata lookup.
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 explicitly says to call this before querying an unfamiliar table, explains how to list all tables, and notes cross-database usage and alias-based targeting. This provides clear contextual guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_sampleARead-only
Fetch a small sample of rows from a table to understand its data format and content. Use alongside get_schema_info before writing complex queries. Accepts bare table names (uses MYSQL_DATABASE) or database.table for cross-database lookups. Use alias to target a different configured database.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | 数据库别名,或管理页面 /admin 中为该库配置的项目名称(项目文件夹名)。在单个 SSE 连接内通过此参数切换不同库;省略时用连接 URL ?alias 指定的别名或默认别名。建议优先传当前项目文件夹名自动匹配对应数据库。 | |
| limit | No | Number of rows to return (default 5, max 20). | |
| table_name | Yes | Table to sample. Use database.table notation for cross-database queries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavioral context: bare table names use MYSQL_DATABASE, database.table enables cross-database lookups, and alias switches the configured database target. It does not describe return shape or sampling order, but these are less critical given the read-only annotations.
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 four sentences with no filler: purpose, usage timing, table-name syntax, and alias behavior each get one focused sentence. It is front-loaded with the core action and reads efficiently.
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 simple read-only sampler with no output schema, the description covers what the tool does, when to use it, how to name tables, and how to override the database target. An agent has enough information to invoke it correctly without needing to infer anything beyond the schema.
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 the baseline is 3. The description goes beyond the schema by specifying that bare table names resolve to MYSQL_DATABASE and reinforcing how alias targets a different configured database. The limit parameter needs no extra explanation because the schema already documents default and maximum.
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?
Description states a specific action and resource: 'Fetch a small sample of rows from a table to understand its data format and content.' It also names a companion tool (get_schema_info) and clearly frames this as an exploration tool, which distinguishes it from execute_sql even without an explicit contrast.
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 gives clear context: 'Use alongside get_schema_info before writing complex queries,' indicating when this tool is appropriate. It does not explicitly state when to prefer execute_sql instead, but the phrase 'before writing complex queries' implies the alternative, so it falls just short of fully explicit exclusion guidance.
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.4.4- First observed
execute_sql - First observed
get_schema_info - First observed
get_table_sample
TDQS
Scored across 3 tools
Each tool has a clear, distinct role: execute_sql for arbitrary SQL, get_schema_info for metadata, and get_table_sample for row previews. Although execute_sql can also run SHOW/SELECT statements, the specialized helper tools are explicitly framed as complementary, not competing.
All tool names follow a consistent verb_noun pattern in snake_case: execute_sql, get_schema_info, get_table_sample. This makes the action and target of each tool predictable.
Three tools is a compact but appropriate scope for a SQL database server: one general execution path plus two focused inspection helpers. Each tool serves a distinct need without redundancy.
The surface covers the core workflow: inspect schema, preview data, and execute arbitrary SQL for reads and writes. Cross-database behavior and user confirmation are handled, and remaining database-level operations can be reached via execute_sql.
Maintenance
Related MCP Connectors
Guard AI agents' PostgreSQL/MySQL access via MCP: SQL audit, auth, masking, write approval
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Draxlr's remote MCP server connects AI assistants to your SQL databases and dashboards. Explore schemas, run read-only queries, manage saved queries and dashboards, and export results, all with row-level security so each user sees only their own data.
Paid remote MCP for governed database query review, SQL simulation, approvals, and audits.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables read-only interaction with SQL databases through MCP, providing database metadata exploration, sample data retrieval, and secure query execution. Supports MySQL with multiple transport options and built-in security features including SQL injection protection and data sanitization.16 npm5MIT
- AlicenseNot gradedqualityDmaintenanceEnables MySQL database operations through MCP, including executing SQL queries, listing databases and tables, and describing table structures.959 npm5MIT
- AlicenseNot gradedqualityCmaintenanceEnables safe querying and optional writing to MySQL databases via MCP tools, with support for schema inspection, connection management, and read-only mode.28 npm3MIT
- FlicenseAqualityCmaintenanceEnables interaction with MariaDB/MySQL databases via MCP, supporting read-only mode, SQL execution, and schema inspection.6-