Tokenlite Mysql Mcp

io.github.andezdev由 GitHub 账号 andezdev 发布v4.1.0更新于 Oct 24, 2026

A secure, efficient, and intelligent MySQL server for the Model Context Protocol

已验证STDIO仅桌面数据库数据与分析

概览

AI 生成的概览

本地 MCP 服务器,让助手浏览 MySQL 表结构并执行默认只读、带防护的 SQL 查询,结果以省 token 的 CSV 返回。

可以做什么
  • 浏览数据库表结构与缓存的 DDL,并获取相关表的自动关联上下文
  • 通过安全查询通道执行 SELECT,拦截大规模无索引全表扫描并自动注入行数上限
  • 用 EXPLAIN 查看查询计划,了解查询为何被拦截
  • 仅在通过环境变量开启时执行写入操作(INSERT、UPDATE、DELETE、DDL)
  • 借助语义字典与预审查询模板,以提示形式提供业务指标口径
  • 刷新表结构缓存并接收结构化的 MCP 日志通知
适用场景
适合让助手基于 MySQL 数据库回答问题,尤其是表很多、整体导出表结构会浪费上下文的大型库。也适合希望默认只读、写入需显式开启并带有重查询防护的团队。
运行要求
以 stdio 方式在本地运行 npm 包,需要 Node.js v20 及以上和 MySQL 5.7 及以上。需要 DB_NAME 以及 DB_HOST、DB_PORT、DB_USER 和密钥 DB_PASSWORD 等连接配置,可选 DB_SSL 启用 TLS。MySQL 用户应具备 SELECT 和 SHOW VIEW 权限。远程数据库需通过操作系统级 SSH 隧道连接。
安装前请注意
服务器配置中保存数据库凭据,包括 DB_PASSWORD。写入默认关闭,但 ALLOW_INSERT_OPERATION、ALLOW_UPDATE_OPERATION、ALLOW_DELETE_OPERATION 和 ALLOW_DDL_OPERATION 可开启数据修改及 DROP、TRUNCATE 等破坏性语句。建议使用最小权限账号,开启写入时避免连接生产库。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Tokenlite Mysql Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

TokenLite MySQL MCP

[npm version]

A robust and secure MySQL database server implemented under Anthropic's Model Context Protocol (MCP). Designed specifically to solve the shortcomings of current generic MCP servers through Graceful Degradation, Active Performance Protection, and Aggressive Token Optimization.


