构建完全本地的MCP客户端:让AI智能体与数据库无缝对话

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

最近在做一个项目时,我需要让AI智能体能够直接与本地数据库进行交互。经过一番研究,发现Model Context Protocol(MCP)是个非常优雅的解决方案。今天就跟大家分享一下如何构建一个完全本地化的MCP客户端,让AI智能体能够智能地操作SQLite数据库。

一、什么是MCP?为什么选择它?

MCP(Model Context Protocol)是一个标准化协议,专门用于AI应用程序与外部工具和数据源的连接。想象一下,如果AI智能体是一个万能助手,那么MCP就是它的"工具箱接口",让它能够标准化地使用各种外部工具。

二、技术栈选择

经过多次尝试,我选择了这样的技术栈:

  • LlamaIndex:构建MCP智能体的核心框架
  • Ollama:本地运行Deepseek-R1模型
  • LightningAI:开发和托管环境
  • SQLite:作为演示的数据存储

三、整体工作流程

整个系统的运行逻辑其实很简单:

  1. 用户提交查询
  2. 智能体连接MCP服务器,发现可用工具
  3. 根据查询内容,智能体选择合适的工具
  4. 获取上下文信息并返回智能响应

四、代码实现详解

第一步:构建SQLite MCP服务器

首先,我们需要一个简单的MCP服务器作为演示。这个服务器提供两个核心功能:

