From be2a5f7b487a2028055f728cc46241682a3d0201 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sun, 8 Mar 2026 15:46:44 +0200 Subject: [PATCH 1/7] fix(teams): wire up all teams API endpoints and fix frontend data mapping bugs - Register admin, user, and activity endpoints in setup.go with teams auth middleware (session cookie/JWT), fixing 401 errors on all teams pages - Implement getDashboard handler with user/session/server stats - Fix AdminUsers.vue: backend returns array directly, not {users: [...]} - Fix UserServers.vue: map {personal, shared} response to flat array - Fix UserActivity.vue: use data.items not data.activities - Fix UserDiagnostics.vue: map ownership->owner_type, synthesize health - Fix SidebarNav: remove duplicate Dashboard/Admin Overview, add Sessions - Add nil-safety for activityFilter in admin and user activity handlers - Enhance CLI status command to show edition and teams info (OAuth provider, admin emails) with build-tag separation for personal/teams editions Co-Authored-By: Claude Opus 4.6 --- cmd/mcpproxy/status_cmd.go | 27 +- cmd/mcpproxy/status_teams.go | 18 + cmd/mcpproxy/status_teams_stub.go | 9 + frontend/src/components/SidebarNav.vue | 135 +++++- frontend/src/views/teams/AdminDashboard.vue | 225 ++++++++++ frontend/src/views/teams/AdminUsers.vue | 217 +++++++++ frontend/src/views/teams/UserActivity.vue | 282 ++++++++++++ frontend/src/views/teams/UserDiagnostics.vue | 223 ++++++++++ frontend/src/views/teams/UserServers.vue | 316 +++++++++++++ internal/teams/api/admin_handlers.go | 423 ++++++++++++++++++ internal/teams/api/admin_handlers_test.go | 329 ++++++++++++++ internal/teams/api/auth_endpoints.go | 149 +++++++ internal/teams/api/user_activity.go | 178 ++++++++ internal/teams/api/user_handlers.go | 446 +++++++++++++++++++ internal/teams/setup.go | 93 ++++ 15 files changed, 3054 insertions(+), 16 deletions(-) create mode 100644 cmd/mcpproxy/status_teams.go create mode 100644 cmd/mcpproxy/status_teams_stub.go create mode 100644 frontend/src/views/teams/AdminDashboard.vue create mode 100644 frontend/src/views/teams/AdminUsers.vue create mode 100644 frontend/src/views/teams/UserActivity.vue create mode 100644 frontend/src/views/teams/UserDiagnostics.vue create mode 100644 frontend/src/views/teams/UserServers.vue create mode 100644 internal/teams/api/admin_handlers.go create mode 100644 internal/teams/api/admin_handlers_test.go create mode 100644 internal/teams/api/auth_endpoints.go create mode 100644 internal/teams/api/user_activity.go create mode 100644 internal/teams/api/user_handlers.go create mode 100644 internal/teams/setup.go diff --git a/cmd/mcpproxy/status_cmd.go b/cmd/mcpproxy/status_cmd.go index 9cde5374..0eb2671a 100644 --- a/cmd/mcpproxy/status_cmd.go +++ b/cmd/mcpproxy/status_cmd.go @@ -22,6 +22,7 @@ import ( // StatusInfo holds the collected status data for display. type StatusInfo struct { State string `json:"state"` + Edition string `json:"edition"` ListenAddr string `json:"listen_addr"` Uptime string `json:"uptime,omitempty"` UptimeSeconds float64 `json:"uptime_seconds,omitempty"` @@ -31,6 +32,13 @@ type StatusInfo struct { SocketPath string `json:"socket_path,omitempty"` ConfigPath string `json:"config_path,omitempty"` Version string `json:"version,omitempty"` + TeamsInfo *TeamsStatusInfo `json:"teams,omitempty"` +} + +// TeamsStatusInfo holds teams-specific status information. +type TeamsStatusInfo struct { + OAuthProvider string `json:"oauth_provider"` + AdminEmails []string `json:"admin_emails"` } // ServerCounts holds upstream server statistics. @@ -151,11 +159,15 @@ func collectStatusFromDaemon(cfg *config.Config, socketPath, configPath string) info := &StatusInfo{ State: "Running", + Edition: Edition, APIKey: cfg.APIKey, SocketPath: socketPath, ConfigPath: configPath, } + // Add teams info if available + info.TeamsInfo = collectTeamsInfo(cfg) + // Get status data (running, listen_addr, upstream_stats) statusData, err := client.GetStatus(ctx) if err != nil { @@ -208,13 +220,18 @@ func collectStatusFromConfig(cfg *config.Config, socketPath, configPath string) listenAddr = "127.0.0.1:8080" } - return &StatusInfo{ + info := &StatusInfo{ State: "Not running", + Edition: Edition, ListenAddr: listenAddr + " (configured)", APIKey: cfg.APIKey, WebUIURL: statusBuildWebUIURL(listenAddr, cfg.APIKey), ConfigPath: configPath, } + + info.TeamsInfo = collectTeamsInfo(cfg) + + return info } func extractServerCounts(stats map[string]interface{}) *ServerCounts { @@ -321,6 +338,7 @@ func printStatusTable(info *StatusInfo) { fmt.Println("MCPProxy Status") fmt.Printf(" %-12s %s\n", "State:", info.State) + fmt.Printf(" %-12s %s\n", "Edition:", info.Edition) if info.Version != "" { fmt.Printf(" %-12s %s\n", "Version:", info.Version) @@ -346,6 +364,13 @@ func printStatusTable(info *StatusInfo) { if info.ConfigPath != "" { fmt.Printf(" %-12s %s\n", "Config:", info.ConfigPath) } + + if info.TeamsInfo != nil { + fmt.Println() + fmt.Println("Teams") + fmt.Printf(" %-12s %s\n", "OAuth:", info.TeamsInfo.OAuthProvider) + fmt.Printf(" %-12s %s\n", "Admins:", strings.Join(info.TeamsInfo.AdminEmails, ", ")) + } } func loadStatusConfig() (*config.Config, error) { diff --git a/cmd/mcpproxy/status_teams.go b/cmd/mcpproxy/status_teams.go new file mode 100644 index 00000000..f77755ce --- /dev/null +++ b/cmd/mcpproxy/status_teams.go @@ -0,0 +1,18 @@ +//go:build teams + +package main + +import "github.com/smart-mcp-proxy/mcpproxy-go/internal/config" + +func collectTeamsInfo(cfg *config.Config) *TeamsStatusInfo { + if cfg.Teams == nil || !cfg.Teams.Enabled { + return nil + } + info := &TeamsStatusInfo{ + AdminEmails: cfg.Teams.AdminEmails, + } + if cfg.Teams.OAuth != nil { + info.OAuthProvider = cfg.Teams.OAuth.Provider + } + return info +} diff --git a/cmd/mcpproxy/status_teams_stub.go b/cmd/mcpproxy/status_teams_stub.go new file mode 100644 index 00000000..327de7e7 --- /dev/null +++ b/cmd/mcpproxy/status_teams_stub.go @@ -0,0 +1,9 @@ +//go:build !teams + +package main + +import "github.com/smart-mcp-proxy/mcpproxy-go/internal/config" + +func collectTeamsInfo(_ *config.Config) *TeamsStatusInfo { + return nil +} diff --git a/frontend/src/components/SidebarNav.vue b/frontend/src/components/SidebarNav.vue index bf899c4d..cdb5e6bb 100644 --- a/frontend/src/components/SidebarNav.vue +++ b/frontend/src/components/SidebarNav.vue @@ -6,25 +6,90 @@
MCPProxy Logo - MCPProxy +
+ MCPProxy + Teams +
-