HTTP 與 MCP
httpcompat 與 mcp 是接在同一個 h2c 埠上的兩個非 gRPC 表面:httpcompat 用 grpc-gateway 產生 HTTP/JSON,mcp 把標注過的 RPC 開成 AI agent 可呼叫的 MCP tools。兩者都經 in-process loopback 回撥 gRPC server,因此共用同一條攔截器鏈。
先取得模組:go get github.com/yshengliao/gortexa@v0.28.3。以下片段皆對 v0.28.3 編譯驗證過。
httpcompat
Section titled “httpcompat”建立 error handler 走 apperr、含 protojson marshaler、並把 Authorization 與 X-Request-Id 轉送到固定 metadata key 的 ServeMux;撞上受信 key(含 peer-IP)的 Grpc-Metadata-* 拼法一律拒絕。
import ( "github.com/yshengliao/gortexa/apperr" "github.com/yshengliao/gortexa/httpcompat")
gateway := httpcompat.NewServeMux(apperr.Default)// 把 grpc-gateway handler 註冊到 gateway + loopback connhandler := httpcompat.MaxBodyBytes(gateway) // body 上限 1 MiBhandler = httpcompat.CORS(handler, cfg.Server)另有 OpenAPIRoute(next, cfg, specPath) 掛 OpenAPI spec。
把有 gortexa.ai.v1 annotations 的 RPC 暴露成 MCP tools,經 loopback 過同一條攔截器鏈。
import ( "github.com/yshengliao/gortexa/apperr" "github.com/yshengliao/gortexa/mcp")
descs, err := mcp.ServiceDescriptors("resource.v1.ResourceService")if err != nil { return err}bridge, err := mcp.NewBridge(conn, descs, apperr.Default, cfg.Observ)if err != nil { return err}bridge.SetAllowedOrigins(cfg.Server.CORSOrigins)app.SetMCPHandler(bridge.Handler())離線輸出 tool schema 用 mcp.ExportSchemas(format, descs),format 為 mcp/openai/gemini。
- HTTP/JSON transport:gateway 的路由、headers 與限制
- MCP transport:endpoint 行為與 AI tool schema
- 核心概念:單埠多工與共用的攔截器鏈