from __future__ import annotations from pydantic import ValidationError from quart import Blueprint, jsonify from app.api.v1.utils import ApiDependencies, LongArticlesMcpRequest from app.api.v1.utils import parse_json, validation_error_response from app.domains.mcp import LongArticleMCP def create_mcp_bp(deps: ApiDependencies) -> Blueprint: bp = Blueprint("mcp", __name__) @bp.route("/long_articles_mcp/", methods=["POST"]) async def long_articles_mcp(task_name: str): """ MCP 交互接口 - POST /api/long_articles_mcp/ - 通过 task_name 分发到 LongArticleMCP 内对应的方法 - 请求体为 JSON,可选字段如 limit、offset 等,由各 task 按需使用 """ try: req, _ = await parse_json(LongArticlesMcpRequest) except ValidationError as e: payload, status = validation_error_response(e) return jsonify(payload), status # 使用校验后的模型转 dict,保证 limit/offset 等类型正确,且含 extra 透传字段 params = req.model_dump(exclude_none=True) mcp = LongArticleMCP(pool=deps.db, log_service=deps.log) handler_map = { "get_decode_response": mcp.get_decode_response, } handler = handler_map.get(task_name) if handler is None: return ( jsonify( { "code": 404, "message": f"unknown task_name: {task_name}", "data": None, } ), 404, ) result = await handler(params=params) return jsonify({"code": 0, "message": "success", "data": result}) return bp