当前位置: 首页 > news >正文

MCP概述及MCP Server的使用和实现(谷歌ADK使用MCP Server)

MCP

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口

文档:Introduction - Model Context Protocol

MCP 可以直接在 AI 与数据(包括本地数据和互联网数据)之间架起一座桥梁,通过 MCP 服务器和 MCP 客户端,大家只要都遵循这套协议,就能实现“万物互联”。

MCP 与 Function Calling 的区别

● MCP(Model Context Protocol),模型上下文协议

● Function Calling,函数调用

这两种技术都旨在增强 AI 模型与外部数据的交互能力。

MCP 的核心技术

架构设计

MCP 遵循客户端-服务器架构(client-server),其中包含以下几个核心概念:

1.  MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude 、IDE 或 AI 工具)。

2.  MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持 1:1 的连接。

3.  MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。

4.  本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。

5.  远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。

MCP Client

MCP client 充当 LLM 和 MCP server 之间的桥梁,MCP client 的工作流程如下:

● MCP client 首先从 MCP server 获取可用的工具列表。

● 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。

● LLM 决定是否需要使用工具以及使用哪些工具。

● 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用。

● 工具调用的结果会被发送回 LLM。

● LLM 基于所有信息生成自然语言响应。

● 最后将响应展示给用户。

MCP Server

MCP server 是 MCP 架构中的关键组件,它可以提供 3 种主要类型的功能:

● 资源(Resources):类似文件的数据,可以被客户端读取,如 API 响应或文件内容。

● 工具(Tools):可以被 LLM 调用的函数(需要用户批准)。

● 提示(Prompts):预先编写的模板,帮助用户完成特定任务。

通信机制

两种主要的通信机制:基于标准输入输出的本地通信和基于SSE(Server-Sent-Events)的远程通信。这两种机制都使用 JSON-RPC 2.0格式进行消息传输,确保了通信的标准化和可扩展性。

● 本地通信通过 stdio 传输数据,适用于在同一台机器上运行的客户端和服务器之间的通信。

● 远程通信利用 SSE 与 HTTP 结合,实现跨网络的实时数据传输,适用于需要访问远程资源或分布式部署的场景。

现有MCP Server

有很多可以直接使用的MCP server

百度MCP 广场:

阿里

github项目

GitHub - punkpeye/awesome-mcp-servers: A collection of MCP servers.

有非常多的github上开源的mcp server

使用示例

以高德地图的mcp server为例。

mcp server配置文件(json)示例:

stdio

{"mcpServers": {#高德"amap-maps": {"command": "npx","args": ["-y", "@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "您在高德官网上申请的key"}}}#另一个"sequential-thinking": {   "command": "npx",    "args": ["-y",       "@modelcontextprotocol/server-sequential-thinking"]} }
}

{"command": "npx",

"args": ["-y", "@amap/amap-maps-mcp-server"],

"env": {

"AMAP_MAPS_API_KEY": "您在高德官网上申请的key"

}

}

sse

{"mcpServers": {"amap-amap-sse": {"url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key"}}
}

一个mcp server中可以有多个工具等服务。

基于adk的简单使用

# stdio
tools, exit_stack = await MCPToolset.from_server(connection_params=StdioServerParameters(command='npx',args=["-y","@amap/amap-maps-mcp-server"],env={"AMAP_MAPS_API_KEY": Amaps_api_key}))# sse
tools, exit_stack = await MCPToolset.from_server(connection_params=SseServerParams(url="http://0.0.0.0:9000/sse"),)

FastMCP

文档:The FastMCP Server - FastMCP

虽然 FastMCP 仍然支持 SSE,但它已被弃用,Streamable HTTP 是新项目的首选。

构建MCP Server
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP# Initialize FastMCP server
mcp = FastMCP("weather")
# 工具 function
@mcp.tool()
async def get_alerts(state: str) -> str:"""Get weather alerts for a US state.pass
# 可请求特定数据的参数化资源
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:"""Get a personalized greeting"""return f"Hello, {name}!"
# 用于指导llm的可重用消息模板
@mcp.prompt()
def analyze_data(data_points: list[float]) -> str:"""Creates a prompt asking for analysis of numerical data."""formatted_data = ", ".join(str(point) for point in data_points)return f"Please analyze these data points: {formatted_data}"if __name__ == "__main__":# Initialize and run the server# mcp.run(transport='stdio')mcp.run(transport="streamable-http",host="127.0.0.1",port=4200,path="/my-custom-path",log_level="debug",)

MCP Client
# streamable-http传输类型
import asyncio
from fastmcp import Client
async def example():async with Client("http://127.0.0.1:4200/my-custom-path") as client:await client.list_tools()
if __name__ == "__main__":asyncio.run(example())

相关文章:

  • P6123 [NEERC 2016] Hard Refactoring 题解
  • Invicti-Professional-V25.5
  • C/C++实践(九)C++二叉搜索树深入讲解
  • 高效批量合并Word文档的工具介绍
  • FC7300 PWM MCAL配置引导
  • 关于计算机系统和数据原子性的联系
  • Redis 五种类型基础操作(redis-cli + Spring Data Redis)
  • 反编译读取.class文件
  • 从微积分到集合论(1630-1910)(历史简介)——第1章——积分技巧(1630-1660)(Kirsti Møller Pedersen)
  • 时源芯微|磁珠
  • PCL 计算一条射线与二次曲面的交点
  • 【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
  • 显性知识的主要特征
  • HNU工训--计算机串口数据收发与测量
  • 2025年PMP 学习十六 第11章 项目风险管理 (总章)
  • 如何在自动化脚本中向控件输入文本?
  • ohttps开启群晖ssl证书自动更新
  • Leetcode76覆盖最小子串
  • 五月份嵌入式面试总结
  • 锐捷交换机STP环路日志信息解读
  • 河南一县政府党组成员签订抵制违规吃喝问题承诺书,现场交给县长
  • 自然资源部:不动产登记累计化解遗留问题房屋2000多万套
  • 郑钦文憾负高芙,止步WTA1000罗马站四强
  • 李强:把做强国内大循环作为推动经济行稳致远的战略之举
  • 因港而兴,“长江黄金水道”上的宜宾故事
  • 苏轼“胡为适南海”?