掘金 人工智能 前天 16:28
从零开始编写Mcp Server, 发布上线,超简单全网最细
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了从开发者角度出发,如何利用MCP(模型上下文协议)快速构建AI工具箱。通过Python SDK,演示了创建MCP Server的全过程,包括本地STDIO、SSE协议的使用,以及将MCP Server发布到公网的两种方式:PyPI发布和云服务器部署。文章深入浅出地讲解了MCP的核心概念和实现细节,帮助开发者更好地理解和应用MCP协议,构建自己的AI工具。

🔨 **MCP 核心概念:** MCP(模型上下文协议)作为AI与外部工具的中间层,允许大模型通过标准输入输出通道或SSE协议调用工具,简化了AI与外部工具的交互过程。

🐍 **Python SDK 快速上手:** 演示了使用Python SDK创建MCP Server的步骤,包括安装uv、初始化项目、编写工具和资源,以及使用STDIO和SSE协议进行本地测试。

🌐 **发布 MCP Server:** 介绍了两种发布MCP Server的方式:通过PyPI发布,方便他人下载使用;以及部署到云服务器,通过SSE协议提供远程调用服务,扩展了MCP Server的使用范围。

💡 **STDIO 与 SSE 协议对比:** STDIO协议将MCP Server下载到本地运行,而SSE协议则允许远程调用,提供了不同的部署和使用场景。

视频版: www.bilibili.com/video/BV1RN…

MCP简单来说就是AI大模型的标准化工具箱。在我们之前的很多期视频里面,只是讨论了如何使用别人已经编写好的MCP Server,对接到AI客户端里面,实现各种智能体与工作流。本期视频我们转换到开发者的角度,超简单,几分钟之内编写一个MCP Server,并且把它发布上线,提供给所有人去使用。

本期视频内容较多,并且十分硬核,可以帮助我们从开发者的角度更加深入理解MCP协议。在爬爬虾的这期视频里面,对MCP协议有过详细介绍了,这里我们简单总结一下。

概念与准备工作:

MCP全称是模型上下文协议,MCP服务或者叫做MCP Server,作为AI与外部工具的中间层,代替人类访问并且操作外部工具。MCP Server本质上就是一段Nodejs或者Python程序,大模型通过操作系统的STDIO,也就是标准输入输出通道,或者SSE协议调用某个MCP Server。

消息格式是类似这种的,MCP Server接收到这些消息以后,通过自己的代码功能或者使用API请求,访问外部工具并且完成任务。MCP Server本质上就是一段Python或者nodejs程序,编写一个MCP Server,也就是编写这段程序。

我们来到MCP在GitHub上面的官方仓库,就是这个地址。

MCP Github首页:github.com/modelcontex…

这里有两个SDK,Python还有Typescript SDK。SDK也就是开发工具包,本期视频我们主要以Python的SDK为例,演示下创建一个MCP Server。

我们点击Python SDK,在安装这一部分,MCP推荐使用uv去管理Python项目。我们点击这个链接,uv是目前热度最高的Python环境管理工具。我们准备工作的第一步,就是把uv安装一下。

在UV的官网,点击installation,找到对应系统的安装命令。

UV安装:docs.astral.sh/uv/getting-…

我是Windows系统的,我就执行这个命令。我把这个命令复制一下,注意这是一个Powershell的命令。在桌面右键在终端打开,我们打开一个Powershell的命令行窗口,把命令粘贴进来,回车执行。

UV安装成功以后,我们可以来查看一下电脑上已经安装过的Python版本,输入这个命令

uv python list

这里列出的是电脑上的Python版本还有它的安装路径。

我现在想把这个3.13的版本安装一下,执行这个命令

uv python install 3.13

创建MCP项目

我新建了一个文件夹叫mcp_server,我准备在这里面创建我们第一个MCP Server。我在Powershell这边使用CD命令,先切换到我们刚才创建的文件夹,

然后执行

uv init . -p 3.13

就是把当前这个文件夹初始化成一个Python工程,Python版本是 3.13。

接下来我们把MCP的SDK安装一下,执行这个命令

uv add "mcp[cli]"

这个命令就是把MCP的SDK也就是开发工具包安装上

接下来我们找一个IDE打开我们刚才新创建的文件夹,这里我使用vs code。使用vs code编写Python程序。我们需要在左侧的extension里面搜索Python,然后把Python debugger跟Python这两个插件安装一下。

接下来我们使用vs code打开刚才创建的文件夹,就是这个MCP Server的文件夹。我们看到UV已经帮我们配置好了开发环境:

编写MCP Server

接下来开始编写MCP Server,然后我们来到Python SDK这边,前面几步已经完成了,下面需要做的是把代码拷贝进来。我把代码复制一下。

# server.pyfrom mcp.server.fastmcp import FastMCP# Create an MCP servermcp = 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"""    return f"Hello, {name}!"

前两行的写法是固定的:在MCP包里面导入FastMCP,然后使用FastMCP初始化MCP对象。接下来这一句

