Skip to content

Commit 973fbad

Browse files
authored
refactor: handle missing io.modelcontextprotocol.registry/publisher-provided _meta from serve (#427)
1 parent ab8385c commit 973fbad

3 files changed

Lines changed: 38 additions & 2 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { describe, expect, it } from "vitest";
2+
import type { V0ServerJson } from "@/generated/types.gen";
3+
import { mockedGetRegistryV01Servers } from "@/mocks/fixtures/registry_v0_1_servers/get";
4+
import { parseStacklokMeta } from "./server-meta";
5+
6+
const servers = mockedGetRegistryV01Servers.defaultValue.servers ?? [];
7+
8+
function getServerByName(serverName: string): V0ServerJson {
9+
const serverEntry = servers.find(
10+
(entry) => entry.server?.name === serverName,
11+
);
12+
13+
if (!serverEntry?.server) {
14+
throw new Error(`Test fixture server not found: ${serverName}`);
15+
}
16+
17+
return serverEntry.server as V0ServerJson;
18+
}
19+
20+
const osvServer = getServerByName("com.toolhive.k8s.toolhive-system/osv");
21+
const googleWorkspaceServer = getServerByName("google/mcp-google-apps");
22+
23+
describe("parseStacklokMeta", () => {
24+
it("returns null when stacklok metadata is missing", () => {
25+
expect(parseStacklokMeta(googleWorkspaceServer)).toBeNull();
26+
});
27+
28+
it("returns a successful parse result when stacklok metadata is valid", () => {
29+
const result = parseStacklokMeta(osvServer);
30+
31+
expect(result?.success).toBe(true);
32+
});
33+
});

src/lib/schemas/server-meta.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,8 @@ export function parseStacklokMeta(server: V0ServerJson) {
3131
server._meta?.["io.modelcontextprotocol.registry/publisher-provided"]?.[
3232
"io.github.stacklok"
3333
];
34+
35+
if (!raw) return null;
36+
3437
return stacklokMetaSchema.safeParse(raw);
3538
}

src/lib/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function cn(...inputs: ClassValue[]) {
1313
*/
1414
export function isVirtualMCPServer(server: V0ServerJson): boolean {
1515
const result = parseStacklokMeta(server);
16-
if (!result.success) return false;
16+
if (!result || !result.success) return false;
1717

1818
return Object.values(result.data).some(
1919
(t) => t.metadata?.kubernetes?.kind === "VirtualMCPServer",
@@ -26,7 +26,7 @@ export function isVirtualMCPServer(server: V0ServerJson): boolean {
2626
*/
2727
export function getTools(server: V0ServerJson): ServerTool[] {
2828
const result = parseStacklokMeta(server);
29-
if (!result.success) return [];
29+
if (!result || !result.success) return [];
3030

3131
return Object.values(result.data).flatMap((t) => t.tool_definitions ?? []);
3232
}

0 commit comments

Comments
 (0)