前言
目前mcp协议是给deepseek大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力!
如何开发一个mcp?
mcp是一种协议,指的是模型上下文协议 (Model Context Protocol)。
官方结成的mcp
https://github.com/modelcontextprotocol/python-sdk
mcp库
pip install mcp
from mcp.server.fastmcp import FastMCP
我们先来做一个简单的案例
from mcp.server.fastmcp import FastMCP
import requests
mcp = FastMCP("spider")
@mcp.tool()
def crawl(url: str) -> int:
"""获取网页的源代码"""
resposne = requests.get(url)
return response.text
if __name__ == "__main__":
mcp.run(transport='stdio')
#mcp.run(transport="sse")
以上代码实现了FastMCP 库来创建一个简单的 MCP 服务器,它提供一个基本的工具(工具名:crawl),用于是实现源代码的获取。这是一个非常简单的爬虫mcp入门示例,适合理解 MCP 服务器的工作原理和 FastMCP 的基本用法。
代码分析
首先,从 mcp.server.fastmcp 模块中导入了 FastMCP 类。接着,创建了一个 FastMCP 类的实例,命名为 spider。
FastMCP 是服务器的核心类,它负责管理工具、资源和通信。参数「spider」是服务器的名称,用于标识这个 MCP 服务器。
然后,@mcp.tool() 是一个装饰器(decorator),它告诉 FastMCP 将 crawl 函数注册为一个可供客户端调用的工具。
文档字符串(“”“获取网页的源代码”“”):这是函数的描述,客户端(如 MCP Inspector)会显示这个描述,帮助用户理解工具的功能。这个工具可以被外部客户端调用!
例如通过 MCP 协议发送请求,传入url,服务器会返回它的网页源代码。
mcp.run(transport=‘stdio’) 启动 MCP 服务器,进入监听状态,等待客户端的连接和请求。transport=‘stdio’ 指定了通信方式为标准输入输出(Standard I/O)。这意味着服务器通过命令行的标准输入(stdin)和标准输出(stdout)与客户端通信,适合本地开发和测试。
mcp.run(transport=‘stdio’)启动 MCP 服务器,如果需要远程通信,可以更改为其他传输方式(如 ‘sse’,Server-Sent Events)。
fastapi-mcp库
pip install fastapi-mcp
from fastapi_mcp import add_mcp_server
案例分析
import requests
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
from typing import Optional
from fastapi_mcp import add_mcp_server
# Create a simple FastAPI app
app = FastAPI(
title=spider",
description="A simple example API with integrated MCP server",
version="0.1.0",
)
@app.get("/items/{url}", response_model=Item, tags=["items"])
def crawl(url: Optional[str] = Query(None, description="get websource from url")) -> dict:
"""获取网页的源代码"""
resposne = requests.get(url)
return {"response":response.text}
mcp_server = add_mcp_server(
app,
mount_path="/mcp", # 挂着mcp服务器的地址
name="Item API MCP", # mcp服务的名称
description="MCP server for the Item API",
base_url="http://localhost:8000",
describe_all_responses=False,
describe_full_response_schema=False,
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
fastapi_mcp分析
上面的案例引入了fastapi和fastapi-mcp并实例化一个fastapi的类;
然后使用fastapi编写了一个方法用户获取一个url站点的源代码;
使用fastspi-mcp创建一个实例化的mcp_server,将上面的fastapi服务注册为一个mcp服务,可以配置mcp服务调用的路由为http://localhost:8000/mcp
最后导入uvicorn库,正常启动fastapi的服务;可以无缝的将代码转成mcp server!
以上两种实现MCP服务的方式,都可以学习下,尤其是如果你本身对fastapi比较的熟练,那么可以直接使用fastapi-mcp将服务注册为MCP server!如果熟悉python,但是不熟悉fastapi也可以使用官方推荐的mcp库,节省学习的成本,降低学习难度系数!
实战编写mongodb数据库查询MCP服务
import sys
from datetime import datetime
import traceback
import uvicorn
from fastapi_mcp import add_mcp_server
from fastapi import FastAPI, status, HTTPException, Response, Query
import motor.motor_asyncio
app = FastAPI()
......代码省略.....
# 根据结构式获取化合物计算属性的值
@app.get("/api/computes/", status_code=status.HTTP_200_OK, summary="根据结构式获取化合物计算属性的值")
async def computed(smiles: Optional[str] = Query(None, description="Search smiles string")):
result = ChemRdkit(smiles=smiles).computed
if result and result.get("code") == 200:
del result["code"]
return ResponseModel(data=result, message="success")
return ErrorResponseModel(error=result.get("error"), code=status.HTTP_404_NOT_FOUND,
message=result.get("message"))
# 获取单个化合物
@app.get("/api/chemicals/{casno}/", status_code=status.HTTP_200_OK, summary="根据casno获取单个化合物")
async def chemicals(casno:str):
""""
根据casno获取化合物
"""
result = await chemical_get_data(casno=casno)
if result:
return ResponseModel(data=result, message="success")
return ErrorResponseModel(error="数据不存在", code=status.HTTP_404_NOT_FOUND, message="数据不存在")
# raise HTTPException(400, "Something went wrong")
# 访问结构式图片
@app.get("/image/{filename}/", status_code=status.HTTP_200_OK, summary="访问结构式图片")
async def get_image(filename: str):
print(filename)
# 获取图片二进制
image_content = struct_obj.get_struct(filename)
if image_content:
return Response(content=image_content, media_type="image/jpeg")
# 不存在,通过filename获取casno号的基本信息,使用rdkit库根据smiles(存在)生成结构式图片
obj = await get_smiles(casno=filename.replace("_", "-"))
if obj:
ChemRdkit(smiles=obj.get("smiles", "")).struct(filename=obj.get("casno"))
image_content = struct_obj.get_struct(filename)
if image_content:
return Response(content=image_content, media_type="image/jpeg")
return None
mcp_server = add_mcp_server(
app,
mount_path="/mcp", # 挂着mcp服务器的地址
name="Item API MCP", # mcp服务的名称
description="MCP server for the Item API",
base_url="http://192.168.1.250:9999",
describe_all_responses=False,
describe_full_response_schema=False,
)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=9999)
结果输出
实现查询casno的基本信息,以及根据smiles生成化合物的属性信息
以上就可以把企业本地查询数据的一般能力集成到deepseek中了!让企业赶的上AI的快车!
搭建自己的本地MCP hub
Hub 服务器 (MCP Hub): 作为中央管理服务器,连接并管理多个 MCP 服务器。它为客户端提供统一的 API 入口,并将请求路由到相应的 MCP 服务器。
docker run --name=mcphub -p 3001:3000 --restart=always -d registry.cn-hangzhou.aliyuncs.com/samanhappy/mcphub
浏览器输入:http://localhost:3001/
1panel MCP server
目前仅支持stdio的输出协议!
Ubuntu安装
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
其他MCP服务参考
https://github.com/punkpeye/awesome-mcp-servers/tree/main
如何系统学习掌握AI大模型?
AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!
有需要的小伙伴,可以点击下方链接免费领取【保证100%免费
】
1.学习路线图
如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取
👉2.大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)
👉3.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(篇幅有限,仅展示部分,公众号内领取)
👉4.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)
大模型面试
**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取【保证100%免费
】
**或扫描下方二维码领取 **