Python小白也能玩转!手把手教你开发并部署自己的MCP Server(附完整代码+避坑指南)
还在为找不到合适的协议服务器而烦恼?想自己动手开发却怕代码复杂到头秃?今天用Python+Flask实现一个MCP(Minimal Communication Protocol)Server,从零搭建到部署全流程拆解,代码仅50行,连注释都给你标得明明白白!
一、MCP Server是什么?能干啥?
MCP(自定义通信协议)是一种轻量级、可扩展的通信框架,适合物联网设备、游戏后端、嵌入式系统等场景。
举个栗子:
- 智能家居设备通过MCP协议上报温度数据到服务器
- 小游戏客户端向服务器发送玩家移动指令
- 工业传感器实时传输压力值到监控平台
咱们今天的目标:
✅ 开发一个支持JSON数据传输的MCP Server
✅ 实现GET/POST请求处理
✅ 部署到本地和云服务器(含公网访问教程)
二、开发环境准备(3分钟搞定)
-
安装Python 3.8+
访问Python官网下载安装包,勾选Add Python to PATH
。
验证安装:python --version # 应显示Python 3.x.x
-
创建虚拟环境(推荐)
mkdir mcp_server && cd mcp_server python -m venv venv # 创建虚拟环境 source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows
-
安装依赖库
pip install flask==3.0.0 # 指定版本避免兼容性问题
三、50行代码开发MCP Server
完整代码(带注释)
from flask import Flask, request, jsonify
app = Flask(__name__)
# 全局变量存储数据(生产环境建议用Redis/数据库)
data_store = {"temperature": 25.5, "status": "normal"}
@app.route('/')
def home():
"""根路径测试接口"""
return jsonify({"message": "MCP Server Running!", "status": "online"})
@app.route('/api/data', methods=['GET', 'POST'])
def handle_data():
"""
GET请求:获取当前数据
POST请求:更新数据(需带JSON体)
"""
if request.method == 'GET':
return jsonify(data_store)
elif request.method == 'POST':
if not request.is_json:
return jsonify({"error": "Content-Type must be application/json"}), 400
new_data = request.get_json()
# 简单数据校验(生产环境需更严格)
if 'temperature' in new_data:
data_store['temperature'] = float(new_data['temperature'])
if 'status' in new_data:
data_store['status'] = str(new_data['status'])
return jsonify({"message": "Data updated", "new_data": data_store})
if __name__ == '__main__':
# 开发环境:127.0.0.1:5000
# 生产环境:修改host='0.0.0.0'允许公网访问
app.run(host='127.0.0.1', port=5000, debug=True)
代码拆解
-
路由定义:
/
:测试接口,返回服务器状态/api/data
:核心数据接口,支持GET/POST
-
GET请求处理:
直接返回data_store
中的数据 -
POST请求处理:
- 校验请求头是否为
application/json
- 解析JSON体并更新
data_store
- 返回更新后的数据
- 校验请求头是否为
四、本地测试(30秒出结果)
-
启动服务
python server.py # 假设代码保存为server.py
看到输出:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
-
测试GET请求
浏览器访问:http://127.0.0.1:5000/api/data
或用curl
命令:curl http://127.0.0.1:5000/api/data
预期输出:
{"temperature": 25.5, "status": "normal"}
-
测试POST请求
curl -X POST -H "Content-Type: application/json" \ -d '{"temperature": 30.2, "status": "warning"}' \ http://127.0.0.1:5000/api/data
预期输出:
{"message": "Data updated", "new_data": {"temperature": 30.2, "status": "warning"}}
五、部署到云服务器(阿里云/腾讯云)
步骤1:购买云服务器
- 选1核1G配置即可(学生可申请阿里云ECS免费套餐)
- 操作系统选Ubuntu 22.04
步骤2:远程连接服务器
- Windows:用
Xshell
/MobaXterm
- Mac/Linux:终端输入
ssh root@你的服务器IP # 初始密码在云平台控制台查看
步骤3:安装Python和依赖
# 更新系统
apt update && apt upgrade -y
# 安装Python3和pip
apt install python3 python3-pip -y
# 创建项目目录
mkdir /home/mcp_server && cd /home/mcp_server
# 上传代码(用scp或SFTP工具)
# 或者直接在服务器创建文件
cat > server.py <<EOF
# 粘贴上面的完整代码
EOF
# 安装依赖
pip3 install flask==3.0.0
步骤4:修改为公网访问
修改代码中的app.run()
为:
app.run(host='0.0.0.0', port=5000) # 允许所有IP访问
步骤5:启动服务(后台运行)
# 使用nohup保持后台运行
nohup python3 server.py > server.log 2>&1 &
# 查看日志
tail -f server.log
步骤6:配置安全组(关键!)
- 登录云平台控制台
- 找到安全组规则
- 添加规则:
- 类型:自定义TCP
- 端口范围:5000/5000
- 授权对象:0.0.0.0/0
步骤7:公网访问测试
curl http://你的服务器IP:5000/api/data
六、避坑指南(血泪教训总结)
-
端口冲突
- 错误:
OSError: [Errno 98] Address already in use
- 解决:
netstat -tulnp | grep 5000
查看占用进程,kill -9 PID
终止
- 错误:
-
防火墙拦截
- Ubuntu默认启用
ufw
,需运行:ufw allow 5000/tcp
- Ubuntu默认启用
-
跨域问题(前端调用时)
- 错误:
Access-Control-Allow-Origin
报错 - 解决:安装
flask-cors
并添加装饰器from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有跨域请求
- 错误:
-
生产环境优化
- 用
gunicorn
替代Flask内置服务器:pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 server:app
- 配置
Nginx
反向代理(参考官方文档)
- 用
七、扩展玩法(进阶方向)
-
添加认证机制
from functools import wraps def auth_required(f): @wraps(f) def decorated(*args, **kwargs): auth = request.headers.get('Authorization') if auth != 'Bearer YOUR_SECRET_TOKEN': return jsonify({"error": "Unauthorized"}), 401 return f(*args, **kwargs) return decorated @app.route('/api/secret', methods=['GET']) @auth_required def secret_data(): return jsonify({"data": "This is confidential!"})
-
连接数据库
from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' db = SQLAlchemy(app) class SensorData(db.Model): id = db.Column(db.Integer, primary_key=True) value = db.Column(db.Float) timestamp = db.Column(db.DateTime, default=db.func.current_timestamp())
-
WebSocket实时通信
from flask_socketio import SocketIO socketio = SocketIO(app) @socketio.on('sensor_update') def handle_sensor_update(json): print('received: ' + str(json)) socketio.emit('response', {'data': 'server received'})
八、总结:从开发到部署全流程
-
开发阶段:
- 50行代码实现核心功能
- 本地测试验证逻辑
-
部署阶段:
- 云服务器配置安全组
- 后台运行+日志监控
-
优化阶段:
- 添加认证/数据库
- 切换到生产级服务器
立即行动:
- 复制代码到本地运行测试
- 申请免费云服务器部署
- 在评论区晒出你的公网访问截图!
点赞过百:下期分享《用Python+MCP Server开发物联网监控系统:从硬件接入到数据可视化》!
本人微信公众号:AI学习新视界,大家一起共同学习,探讨AI领域的最新发展和AI工具产品等使用心得体会。