demo
环境搭建
FROM python:3.11.12-alpine3.21
LABEL maintainer=1209233066@qq.com
RUN pip3 install starlette==0.46.2 uvicorn==0.34.1 mcp akshare pandas -i https://mirrors.aliyun.com/pypi/simple/
EXPOSE 8000
COPY mcp_demo.py /opt/mcp_demo.py
WORKDIR /opt
CMD ["uvicorn","mcp_demo:app","--host","0.0.0.0"]
from starlette.applications import Starlette
from starlette.routing import Mount, Host
from mcp.server.fastmcp import FastMCP
from datetime import datetime
import os
import akshare as ak
import pandas as pd
mcp = FastMCP("My App")
@mcp.tool()
def get_time() -> str:
"""Get current time"""
now = datetime.now()
return f"Current time: {now.strftime('%Y-%m-%d %H:%M:%S')} (UTC+8)"
@mcp.tool()
def get_user() -> str:
"""Get user name"""
user=os.getenv("USER")
return f"Current user: {user} "
@mcp.tool()
def get_stock() -> str:
"""Get stock info """
data = ak.stock_zh_a_spot_em()
# 将数据转换为DataFrame
df = pd.DataFrame(data)
stock_codes = {"000001",
"000009",
"000547",
"000792",
"000821",
"000938",
"001333",
"002085",
"002340",
"002607",
"002642",
"002803",
"300498",
"301091",
"600089",
"600062",
"603191",
"603650",
"603982",
"605366",
"835985",
"603315",
"603381",
"300085",
"600536",
"300397",
"002122",
"600876"
}
# 筛选指定股票的实时数据
stock_data = df[df[f"代码"].isin(stock_codes)]
# # 选择我们想要展示的列
columns_to_display = ["代码", "名称", "最低", "最新价", "最高", "涨跌幅", "涨速", "5分钟涨跌", "换手率", "量比",
"年初至今涨跌幅"]
stock_data_display = stock_data[columns_to_display]
# print(stock_data_display)
# # 按照涨跌幅倒序排列
stock_data_sorted = stock_data_display.sort_values(by="涨跌幅", ascending=False)
# # # 打印结果
return f"Current stock: {stock_data_sorted}"
@mcp.tool()
def logfile(context):
"""wirte context to logfile"""
with open("/tmp/1.log",mode="w+") as f:
f.write(context)
return f"already write {context} to /tmp/1.log"
# Mount the SSE server to the existing ASGI server
app = Starlette(
routes=[
Mount('/', app=mcp.sse_app()),
]
)
# or dynamically mount as host
app.router.routes.append(Host('mcp.acme.corp', app=mcp.sse_app()))
docker build . -t mcp_demo:v0.1
docker run --rm -it -p8000:8000 mcp_demo:v0.1
cursor 配置
{
"mcpServers": {
"demo": {
"type": "sse",
"url": "http://192.168.0.102:8000/sse"
}
}
}
Starlette 是一个轻量的异步web框架,借助该工具实现sse
mcp 官网
mcp python-sdk 使用python 实现mcp 工具开发的sdk