@mcp.tool()

是Python里面的装饰器,用来给下面这个函数增加功能,在这里表示声明下面这个函数是一个MCP工具。

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

这里有几个关键点:

    这个"""Add two numbers"""注释是必须要写的,这个注释的意思是使用自然语言告诉AI大模型这个函数的功能是什么。在这个例子里面,就是把两个数字加起来。AI大模型拿到这个MCP Server以后,他就知道我有一个工具,这个工具可以帮助我精确的计算加法。在这个例子里面,代码非常的简单,当然,我们也可以把一些很复杂的功能放到这里面,形成一些很有用的工具。第二个关键点是这里的类型修饰符add(a: int, b: int) -> int:。在这个函数里面接收两个int变量,然后返回一个int值。这个类型修饰符是一定要写的,它有助于帮助大模型理解工具的传参是什么类型的,可以帮助大模型更精准的调用MCP工具。

我们看到修饰符有两种:mcp.tool 还有 mcp.resource:

一个MCP Server的代码就这么多,最后我们再加两句话,让它可以变成一个可以独立运行的程序。我们就加上这一句 mcp.run(),括号里面是协议,这里我们先使用最简单的STDIO协议。

完整代码:

# server.pyfrom mcp.server.fastmcp import FastMCP# Create an MCP servermcp = 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"""    return f"Hello, {name}!"if __name__ == "__main__":    mcp.run(transport='stdio')

我们找一个AI客户端来试一下刚才编写好的程序。这里我使用的AI客户端是Cherry studio,爬爬虾之前有一期完整视频介绍使用Cherry studio接入MCP Server。

我们先进入设置,找到MCP服务器,右上角如果有一个红色的叹号,我们需要先把UV跟Bun安装一下,Cherry Studio使用的是它内置的UV还有Bun。

这里的协议选择stdio,注意命令这里写uv,不要写错了。下面的参数都是固定的:

填好以后点击保存,这里打上一个绿灯,就配置成功了。

我们来试一下,我们选择一个AI模型,这里我用的Gemini 2.5 Flash。爬爬虾之前有一期视频介绍把Gemini接入Cherry studio。

在MCP服务器这里,找到我们刚才添加的那个,

我们来试一下它的加法。这里看到它调用了MCP,正确的传递了参数,并且拿到了结果,最后完成了输出。

除了使用Cherry Studio,接下来我们换一个AI客户端,这里我准备使用cursor。我们先打开cursor,找到右上角的设置MCP,点击添加,cursor这边需要编写Json文件。

我们来到Cherry studio,找到设置还是MCP,找到这个编辑按钮,我们把这个配置文件整个复制出来,然后粘贴到cursor里面。保存一下,这里打上一个绿灯,就配置成功了。

使用SSE协议

接下来我们进入第二部分,使用SSE协议。接下来,我们把这个MCP Server改成SSE协议的,改成SSE协议非常的简单,只需要在代码里的最后一行,把STDIO改成SSE。

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

改成SSE,我们需要服务端这边把它启动起来,右上角点击这个启动按钮,我们启动起来以后,把这个监听的地址复制一下,

回到Cherry studio的设置,找到我们的MCP,这次把类型从stdio改成SSE。接下来填写一个URL,我们填写刚才复制的Server端的地址,后面加/sse。好,这样完成,我们保存一下,回到聊天界面。

我们再试一下,在下面把MCP服务器选中,询问AI一个问题,它成功调用了MCP Server并且给出了结果。我们回到vs code这边,可以看到这些远程的调用记录,这样证明了实际的代码执行是在vs code这边,AI客户端通过SSE协议远程调用了这个方法,并且拿到了结果。

STDIO vs SSE

总结一下SSE与STDIO的区别:

除了SSE协议,MCP Server目前还支持另外一种是streamable-http,这个跟SSE功能非常像,也是远程调用。

我们把协议类型改成streamable-http,启动起来,

if __name__ == "__main__":    mcp.run(transport='streamable-http')

然后客户端也需要相应的改动。我们来到客户端,这里的类型选择streamable-http,URL末尾从sse改成mcp,最后点击保存,这样同样的可以配置成功。

我们再来试一下,同样的完成了调用,最终结果也是正确的。同样的,我们可以把这套配置放到cursor上面。

cursor有一点不同的是,需要把这里的baseUrl改成url

好,本期视频前半段的内容我们就完成了。我们介绍了如何在本地编写一个MCP Server,并且在本地的AI客户端里面去使用,这里我们介绍了三种协议:STDIO,SSE还有streamable HTTP。

将MCP Server发布到公网

下一个章节,我们把这个MCP Server发布到公网上面,让所有人都可以使用。把一个MCP Server发布到公网上面有两种方式:

    最常见的就是把它打包成一个Python包,并且上传到Pypi上面,其他人使用uvx命令就可以自动的下载到这个Python包,并且本地执行。另外一种方式,我们就使用SSE协议,把我们的程序部署到一个云服务器上面,然后暴露出来一个公网链接,其他人使用这个公网链接,就可以使用我们的MCP Server。

