🎨 feat: MCP UI basic integration (#9299)

This commit is contained in:
Samuel Path 2025-08-29 19:07:19 +02:00 committed by GitHub
parent 20b29bbfa6
commit d16f93b5f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 365 additions and 14 deletions

View file

@ -111,6 +111,7 @@ export function formatToolContent(
const formattedContent: t.FormattedContent[] = [];
const imageUrls: t.FormattedContent[] = [];
let currentTextBlock = '';
let uiResources: t.UIResource[] = [];
type ContentHandler = undefined | ((item: t.ToolContentPart) => void);
@ -142,9 +143,14 @@ export function formatToolContent(
},
resource: (item) => {
if (item.resource.uri.startsWith('ui://')) {
uiResources.push(item.resource as t.UIResource);
return;
}
const resourceText = [];
if (item.resource.text != null && item.resource.text) {
resourceText.push(item.resource.text);
resourceText.push(`Resource Text: ${item.resource.text}`);
}
if (item.resource.uri.length) {
resourceText.push(`Resource URI: ${item.resource.uri}`);
@ -153,10 +159,10 @@ export function formatToolContent(
resourceText.push(`Resource: ${item.resource.name}`);
}
if (item.resource.description) {
resourceText.push(`Description: ${item.resource.description}`);
resourceText.push(`Resource Description: ${item.resource.description}`);
}
if (item.resource.mimeType != null && item.resource.mimeType) {
resourceText.push(`Type: ${item.resource.mimeType}`);
resourceText.push(`Resource MIME Type: ${item.resource.mimeType}`);
}
currentTextBlock += (currentTextBlock ? '\n\n' : '') + resourceText.join('\n');
},
@ -176,6 +182,10 @@ export function formatToolContent(
formattedContent.push({ type: 'text', text: currentTextBlock });
}
if (uiResources.length) {
formattedContent.push({ type: 'text', metadata: 'ui_resources', text: btoa(JSON.stringify(uiResources))});
}
const artifacts = imageUrls.length ? { content: imageUrls } : undefined;
if (CONTENT_ARRAY_PROVIDERS.has(provider)) {
return [formattedContent, artifacts];

View file

@ -75,6 +75,7 @@ export type FormattedContent =
| {
type: 'text';
text: string;
metadata?: string;
}
| {
type: 'image';
@ -103,6 +104,13 @@ export type FormattedContentResult = [
undefined | { content: FormattedContent[] },
];
export type UIResource = {
uri: string;
mimeType: string;
text: string;
[key: string]: unknown;
}
export type ImageFormatter = (item: ImageContent) => FormattedContent;
export type FormattedToolResponse = [