Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气工具示例
文章目录
- MCP 官网
- Github
- MCP 仓库
- 简介
- 架构
- 高德地图 MCP 客户端示例
- python-sdk 客户端
- java-sdk 客户端
MCP 官网
- https://modelcontextprotocol.io/introduction
Github
- python-sdk:https://github.com/modelcontextprotocol/python-sdk
- java-sdk:https://github.com/modelcontextprotocol/java-sdk
- typescript-sdk:https://github.com/modelcontextprotocol/typescript-sdk
MCP 仓库
-
https://mcp.so/zh
-
https://supermachine.ai/public-mcp-servers
简介
MCP 是一种开放协议,它标准化了应用程序向 LLM 提供上下文的方式。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。
架构
- MCP 主机:希望通过 MCP 访问数据的程序,例如 Claude Desktop、IDE 或 AI 工具
- MCP 客户端:与服务器保持 1:1 连接的协议客户端
- MCP 服务器:轻量级程序,每个程序都通过标准化模型上下文协议公开特定功能
- 本地数据源:MCP 服务器可以安全访问的您的计算机文件、数据库和服务
- 远程服务:MCP 服务器可通过互联网(例如通过 API)连接到的外部系统
高德地图 MCP 客户端示例
- Node 下载:https://nodejs.org/zh-cn/download
注: Node版本 >= 18.20.4 ,版本太低无法执行 npx 命令。
- 高德地图文档(申请 AMAP_MAPS_API_KEY):https://lbs.amap.com/api/mcp-server/summary
python-sdk 客户端
pip install 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())
java-sdk 客户端
- 0.7版本迁移0.8版指南:https://github.com/modelcontextprotocol/java-sdk/blob/main/migration-0.8.0.md
<!-- https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp -->
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
<version>0.8.1</version>
</dependency>
// https://mvnrepository.com/artifact/io.modelcontextprotocol.sdk/mcp
implementation("io.modelcontextprotocol.sdk:mcp:0.8.1")
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());
}
}