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

posted @ 2025-04-16 17:33  mingtian是吧  阅读(26)  评论(0)    收藏  举报