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()

运行效果

相关推荐
水月wwww2 分钟前
【OpenClaw学习记录】
学习
一个天蝎座 白勺 程序猿15 分钟前
AI入门踩坑实录:我换了3种语言才敢说,Python真的是入门唯一选择吗?
开发语言·人工智能·python·ai
剪刀石头布Cheers17 分钟前
Ubuntu Hermes安装关键步骤
linux·运维·ubuntu·ai·agent·hermes
中间件XL19 分钟前
spring ai alibaba原理源码分析(一)-架构
人工智能·ai·alibaba·spring ai·agent框架
Orange_sparkle23 分钟前
claude code高级使用手册
python·ai·claude code
xieliyu.23 分钟前
Java手搓数据结构:从零模拟实现顺序表增删改查
java·开发语言·数据结构·学习·顺序表
拥有必珍惜26 分钟前
官方与社区热门的MCP服务器
ai·mcp
楼田莉子29 分钟前
仿muduo库的高并发服务器——正则表达式与any类介绍及其简单模拟实现
linux·服务器·c++·学习·设计模式
xiaoxiaoxiaolll30 分钟前
《Nature Communications》:集成热光调制与3D空间并行的光子神经网络芯片
学习
码喽7号35 分钟前
JsonWeb token(JWT)跨域认证
spring boot·学习