Jean's Blog

一个专注软件测试开发技术的个人博客

0%

MCP模型上下文协议介绍

什么是MCP

大模型和外部工具交互的标准化协议,官方网址:https://modelcontextprotocol.io/docs/getting-started/intro

模型上下文协议(MCP ModelContextProtocol)正迅速成为AI领域的核心基础设施标准,它通过标准化大语言模型与外部工具的交互方式,解决了AI应用开发中的关键瓶颈,推动了智能体从实验室走向商业化的进程。这一由Anthropic于2024年11月开源的协议,已被OpenAI、阿里云、腾讯、字节跳动等全球科技巨头广泛采纳,形成了一场静默的AI革命。MCP的流行不仅源于其技术创新,更在于它满足了AI产业从单体智能向互联网络转变的迫切需求,为AI应用的规模化落地提供了关键支撑。

可以将 MCP 想象成用于 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 也提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。

image.png

MCP原理

MCP的核心原理

image.png

MCP服务应用

image.png

MCP 的核心原理是将互联网服务(高德、谷歌)或本地操作系统 API(文件系统、数据库、终端)封装成 AI 智能体能够理解和使用的 Tools 工具,让 AI 智能体能够自由地调用这些 Tools 工具实现复杂的业务逻辑和功能。

我们可以在ModelScope市面上的一些各个方面的MCP服务,地址:https://modelscope.cn/mcp

MCP的优势

解决了智能体开发过程中的关键效率问题

MCP之所以迅速火爆,首先在于它解决了AI应用开发中的关键痛点。传统模式下,大模型与外部工具的集成需要为每个工具单独开发接口,形成了”M个智能体×N个工具“的复杂度。

MCP通过标准化交互规则,将复杂的”M×N”集成简化为”M+N”模式,使开发者只需遵循协议标准,就能实现AI模型与各类工具的即插即用。这种标准化不仅降低了开发门槛,还提高了系统的可扩展性和互操作性。

基于MCP的智能体架构

graph TD
    A[智能体] --> B[大模型]
    A --> C[工具]
    C --> D[本地工具 Function]
    C --> E[远程工具 MCP]
    E --> F[远程MCP Server]
    E --> G[本地MCP Server]

MCP服务接入示例

接入MCP核心包

1
2
3
4
# 用于自定义MCP开发服务
pip install mcp
# langchian接入mcp服务
pip install langchain-mcp-adapters

高德MCP服务接入与智能体

高德MCP服务介绍,官方地址:https://lbs.amap.com/api/mcp-server/summary

第一步:MCP客户端开发

  1. 安装依赖:pip install langchain_mcp_adapters

  2. 获取高德应用key: https://lbs.amap.com/api/mcp-server/create-project-and-key

  3. 开发高德mcp客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # @Time:2025/9/16 15:40
    # @Author:jinglv
    import asyncio
    import os

    from dotenv import load_dotenv

    # 加载 .env 文件中的变量
    load_dotenv()
    from langchain_mcp_adapters.client import MultiServerMCPClient


    async def create_amap_mcp_client():
    """创建MCP客户端"""
    amap_key = os.environ.get("AMAP_KEY")

    client = MultiServerMCPClient({
    "amap": {
    "url": f"https://mcp.amap.com/sse?key={amap_key}",
    "transport": "sse",
    }
    })

    tools = await client.get_tools()

    return client, tools


    if __name__ == '__main__':
    client, tools = asyncio.run(create_amap_mcp_client())
    print('-------------------------------查看是否创建完成客户端------------------------')
    print(client)
    print('-------------------------------查看提供的工具有哪些------------------------')
    print(tools)

第二步:创建智能体,集成MCP工具

  1. 获取mcp tools
  2. 创建智能体
  3. 创建提示词
  4. 异步运行智能体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import os

from dotenv import load_dotenv

# 加载 .env 文件中的变量
load_dotenv()
from langchain_mcp_adapters.client import MultiServerMCPClient