python 复制代码
import sqlite3
import json
from typing import Any, Dict, List
import asyncio
class SQLiteMCPServer:
def __init__(self, db_path: str = "demo.db"):
self.db_path = db_path
self.init_database()
def init_database(self):
"""初始化数据库表"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS players (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
sport TEXT NOT NULL,
achievements TEXT
)
''')
conn.commit()
conn.close()
def add_data(self, name: str, sport: str, achievements: str = "") -> Dict[str, Any]:
"""添加数据到数据库"""
try:
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute(
"INSERT INTO players (name, sport, achievements) VALUES (?, ?, ?)",
(name, sport, achievements)
)
conn.commit()
row_id = cursor.lastrowid
conn.close()
return {"success": True, "id": row_id, "message": f"成功添加 {name}"}
except Exception as e:
return {"success": False, "error": str(e)}
def get_data(self, sport: str = None) -> Dict[str, Any]:
"""从数据库获取数据"""
try:
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
if sport:
cursor.execute("SELECT * FROM players WHERE sport = ?", (sport,))
else:
cursor.execute("SELECT * FROM players")
rows = cursor.fetchall()
columns = [description[0] for description in cursor.description]
data = []
for row in rows:
data.append(dict(zip(columns, row)))
conn.close()
return {"success": True, "data": data, "count": len(data)}
except Exception as e:
return {"success": False, "error": str(e)}
# 创建MCP服务器实例
mcp_server = SQLiteMCPServer()

第二步:设置本地大语言模型

使用Ollama在本地运行Deepseek-R1模型:

python 复制代码
from llama_index.llms.ollama import Ollama
def setup_local_llm():
"""配置本地LLM"""
llm = Ollama(
model="deepseek-r1:latest",
base_url="http://localhost:11434",
temperature=0.1,
request_timeout=120.0
)
return llm
# 初始化LLM
local_llm = setup_local_llm()

第三步:定义智能体系统提示词

这一步很关键,好的提示词能让智能体更好地理解任务:

ini 复制代码
SYSTEM_PROMPT = """
你是一个智能数据库助手。你拥有以下能力:
1. 向数据库添加运动员信息
2. 从数据库查询运动员数据
重要规则:
- 在回答用户问题之前,先使用相应的工具获取或操作数据
- 如果用户想要添加数据,使用 add_data 工具
- 如果用户想要查看数据,使用 get_data 工具
- 始终以友好、专业的语调回应
- 将结果以清晰、易读的格式呈现给用户
请根据用户的请求,选择合适的工具并提供有用的响应。
"""

第四步:创建MCP工具包装器

将MCP服务器的功能包装成LlamaIndex可以使用的工具:

python 复制代码
from llama_index.core.tools import FunctionTool
from typing import Optional
def create_mcp_tools(server: SQLiteMCPServer) -> List[FunctionTool]:
"""创建MCP工具列表"""
def add_player_data(name: str, sport: str, achievements: str = "") -> str:
"""
添加运动员数据到数据库
Args:
name (str): 运动员姓名
sport (str): 运动项目
achievements (str): 主要成就,可选
Returns:
str: 操作结果
"""
result = server.add_data(name, sport, achievements)
if result["success"]:
return f"✅ {result['message']}"
else:
return f"❌ 添加失败: {result['error']}"
def get_player_data(sport: Optional[str] = None) -> str:
"""
从数据库获取运动员数据
Args:
sport (str, optional): 运动项目筛选,不提供则获取所有数据
Returns:
str: 查询结果
"""
result = server.get_data(sport)
if result["success"]:
if result["count"] == 0:
return "📭 数据库中暂无符合条件的运动员数据"
data_str = f"📊 找到 {result['count']} 条记录:\n\n"
for player in result["data"]:
data_str += f"🏆 {player['name']}\n"
data_str += f"   项目: {player['sport']}\n"
if player['achievements']:
data_str += f"   成就: {player['achievements']}\n"
data_str += "\n"
return data_str
else:
return f"❌ 查询失败: {result['error']}"
# 创建工具列表
tools = [
FunctionTool.from_defaults(
fn=add_player_data,
name="add_data",
description="向数据库添加运动员信息"
),
FunctionTool.from_defaults(
fn=get_player_data,
name="get_data",
description="从数据库查询运动员信息"
)
]
return tools

第五步:构建MCP智能体

现在我们把所有组件整合起来:

python 复制代码
from llama_index.core.agent import FunctionCallingAgent
from llama_index.core.memory import ChatMemoryBuffer
class MCPAgent:
def __init__(self, llm, tools, system_prompt: str):
self.llm = llm
self.tools = tools
self.memory = ChatMemoryBuffer.from_defaults(token_limit=4000)
self.agent = FunctionCallingAgent.from_tools(
tools=tools,
llm=llm,
system_prompt=system_prompt,
memory=self.memory,
verbose=True
)
def chat(self, message: str) -> str:
"""与智能体对话"""
try:
response = self.agent.chat(message)
return str(response)
except Exception as e:
return f"抱歉,处理您的请求时出现错误:{str(e)}"
def reset_memory(self):
"""重置对话记忆"""
self.memory.reset()
def create_mcp_agent(mcp_server: SQLiteMCPServer) -> MCPAgent:
"""创建MCP智能体"""
llm = setup_local_llm()
tools = create_mcp_tools(mcp_server)
agent = MCPAgent(
llm=llm,
tools=tools,
system_prompt=SYSTEM_PROMPT
)
return agent

第六步:完整的运行示例

让我们把所有代码整合起来,创建一个完整的演示:

python 复制代码
def main():
"""主函数:演示MCP客户端的完整功能"""
print("🚀 正在初始化本地MCP客户端...")
# 创建MCP服务器
mcp_server = SQLiteMCPServer()
print("✅ SQLite MCP服务器已启动")
# 创建智能体
agent = create_mcp_agent(mcp_server)
print("✅ MCP智能体已就绪")
print("\n" + "="*50)
print("🤖 MCP智能体已启动!您可以尝试以下操作:")
print("- 添加运动员信息:'添加拉斐尔·纳达尔,网球运动员,22个大满贯冠军'")
print("- 查看所有数据:'显示所有运动员信息'")
print("- 输入 'quit' 退出")
print("="*50)
# 交互循环
while True:
try:
user_input = input("\n👤 您: ").strip()
if user_input.lower() in ['quit', 'exit', '退出']:
print("👋 再见!")
break
if not user_input:
continue
print("🤖 智能体思考中...")
response = agent.chat(user_input)
print(f"🤖 智能体: {response}")
except KeyboardInterrupt:
print("\n👋 程序已退出")
break
except Exception as e:
print(f"❌ 发生错误: {str(e)}")
if __name__ == "__main__":
main()

五、运行效果展示

当你运行这个程序时,你会看到类似这样的交互:

makefile 复制代码
👤 您: 添加拉斐尔·纳达尔,网球运动员,22个大满贯冠军
🤖 智能体: ✅ 成功添加 拉斐尔·纳达尔
👤 您: 显示所有运动员信息
🤖 智能体: 📊 找到 1 条记录:
🏆 拉斐尔·纳达尔
项目: 网球
成就: 22个大满贯冠军

六、实际应用场景

这个MCP客户端的应用场景非常广泛:

  1. 数据管理助手:让AI帮助管理各种结构化数据
  2. 智能客服系统:结合知识库进行智能问答
  3. 业务流程自动化:让AI执行复杂的数据操作任务
  4. 开发工具集成:在开发环境中提供智能化的数据操作

七、扩展可能性

基于这个基础架构,你可以轻松扩展更多功能:

  • 连接更多类型的数据库(MySQL、PostgreSQL等)
  • 集成文件系统操作
  • 添加API调用功能
  • 实现复杂的数据分析工具

八、总结

通过这个完全本地化的MCP客户端,我们实现了AI智能体与数据库的无缝对话。整个系统不依赖任何外部API,保证了数据的安全性和隐私性。

最重要的是,这种架构非常灵活,你可以根据自己的需求轻松修改和扩展。无论是简单的数据管理,还是复杂的业务流程自动化,都能够很好地适应。

如果你也在探索AI智能体的实际应用,不妨试试这个方案。相信它会给你带来不少启发!

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

相关推荐
陳陈陳9 小时前
Workflow vs Agent:别再被“调包侠”忽悠了,一张图看懂AI工程的“骨架”与“大脑”
langchain·agent·workflow
新知图书9 小时前
11.3 详细实现与核心配置(作业批改智能体开发)
人工智能·agent·ai agent·智能体·扣子
小林ixn10 小时前
Workflow 还是 Agent?帮你一次性搞清楚这俩到底有啥不一样
agent·workflow
Darling噜啦啦10 小时前
Workflow 还是 Agent?一文搞懂 AI 工程的两大核心范式,以及它们的未来
agent·workflow
沉默王二12 小时前
腾讯一面,我霸气反问:“你说你们在做Agent项目,说说 SubAgent、Plan 模式、Skill 调用这些你们都是怎么做的?”面试官一直在擦汗。。
面试·agent·ai编程
新知图书14 小时前
10.1 项目背景与需求分析(智能客服智能体开发)
人工智能·agent·ai agent·智能体·扣子
程序员cxuan15 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
决战灬15 小时前
langgraph之interrupt(理论篇)
人工智能·python·agent
人间凡尔赛17 小时前
2026 AI Agent 多智能体协同编程实战指南:从 Kimi K3 到 GPT-5.6 深度解析
ai·agent·多智能体·编程实战·waic·gpt-5.6·kimik3