MCP学习

1、概述

类似一个接口服务,基于标准mcp协议开发一次mcpserver,所有支持MCP的模型,都能直接调用。提供给模型客户端是一个接口定义(工具名称、参数等),模型根据上下文决定是否/何时调用函数。对于模型客户端,不知道这个接口如何实现的,无法看到代码。

模型相当于大脑,mcp接口相当于手、脚

【MCP 采用客户端-服务器(Client-Server)架构,主要包括以下核心组件】

MCP Host:运行 AI 模型的环境,如 Claude Desktop、Cursor IDE 等。

MCP Client:嵌入在 Host 中的组件,负责发起请求并与 MCP Server 通信。

MCP Server:轻量级服务,提供特定功能(如数据查询、API 调用等),供 AI 模型调用。

2、使用第三方的MCP服务(以高德mcp服务为例)

1、打开modelscope->选择模型广场-->选择高德

https://modelscope.cn/home

2、服务配置,选择Stdio

这里的AMAP_MAPS_API_KEY是key,要去高德上注册账号获取key的

{

"mcpServers": {

"amap-maps": {

"args": [

"-y",

"@amap/amap-maps-mcp-server"

],

"command": "npx",

"env": {

"AMAP_MAPS_API_KEY": ""

}

}

}

}

【高德key获取】

1,登录高德开放平台 https://lbs.amap.com/

2,注册成为开发者 => 创建应用 => 应用服务平台 选择 Web服务 => 获取 API KEY

3、使用具有MCP功能的客户端(Agent IDE)进行调用,这里我用的lingma

把高德MCP 配置完整粘贴到灵马(Lingma)标准 MCP 配置结构

成功加载出12个高德工具,说明配置正确

Agent 模式调用高德 MCP 对话

3、高代码调用高德mcp(qwen_agent + 高德mcp)

核心如何注册高德mcp

python 复制代码
"""基于 Assistant 实现的高德地图智能助手

这个模块提供了一个智能地图助手,可以:
1. 通过自然语言查询地图服务
2. 支持路线规划、地址解析、天气查询、POI搜索等
3. 支持 GUI、TUI、测试三种交互模式
"""

import os
from typing import Optional
import dashscope
from qwen_agent.agents import Assistant

# 配置 DashScope
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY', '')
dashscope.timeout = 30

def init_agent_service():
    """初始化高德地图助手服务"""
    
    # LLM 模型配置
    llm_cfg = {
        'model': 'qwen-max',
        'timeout': 30,
        'retry_count': 3,
    }

    # 系统角色:高德地图智能助手
    system = (
        '你是一个专业的高德地图智能助手。'
        '你可以通过自然语言完成地址解析、经纬度转换、路线规划、天气查询、POI搜索、IP定位、距离计算等功能。'
        '你必须优先使用高德MCP工具回答用户的地图相关问题。'
    )

    # 高德 MCP 配置
    tools = [{
        "mcpServers": {
            "amap-maps": {
                "command": "npx",
                "args": [
                    "-y",
                    "@amap/amap-maps-mcp-server"
                ],
                "env": {
                    "AMAP_MAPS_API_KEY": "xxxxxxxxxxxx"
                }
            }
        }
    }]

    try:
        bot = Assistant(
            llm=llm_cfg,
            name='高德地图助手',
            description='路线规划、地址查询、天气、POI搜索',
            system_message=system,
            function_list=tools,
        )
        print("高德地图助手初始化成功!")
        return bot
    except Exception as e:
        print(f"助手初始化失败: {str(e)}")
        raise

def test(query='帮我查一下北京天安门的经纬度', file: Optional[str] = None):
    """测试模式"""
    try:
        bot = init_agent_service()
        messages = []
        if not file:
            messages.append({'role': 'user', 'content': query})
        else:
            messages.append({'role': 'user', 'content': [{'text': query}, {'file': file}]})

        print("正在处理请求...")
        for response in bot.run(messages):
            print('bot response:', response)
    except Exception as e:
        print(f"出错: {str(e)}")

