// opsxdb-mcp:stdio MCP Server,暴露只读数据库工具(P0)。 // Logan.Li // // 配置: // ~/.opsxdb/mcp.json — allowed_connection_ids;mode(P0 执行层强制只读) // ~/.opsxdb/connections.json — 桌面双写的连接列表(密码 ox1. 混淆) // ~/.opsxdb/logs/mcp-audit.jsonl // // Cursor 示例见 docs/mcp-cursor.example.json package main import ( "context" "encoding/json" "fmt" "os" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "opsxdb/server/internal/aitools" ) func main() { rt, err := aitools.DefaultRuntime() if err != nil { fmt.Fprintf(os.Stderr, "opsxdb-mcp: load policy: %v\n", err) os.Exit(1) } rt.Source = "mcp" s := server.NewMCPServer( "opsxdb", "0.1.0", server.WithToolCapabilities(true), ) for _, spec := range aitools.ToolSpecs() { raw, _ := json.Marshal(spec.InputSchema()) t := mcp.NewToolWithRawSchema(spec.Name, spec.Description, raw) toolName := spec.Name s.AddTool(t, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { args := req.GetArguments() out, err := rt.Call(ctx, toolName, args) if err != nil { return mcp.NewToolResultError(err.Error()), nil } return mcp.NewToolResultText(aitools.ResultJSON(out)), nil }) } if err := server.ServeStdio(s); err != nil { fmt.Fprintf(os.Stderr, "opsxdb-mcp: %v\n", err) os.Exit(1) } }