38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { Buffer } from 'node:buffer'
|
|
|
|
export type MCPContent =
|
|
| { type: 'text'; text: string }
|
|
| { type: 'image'; data: string; mimeType: string }
|
|
|
|
export type MCPResult = { content: MCPContent[]; isError?: boolean }
|
|
|
|
export const MAX_RESULT_BYTES = 900_000
|
|
|
|
export function resultTooLargeMessage(kind: string, bytes: number, hint: string): string {
|
|
return `${kind} is too large (${Math.round(bytes / 1024)}KB, limit ${Math.round(
|
|
MAX_RESULT_BYTES / 1024
|
|
)}KB). ${hint}`
|
|
}
|
|
|
|
export function ok(data: unknown, toolName?: string): MCPResult {
|
|
const text = JSON.stringify(data, null, 2)
|
|
const bytes = Buffer.byteLength(text, 'utf8')
|
|
if (bytes > MAX_RESULT_BYTES) {
|
|
return fail(
|
|
new Error(
|
|
resultTooLargeMessage(
|
|
toolName ? `Result from "${toolName}"` : 'Result',
|
|
bytes,
|
|
'Narrow the request with depth/root_id/node_types, get_node, or find_nodes.'
|
|
)
|
|
)
|
|
)
|
|
}
|
|
return { content: [{ type: 'text', text }] }
|
|
}
|
|
|
|
export function fail(e: unknown): MCPResult {
|
|
const msg = e instanceof Error ? e.message : String(e)
|
|
return { content: [{ type: 'text', text: JSON.stringify({ error: msg }) }], isError: true }
|
|
}
|