MCP 简介
MCP(Model Context Protocol)是一种开放协议,它标准化了应用程序向 LLM 提供上下文的方式。可以将 MCP 视为 AI 应用程序的 USB-C 端口:正如 USB-C 提供了连接外围设备的标准方式一样,MCP 让 AI 模型能够以统一接口连接不同的数据源和工具。
核心架构
- MCP 主机:希望通过 MCP 访问数据的程序,如 Claude Desktop、IDE 或 AI 工具。
- MCP 客户端:与服务器保持 1:1 连接的协议客户端。
- MCP 服务器:轻量级程序,通过标准化协议公开特定功能。
- 本地/远程数据源:服务器可安全访问的文件、数据库或外部 API 系统。
环境准备
在开始之前,请确保已安装 Node.js 且版本不低于 18.20.4,否则 npx 命令可能无法正常工作。同时需要申请高德地图的 AMAP_MAPS_API_KEY,获取地址如下:
高德地图 MCP 服务提供的工具列表包含天气查询等功能,例如 maps_weather 支持根据城市名称或 adcode 查询指定城市的天气。
Python SDK 接入
首先安装必要的依赖包:
pip install mcp
接下来编写客户端代码。这里需要注意环境变量中填入你的高德 Key,实际运行时请替换为有效值。代码逻辑分为初始化连接、列出可用工具以及调用具体工具三个步骤。
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": "your_key_here"}
)
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())
运行后你会看到服务端暴露的工具列表,随后即可通过 call_tool 方法传入参数获取天气数据。这种异步模式非常适合集成到现有的 AI Agent 流程中。
Java SDK 接入
如果你更习惯使用 Java,也可以参考官方迁移指南进行开发。当前推荐使用 0.8.1 及以上版本。
Maven 依赖
<!-- https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp -->
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
<version>0.8.1</version>
</dependency>
代码示例
Java 端同样采用同步客户端构建方式,配置与服务端通信参数后即可调用。
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", "your_key_here")
.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());
}
}