def app_tui():
    """终端交互模式"""
    try:
        bot = init_agent_service()
        messages = []
        while True:
            query = input('user question: ')
            file = input('file url (回车跳过): ').strip()
            
            if not query:
                print('输入不能为空!')
                continue
                
            if not file:
                messages.append({'role': 'user', 'content': query})
            else:
                messages.append({'role': 'user', 'content': [{'text': query}, {'file': file}]})

            print("处理中...")
            res = []
            for res in bot.run(messages):
                print('bot response:', res)
            messages.extend(res)
    except Exception as e:
        print(f"终端模式异常: {str(e)}")

if __name__ == '__main__':
    test()

运行效果

从日志可以明确:

MCP 服务初始化成功:Initializing MCP tools from mcp servers: ['amap-maps'] 说明高德地图 MCP 服务已被正确识别并加载

stdio 客户端启动正常:Initializing a MCP stdio_client 表示 MCP 客户端进程已启动,高德地图助手初始化成功! 确认 Agent 服务就绪

4、自定义一个MCP服务

FastMCP 是 Python MCP SDK 中的轻量级服务器框架,特点如下:

自定义MCP server

安装依赖:

pip install mcp -i https://pypi.tuna.tsinghua.edu.cn/simple

python 复制代码
from mcp.server.fastmcp import FastMCP

# 1. 初始化FastMCP服务(仅1行)
mcp = FastMCP("MyTextStatsServer")

# 2. 注册工具:文本统计(自动发现,无需额外配置)
@mcp.tool()
def count_text_stats(text: str) -> str:
    """
    统计文本的字符数、行数、单词数
    :param text: 需要统计的文本内容
    :return: 结构化统计结果
    """
    char_count = len(text)
    line_count = len(text.splitlines())
    word_count = len(text.split())
    
    return (
        f"文本统计结果:\n"
        f"总字符数(含空格/标点):{char_count}\n"
        f"总行数:{line_count}\n"
        f"总单词数(按空格分割):{word_count}"
    )

# 3. 启动服务(stdio模式,适配Agent调用)
if __name__ == "__main__":
    mcp.run()

agent调用示例

python 复制代码
import os
import dashscope
from qwen_agent.agents import Assistant

dashscope.api_key = os.getenv("DASHSCOPE_API_KEY", "")

def init_agent():
    llm_cfg = {
        "model": "qwen-max",
        "timeout": 30,
        "retry_count": 3
    }

    system = "你必须优先调用MCP工具回答问题,参数必须完整。"

    tools = [{
        "mcpServers": {
            "my-text-stats": {
                "command": "python",
                "args": ["mcp_fastmcp_server.py"]
            }
        }
    }]

    return Assistant(
        llm=llm_cfg,
        system_message=system,
        function_list=tools
    )

def chat():
    bot = init_agent()
    messages = []
    
    # 内置示例问题(代码中直接写好)
    user_input = "帮我统计这句话的字数:我正在学习自定义MCP服务"
    
    print("用户问题:", user_input)
    messages.append({"role": "user", "content": user_input})
    
    for response in bot.run(messages):
        print(response)

if __name__ == "__main__":
    chat()

运行效果

相关推荐
凌波粒3 小时前
D2L学习笔记:安装、张量与数据处理
笔记·python·学习·pandas
chools3 小时前
Java后端拥抱AI开发之个人学习路线 - - Spring AI【第一期】
java·人工智能·学习·spring·ai
忙什么果4 小时前
transformer学习笔记2
笔记·学习·transformer
带刺的坐椅4 小时前
SolonCode CLI v2026.4.5 发布(编码智能体)
ai·llm·ai编程·cli·claudecode·opencode·sloncode
ZhiqianXia5 小时前
Gem5 学习笔记(2) : Gem5 建模要点与基本思路
笔记·学习
Dxy12393102165 小时前
ECharts折线图入门学习:从基础到实战的完整指南
学习·信息可视化·echarts
未来转换5 小时前
OpenClaw 命令大全以及使用指南
python·ai·openclaw
_李小白5 小时前
【OSG学习笔记】Day 25: OSG 设计架构解析
笔记·学习·架构
风中的小熊生气5 小时前
MQ 学习笔记
笔记·学习