MCP 简介与架构
MCP(Model Context Protocol)是一种开放协议,标准化了应用程序向 LLM 提供上下文的方式。你可以把它理解为 AI 应用的 USB-C 端口:正如 USB-C 统一了设备连接标准,MCP 让 AI 模型能够以统一方式接入不同的数据源和工具。
在架构上,主要包含以下角色:
- MCP 主机:希望访问数据的程序,如 Claude Desktop、IDE 或 AI 工具。
- MCP 客户端:与服务器保持 1:1 连接的协议客户端。
- MCP 服务器:轻量级程序,通过标准化协议公开特定功能。
- 数据源:包括本地文件、数据库以及可通过互联网连接的外部系统。
环境准备
运行 MCP 服务通常依赖 Node.js 环境。请确保你的 Node 版本不低于 18.20.4,旧版本可能无法执行 npx 命令。
关于高德地图 MCP 服务,你需要先申请 AMAP_MAPS_API_KEY。服务支持的工具列表可以通过官方文档查看,其中核心功能包括根据城市名称或 adcode 查询天气、获取 POI 详情等。
Python SDK 实现
Python 生态中,我们可以使用官方的 mcp 库来快速构建客户端。首先安装依赖:
pip install mcp
接下来是核心代码。这里我们配置 StdioServerParameters 来启动高德地图的 MCP 服务器进程,并通过异步会话进行交互。
import asyncio
from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client
server_params = StdioServerParameters(
command="npx",
args=["-y", "@amap/amap-maps-mcp-server"],
env={"AMAP_MAPS_API_KEY": "xxxxx"}
)
async def run():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print("工具列表:", tools)
# 调用天气查询工具
result = await session.call_tool(
"maps_weather",
arguments={"city": "福州"}
)
print("调用结果:", result)
if __name__ == "__main__":
asyncio.run(run())
这段代码的关键在于 stdio_client 上下文管理器,它负责建立与服务器的标准输入输出通道。初始化后,我们可以列出可用工具并调用具体的 call_tool。注意替换环境变量中的 API Key 为真实值。
Java SDK 实现
如果你更习惯 Java 开发,MCP 也提供了同步客户端支持。在 Maven 项目中引入依赖:
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
<version>0.8.1</version>
</dependency>
或者在 Gradle 中使用:
implementation("io.modelcontextprotocol.sdk:mcp:0.8.1")
以下是基于 JUnit 测试框架的实现示例,展示了如何构建同步客户端并调用工具:
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.McpSyncClient;
import io.modelcontextprotocol.client.transport.ServerParameters;
import io.modelcontextprotocol.client.transport.StdioClientTransport;
import io.modelcontextprotocol.spec.McpSchema;
import org.junit.jupiter.api.Test;
import java.util.Map;
public class JunitTest {
@Test
public void test() {
ServerParameters params = ServerParameters.builder("npx")
.args("-y", "@amap/amap-maps-mcp-server")
.addEnvVar("AMAP_MAPS_API_KEY", "xxxxx")
.build();
StdioClientTransport transport = new StdioClientTransport(params);
McpSyncClient client = McpClient.sync(transport).build();
client.initialize();
McpSchema.ListToolsResult toolsList = client.listTools();
System.out.println("工具列表:" + toolsList);
McpSchema.CallToolResult mapsWeather = client.callTool(
new McpSchema.CallToolRequest("maps_weather", Map.of("city", "福州"))
);
System.out.println("调用结果:" + mapsWeather.content());
}
}
Java 版本采用了同步阻塞模式,逻辑上比 Python 异步版本更直观一些,适合传统后端集成场景。无论选择哪种语言,核心流程都是:配置参数 -> 建立传输 -> 初始化 -> 调用工具。


