Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "os"
  6. "git.x2erp.com/qdy/go-svc-mcp/internal/auth"
  7. "git.x2erp.com/qdy/go-svc-mcp/internal/mcp"
  8. _ "git.x2erp.com/qdy/go-svc-mcp/internal/tools" // 触发工具自动注册
  9. "git.x2erp.com/qdy/go-base/config"
  10. "git.x2erp.com/qdy/go-base/container"
  11. "git.x2erp.com/qdy/go-base/ctx"
  12. "git.x2erp.com/qdy/go-base/graceful"
  13. "git.x2erp.com/qdy/go-base/logger"
  14. "git.x2erp.com/qdy/go-db/factory/database"
  15. mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp"
  16. )
  17. var (
  18. appName = "svc-mcp"
  19. appVersion = "1"
  20. )
  21. func main() {
  22. // 0. 初始化日志
  23. logBootFactory := logger.InitBootLog()
  24. // 1. 获取配置文件
  25. cfg := config.GetConfig()
  26. cfg.SetAppName(appName)
  27. cfg.SetAppVersion(appVersion)
  28. // 2. 创建关闭容器
  29. ctr := container.NewContainer(cfg)
  30. // 注册日志,实现自动关闭
  31. container.Reg(ctr, logBootFactory)
  32. // 3. 创建数据库工厂
  33. dbFactory := container.Create(ctr, database.CreateDBFactory)
  34. dbFactory.TestConnection()
  35. // 4. 创建基础请求上下文(可从配置或认证中提取)
  36. baseCtx := &ctx.RequestContext{
  37. TenantID: "default-tenant", // 实际应从认证中间件获取
  38. }
  39. // 5. 创建 MCP 服务器
  40. mcpServer, err := mcp.NewServer(mcp.Config{
  41. Name: appName,
  42. Version: appVersion,
  43. Description: "MCP 工具服务,提供自动注册发现和依赖注入",
  44. DBFactory: dbFactory,
  45. BaseCtx: baseCtx,
  46. Port: cfg.GetServiceConfig().Port,
  47. ServiceName: cfg.GetServiceConfig().ServiceName,
  48. })
  49. if err != nil {
  50. log.Fatalf("Failed to create MCP server: %v", err)
  51. }
  52. log.Printf("MCP server created with tools registered")
  53. // 6. 获取 SDK 服务器实例
  54. sdkServer := mcpServer.GetSDKServer()
  55. // 7. 创建 HTTP 处理器(带验证中间件)
  56. authToken := os.Getenv("MCP_AUTH_TOKEN")
  57. if authToken == "" {
  58. authToken = "123" // 仅用于开发,生产环境必须设置
  59. }
  60. projectIDHeader := os.Getenv("MCP_PROJECT_ID_HEADER")
  61. if projectIDHeader == "" {
  62. projectIDHeader = "X-Project-ID"
  63. }
  64. mcpHandler := mcpsdk.NewStreamableHTTPHandler(func(req *http.Request) *mcpsdk.Server {
  65. return sdkServer
  66. }, nil)
  67. // 包装验证中间件
  68. handler := auth.AuthMiddleware(mcpHandler, authToken, projectIDHeader)
  69. mcpServer.Run(handler)
  70. //启用运行日志
  71. container.Create(ctr, logger.InitRuntimeLogger)
  72. //等待关闭
  73. graceful.WaitForShutdown(appName, mcpServer.GetHTTPServer(), ctr)
  74. }