模型上下文协议(MCP)——使用Java构建SQL数据库代理(MCP代理教程)
*大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,热爱机器学习和深度学习算法应用,拥有丰富的AI项目经验,希望和你一起成长交流。关注"AI拉呱",评论+转发此文即可私信获取一份教程+一份学习书单!
模型上下文协议(MCP)——使用Java构建SQL数据库代理(MCP代理教程)
在本实操教程中,我们将使用纯Java基于模型上下文协议(Model Context Protocol,MCP) 构建一个SQL数据库代理(SQL Database Agent)。该代理能让大型语言模型(LLMs)通过结构化操作(如创建表、插入数据、查询数据等)以编程方式与SQL数据库交互,全程无需手动编写SQL语句。
我此前已撰写过多篇关于MCP、智能体间通信(Agent-to-Agent,A2A)及其对比的深度文章。为聚焦实操,本文不再重复这些概念,而是直接使用a2ajava库进行实现。
✅ 本教程非常适合希望通过Java,借助智能体(Intelligent Agents)将数据库与LLM集成的开发者。
🛠 编写Java类或Spring Bean——其余工作交给MCP即可
模型上下文协议(MCP)的一大核心优势是能与工具无缝集成,但本文要实现的功能是将Java方法转换为工具:你只需编写常规的Java类(更推荐编写Spring Boot服务),a2a库会自动将其转换为可用于MCP或A2A(智能体间)任务的工具。
以下是使用a2ajava和Spring的真实案例,该代理可处理内存中的Apache Derby数据库的SQL操作:
package io.github.vishalmysore.service;import com.t4a.annotations.Action;
import com.t4a.annotations.Agent;
import com.t4a.detect.ActionCallback;
import io.github.vishalmysore.a2a.domain.Task;
import io.github.vishalmysore.a2a.domain.TaskState;
import io.github.vishalmysore.data.*;import lombok.extern.java.Log;
import org.springframework.stereotype.Service;import java.sql.*;
import java.util.*;@Log
@Service
@Agent(groupName = "Database related actions") // 标注为数据库相关操作的智能体
public class DerbyService {// Derby内存数据库的JDBC连接地址,若数据库不存在则自动创建private static final String JDBC_URL = "jdbc:derby:memory:myDB;create=true";private ActionCallback callback;// 启动数据库服务器的操作@Action(description = "start database server")public String startServer(String serverName) {log.info("Derby server started.");return "为" + serverName + "启动Derby服务器";}// 创建数据库的操作@Action(description = "Create database")public String createDatabase(String databaseName) {// 将任务状态设置为“已完成”,并添加数据库创建信息((Task)callback.getContext()).setDetailedAndMessage(TaskState.COMPLETED, "Creating database: " + databaseName);try (Connection conn = DriverManager.getConnection(JDBC_URL)) {// 若连接成功则返回创建成功信息,否则返回失败信息return conn != null ? "数据库创建成功。" : "数据库创建失败。";} catch (SQLException e) {e.printStackTrace();return "数据库创建失败。";}}// 创建数据表的操作@Action(description = "Create tables")public String createTables(TableData tableData) {// 【仅作演示用:实际使用前请务必对输入进行安全校验!】StringBuilder createTableSQL = new StringBuilder("CREATE TABLE ");createTableSQL.append(tableData.getTableName()).append(" (");// 遍历表的列信息,拼接SQL语句for (ColumnData column : tableData.getHeaderList()) {createTableSQL.append(column.getColumnName()).append