Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions main/src/utils/mcp-tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/
import type { CoreWorkload } from '@api/types.gen'
import log from '../logger'

export type McpToolDefinition = Tool
export interface McpToolDefinition {
description?: string
inputSchema: Tool['inputSchema']
}

export function isMcpToolDefinition(obj: unknown): obj is Tool {
export function isMcpToolDefinition(obj: unknown): obj is McpToolDefinition {
if (!obj || typeof obj !== 'object' || obj === null) return false

const tool = obj as Record<string, unknown>
const tool = obj

// Description should be string if present
if (
Expand Down Expand Up @@ -105,12 +108,16 @@ export async function getWorkloadAvailableTools(
const rawTools = await mcpClient.tools<'automatic'>()

// Filter and validate tools using type guard
const serverMcpTools: Record<string, McpToolDefinition> = {}
for (const [name, def] of Object.entries(rawTools)) {
if (name && def && isMcpToolDefinition(def)) {
serverMcpTools[name] = def
}
}
const serverMcpTools = Object.entries(rawTools)
.filter(([, defTool]) => isMcpToolDefinition(defTool))
.reduce<Record<string, McpToolDefinition>>((prev, [name, def]) => {
if (!def || !name) return prev
prev[name] = {
description: def.description,
inputSchema: def.inputSchema,
}
return prev
}, {})
await mcpClient.close()
return serverMcpTools
}
Expand Down
Loading