mcp.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from __future__ import annotations
  2. from pydantic import ValidationError
  3. from quart import Blueprint, jsonify
  4. from app.api.v1.utils import ApiDependencies, LongArticlesMcpRequest
  5. from app.api.v1.utils import parse_json, validation_error_response
  6. from app.domains.mcp import LongArticleMCP
  7. def create_mcp_bp(deps: ApiDependencies) -> Blueprint:
  8. bp = Blueprint("mcp", __name__)
  9. @bp.route("/long_articles_mcp/<string:task_name>", methods=["POST"])
  10. async def long_articles_mcp(task_name: str):
  11. """
  12. MCP 交互接口
  13. - POST /api/long_articles_mcp/<task_name>
  14. - 通过 task_name 分发到 LongArticleMCP 内对应的方法
  15. - 请求体为 JSON,可选字段如 limit、offset 等,由各 task 按需使用
  16. """
  17. try:
  18. req, _ = await parse_json(LongArticlesMcpRequest)
  19. except ValidationError as e:
  20. payload, status = validation_error_response(e)
  21. return jsonify(payload), status
  22. # 使用校验后的模型转 dict,保证 limit/offset 等类型正确,且含 extra 透传字段
  23. params = req.model_dump(exclude_none=True)
  24. mcp = LongArticleMCP(pool=deps.db, log_service=deps.log)
  25. handler_map = {
  26. "get_decode_response": mcp.get_decode_response,
  27. }
  28. handler = handler_map.get(task_name)
  29. if handler is None:
  30. return (
  31. jsonify(
  32. {
  33. "code": 404,
  34. "message": f"unknown task_name: {task_name}",
  35. "data": None,
  36. }
  37. ),
  38. 404,
  39. )
  40. result = await handler(params=params)
  41. return jsonify({"code": 0, "message": "success", "data": result})
  42. return bp