MCP Python SDK构建的**SQLite浏览器**的完整操作指南

以下是使用MCP Python SDK构建的SQLite浏览器的完整操作指南:


一、环境准备

  1. 安装依赖
bash 复制代码
# 安装MCP SDK及SQLite支持
pip install mcp sqlite3
  1. 创建测试数据库
bash 复制代码
sqlite3 test.db <<EOF
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
EOF

二、服务端开发

python 复制代码
# sqlite_explorer.py
import sqlite3
from mcp.server.fastmcp import FastMCP, Context

# 初始化MCP服务器
mcp = FastMCP("SQLite Explorer")

@mcp.resource("schema://{database}")
def get_schema(database: str) -> str:
    """获取数据库模式"""
    try:
        conn = sqlite3.connect(f"{database}.db")
        result = conn.execute("SELECT sql FROM sqlite_master").fetchall()
        return "\n".join(row[0] for row in result if row[0])
    except Exception as e:
        return f"Error: {str(e)}"

@mcp.tool()
def execute_query(sql: str, ctx: Context) -> str:
    """安全执行SQL查询"""
    try:
        # 限制DELETE/UPDATE操作
        if any(cmd in sql.upper() for cmd in ["DELETE", "UPDATE", "DROP"]):
            return "Error: Write operations are disabled"
            
        conn = sqlite3.connect("test.db")
        cursor = conn.execute(sql)
        
        # 返回格式化的结果
        if cursor.description:
            headers = [desc[0] for desc in cursor.description]
            rows = cursor.fetchall()
            return f"{headers}\n" + "\n".join(str(row) for row in rows)
        return "Query executed successfully"
    except Exception as e:
        return f"Error: {str(e)}"

if __name__ == "__main__":
    mcp.run()

三、服务启动与测试

  1. 启动服务器
bash 复制代码
mcp dev sqlite_explorer.py
  1. 通过客户端交互
python 复制代码
# client.py
from mcp.client.stdio import stdio_client
from mcp import ClientSession

async def main():
    async with stdio_client() as (read, write):
        async with ClientSession(read, write) as session:
            # 获取数据库模式
            schema = await session.read_resource("schema://test")
            print("Schema:\n", schema)
            
            # 执行查询
            result = await session.call_tool("execute_query", {
                "sql": "SELECT * FROM users LIMIT 2"
            })
            print("Query Result:\n", result)

asyncio.run(main())

四、核心功能说明

  1. 安全防护机制
  • 自动拦截危险操作(DELETE/UPDATE/DROP)
  • 限制最大返回行数(可在代码中添加LIMIT子句)
  • 使用参数化查询(示例中可扩展实现)
  1. 数据展示优化
python 复制代码
# 在execute_query工具中优化输出格式
if cursor.description:
    headers = [desc[0] for desc in cursor.description]
    rows = cursor.fetchall()
    max_width = 20
    return (
        "| " + " | ".join(h.ljust(max_width) for h in headers) + " |\n" +
        "|-" + "-|-".join("-"*max_width for _ in headers) + "-|\n" +
        "\n".join(
            "| " + " | ".join(str(v).ljust(max_width)[:max_width] for v in row
        ) + " |"
        for row in rows
    )
)

五、高级功能扩展

  1. 数据库切换支持
python 复制代码
@mcp.tool()
def switch_database(db_name: str) -> str:
    global current_db
    if not os.path.exists(f"{db_name}.db"):
        return "Database not found"
    current_db = f"{db_name}.db"
    return f"Switched to {db_name}"
  1. 查询历史记录
python 复制代码
from datetime import datetime
query_history = []

@mcp.resource("history://last10")
def get_history() -> str:
    return "\n".join(
        f"{ts} | {query}" 
        for ts, query in query_history[-10:]
    )

# 在execute_query中记录历史
query_history.append((datetime.now().strftime("%Y-%m-%d %H:%M"), sql))

六、使用场景示例

  1. 自然语言查询转换
bash 复制代码
用户请求 -> "显示最近注册的5个用户"
转换SQL -> "SELECT * FROM users ORDER BY id DESC LIMIT 5"
  1. 数据可视化对接
python 复制代码
@mcp.tool()
def generate_chart(sql: str) -> Image:
    data = execute_query(sql)
    plt.figure()
    # 生成图表逻辑
    return Image(data=plot_to_bytes(), format="png")

通过以上实现,您已构建了一个具备完整CRUD功能、安全审计、历史追溯的SQLite浏览器服务。该服务可通过MCP协议无缝集成到各类LLM应用中,实现自然语言到结构化查询的安全转换。

相关推荐
树獭非懒4 小时前
AI大模型小白手册|Embedding 与向量数据库
后端·python·llm
数据组小组6 小时前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替
唐叔在学习7 小时前
就算没有服务器,我照样能够同步数据
后端·python·程序员
曲幽9 小时前
FastAPI流式输出实战与避坑指南:让AI像人一样“边想边说”
python·ai·fastapi·web·stream·chat·async·generator·ollama
Flittly9 小时前
【从零手写 AI Agent:learn-claude-code 项目实战笔记】(1)The Agent Loop (智能体循环)
python·agent
vivo互联网技术11 小时前
ICLR2026 | 视频虚化新突破!Any-to-Bokeh 一键生成电影感连贯效果
人工智能·python·深度学习
敏编程12 小时前
一天一个Python库:virtualenv - 隔离你的Python环境,保持项目整洁
python
悟空聊架构12 小时前
基于KaiwuDB在游乐场“刷卡+投币”双模消费系统中的落地实践
数据库·后端·架构
IvorySQL12 小时前
PostgreSQL 技术日报 (3月4日)|硬核干货 + 内核暗流一网打尽
数据库·postgresql·开源