从零开始编写Mcp Server, 发布上线,超简单全网最细

视频版: 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已经帮我们配置好了开发环境:

  • .venv文件夹是Python的虚拟环境
  • pyproject文件定义了项目的基本信息
  • main.py文件是一个基础的代码样例

编写MCP Server

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

python 复制代码
# server.py
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"""
    return f"Hello, {name}!"

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

@mcp.tool()

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

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

这里有几个关键点:

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

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

  • mcp.tool声明了这是一个工具,类似于Http Rest API里面的post方法。大模型使用工具与外部系统进行交互,通常会产生副作用,比如写入文件,发送邮件,还有写数据库等等。
  • 下面的resource类似于HTTP里面的get方法,通常resource为大模型提供只读数据,resource只是请求数据,但不会产生任何副作用,有点像rest API里面的get方法。

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

完整代码:

python 复制代码
# server.py
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"""
    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。

ini 复制代码
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的区别:

  • STDIO协议一般是客户端把MCP Server也就是这个Python程序下载到本机并且本机运行,AI客户端与MCP Server使用STDIO也就是操作系统的标准输入输出通道进行交互。使用STDIO协议,AI客户端与MCP Server的距离更近一些。
  • SSE协议则是把MCP Server也就是这个Python程序单独部署,AI客户端与MCP Server使用SSE协议进行远程调用。使用SSE协议,AI客户端与MCP Server的距离更远一些。

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

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

ini 复制代码
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发布到公网上面有两种方式:

  1. 最常见的就是把它打包成一个Python包,并且上传到Pypi上面,其他人使用uvx命令就可以自动的下载到这个Python包,并且本地执行。
  2. 另外一种方式,我们就使用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。

完整代码:

python 复制代码
# server.py
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"""
    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从远程被访问到。

完整代码:

python 复制代码
# server.py
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"""
    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种场景:

  1. 本地使用STDIO
  2. 本地使用SSE
  3. 发布STDIO
  4. 发布SSE

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

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

相关推荐
Morpheon3 小时前
Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强
ide·github·cursor·mcp
用户214118326360210 小时前
03-mcp-server案例分享-手搓一个MCP-server拥有属于自己的MCP
mcp
SelectDB技术团队12 小时前
Apache Doris + MCP:Agent 时代的实时数据分析底座
人工智能·数据挖掘·数据分析·apache·mcp
CoderJia程序员甲13 小时前
MCP 技术完全指南:微软开源项目助力 AI 开发标准化学习
microsoft·ai·开源·ai教程·mcp
大模型真好玩13 小时前
可视化神器WandB,大模型训练的必备工具!
人工智能·python·mcp
小溪彼岸14 小时前
【MCP】从零开始了解模型上下文协议MCP
mcp
掘我的金1 天前
MCP生产部署实战:从开发到上线的完整指南
llm·mcp
bytebeats1 天前
在本地 LLM 上运行MCP
mcp
bytebeats1 天前
MCP + A2A 可能是自互联网以来软件领域最大的变革
mcp