方法一:发布到PyPI

这里我们先看第一种方法,上传到Pypi上面。这里我新建一个文件夹,叫做tech_shrimp_mcp_demo,因为Pypi是没有命名空间的,所以我们的测试程序最好在前面加上自己的名字,以免跟别人混淆起来。

我们在命令行切换到对应的文件夹,我们输入

uv init . --package -p 3.13

把这个文件夹初始化一下,后面加--package表示初始化的时候把它初始化成一个Python包,然后指定Python版本3.13。

接下来还是添加MCP的依赖,

uv add "mcp[cli]"

好,我们再用vs code打开这个文件夹,这次我们要把代码写到这个__init__.py,看到这里面已经有个main方法了,我们保留这个main方法,接下来把我们刚才写的本地的那套代码粘贴在上面,然后把mcp.run写到main方法里面。这里的协议使用stdio。

完整代码:

# server.pyfrom mcp.server.fastmcp import FastMCP# Create an MCP servermcp = 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"""    return f"Hello, {name}!"def main() -> None:    mcp.run(transport='stdio')

代码就编写完成了,我们执行这个命令打包试一下,

uv build

看到打包成功了,接下来我们把这个打好了包发布到Pypi上面,提供给所有人下载使用。

首先我们需要注册一下Pypi,在右上角点击register,填写用户名,邮箱密码,然后我们需要收一下验证邮件,这里来到我的邮箱,点击验证链接,完成验证。

接下来点击生成恢复码,屏幕上一共会出现8组恢复码,我们把它保存下来。接下来我们把第一组恢复码填进去,点击verify,点击添加双重身份验证。

然后我们去手机的软件市场下载微软的Authenticator,点击上面的加号,然后选择个人账户,使用手机扫描电脑屏幕上的二维码,然后把手机上生成的这个6位数的验证码填写过来,这样就完成了双重身份验证。

在account setting这里往下找,有一个API TOKEN,

我们点击一下,随便填个名字,然后范围选择所有项目,点击生成,这样就生成了一个很长的Pypi的API TOKEN,我们把它复制下来保存好。

有了TOKEN以后,我们执行这个命令

uv publish --token pypi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

后面就是Pypi网站的TOKEN,回车,这样就发布成功了。

我们找到右上角自己的名字your projects,这个就是我们刚刚上传的MCP Server,我们点击view,这就是一个功能齐全的Python包,当然为了正规,最好填一个项目描述,然后我们就可以在客户端里面使用这个MCP Server了。

我们把这个包的名字复制一下,回到Cherry studio这边,添加服务器-->快速创建,类型选择STDIO,命令填写uvx,一定不要搞错了,下面的参数就把我们自己上传的那个包名填写过来,最后点击保存。

我们可以把这个配置文件发送给任何一个小伙伴们去使用,这是我们自己发布到公网上的MCP Server,其他人通过这个名字就可以下载下来并且本地使用,效果非常的棒,感觉很好。

方法二:部署到公网服务器

我们来看MCP的另外一种发布方式,在公网上暴露一个SSE的地址,然后让其他人进行远程调用。我们只需要把写好的Python程序部署到一个公网IP的云服务器上面就可以了。

这是我的一台Ubuntu系统的云服务器,我们先把UV安装一下,这里来到UV的官网,找到Linux系统的安装命令,复制进来执行一下。UV安装完成以后,记得重开一下命令行窗口,

首先创建一个文件夹叫mcp_demo,然后我们进入到这个文件夹。

这是我们本期视频创建的第一个项目,注意这个不是打包那个,这里需要改一下main.py,首先要把协议改成sse,接下来再添加一句话,

mcp.settings.host = "0.0.0.0" # 允许远程连接

这样可以让我们的Server从远程被访问到。

完整代码:

# server.pyfrom mcp.server.fastmcp import FastMCP# Create an MCP servermcp = 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"""    return f"Hello, {name}!"if __name__ == "__main__":    mcp.settings.host = "0.0.0.0" # 允许远程连接    mcp.run(transport='sse')

接下来我们把这个代码main.py直接拖到服务器对应的目录,下面还需要把pyproject文件也拖进来。代码准备好以后,我们使用UV来启动,首先配置虚拟环境

uv venv

第二步安装依赖

uv pip install .

就是安装当前目录这个项目的依赖,下一个命令就可以启动了

uv run main.py

我们还是来到Cherry studio,来编辑一下这个MCP服务器,类型选择SSE,URL这里填

http://服务器公网IP:8000/sse。

总结

总结一下本期视频,我们使用Python SDK从0到1创建MCP工具,总共介绍了4种场景:

    本地使用STDIO本地使用SSE发布STDIO发布SSE

Nodejs那边原理跟Python是一模一样的,只是换了一种编程语言,本期视频篇幅有限,我们就不展开讲了。

感谢大家点赞支持,我们下期再见。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MCP AI工具 Python SSE PyPI
相关文章