如何在modelscope上上传自己的MCP服务
本文详细记录了使用Gradio和ModelScope创建并部署MCP算命服务的完整流程。
我在网上看了一些,跟着这些教程来实现,发现踩了很多坑,所以想在这里记录一下,正常不踩坑的流程!
首先我们先确定自己的MCP服务需要提供什么功能,目前我以一个模拟算命的例子来说说明,并且使用了gradio来实现前端的页面。为什么要用gradio,一会用用到modelsocpe的时候大家就知道了。好了我先提供一下代码,大家先看看,代码有点长,里面的逻辑很多也是写死的,只是做个示范而已,切勿当真
1.代码编写和测试
import gradio as gr
import pandas as pd
import numpy as np
from datetime import datetime
import random
# 天干
TIAN_GAN = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
# 地支
DI_ZHI = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
# 五行
WU_XING = ["金", "木", "水", "火", "土"]
# 生肖
SHENG_XIAO = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
# 运势类别
FORTUNE_CATEGORIES = ["事业", "财运", "健康", "爱情", "学业"]
# 运势评级
FORTUNE_RATINGS = ["大吉", "吉", "平", "凶", "大凶"]
# 运势描述模板
FORTUNE_TEMPLATES = {
"事业": [
"今年事业蒸蒸日上,有望获得重大突破。",
"职场上将遇到贵人相助,事业发展顺利。",
"工作中需谨慎行事,避免冲动决策。",
"事业发展可能遇到阻碍,需耐心等待时机。",
"今年事业运势低迷,建议稳守当前位置,避免冒险。"
],
"财运": [
"财源广进,投资有望获得丰厚回报。",
"财运稳定,收入有所增长。",
"财务状况平稳,宜量入为出。",
"财运欠佳,需谨慎理财,避免大额支出。",
"财务压力较大,需严格控制开支,避免投资风险。"
],
"健康": [
"身体健康状况极佳,精力充沛。",
"整体健康良好,注意适当锻炼。",
"健康状况一般,注意作息规律。",
"身体易感疲劳,需多加休息,注意饮食。",
"健康状况堪忧,建议定期体检,加强保健。"
],
"爱情": [
"桃花运旺盛,单身者有望遇到理想伴侣。",
"感情生活甜蜜和谐,关系更进一步。",
"感情状况平稳,需增进沟通交流。",
"感情易生波折,需耐心处理矛盾。",
"感情运势低迷,易遇人际关系困扰。"
],
"学业": [
"学习能力超群,知识吸收迅速,成绩优异。",
"学习状态良好,能够稳步提升。",
"学习进度一般,需加强自律性。",
"学习效率下降,需调整学习方法。",
"学习困难重重,需寻求他人指导帮助。"
]
}
def calculate_bazi(year, month, day, hour, minute):
"""计算八字"""
# 简化计算,实际八字计算更复杂
year_idx = (year - 4) % 10 # 天干年
year_branch_idx = (year - 4) % 12 # 地支年
month_idx = ((year_idx % 5) * 2 + month) % 10 # 天干月
month_branch_idx = month % 12 # 地支月
day_idx = (year * 5 + year // 4 + day) % 10 # 天干日
day_branch_idx = (year * 5 + year // 4 + day) % 12 # 地支日
hour_idx = (day_idx * 2 + hour // 2) % 10 # 天干时
hour_branch_idx = hour // 2 % 12 # 地支时
year_pillar = TIAN_GAN[year_idx] + DI_ZHI[year_branch_idx]
month_pillar = TIAN_GAN[month_idx] + DI_ZHI[month_branch_idx]
day_pillar = TIAN_GAN[day_idx] + DI_ZHI[day_branch_idx]
hour_pillar = TIAN_GAN[hour_idx] + DI_ZHI[hour_branch_idx]
shengxiao = SHENG_XIAO[year_branch_idx]
return {
"year_pillar": year_pillar,
"month_pillar": month_pillar,
"day_pillar": day_pillar,
"hour_pillar": hour_pillar,
"shengxiao": shengxiao
}
def analyze_wuxing(bazi):
"""分析五行强弱"""
# 简化分析,实际分析更复杂
wuxing_count = {wx: 0 for wx in WU_XING}
# 根据天干地支计算五行数量
for pillar in [bazi["year_pillar"], bazi["month_pillar"], bazi["day_pillar"], bazi["hour_pillar"]]:
tian_gan = pillar[0]
di_zhi = pillar[1]
# 天干五行对应
if tian_gan in ["甲", "乙"]:
wuxing_count["木"] += 1
elif tian_gan in ["丙", "丁"]:
wuxing_count["火"] += 1
elif tian_gan in ["戊", "己"]:
wuxing_count["土"] += 1
elif tian_gan in ["庚", "辛"]:
wuxing_count["金"] += 1
elif tian_gan in ["壬", "癸"]:
wuxing_count["水"] += 1
# 地支五行对应(简化)
if di_zhi in ["寅", "卯"]:
wuxing_count["木"] += 1
elif di_zhi in ["巳", "午"]:
wuxing_count["火"] += 1
elif di_zhi in ["辰", "戌", "丑", "未"]:
wuxing_count["土"] += 1
elif di_zhi in ["申", "酉"]:
wuxing_count["金"] += 1
elif di_zhi in ["亥", "子"]:
wuxing_count["水"] += 1
# 找出最强和最弱的五行
strongest = max(wuxing_count, key=wuxing_count.get)
weakest = min(wuxing_count, key=wuxing_count.get)
return {
"wuxing_count": wuxing_count,
"strongest": strongest,
"weakest": weakest
}
def generate_fortune(bazi, wuxing_analysis, current_year):
"""生成运势预测"""
# 使用八字和五行分析生成运势
fortune = {}
# 根据生肖和当前年份计算运势基础值
shengxiao_idx = SHENG_XIAO.index(bazi["shengxiao"])
current_year_idx = (current_year - 4) % 12
base_luck = (shengxiao_idx - current_year_idx) % 12
# 根据五行强弱调整运势
strongest = wuxing_analysis["strongest"]
weakest = wuxing_analysis["weakest"]
for category in FORTUNE_CATEGORIES:
# 基础运势评分 (0-4)
base_score = (base_luck + hash(category + strongest)) % 5
# 根据五行调整
if category == "事业" and strongest in ["木", "火"]:
base_score = min(base_score + 1, 4)
elif category == "财运" and strongest in ["金", "土"]:
base_score = min(base_score + 1, 4)
elif category == "健康" and weakest in ["金", "水"]:
base_score = max(base_score - 1, 0)
elif category == "爱情" and strongest in ["火", "土"]:
base_score = min(base_score + 1, 4)
elif category == "学业" and strongest in ["水", "木"]:
base_score = min(base_score + 1, 4)
# 添加一些随机性
adjusted_score = max(0, min(4, base_score + random.randint(-1, 1)))
fortune[category] = {
"rating": FORTUNE_RATINGS[adjusted_score],
"description": FORTUNE_TEMPLATES[category][adjusted_score]
}
return fortune
def predict_fortune(name, gender, birth_year, birth_month, birth_day, birth_hour, birth_minute):
"""根据生辰八字预测运势"""
try:
# 验证输入并设置默认值
if not name or name.strip() == "":
name = "无名氏"
if not gender or gender not in ["男", "女"]:
gender = "男"
# 设置默认值
current_year = datetime.now().year
birth_year = int(birth_year) if birth_year and birth_year.strip() != "" else current_year - 30
birth_month = int(birth_month) if birth_month and birth_month.strip() != "" else 1
birth_day = int(birth_day) if birth_day and birth_day.strip() != "" else 1
birth_hour = int(birth_hour) if birth_hour and birth_hour.strip() != "" else 12
birth_minute = int(birth_minute) if birth_minute and birth_minute.strip() != "" else 0
# 验证日期有效性
datetime(birth_year, birth_month, birth_day, birth_hour, birth_minute)
# 计算八字
bazi = calculate_bazi(birth_year, birth_month, birth_day, birth_hour, birth_minute)
# 分析五行
wuxing_analysis = analyze_wuxing(bazi)
# 获取当前年份
current_year = datetime.now().year
# 生成运势
fortune = generate_fortune(bazi, wuxing_analysis, current_year)
# 生成结果文本
result = f"## {name}的八字分析\n\n"
result += f"**姓名**: {name} ({gender})\n\n"
result += f"**生辰八字**: {bazi['year_pillar']} {bazi['month_pillar']} {bazi['day_pillar']} {bazi['hour_pillar']}\n\n"
result += f"**生肖**: {bazi['shengxiao']}\n\n"
result += "## 五行分析\n\n"
for wx, count in wuxing_analysis["wuxing_count"].items():
result += f"**{wx}**: {'●' * count}\n\n"
result += f"**最旺**: {wuxing_analysis['strongest']} **最弱**: {wuxing_analysis['weakest']}\n\n"
result += "## 运势预测\n\n"
for category in FORTUNE_CATEGORIES:
result += f"**{category}**: {fortune[category]['rating']}\n\n"
result += f"{fortune[category]['description']}\n\n"
result += "## 运势建议\n\n"
if wuxing_analysis['weakest'] == "金":
result += "- 佩戴金属饰品有助于增强运势\n"
elif wuxing_analysis['weakest'] == "木":
result += "- 多接触绿色植物,有助于提升运势\n"
elif wuxing_analysis['weakest'] == "水":
result += "- 多喝水,亲近水源环境有利于运势提升\n"
elif wuxing_analysis['weakest'] == "火":
result += "- 适当增加红色元素在生活中,有助于提升运势\n"
elif wuxing_analysis['weakest'] == "土":
result += "- 多接触大地,户外活动有助于增强运势\n"
if wuxing_analysis['strongest'] == "金":
result += "- 注意避免过于固执,保持灵活思维\n"
elif wuxing_analysis['strongest'] == "木":
result += "- 注意控制脾气,保持心态平和\n"
elif wuxing_analysis['strongest'] == "水":
result += "- 注意不要过于犹豫不决,提高决断力\n"
elif wuxing_analysis['strongest'] == "火":
result += "- 注意避免冲动行事,保持冷静\n"
elif wuxing_analysis['strongest'] == "土":
result += "- 注意不要过于保守,适当尝试新事物\n"
return result
except ValueError as e:
return f"输入错误: {str(e)}"
except Exception as e:
return f"计算错误: {str(e)}"
def create_ui():
with gr.Blocks(title="生辰八字运势预测") as app:
with gr.Row():
gr.Markdown("# 生辰八字运势预测系统")
with gr.Row():
with gr.Column(scale=2):
with gr.Group():
gr.Markdown("### 个人信息")
name = gr.Textbox(label="姓名 *", placeholder="请输入您的姓名")
gender = gr.Radio(["男", "女"], label="性别 *", value="男")
with gr.Group():
gr.Markdown("### 出生信息")
birth_year = gr.Textbox(label="出生年份 *", placeholder="例如: 1990")
with gr.Row():
birth_month = gr.Textbox(label="出生月份 *", placeholder="例如: 1-12", scale=1)
birth_day = gr.Textbox(label="出生日期 *", placeholder="例如: 1-31", scale=1)
with gr.Row():
birth_hour = gr.Textbox(label="出生时辰 (小时) - 可选", placeholder="例如: 0-23", scale=1)
birth_minute = gr.Textbox(label="出生时辰 (分钟) - 可选", placeholder="例如: 0-59", scale=1)
with gr.Group():
with gr.Row():
submit_btn = gr.Button("预测运势", variant="primary", scale=2)
example_btn = gr.Button("填写示例", variant="secondary", scale=1)
with gr.Column(scale=3):
with gr.Group():
output = gr.Markdown(label="运势分析结果", elem_classes="scrollable-output")
# 添加CSS样式,使输出区域可滚动
gr.HTML("""
<style>
.scrollable-output {
max-height: 500px;
overflow-y: auto;
padding: 10px;
}
</style>
""")
with gr.Row():
with gr.Accordion("使用说明与注意事项", open=True):
gr.Markdown("""
### 使用说明
1. 输入您的姓名和性别(如未填写将使用默认值)
2. 输入您的出生年、月、日(如未填写将使用默认值)
3. 输入出生时、分(可选,更精确)
4. 点击"预测运势"按钮获取分析结果
5. 或点击"填写示例"按钮快速填入示例数据
### 注意事项
- 本系统仅供娱乐参考,请勿过度迷信
- 运势分析基于传统八字理论,结合现代算法
- 更准确的分析请咨询专业命理师
- 如未填写必要信息,系统将使用默认值进行计算
""")
def fill_example():
return "张三", "男", "1990", "6", "15", "12", "30"
submit_btn.click(
fn=predict_fortune,
inputs=[name, gender, birth_year, birth_month, birth_day, birth_hour, birth_minute],
outputs=output
)
example_btn.click(
fn=fill_example,
inputs=[],
outputs=[name, gender, birth_year, birth_month, birth_day, birth_hour, birth_minute]
)
return app
app = create_ui()
app.launch(mcp_server=True)
值得注意的是app.launch(mcp_server=True),这个地方一定要写mcp_server=True,不然之后再modelscope后会有问题,同时安装mcp==1.8.1,gradio[mcp],这个地方我标红了,之后会再强调这个环境的,这里我们本地运行看看效果

我们复制这个http://127.0.0.1:7860链接,然后在浏览器中打开,填入需要的信息,就是下面这个样子的

这样我就确定了,本地部署这个服务是成功了,代码也是没有问题的
2.modelscope创空间
我们来到modelscope,然后找到创空间,点击我要创建,选择编程式创建,如下

然后会进入到这个界面

我们按照需要填写的信息填写内容即可,我给看看我的示例

好了,下面是及其关键的地方了,一定要注意!!!!!

一定要选择gradio5.29.0,我就是在这里踩坑了,我之前用5.42.0和5.34.1这版本,最后MCP服务创建不成功,耗了我2个小时啊!!!!!
之后下面的选项选择免费的就行了

填写完成后,点击创建创空间就可以完成空间的创建了,相当于一个台云服务器了
创建完成后会跳转到这个页面

我们复制这个命令git clone http://oauth2:ms-9654accb-6edf-42b9-9fe7-295e6a522f72@www.modelscope.cn/studios/guligedong/fortunetelling.git
然后把仓库拉下来,仓库怎么拉,不用我再说了吧,仓库拉下后里面没有文件,大概是这个样子的

重点1:我们把刚刚写的代码放进去,并且命名为app.py,切记!!!是app.py
重定2:创建一个requirements.txt,里面写如下内容,这样一会这些库一会才会在云服务器上安装

最后我们的文件中一共就有这些文件

然后再上传到仓库就可以了,上传成功后,我们就可以在modelscope上看到这些代码了,如下

我们等待一会审核成功在执行后面的操作,一般会等个5分钟8分钟的
审核成功后,在设置中,找到上线按钮,点击上线就可以了,如下图

然后回到空间内容页面,他会出现如下界面

等个几分钟,就会有画面,我们耐心等一下,等好了,就是如下界面

你会发现这个和你在你电脑本地部署的页面就一模一样了,此时这个服务相当于就在云服务器上部署起来了。
3.MCP服务的创建
当我们成功创空间后,我们找到通过API使用

点击后找到mcp

然后找到关键的地方

重点:这里面的东西复制一下,一会MCP创建服务的时候会用到!!!!
我们现在来创建MCP

点击创建MCP后会来到如下页面

首先,选择自定义创建

然后填写名字和你刚刚创空间的那个网址,托管类型选择可托管部署,类型随便填,我写的开发者工具,如下图

这里提醒一下,来源地址这一项,就是这个

好了就剩最后一步了,服务配置,就行刚刚我让你复制的那些东西粘贴进来就可以了

然后readne随便写一写就行了

然后点击创建,当这个地方都好了之后,MCP服务就创建成功了!!!大功告成了!!!

然后我们会到MCP广场,搜索自己的MCP服务,应该就有了

4.Trae 上测试MCP服务
点击连接后,复制信息,打开trae,然后手动添加刚刚复制的信息




配置好后,我们就可以在trae上用这个MCP服务了,我们来测试一下


然后就会自动调用MCP服务来工作了,如下图

到此圆满结束
至此敬礼
更多推荐

所有评论(0)