From 0a05bbed8dd49e42f6cd50fcd27d0f01a4d68770 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Tue, 16 Jun 2026 15:18:13 +0200 Subject: [PATCH] fix(beszel): review fixes for MCP and widget styling - Throw TRPCError instead of returning null when no integration - Sort beszelRouter import alphabetically in mcp.ts - Replace ternary with lookup table for background color - Mention integration_all in MCP server instructions --- apps/nextjs/src/app/api/mcp/[transport]/route.ts | 2 +- packages/api/src/mcp.ts | 2 +- packages/api/src/router/widgets/beszel.ts | 5 ++++- packages/widgets/src/beszel-system-grid/component.tsx | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/nextjs/src/app/api/mcp/[transport]/route.ts b/apps/nextjs/src/app/api/mcp/[transport]/route.ts index 0611a5a57..364fe90c5 100644 --- a/apps/nextjs/src/app/api/mcp/[transport]/route.ts +++ b/apps/nextjs/src/app/api/mcp/[transport]/route.ts @@ -148,7 +148,7 @@ If \`hasUseAccess\` is false, the API key owner lacks permission for that integr **"Check server health"** → Use \`healthMonitoring_getSystemHealthStatus\` for NAS/server metrics or \`healthMonitoring_getClusterHealthStatus\` for Proxmox clusters. -**"Check Beszel systems"** → Use \`beszel_getSystems\` to list all monitored systems with CPU/memory/disk/network status. Use \`beszel_getAlerts\` for active alerts and history. Use \`beszel_getSystemStats\` for historical metrics of a specific system (requires systemId from \`beszel_getSystems\`). +**"Check Beszel systems"** → Call \`integration_all\` to get Beszel integrationIds, then use \`beszel_getSystems\` to list all monitored systems with CPU/memory/disk/network status. Use \`beszel_getAlerts\` for active alerts and history. Use \`beszel_getSystemStats\` for historical metrics of a specific system (requires systemId from \`beszel_getSystems\`). **"Manage Docker containers"** → Use \`docker_getContainers\` to list containers with status/CPU/memory, then \`docker_startAll\`/\`docker_stopAll\`/\`docker_restartAll\` with container IDs. diff --git a/packages/api/src/mcp.ts b/packages/api/src/mcp.ts index 1a08d37f1..887e878ad 100644 --- a/packages/api/src/mcp.ts +++ b/packages/api/src/mcp.ts @@ -9,6 +9,7 @@ import { iconsRouter } from "./router/icons"; import { infoRouter } from "./router/info"; import { integrationRouter } from "./router/integration/integration-router"; import { inviteRouter } from "./router/invite"; +import { beszelRouter } from "./router/widgets/beszel"; import { calendarRouter } from "./router/widgets/calendar"; import { dnsHoleRouter } from "./router/widgets/dns-hole"; import { downloadsRouter } from "./router/widgets/downloads"; @@ -16,7 +17,6 @@ import { healthMonitoringRouter } from "./router/widgets/health-monitoring"; import { mediaRequestsRouter } from "./router/widgets/media-requests"; import { mediaServerRouter } from "./router/widgets/media-server"; import { smartHomeRouter } from "./router/widgets/smart-home"; -import { beszelRouter } from "./router/widgets/beszel"; export const mcpRouter = createTRPCRouter({ app: appRouterForApps, diff --git a/packages/api/src/router/widgets/beszel.ts b/packages/api/src/router/widgets/beszel.ts index da00ea4f5..25ede9289 100644 --- a/packages/api/src/router/widgets/beszel.ts +++ b/packages/api/src/router/widgets/beszel.ts @@ -1,3 +1,4 @@ +import { TRPCError } from "@trpc/server"; import { observable } from "@trpc/server/observable"; import { z } from "zod/v4"; @@ -160,7 +161,9 @@ export const beszelRouter = createTRPCRouter({ ) .query(async ({ ctx, input }) => { const integration = ctx.integrations[0]; - if (!integration) return null; + if (!integration) { + throw new TRPCError({ code: "BAD_REQUEST", message: "At least one Beszel integrationId is required" }); + } const innerHandler = beszelStatsRequestHandler.handler(integration, { systemId: input.systemId, timePeriod: input.timePeriod, diff --git a/packages/widgets/src/beszel-system-grid/component.tsx b/packages/widgets/src/beszel-system-grid/component.tsx index cd902963c..63c6f785a 100644 --- a/packages/widgets/src/beszel-system-grid/component.tsx +++ b/packages/widgets/src/beszel-system-grid/component.tsx @@ -356,7 +356,8 @@ export default function BeszelSystemGridWidget({ const board = useRequiredBoard(); const colorScheme = useComputedColorScheme("light"); const opacity = board.opacity / 100; - const backgroundColor = colorScheme === "dark" ? `rgba(57, 57, 57, ${opacity})` : `rgba(246, 247, 248, ${opacity})`; + const bgBase: Record = { dark: "57, 57, 57", light: "246, 247, 248" }; + const backgroundColor = `rgba(${bgBase[colorScheme]}, ${opacity})`; const { data: results = [] } = clientApi.widget.beszel.getSystems.useQuery( { integrationIds },