从零开始编写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是一模一样的,只是换了一种编程语言,本期视频篇幅有限,我们就不展开讲了。

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

相关推荐
薛定谔的猫210 小时前
Cursor 系列(3):关于MCP
前端·cursor·mcp
王国强200916 小时前
Unla MCP 网关代理配置教程
mcp
kagg88618 小时前
mcp-gateway —— 隐藏mcp上下文以避免不必要的tokens开销
llm·mcp
AAA阿giao19 小时前
qoder-cli:下一代命令行 AI 编程代理——全面解析与深度实践指南
开发语言·前端·人工智能·ai编程·mcp·context7·qoder-cli
饭勺oO2 天前
AI 编程配置太头疼?ACP 帮你一键搞定,再也不用反复折腾!
ai·prompt·agent·acp·mcp·skills·agent skill
AlienZHOU2 天前
MCP 是最大骗局?Skills 才是救星?
agent·mcp·vibecoding
Linux内核拾遗2 天前
人人都在聊 MCP,它到底解决了什么?
aigc·ai编程·mcp
谷哥的小弟2 天前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
tyw152 天前
解决 Trae MySQL MCP 连接失败(Fail to start)
mcp·trae·fail to start·mysql mcp·mcp兼容
谷哥的小弟2 天前
File System MCP服务器安装以及客户端连接配置
服务器·人工智能·大模型·file system·mcp·ai项目