Python之MCPServer实现

简介: 这是一个基于FastMCP框架构建的AI服务后端,集成百度天气预报与腾讯云搜索两大工具,支持实时新闻/天气查询;采用RSA鉴权与JWT认证,内置SQLAlchemy数据库支持及PyMySQL连接,具备健康检测接口与完整日志监控。

依赖包

pycryptodome==3.23.0
PyJWT==2.10.1
PyYAML==6.0.3
SQLAlchemy==2.0.45
PyMySQL==1.1.2
fastmcp==2.14.1

main方法

from fastmcp import FastMCP
from starlette.requests import Request
from starlette.responses import JSONResponse, Response

from tools.BaiduMapService import baidu_weather_forecasts_tool
from tools.TencentSearchPro import tencent_cloud_search_tool

# 初始化服务器
mcp = FastMCP("cmiot-mcp-server")
mcp.add_tool(tencent_cloud_search_tool)
mcp.add_tool(baidu_weather_forecasts_tool)


# 自定义接口:健康监测
@mcp.custom_route("/probe", methods=["GET", "POST"])
async def probe(request: Request) -> Response:
    return JSONResponse({"status": "ok"})


if __name__ == "__main__":
    mcp.run(
        transport="http",
        host="0.0.0.0",
        port=8000,
        path="/mcp"
    )

Tool

tencent_cloud_search_tool = Tool.from_function(
    query_tencent_cloud_search,
    name="tencent_cloud_search",
    description="联网搜索功能。如果用户想要了解最近的或者实时新闻之类的信息,用本接口搜索互联网数据。",
    tags={"最近", "最新", "实时", "实时新闻", "实时天气"},
    output_schema={
        "type": "object",
        "properties": {
            "results": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "title": { "type": "string", "description": "标题" },
                        "content": { "type": "string", "description": "内容" },
                        "url": { "type": "string", "description": "内容链接" }
                    }
                }
            }
        }
    }
)

具体实现

async def query_tencent_cloud_search(query: str) -> dict:
    """
    联网搜索功能。如果用户想要了解最近的或者实时新闻之类的信息,用本接口搜索互联网数据。
    :param query: 用户想要联网搜索的内容。
    :return: 返回实时数据列表。检索到的内容包括:标题title,文本内容content,内容链接url
    """
    start_time = datetime.now()
    uid = extract_user_id_from_auth_header()
    if uid == 0:
        return {"results": []}
    results = tencentcloud_search_online(query)
    end_time = datetime.now()
    total_cost = (end_time - start_time).total_seconds()
    logger.info(f"uid: {uid}, cost: {total_cost}s, query: {query}, results: {results}")
    return {"results": results}

鉴权

from datetime import datetime

from fastmcp.server.dependencies import get_http_headers

from dao.UserDao import user_secret_key_dict
from utils.LoggerManager import logger
from utils.RSAHelper import parse_rsa_decrypted


def extract_user_id_from_auth_header():
    # 用户ID默认为0
    result_uid = 0
    try:
        headers = get_http_headers()
        if headers:
            authorization = headers.get("authorization")
            if authorization:
                authorization = authorization[7:]
                logger.info(f"extract_user_id authorization: {authorization}")
                # 解密
                uid, secret_key, timestamp = parse_rsa_decrypted(authorization)
                # logger.info(f"extract_user_id uid: {uid}, timestamp: {timestamp}")
                # 如果时间超过5分钟,则认为失效
                timeout = timestamp + 300 < int(datetime.now().timestamp())
                # logger.info(f"extract_user_id timeout: {timeout}")
                # 如果没有失效
                if not timeout:
                    server_secret = user_secret_key_dict.get(uid)
                    # 校验两个密钥是否相同
                    if server_secret == secret_key:
                        result_uid = uid
    except Exception as e:
        logger.info(f"extract_user_id Exception: {e}")
    logger.info(f"extract_user_id result_uid: {result_uid}")
    return result_uid
相关文章
|
4天前
|
缓存 人工智能 运维
企业级 LLM 成本治理:Claude Code 缓存机制与 API 架构优化实践
本文介绍企业级LLM成本治理实践:基于Claude前缀缓存机制,通过统一提示词模板、稳定模型配置与会话管理,实现84%缓存命中率、76%成本降低;并结合API网关架构优化,兼顾降本、合规、多模型兼容与运维效率。
94 0
|
1月前
|
Java 调度 开发者
Java AQS:JUC 并发体系的底层同步框架基石
AQS(AbstractQueuedSynchronizer)是Java并发包(JUC)的底层核心,以volatile state + CLH双向队列统一实现同步控制。支持独占(如ReentrantLock)与共享(如Semaphore、CountDownLatch)两种模式,通过模板方法封装排队、阻塞/唤醒等通用逻辑,是理解与定制高性能同步组件的关键基石。(239字)
282 7
|
4月前
|
安全 数据安全/隐私保护 Python
Python实现RSA加解密
本文介绍如何使用Python的PyCryptodome库实现RSA加解密。内容包括安装依赖、生成密钥对、保存公私钥文件,以及封装加密、解密和公钥导出功能的类,并提供完整调用示例,适用于安全通信开发场景。(238字)
150 0
|
4天前
|
人工智能 运维 测试技术
从部署到优化,AI开源知识库实用心得
先交代一下背景:我们团队是中小规模研发+运维混合团队,共12人,核心痛点有两个:一是内网部署的国产化龙芯服务器,很多工具适配性差,之前用的传统Wiki要么装不上,要么运行卡顿;二是研发、运维、测试三个部门的技术知识分散,比如运维的服务器部署文档、研发的接口规范、测试的用例说明,分别存在本地文档、GitLab、企业微信文件夹里,跨部门协作时找资料像“考古”,新人上手更是难上加难。
|
4天前
|
存储 人工智能 API
OpenClaw一人AI企业搭建全攻略:阿里云/本地部署,集成Chief+Sub-Agent架构及多Agent操作指南
2026年,用OpenClaw搭建“一人公司”时,很多人会陷入多Agent管理的困境:记忆混乱导致战略分散、Token消耗激增、上下文污染让Agent“越界干活”——明明需要执行者,却养了一群“记忆错乱的演员”。核心问题不在于Agent数量,而在于架构设计错误。
91 0
|
3月前
|
Python
Python桌面程序PyQt6的Pop提示与自动消失
使用PyQt6实现全屏提示框,3秒后自动消失。通过自定义TipPopup类创建无边框、置顶窗口,并结合信号与定时器控制显示与关闭,适用于全局提示场景。
|
4月前
|
API Python
腾讯云-联网搜索API-调用Demo
本文介绍了如何使用Python生成腾讯云API的TC3-HMAC-SHA256签名,并通过Authorization请求头调用SearchPro接口实现搜索功能,涵盖签名计算、请求拼接与HTTP调用全过程。
224 0
|
6月前
|
调度 Python
Python基于Fastapi与APScheduler的应用定时任务
基于FastAPI与APScheduler实现定时任务调度,通过lifespan管理生命周期,每分钟执行一次反馈任务,结合Uvicorn启动服务,构建高效异步任务处理系统。
402 3
|
7月前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
527 3

热门文章

最新文章