AI算法与图像处理 | 从零搭建智能体!构建第一个MCP

本文来源公众号“AI算法与图像处理”,仅用于学术分享,侵权删,干货满满。

原文链接:从零搭建智能体!构建第一个MCP

大家好,这是从零搭建智能体第二篇,本文将介绍MCP的一些核心概念,并根据官方例子,搭建一个用关键词查询arxiv上最新论文的MCP

MCP简介:

Anthropic提出的Model Context Protocol(MCP) 是一种开放协议,它标准化了应用程序如何为大型语言模型 (LLM) 提供上下文。它如同一个专门为AI 应用设计的 USB-C 端口。让大模型非常轻易地调用外部工具。

MCP架构组成:

MCP 架构的主要参与者是:

  • MCP Host

     协调和管理一个或多个 MCP 客户端的 AI 应用程序

  • MCP Client

    维护与 MCP 服务器的连接并从 MCP 服务器获取上下文供 MCP 主机使用的组件

  • MCP Server

    向 MCP 客户端提供上下文的程序

MCP 支持两种传输机制:

  • Stdio transport

    使用标准输入/输出流在同一台机器上的本地进程之间进行直接进程通信,提供最佳性能,没有网络开销。

  • HTTP with Server-Sent Events(SSE) 或Streamable HTTP transport

    将 HTTP POST 用于客户端到服务器消息,并使用可选的服务器发送事件来实现流式处理功能。

MCP 定义了server可以公开的三个核心基本操作:

  • Tools

    AI 应用程序可以调用action的可执行函数(例如,文件作、API 调用、数据库查询)

  • Resources

    向 AI 应用程序提供上下文信息的数据源(例如,文件内容、数据库记录、API 响应)

  • Prompts

    可重用的模板,有助于构建与语言模型的交互(例如,系统提示、少量示例)

实现一个MCP

基于了解上面的一些概念,以及参考官方例子:https://github.com/modelcontextprotocol/python-sdk

我们用两个任务理解一下,一个是官方例子,采用stdio本地调试,另一个构建自己的MCP,采用sse的通信方式,用代码实现本地调用

任务一:创建一个简单的 MCP server,功能是暴露出计算器工具和数据

# fastmcp_demo.py

"""
FastMCP quickstart example.

cd to the `examples/snippets/clients` directory and run:
    uv run server fastmcp_quickstart stdio
"""

from mcp.server.fastmcp import FastMCP

# Create an MCP server
mcp = FastMCP("Demo")


# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b


# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a personalized greeting"""
    returnf"Hello, {name}!"


# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
    """Generate a greeting prompt"""
    styles = {
        "friendly": "Please write a warm, friendly greeting",
        "formal": "Please write a formal, professional greeting",
        "casual": "Please write a casual, relaxed greeting",
    }

    returnf"{styles.get(style, styles['friendly'])} for someone named {name}."

if __name__ == "__main__":
    mcp.run(transport='stdio')

这里在本地使用 inspector 来测试,在终端中运行下面的代码,会自动打开一个浏览器:

npx -y @modelcontextprotocol/inspector python fastmcp_demo.py    

1、先链接server,点击 connect

2、查看Resource功能

返回结果

{  "contents": [    {      "uri": "greeting://Tony",      "mimeType": "text/plain",      "text": "Hello, Tony!"    }  ]}

3、查看Prompts功能

返回结果

4、查看Tools功能

返回结果

任务二:定义一个帮忙查询arxiv最新论文的MCP

pip install arixv

功能说明:

通过输入查询的关键词,获取arxiv上最新的论文,例如这里搜索关键词为“qwen”

代码:

# sse_arxiv_search.py
import httpx
import arxiv
import json
from mcp.server import FastMCP


app = FastMCP('arxiv-search', port=9000)


@app.tool()
async def arxiv_search(query: str) -> str:
    """
    {
      "name": "arxiv_search",
      "description": "根据需要搜索的关键词,返回arxiv上相关的最新论文",
      "inputSchema":
      {
          "type": "object",
          "properties":
          {
              "query":
              {
                  "description": "论文搜索关键词",
                  "type": "string"
              }
          },
          "required":
          [
              "query"
          ]
      },
    }
    """

    client = arxiv.Client()
    search = arxiv.Search(
        query=query,
        max_results=2,
        sort_by=arxiv.SortCriterion.SubmittedDate
    )
    search_results = []
    for result in client.results(search):  # 用新的调用方式
        single_result = {
                        'url': result.entry_id,
                        'title': result.title,
                        # 'summary': result.summary
                         }
        search_results.append(single_result)
    return json.dumps(search_results)

if __name__ == "__main__":
    app.run(transport='sse')

采用sse启动,按照下面调整

app.run(transport='stdio')
调整为
app.run(transport='sse')

启动server

python sse_arxiv_search.py

client代码:

import asyncio
from mcp.client.sse import sse_client
from mcp import ClientSession
import json

asyncdef main():
    asyncwith sse_client('http://localhost:9000/sse') as streams:
        asyncwith ClientSession(*streams) as session:
            await session.initialize()
            tools = await session.list_tools()
            print(tools)
            res = await session.call_tool('arxiv_search', {'query': 'qwen'})
            print(res)


if __name__ == '__main__':
    asyncio.run(main())

使用client调用,返回结果如下

参考资料

https://modelcontextprotocol.io/docs/getting-started/intro

https://zhuanlan.zhihu.com/p/1891971357694219896

https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide

https://levelup.gitconnected.com/mcp-server-and-client-with-sse-the-new-streamable-http-d860850d9d9d

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值