当前位置: 首页 > 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())

http://www.xdnf.cn/news/490051.html

相关文章:

  • 如何在 Windows 上安装类似 Synaptic 的 Chocolatey GUI 包管理器
  • 哈希表的实现02
  • java18
  • 理解位图算法:使用 C++ 实现高效数据查重
  • 4.1 多层感知机 MLP 笔记
  • C语言学习记录--深入理解指针(5)(qsort的练习)
  • Linux基础开发工具大全
  • 连续隐马尔可夫离散隐马尔科夫模型的MATLAB实现
  • falsk-ORM的使用-数据库表的创建
  • 【Linux】动静态库链接原理
  • nnUNet V2代码——图像增强(三)
  • 【数据结构】线性表--栈
  • 金属加工液展|切削液展|2025上海金属加工液展览会
  • 使用unsloth对Qwen3在本地进行微调
  • 一个批量文件Dos2Unix程序(Microsoft Store,开源)1.1.0 编码检测和预览
  • 淘宝扭蛋机系统开发前景分析:解锁电商娱乐化新蓝海
  • HOW - React NextJS 的同构机制
  • Dify中使用插件LocalAI配置模型供应商报错
  • Spring Cloud深度实践:从服务发现到弹性智能API网关全景解析
  • Day29 -JS开发02 -两个实例:dom树(存在dom-xss) 加密及基础的js逆向(明文加密)
  • SAP-ABAP:SAP DMS(文档管理系统)的详细说明,涵盖其核心功能、架构、配置及实际应用
  • spring学习->sprintboot
  • Room数据库
  • Matrix-Game:键鼠实时控制、实时生成的游戏生成模型(论文代码详细解读)
  • Java并发编程-线程池(四)
  • Reth(冗余以太网接口) 和Bridge-Aggregation(链路聚合接口)区别
  • 一个进程中可以有多个 WebView2 控件,它们各自有独立的用户数据目录,COOKIE共享
  • 内存泄漏系列专题分析之十六:高通相机CamX内存泄漏内存占用分析--chi-cdk部分ION内存拆解方法
  • 跳转传参的使用
  • Java生产环境设限参数教学