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->选择模型广场-->选择高德

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()
运行效果
