Skip to content

Commit 0e0ddf8

Browse files
committed
feat(lightspeed): Fix API reports, SonarQube warnings
Assisted-by: Claude Opus 4.6 Generated-by: Cursor Signed-off-by: Maysun J Faisal <maysunaneek@gmail.com> Made-with: Cursor
1 parent bbcc62e commit 0e0ddf8

File tree

7 files changed

+97
-6
lines changed

7 files changed

+97
-6
lines changed

workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/lcsHandlers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,19 +244,19 @@ export const lcsHandlers: HttpHandler[] = [
244244
servers: [
245245
{
246246
name: 'static-mcp',
247-
url: 'http://mock-mcp-server:9999',
247+
url: 'https://mock-mcp-server:9999',
248248
provider_id: 'model-context-protocol',
249249
source: 'config',
250250
},
251251
{
252252
name: 'no-token-server',
253-
url: 'http://mock-mcp-server:9999',
253+
url: 'https://mock-mcp-server:9999',
254254
provider_id: 'model-context-protocol',
255255
source: 'config',
256256
},
257257
{
258258
name: 'lcs-only-server',
259-
url: 'http://mock-mcp-server:9999',
259+
url: 'https://mock-mcp-server:9999',
260260
provider_id: 'model-context-protocol',
261261
source: 'api',
262262
},

workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/mcpHandlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import { http, HttpResponse, type HttpHandler } from 'msw';
1818

19-
export const MOCK_MCP_ADDR = 'http://mock-mcp-server:9999';
19+
export const MOCK_MCP_ADDR = 'https://mock-mcp-server:9999';
2020
export const MOCK_MCP_VALID_TOKEN = 'valid-mcp-token';
2121

2222
const MOCK_TOOLS = [

workspaces/lightspeed/plugins/lightspeed-backend/report.api.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import { BackendFeature } from '@backstage/backend-plugin-api';
88
import type { Config } from '@backstage/config';
9+
import type { DatabaseService } from '@backstage/backend-plugin-api';
910
import express from 'express';
1011
import type { HttpAuthService } from '@backstage/backend-plugin-api';
1112
import type { LoggerService } from '@backstage/backend-plugin-api';
@@ -19,10 +20,52 @@ export function createRouter(options: RouterOptions): Promise<express.Router>;
1920
const lightspeedPlugin: BackendFeature;
2021
export default lightspeedPlugin;
2122

23+
// @public
24+
export interface McpServerResponse {
25+
// (undocumented)
26+
enabled: boolean;
27+
// (undocumented)
28+
hasToken: boolean;
29+
// (undocumented)
30+
hasUserToken: boolean;
31+
// (undocumented)
32+
name: string;
33+
// (undocumented)
34+
status: McpServerStatus;
35+
// (undocumented)
36+
toolCount: number;
37+
// (undocumented)
38+
url?: string;
39+
}
40+
41+
// @public (undocumented)
42+
export type McpServerStatus = 'connected' | 'error' | 'unknown';
43+
44+
// @public (undocumented)
45+
export interface McpToolInfo {
46+
// (undocumented)
47+
description: string;
48+
// (undocumented)
49+
name: string;
50+
}
51+
52+
// @public (undocumented)
53+
export interface McpValidationResult {
54+
// (undocumented)
55+
error?: string;
56+
// (undocumented)
57+
toolCount: number;
58+
// (undocumented)
59+
tools: McpToolInfo[];
60+
// (undocumented)
61+
valid: boolean;
62+
}
63+
2264
// @public
2365
export type RouterOptions = {
2466
logger: LoggerService;
2567
config: Config;
68+
database: DatabaseService;
2669
httpAuth: HttpAuthService;
2770
userInfo: UserInfoService;
2871
permissions: PermissionsService;

workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server-types.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,36 @@ export interface McpUserSettingsRow {
2727
updated_at: string;
2828
}
2929

30+
/**
31+
* @public
32+
*/
3033
export type McpServerStatus = 'connected' | 'error' | 'unknown';
3134

32-
/** Public-facing response for an MCP server with user settings merged. */
35+
/**
36+
* Public-facing response for an MCP server with user settings merged.
37+
* @public
38+
*/
3339
export interface McpServerResponse {
3440
name: string;
3541
url?: string;
3642
enabled: boolean;
3743
status: McpServerStatus;
3844
toolCount: number;
3945
hasToken: boolean;
46+
hasUserToken: boolean;
4047
}
4148

49+
/**
50+
* @public
51+
*/
4252
export interface McpToolInfo {
4353
name: string;
4454
description: string;
4555
}
4656

57+
/**
58+
* @public
59+
*/
4760
export interface McpValidationResult {
4861
valid: boolean;
4962
toolCount: number;

workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server.test.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ describe('MCP server management endpoints', () => {
162162
status: 'unknown',
163163
toolCount: 0,
164164
hasToken: true,
165+
hasUserToken: false,
165166
});
166167
});
167168

@@ -178,11 +179,35 @@ describe('MCP server management endpoints', () => {
178179
(s: any) => s.name === 'no-token-server',
179180
);
180181
expect(noTokenServer.hasToken).toBe(false);
182+
expect(noTokenServer.hasUserToken).toBe(false);
181183

182184
const withTokenServer = response.body.servers.find(
183185
(s: any) => s.name === 'static-mcp',
184186
);
185187
expect(withTokenServer.hasToken).toBe(true);
188+
expect(withTokenServer.hasUserToken).toBe(false);
189+
});
190+
191+
it('distinguishes admin token from user token via hasUserToken', async () => {
192+
const backendServer = await startBackendServer(MCP_CONFIG);
193+
194+
// Before user sets a token: admin token exists, no user token
195+
let response = await request(backendServer).get(
196+
'/api/lightspeed/mcp-servers',
197+
);
198+
expect(response.body.servers[0].hasToken).toBe(true);
199+
expect(response.body.servers[0].hasUserToken).toBe(false);
200+
201+
// After user sets a personal token: both should be true
202+
await request(backendServer)
203+
.patch('/api/lightspeed/mcp-servers/static-mcp')
204+
.send({ token: 'my-personal-token' });
205+
206+
response = await request(backendServer).get(
207+
'/api/lightspeed/mcp-servers',
208+
);
209+
expect(response.body.servers[0].hasToken).toBe(true);
210+
expect(response.body.servers[0].hasUserToken).toBe(true);
186211
});
187212

188213
it('reflects user settings after PATCH', async () => {
@@ -251,6 +276,7 @@ describe('MCP server management endpoints', () => {
251276
expect(patchRes.status).toBe(200);
252277
expect(patchRes.body.server.status).toBe('connected');
253278
expect(patchRes.body.server.hasToken).toBe(true);
279+
expect(patchRes.body.server.hasUserToken).toBe(true);
254280
expect(patchRes.body.validation).toBeDefined();
255281
expect(patchRes.body.validation.valid).toBe(true);
256282
expect(patchRes.body.validation.toolCount).toBe(3);
@@ -292,6 +318,7 @@ describe('MCP server management endpoints', () => {
292318
expect(clearRes.status).toBe(200);
293319
expect(clearRes.body.server.status).toBe('unknown');
294320
expect(clearRes.body.server.toolCount).toBe(0);
321+
expect(clearRes.body.server.hasUserToken).toBe(false);
295322
});
296323

297324
it('returns 400 when no fields provided', async () => {
@@ -356,7 +383,7 @@ describe('MCP server management endpoints', () => {
356383
const backendServer = await startBackendServer(MCP_CONFIG);
357384
const response = await request(backendServer)
358385
.post('/api/lightspeed/mcp-servers/validate')
359-
.send({ url: 'http://internal-service:1234', token: 'some-token' });
386+
.send({ url: 'https://internal-service:1234', token: 'some-token' });
360387

361388
expect(response.status).toBe(400);
362389
expect(response.body.error).toContain('URL not recognized');

workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export async function createRouter(
195195
status: setting?.status ?? 'unknown',
196196
toolCount: setting?.tool_count ?? 0,
197197
hasToken: !!(setting?.token || server.token),
198+
hasUserToken: !!setting?.token,
198199
};
199200
});
200201

@@ -371,6 +372,7 @@ export async function createRouter(
371372
status: setting.status,
372373
toolCount: setting.tool_count,
373374
hasToken: !!(setting.token || server.token),
375+
hasUserToken: !!setting.token,
374376
},
375377
};
376378
if (validation) result.validation = validation;

workspaces/lightspeed/plugins/lightspeed-common/report.api.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ export const lightspeedChatReadPermission: BasicPermission;
1818
// @public
1919
export const lightspeedChatUpdatePermission: BasicPermission;
2020

21+
// @public
22+
export const lightspeedMcpManagePermission: BasicPermission;
23+
24+
// @public
25+
export const lightspeedMcpReadPermission: BasicPermission;
26+
2127
// @public
2228
export const lightspeedNotebooksUsePermission: BasicPermission;
2329

0 commit comments

Comments
 (0)