| 102 | } |
| 103 | |
| 104 | func (n *daemonNativeTools) mcpAuthStatus( |
| 105 | ctx context.Context, |
| 106 | _ toolspkg.Scope, |
| 107 | req toolspkg.CallRequest, |
| 108 | ) (toolspkg.ToolResult, error) { |
| 109 | var input mcpAuthStatusInput |
| 110 | if err := decodeNativeInput(req, &input); err != nil { |
| 111 | return toolspkg.ToolResult{}, err |
| 112 | } |
| 113 | serverName, err := requiredNativeString(req.ToolID, "server_name", input.ServerName) |
| 114 | if err != nil { |
| 115 | return toolspkg.ToolResult{}, err |
| 116 | } |
| 117 | provider := n.mcpAuthProvider() |
| 118 | if provider == nil { |
| 119 | return toolspkg.ToolResult{}, toolspkg.NewToolError( |
| 120 | toolspkg.ErrorCodeUnavailable, |
| 121 | req.ToolID, |
| 122 | "mcp auth status provider is unavailable", |
| 123 | toolspkg.ErrToolUnavailable, |
| 124 | toolspkg.ReasonDependencyMissing, |
| 125 | ) |
| 126 | } |
| 127 | status, err := provider.Status(ctx, toolspkg.SourceRef{ |
| 128 | Kind: toolspkg.SourceMCP, |
| 129 | Owner: serverName, |
| 130 | RawServerName: serverName, |
| 131 | }) |
| 132 | if err != nil { |
| 133 | return toolspkg.ToolResult{}, err |
| 134 | } |
| 135 | if strings.TrimSpace(status.ServerName) == "" { |
| 136 | status.ServerName = serverName |
| 137 | } |
| 138 | payload := mcpAuthStatusPayload{ |
| 139 | Status: status, |
| 140 | RepairPaths: mcpAuthRepairPathsFor(status.ServerName), |
| 141 | } |
| 142 | return structuredResult(payload, fmt.Sprintf("%s %s", status.ServerName, status.Status)) |
| 143 | } |
| 144 | |
| 145 | func mcpAuthRepairPathsFor(serverName string) mcpAuthRepairPaths { |
| 146 | arg := strconv.Quote(strings.TrimSpace(serverName)) |