您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

mcp_server.py 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import json
  2. from enum import StrEnum
  3. from flask_login import current_user
  4. from flask_restx import Resource, fields, marshal_with, reqparse
  5. from werkzeug.exceptions import NotFound
  6. from controllers.console import api, console_ns
  7. from controllers.console.app.wraps import get_app_model
  8. from controllers.console.wraps import account_initialization_required, setup_required
  9. from extensions.ext_database import db
  10. from fields.app_fields import app_server_fields
  11. from libs.login import login_required
  12. from models.model import AppMCPServer
  13. class AppMCPServerStatus(StrEnum):
  14. ACTIVE = "active"
  15. INACTIVE = "inactive"
  16. @console_ns.route("/apps/<uuid:app_id>/server")
  17. class AppMCPServerController(Resource):
  18. @api.doc("get_app_mcp_server")
  19. @api.doc(description="Get MCP server configuration for an application")
  20. @api.doc(params={"app_id": "Application ID"})
  21. @api.response(200, "MCP server configuration retrieved successfully", app_server_fields)
  22. @setup_required
  23. @login_required
  24. @account_initialization_required
  25. @get_app_model
  26. @marshal_with(app_server_fields)
  27. def get(self, app_model):
  28. server = db.session.query(AppMCPServer).where(AppMCPServer.app_id == app_model.id).first()
  29. return server
  30. @api.doc("create_app_mcp_server")
  31. @api.doc(description="Create MCP server configuration for an application")
  32. @api.doc(params={"app_id": "Application ID"})
  33. @api.expect(
  34. api.model(
  35. "MCPServerCreateRequest",
  36. {
  37. "description": fields.String(description="Server description"),
  38. "parameters": fields.Raw(required=True, description="Server parameters configuration"),
  39. },
  40. )
  41. )
  42. @api.response(201, "MCP server configuration created successfully", app_server_fields)
  43. @api.response(403, "Insufficient permissions")
  44. @setup_required
  45. @login_required
  46. @account_initialization_required
  47. @get_app_model
  48. @marshal_with(app_server_fields)
  49. def post(self, app_model):
  50. if not current_user.is_editor:
  51. raise NotFound()
  52. parser = reqparse.RequestParser()
  53. parser.add_argument("description", type=str, required=False, location="json")
  54. parser.add_argument("parameters", type=dict, required=True, location="json")
  55. args = parser.parse_args()
  56. description = args.get("description")
  57. if not description:
  58. description = app_model.description or ""
  59. server = AppMCPServer(
  60. name=app_model.name,
  61. description=description,
  62. parameters=json.dumps(args["parameters"], ensure_ascii=False),
  63. status=AppMCPServerStatus.ACTIVE,
  64. app_id=app_model.id,
  65. tenant_id=current_user.current_tenant_id,
  66. server_code=AppMCPServer.generate_server_code(16),
  67. )
  68. db.session.add(server)
  69. db.session.commit()
  70. return server
  71. @api.doc("update_app_mcp_server")
  72. @api.doc(description="Update MCP server configuration for an application")
  73. @api.doc(params={"app_id": "Application ID"})
  74. @api.expect(
  75. api.model(
  76. "MCPServerUpdateRequest",
  77. {
  78. "id": fields.String(required=True, description="Server ID"),
  79. "description": fields.String(description="Server description"),
  80. "parameters": fields.Raw(required=True, description="Server parameters configuration"),
  81. "status": fields.String(description="Server status"),
  82. },
  83. )
  84. )
  85. @api.response(200, "MCP server configuration updated successfully", app_server_fields)
  86. @api.response(403, "Insufficient permissions")
  87. @api.response(404, "Server not found")
  88. @setup_required
  89. @login_required
  90. @account_initialization_required
  91. @get_app_model
  92. @marshal_with(app_server_fields)
  93. def put(self, app_model):
  94. if not current_user.is_editor:
  95. raise NotFound()
  96. parser = reqparse.RequestParser()
  97. parser.add_argument("id", type=str, required=True, location="json")
  98. parser.add_argument("description", type=str, required=False, location="json")
  99. parser.add_argument("parameters", type=dict, required=True, location="json")
  100. parser.add_argument("status", type=str, required=False, location="json")
  101. args = parser.parse_args()
  102. server = db.session.query(AppMCPServer).where(AppMCPServer.id == args["id"]).first()
  103. if not server:
  104. raise NotFound()
  105. description = args.get("description")
  106. if description is None:
  107. pass
  108. elif not description:
  109. server.description = app_model.description or ""
  110. else:
  111. server.description = description
  112. server.parameters = json.dumps(args["parameters"], ensure_ascii=False)
  113. if args["status"]:
  114. if args["status"] not in [status.value for status in AppMCPServerStatus]:
  115. raise ValueError("Invalid status")
  116. server.status = args["status"]
  117. db.session.commit()
  118. return server
  119. @console_ns.route("/apps/<uuid:server_id>/server/refresh")
  120. class AppMCPServerRefreshController(Resource):
  121. @api.doc("refresh_app_mcp_server")
  122. @api.doc(description="Refresh MCP server configuration and regenerate server code")
  123. @api.doc(params={"server_id": "Server ID"})
  124. @api.response(200, "MCP server refreshed successfully", app_server_fields)
  125. @api.response(403, "Insufficient permissions")
  126. @api.response(404, "Server not found")
  127. @setup_required
  128. @login_required
  129. @account_initialization_required
  130. @marshal_with(app_server_fields)
  131. def get(self, server_id):
  132. if not current_user.is_editor:
  133. raise NotFound()
  134. server = (
  135. db.session.query(AppMCPServer)
  136. .where(AppMCPServer.id == server_id)
  137. .where(AppMCPServer.tenant_id == current_user.current_tenant_id)
  138. .first()
  139. )
  140. if not server:
  141. raise NotFound()
  142. server.server_code = AppMCPServer.generate_server_code(16)
  143. db.session.commit()
  144. return server