async def create_amap_mcp_client():
"""创建MCP客户端"""
amap_key = os.environ.get("AMAP_KEY")

client = MultiServerMCPClient({
"amap": {
"url": f"https://mcp.amap.com/sse?key={amap_key}",
"transport": "sse",
}
})

tools = await client.get_tools()

return client, tools

from langchain_openai import ChatOpenAI

from langchain.prompts import PromptTemplate
from langchain.agents import initialize_agent, AgentType


async def create_run_agent():
"""创建智能体,集成MCP工具"""
# 1.获取mcp tools
client, tools = await create_amap_mcp_client()
# 2.创建智能体
qv_llm = ChatOpenAI(
model=os.getenv("LLM_MODEL"),
base_url=os.getenv("LLM_BASE_URL"),
api_key=os.getenv("LLM_API_KEY"),
streaming=True,
)
agent = initialize_agent(
tools=tools,
llm=qv_llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 打开调试模式
)
# 3.创建提示词
prompt_template = PromptTemplate.from_template(
"你是一个智能助手,可以调用高德 MCP 工具。\n\n问题: {input}"
)

prompt = prompt_template.format(input="提供北京南站的坐标")
# 4.异步运行智能体
res = await agent.ainvoke(prompt)
return res

基于高德MCP的复杂路径规划+可视化展示

增加文件工具及扩展智能体工具,文件工具需要安装依赖:pip install langchain_community

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import asyncio
import os

from dotenv import load_dotenv

# 加载 .env 文件中的变量
load_dotenv()
from langchain_mcp_adapters.client import MultiServerMCPClient


async def create_amap_mcp_client():
"""创建MCP客户端"""
amap_key = os.environ.get("AMAP_KEY")

client = MultiServerMCPClient({
"amap": {
"url": f"https://mcp.amap.com/sse?key={amap_key}",
"transport": "sse",
}
})

tools = await client.get_tools()

return client, tools


from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits import FileManagementToolkit

from langchain.prompts import PromptTemplate
from langchain.agents import initialize_agent, AgentType


async def create_run_agent():
"""创建智能体,集成MCP工具"""
# 1.获取mcp tools
client, tools = await create_amap_mcp_client()

# 增加获取文件工具
file_toolkit = FileManagementToolkit(root_dir="/Users/jinglv/PycharmProjects/ai-agent-dev/temp")
file_tools = file_toolkit.get_tools()

# 2.创建智能体
qv_llm = ChatOpenAI(
model=os.getenv("LLM_MODEL"),
base_url=os.getenv("LLM_BASE_URL"),
api_key=os.getenv("LLM_API_KEY"),
streaming=True,
)

agent = initialize_agent(
tools=tools + file_tools,
llm=qv_llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 打开调试模式
)
# 3.创建提示词
prompt_template = PromptTemplate.from_template(
"你是一个智能助手,可以调用高德 MCP 工具。\n\n问题: {input}"
)

prompt = prompt_template.format(input="""
目标:
- 明天上午10点我要从北京南站到北京望京SOHO
- 线路选择:公路地址或打车
- 考虑出行时间和路线,以及天气状况和穿衣建议

要求:
- 制作网页来展示出现线路和位置,输出一个HTML页面,将网页保存到:/Users/jinglv/PycharmProjects/ai-agent-dev/temp目录下
- 网页使用简约美观的页面风格,以及卡片展示
""")
# 4.异步运行智能体
res = await agent.ainvoke(prompt)
return res


if __name__ == '__main__':
client, tools = asyncio.run(create_amap_mcp_client())
print('-------------------------------查看是否创建完成客户端------------------------')
print(client)
print('-------------------------------查看提供的工具有哪些------------------------')
print(tools)
res = asyncio.run(create_run_agent())
print('-------------------------------智能体结合MCP客户端执行结果------------------------')
print(res)