Skip to main content
Glama
Liu-creators

MySQL MCP

by Liu-creators

describe_table

Retrieve table structure and column details from a MySQL database by providing the table name, with optional custom database connection settings.

Instructions

获取表结构

Args:
    table_name: 表名
    db_config: 数据库连接配置参数,如果为None则使用默认配置
    
Returns:
    包含表结构信息的字典

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
table_nameYes
db_configNo

Implementation Reference

  • The describe_table tool handler function. Uses @mcp.tool() decorator for registration. Connects to MySQL, executes DESCRIBE {table_name}, and returns column structure information.
    @mcp.tool()
    async def describe_table(table_name: str, db_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
        """获取表结构
        
        Args:
            table_name: 表名
            db_config: 数据库连接配置参数,如果为None则使用默认配置
            
        Returns:
            包含表结构信息的字典
        """
        if not table_name:
            return {"error": "表名不能为空"}
            
        try:
            conn = get_connection(db_config)
            cursor = conn.cursor(dictionary=True)
            cursor.execute(f"DESCRIBE {table_name}")
            columns = cursor.fetchall()
            return {
                "success": True,
                "table": table_name,
                "columns": columns
            }
        except Error as e:
            error_message = f"获取表结构失败: {str(e)}"
            if "doesn't exist" in str(e):
                error_message += f"\n原因:表 {table_name} 不存在"
            elif "Access denied" in str(e):
                error_message += "\n原因:当前用户没有足够权限查看表结构"
            return {"error": error_message}
        except Exception as e:
            return {"error": f"获取表结构时发生未知错误: {str(e)}"}
        finally:
            if 'conn' in locals() and conn.is_connected():
                cursor.close()
                conn.close()
  • mysql-mcp.py:220-221 (registration)
    Registration of the describe_table tool via @mcp.tool() decorator on the function. MCP (FastMCP) automatically registers the function as a tool.
    @mcp.tool()
    async def describe_table(table_name: str, db_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
  • Function signature and docstring defining the input schema: table_name (required str), db_config (optional Dict[str, Any]), and return type Dict[str, Any].
    """获取表结构
    
    Args:
        table_name: 表名
        db_config: 数据库连接配置参数,如果为None则使用默认配置
        
    Returns:
        包含表结构信息的字典
    """
  • The get_connection helper function used by describe_table to establish database connections with retry logic.
    def get_connection(db_config=None):
        """获取数据库连接
        
        Args:
            db_config: 数据库连接配置参数,如果为None则使用默认配置
            
        Returns:
            数据库连接对象
        """
        # 如果没有提供配置,先尝试使用全局配置,再使用默认配置
        if db_config is None:
            if GLOBAL_DB_CONFIG is not None:
                db_config = GLOBAL_DB_CONFIG.copy()
            else:
                db_config = DEFAULT_DB_CONFIG.copy()
        else:
            # 合并用户提供的配置和全局/默认配置
            if GLOBAL_DB_CONFIG is not None:
                config = GLOBAL_DB_CONFIG.copy()
            else:
                config = DEFAULT_DB_CONFIG.copy()
            config.update(db_config)
            db_config = config
        
        retry_count = 0
        last_error = None
        max_retries = db_config.get("connect_retry_count", 3)
        
        while retry_count < max_retries:
            try:
                # 创建一个配置字典的副本,移除自定义的配置项
                db_config_copy = db_config.copy()
                db_config_copy.pop("connect_retry_count", None)
                
                # 将connection_timeout转换为mysql.connector需要的connect_timeout参数
                if "connection_timeout" in db_config_copy:
                    db_config_copy["connect_timeout"] = db_config_copy.pop("connection_timeout")
                    
                conn = mysql.connector.connect(**db_config_copy)
                return conn
            except Error as e:
                last_error = e
                retry_count += 1
                if retry_count < max_retries:
                    # 只有在还有重试机会的情况下打印重试信息
                    print(f"第 {retry_count} 次连接失败,正在重试... 错误: {e}")
        
        # 所有重试都失败后,构建详细的错误信息
        error_message = f"数据库连接错误(重试 {retry_count} 次后): {last_error}"
        if "Can't connect to MySQL server" in str(last_error):
            error_message += f"\n无法连接到MySQL服务器,请检查主机 {db_config['host']} 和端口 {db_config['port']} 是否正确"
            error_message += f"\n连接超时时间为 {db_config.get('connection_timeout', 10)} 秒"
        elif "Access denied" in str(last_error):
            error_message += f"\n访问被拒绝,请检查用户名 {db_config['user']} 和密码是否正确"
        elif "Unknown database" in str(last_error):
            error_message += f"\n未知数据库 {db_config['database']},请确认数据库名称是否正确"
        raise Exception(error_message)
  • FastMCP server initialization (mcp = FastMCP('mysql')) used by @mcp.tool() decorator for tool registration.
    mcp = FastMCP("mysql")
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but only states it returns a dictionary. It does not disclose read-only nature, required permissions, potential side effects, or any behavioral traits beyond the basic operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three clear sections (description, args, returns) and no superfluous text. It is efficiently structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description should provide more context about the returned data structure and behavior. It lacks details on what '表结构信息' includes (e.g., column names, data types) and does not clarify whether it is a read-only operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It provides brief Chinese explanations for each parameter ('表名' for table_name, '数据库连接配置参数...' for db_config), adding some meaning beyond names. However, the explanations are minimal and do not fully clarify types or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states '获取表结构' (get table structure), which is a specific verb and resource. It distinguishes itself from sibling tools like create_table and list_tables by focusing on structural metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use it (when you need table structure), but it does not explicitly state when not to use it or provide alternatives. No comparison with sibling tools is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Liu-creators/mysql-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server