目录

什么是MCP

MCP是怎么工作的?

环境运行安装

MCP+AI实现高德地图酒店查询

获取高德api-key

代码讲解

运行演示


什么是MCP

MCP(Model Context Protocol)可以理解为**大模型与外部世界打交道的“万能转接头”**。它的核心作用是:**让大模型(如Claude、GPT等)能够安全、标准化地调用外部工具和服务**,从而完成更复杂的任务。

MCP是怎么工作的?

它采用**客户端-服务器架构**,分为三个核心角色:

MCP Host:如 Claude Desktop、Cursor、VS Code 等,负责运行大模型;
  
MCP Client:Host 内部的小助手,负责和服务器通信;
  
MCP Server:连接外部服务的“翻译器”,比如地图API、数据库、本地文件系统等。
  

工作流程如下:

1. 用户提问;
  
2. 大模型判断是否需要调用工具;
  
3. MCP Client 把请求发给 MCP Server;
  
4. MCP Server 执行具体操作(如查天气、写文件);
  
5. 结果返回给大模型,生成最终回答。

环境运行安装

需求:Python 3.10+,node.js,npm

安装uv

pip install uv

创建一个空的python项目

初始化项目

Uv init
Uv venv

激活环境

.venv\Scripts\activate

安装mcp支持

uv add "mcp[cli]"

如何查看mcp是否安装完成

直接终端输入下面的指令

mcp

输出

当输出这个时候就证明安装完成了。

MCP+AI实现高德地图酒店查询

获取高德api-key

首先我们要获取到高德地图的api-key。

高德开放平台 | 高德地图API

登录之后点击应用管理

创建新的应用

点击添加key

选web服务

其他默认填写就行了,然后复制生成的api_key就好了

代码讲解

在已经有的项目结构根目录下创建mcp.json文件

如图所示

然后将这串全部复制到你json文件里面替换成你的api-key就行了

{
    "mcpServers": {
      "amap-mcp": {
        "url": "https://mcp.amap.com/sse?key=你的api-key"
      }
    }
}

连接mcp

点击个人设置

点击服务连接

打开按钮,等待为绿色连接状态就OK了

如果没有工具显示

选择配置文件添加,将已经编写好的json文件复制进去,保存之后就会有了

光有mcp是能直接获取数据输出的,不过会通过网络走web查询,不经过mcp工具进行输出,所有我们需要创建mcp工具函数。

在main.py创建

import asyncio
import httpx
import os
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("gaode-hotel-search")

@mcp.tool()
async def search_hotels_nearby(location: str, radius: int = 5000):
    """根据经纬度搜索附近酒店"""
    url = "https://restapi.amap.com/v5/place/around"
    # 使用环境变量中的API密钥,避免硬编码
    api_key = os.getenv("AMAP_API_KEY", "你的api-key")
    params = {
        "key": api_key,
        "location": location,
        "keywords": "酒店",
        "radius": radius,
        "types": "住宿服务"
    }
    # 添加超时设置和错误处理
    timeout = httpx.Timeout(10.0, connect=5.0)
    async with httpx.AsyncClient(timeout=timeout) as client:
        try:
            res = await client.get(url, params=params)
            res.raise_for_status()
            return res.json()
        except httpx.TimeoutException:
            return {"error": "请求超时,请检查网络连接"}
        except httpx.RequestError as e:
            return {"error": f"请求错误: {str(e)}"}
        except Exception as e:
            return {"error": f"未知错误: {str(e)}"}

if __name__ == "__main__":
    mcp.run(transport="stdio")

这串代码具体做了什么。

首先创建mcp实例对话(约等于你创建fastapi的app对象一样)

使用

@mcp.tool()

创建工具使用方法函数的接口对象

这一串是初始化定义传递的数据参数类型和目标网址

"""根据经纬度搜索附近酒店"""
    url = "https://restapi.amap.com/v5/place/around"
    # 使用环境变量中的API密钥,避免硬编码
    api_key = os.getenv("AMAP_API_KEY", "你的api-key")
    params = {
        "key": api_key,
        "location": location,
        "keywords": "酒店",
        "radius": radius,
        "types": "住宿服务"
    }

这一串则是定义了大模型去哪个路由地址去查询你所需要的地址去获取参数,返回的参数转换为json格式让大模型进行转换输出

 async with httpx.AsyncClient(timeout=timeout) as client:
        try:
            res = await client.get(url, params=params)
            res.raise_for_status()
            return res.json()
        except httpx.TimeoutException:
            return {"error": "请求超时,请检查网络连接"}
        except httpx.RequestError as e:
            return {"error": f"请求错误: {str(e)}"}
        except Exception as e:
            return {"error": f"未知错误: {str(e)}"}

运行演示

记得运行时勾选上工具。

然后运行py文件

输出大概演示

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