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

运行效果

相关推荐
世人万千丶11 小时前
鸿蒙Crash高级捕获与异常监控:全局异常兜底/崩溃栈解析/符号表还原/智能聚类/闭环修复
学习·机器学习·华为·数据挖掘·harmonyos·鸿蒙·聚类
Jul1en_12 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
fengci.12 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
m4Rk_13 小时前
【论文阅读】Agent 记忆机制(28):MEM1——将记忆压缩融入推理,实现近似恒定上下文的长程智能体
论文阅读·人工智能·学习·开源·github
一只小菜鸡..13 小时前
南京大学 操作系统 (JYY) 学习笔记:持久化的黑魔法——从磁铁、刻坑到闪存电荷
服务器·笔记·学习
Beginner x_u14 小时前
Codex Rules 与 Skills:项目级和全局级配置一览
ai·codex·rules·skill
Embedded-Xin14 小时前
Rust学习——Cargo工具
linux·学习·架构·rust·嵌入式
xcLeigh15 小时前
KingbaseES 的卢智能运维体架构深度拆解
运维·数据库·人工智能·ai·架构·ffmpeg·智能体
恣逍信点15 小时前
《凌微经 · 理悖相涵》导论:“我思”事实——知识理论之根基
人工智能·科技·学习·生活·量子计算·交友·哲学