🌟 Core Pillars

  1. Safe-Query Optimizer (AST & EXPLAIN): Protects production databases by pre-analyzing queries. Blocks unindexed Full Table Scans that exceed configurable thresholds and injects strict LIMIT clauses automatically at the AST level.
  2. Granular AST-Based Write Permissions: By default, TokenLite is 100% Read-Only. You can surgically enable specific write operations (INSERT, UPDATE, DELETE, DDL) via environment variables. The firewall uses strict AST parsing to prevent SQL injection and comment-bypass attacks, and strictly prohibits privilege escalation commands (like GRANT or CALL).
  3. Session-Level Defense in Depth: If the server is configured in strict Read-Only mode (all write variables disabled), TokenLite injects SET SESSION TRANSACTION READ ONLY directly into the connection pool sockets. This guarantees that even if a theoretical bypass exists in the AST parser, the MySQL engine itself will physically reject any data modification.
  4. Business Intelligence Injection: Bridges the gap between raw data and company logic. Automatically attaches semantic dictionaries (metadata.json) to database schema exploration, and exposes Semantic Templates via the official MCP Prompts API (templates.json) so the LLM uses pre-approved analytical queries instead of hallucinating them.
  5. Graph-Based Semantic Schema: Avoids sending giant schemas to the LLM that saturate the context window. When a table is searched, the engine uses heuristics to deduce implicit relationships and packages the exact "Auto-Join Context".
  6. CSV Token Compression: Database results are efficiently transformed into tabular CSV markdown with unambiguous NULL representation (∅), saving up to 50% of Output Tokens compared to verbose JSON. When results hit the applied LIMIT, a -- rows: N (truncated at LIMIT X) footer is appended so the LLM does not assume a complete dataset.
  7. MCP Completions: Table names and template keywords support the official completions/complete capability for resource templates (mysql://tables/{name}) and the query_templates prompt.

📋 Requirements

  • Node.js v20 or higher
  • MySQL 5.7 or higher (MySQL 8.0+ recommended)
  • A MySQL user with SELECT and SHOW VIEW privileges.

🚀 Installation & Usage

You can use this MCP server with any compatible client. Below are the configurations for the most popular ones.

1. Claude Desktop

Edit your claude_desktop_config.json (usually located at %APPDATA%\Claude\claude_desktop_config.json on Windows or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS) and add the following:

Using NPX (Recommended)

json
{  "mcpServers": {    "tokenlite-mysql": {      "command": "npx",      "args": [        "-y",        "@andezdev/tokenlite-mysql-mcp"      ],      "env": {        "DB_HOST": "localhost",        "DB_PORT": "3306",        "DB_USER": "your_db_user",        "DB_PASSWORD": "your_password",        "DB_NAME": "your_database",        "MCP_EXPLAIN_MAX_SCAN_ROWS": "1000",        "MCP_QUERY_ROW_LIMIT": "500",        "MCP_SAFE_QUERY_ENABLE_BLOCKING": "true"      }    }  }}

2. Claude Code (CLI)

You can easily integrate this server globally into Claude Code:

bash
claude mcp add tokenlite_mysql \  -e DB_HOST="127.0.0.1" \  -e DB_PORT="3306" \  -e DB_USER="root" \  -e DB_PASSWORD="your_password" \  -e DB_NAME="your_database" \  -- npx -y @andezdev/tokenlite-mysql-mcp

3. Cursor IDE

To use within Cursor IDE:

  1. Open Cursor Settings > Features > MCP.
  2. Click + Add New MCP Server.
  3. Set the Type to command.
  4. Name it tokenlite-mysql.
  5. Set the command to:
    bash
    npx -y @andezdev/tokenlite-mysql-mcp

(Note: Cursor handles environment variables directly in the IDE UI, make sure to add your DB credentials there).


⚙️ Environment Variables Reference

Understanding Query Limits (two independent knobs)

execute_safe_query applies two separate limits. Do not confuse them:

VariableWhat it controlsDefaultExample
MCP_EXPLAIN_MAX_SCAN_ROWSSecurity gate: blocks queries whose EXPLAIN plan shows a full table scan (type: ALL) with more estimated rows than this threshold. The query is rejected before execution.10005000 allows scanning tables up to ~5000 rows without an index
MCP_QUERY_ROW_LIMITResult cap: max rows returned to the LLM. Injected as LIMIT at the AST level. When reached, CSV includes -- rows: N (truncated at LIMIT X).5001000 returns up to 1000 rows per SELECT

Deprecated alias: MCP_SAFE_QUERY_MAX_ROWS still works as a fallback for MCP_EXPLAIN_MAX_SCAN_ROWS only. It does not control the result LIMIT.

Worked example with MCP_EXPLAIN_MAX_SCAN_ROWS=5000 and MCP_QUERY_ROW_LIMIT=500 on a customers table (~1502 rows):

  1. SELECT * FROM customers → passes EXPLAIN (1502 < 5000), executes with LIMIT 500, returns 500 rows + truncation footer.
  2. Same config but table has 8000 rows → blocked by EXPLAIN before execution.
VariableDescriptionDefaultRequired
DB_HOSTMySQL Host addresslocalhostNo
DB_PORTMySQL Port3306No
DB_USERMySQL UsernamerootNo
DB_PASSWORDMySQL Password''No
DB_NAMEMySQL Database nametestYes
MCP_EXPLAIN_MAX_SCAN_ROWSEXPLAIN guardrail: max estimated rows for unindexed full table scans before blocking.1000No
MCP_QUERY_ROW_LIMITMax rows returned per SELECT (AST-injected LIMIT + truncation footer).500No
MCP_SAFE_QUERY_ENABLE_BLOCKINGEnable or disable the EXPLAIN guardrail.trueNo
MCP_METADATA_PATHAbsolute path to your custom metadata.json dictionary.(Disabled)No
MCP_TEMPLATES_PATHAbsolute path to your custom templates.json queries.(Disabled)No
TOOL_PREFIXPrefix for tool names (useful when running multiple instances).Derived from DB_NAME (e.g., mydb_). Random fallback only if DB_NAME is unset.No
MCP_RATE_LIMIT_RPMMax tool invocations per minute (sliding window). Set to 0 to disable.60No
MYSQL_QUERY_TIMEOUTMax execution time for a query (in ms). Aborts heavy queries to protect against DoS.15000No
MYSQL_CONNECTION_LIMITMax concurrent pool connections.10No
MYSQL_CONNECT_TIMEOUTMax time to wait for a socket to establish (in ms).10000No
MYSQL_RETRY_ATTEMPTSMax retries on transient connection errors (ECONNREFUSED, PROTOCOL_CONNECTION_LOST, etc.).3No
MYSQL_RETRY_DELAY_MSBase delay (ms) for exponential backoff between retries (1s, 2s, 4s...).1000No
MYSQL_QUEUE_LIMITMax queued requests when all pool connections are busy. Prevents unbounded growth if MySQL is down.50No
MCP_DDL_CACHE_TTLTime-to-live (in seconds) for cached DDL statements. Reduces latency on repeated search_schema calls. Invalidated by refresh_schema.60No
MCP_LOG_LEVELMinimum severity for MCP log notifications: debug, info, notice, warning, error, critical, alert, emergency.infoNo
ALLOW_INSERT_OPERATIONEnable INSERT and REPLACE queries.falseNo
ALLOW_UPDATE_OPERATIONEnable UPDATE queries.falseNo
ALLOW_DELETE_OPERATIONEnable DELETE and TRUNCATE queries.falseNo
ALLOW_DDL_OPERATIONEnable Data Definition Language (CREATE, ALTER, DROP, RENAME).falseNo
DB_SSLEnable TLS for the MySQL connection (recommended for managed/cloud databases).falseNo
DB_SSL_REJECT_UNAUTHORIZEDReject self-signed or untrusted TLS certificates when DB_SSL=true.trueNo

🛡️ Business Intelligence Features (Opt-in)

TokenLite can teach the LLM about your company's business rules. To enable this, map the absolute paths of two JSON files via .env or your MCP client config:

metadata.json (Semantic Dictionary)

Translate integer statuses or internal jargon so the LLM understands the data.

json
{  "orders.status": {    "pending": "The order is waiting for payment validation",    "shipped": "The order has left the warehouse"  }}

Custom Relationships

Define FK mappings the heuristic engine can't auto-detect (e.g., created_by → users). Add a _relationships key to your metadata.json:

json
{  "orders.status": { "pending": "...", "shipped": "..." },  "_relationships": {    "orders.created_by": "users.id",    "categories.parent_id": "categories.id"  }}

These are treated as authoritative (not heuristic) and take priority over automatic detection.

The heuristic engine also assigns a confidence score (0–100) to each inferred FK based on name matching (+40), data type validation (+30), primary key verification (+20), and index presence (+10). Only FKs scoring ≥70 are accepted.

templates.json (Pre-approved SQL)

Stop the LLM from hallucinating complex metrics by providing vetted templates.

json
[  {    "name": "Customer Lifetime Value (LTV)",    "description": "Calculates total revenue generated by delivered orders per customer.",    "sql": "SELECT c.id, SUM(oi.price) FROM customers c JOIN orders o... WHERE o.status='delivered'"  }]

📈 Benchmarks & Token Savings

TokenLite includes an automated benchmark suite using o200k_base tokenization (GPT-4o/GPT-5 standard) to measure efficiency improvements. Token counts are approximate — Claude 4.x uses a proprietary tokenizer; actual counts may vary slightly.

To run the benchmark in your own environment:

bash
npm run benchmark

Baseline: Standard MCP Pattern

The benchmark compares against the standard pattern used by generic MySQL MCP servers: full schema exposed as information_schema.columns in pretty-printed JSON, and query results returned as JSON.stringify(rows, null, 2) with execution time metadata.

1. Schema Discovery (Input Tokens)

Standard MCP servers dump the entire schema to the LLM. For large databases, this consumes thousands of input tokens on every turn. TokenLite's relational graph serves a localized Auto-Join Context (target table + direct parent tables + direct child tables).

ScenarioStandard MCP PatternTokenLite📉 Savings
Mock (50 tables, Enterprise CRM)15,566 tokens883 tokens94.3%
Live (9 tables, Test DB)2,208 tokens531 tokens75.9%

Savings scale with the number of tables: the more tables in the database, the higher the savings because the standard pattern dumps all of them while TokenLite only fetches the target + 1-hop relationships.

2. Query Result Payloads (Output Tokens)

TokenLite converts raw database rows to a dense, structured CSV layout. This avoids JSON syntax overhead (brackets, braces, repeated keys) and compresses the output payload returned to the LLM. When the row count reaches the server-injected LIMIT, results include a truncation footer (e.g. -- rows: 500 (truncated at LIMIT 500)) so agents know more data may exist.

Mock data (varied: NULLs, long descriptions, mixed lengths):

Rows ReturnedStandard MCP Pattern (Tokens)TokenLite CSV (Tokens)📉 Output Savings (%)
10 rows1,16760148.5%
50 rows5,8032,92749.6%
100 rows11,6075,84249.7%
500 rows57,99029,11949.8%

Live data (real MySQL test database with NULLs, ENUMs, variable-length text):

Rows ReturnedStandard MCP Pattern (Tokens)TokenLite CSV (Tokens)📉 Output Savings (%)
10 rows1,00762837.6%
50 rows5,0293,11438.1%
100 rows10,0716,23238.1%
500 rows50,32731,11638.2%

📊 Logging & Observability

TokenLite uses MCP-native logging via notifications/message instead of raw stderr output. Clients that support MCP logging (e.g., MCP Inspector) will receive structured log messages with severity levels, logger names, and JSON data.

Severity levels (from least to most severe): debug, info, notice, warning, error, critical, alert, emergency.

The server emits logs at info level and above by default. Control the minimum level via MCP_LOG_LEVEL or dynamically at runtime through the MCP logging/setLevel request.

Before the MCP session is established (e.g., during pool initialization), logs fall back to stderr.


🌐 Advanced Networking & Remote Connections

By design, tokenlite-mysql-mcp adheres to the Unix philosophy: it does one thing (AI-driven MySQL interactions) and does it securely via the standard stdio transport. It deliberately avoids bloating the codebase with HTTP servers or built-in SSH clients.

If you need to connect to remote databases or expose this server over the network, here are the recommended, enterprise-grade alternatives:

1. Connecting to Remote Databases (SSH Tunnels)

Instead of embedding SSH libraries, we recommend using native OS tunnels. This is much more secure, respects your ~/.ssh/config, and supports advanced authentication (2FA, hardware keys).

Simply open a terminal and run:

bash
ssh -N -L 3306:127.0.0.1:3306 [email protected]

Then, point tokenlite-mysql-mcp to localhost and port 3306.

2. Exposing the MCP Server over HTTP/Network

If you need to host this MCP Server in the cloud (AWS, GCP) and have multiple Claude desktop clients connect to it remotely via HTTP/SSE, do not modify this codebase to add Express/HTTP logic. Instead, wrap the process using standard open-source MCP proxies like mcp-proxy. This cleanly separates the transport layer security from the AI logic.

🐛 Troubleshooting

Error: OptimizerError: Full table scan detected... The LLM attempted to execute a query that requires scanning thousands of rows without using an index. Solution: Use explain_query to see the full EXPLAIN output and understand why the query was blocked. Rewrite the query with an indexed WHERE clause. If you truly need to scan the whole table, increase MCP_EXPLAIN_MAX_SCAN_ROWS in your config. To return more rows per query, adjust MCP_QUERY_ROW_LIMIT separately.

Error: calling "initialize": invalid character... This means the MCP JSON-RPC protocol crashed. Ensure you are passing the correct DB credentials and that the database is running and accessible from the machine where the MCP server runs.


Built for the AI Engineering era.


来源:README.md,提交 f1b56ff

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v4.1.0最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分