Skip to content
Merged
Show file tree
Hide file tree
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
28 changes: 24 additions & 4 deletions ui/desktop/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion ui/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
"@ai-sdk/openai": "^0.0.72",
"@ai-sdk/ui-utils": "^1.0.2",
"@hey-api/client-fetch": "^0.8.1",
"@mcp-ui/client": "~5.3.1",
"@mcp-ui/client": "~5.6.2",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you'd like you can also move this back to "^5.6.1" -- since merging #3859 we're respecting the lock file on all platforms

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool, will do in the next pr related to mcp-ui

"@radix-ui/react-accordion": "^1.2.2",
"@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-dialog": "^1.1.7",
Expand Down
68 changes: 36 additions & 32 deletions ui/desktop/src/components/MCPUIResourceRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,60 +1,61 @@
import { UIResourceRenderer, UIActionResult } from '@mcp-ui/client';
import { ResourceContent } from '../types/message';
import { useState, useCallback } from 'react';

// Extend UIActionResult to include size-change type
type ExtendedUIActionResult =
| UIActionResult
| {
type: 'size-change';
payload: {
height: string;
};
};
import { useCallback } from 'react';
import { toast } from 'react-toastify';
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

popin' some toast for user feedback, as we work to make the action handling real


interface MCPUIResourceRendererProps {
content: ResourceContent;
}

export default function MCPUIResourceRenderer({ content }: MCPUIResourceRendererProps) {
console.log('MCPUIResourceRenderer', content);
const [iframeHeight, setIframeHeight] = useState('200px');

const handleUIAction = useCallback(async (result: ExtendedUIActionResult) => {
console.log('Handle action from MCP UI Action:', result);
const handleAction = (action: UIActionResult) => {
console.log(
`MCP UI message received (but only handled with a toast notification for now):`,
action
);
toast.info(`${action.type} message sent from MCP UI, refer to console for more info`, {
data: action,
});
return { status: 'handled', message: `${action.type} action logged` };
};

// Handle UI actions here
const handleUIAction = useCallback(async (result: UIActionResult) => {
switch (result.type) {
case 'intent':
case 'intent': {
// TODO: Implement intent handling
handleAction(result);
break;
}

case 'link':
case 'link': {
// TODO: Implement link handling
handleAction(result);
break;
}

case 'notify':
// TODO: Implement notification handling
case 'notify': {
// TODO: Implement notify handling
handleAction(result);
break;
}

case 'prompt':
case 'prompt': {
// TODO: Implement prompt handling
handleAction(result);
break;
}

case 'tool':
// TODO: Implement tool handling
case 'tool': {
// TODO: Implement tool call handling
handleAction(result);
break;
}

// Currently, `size-change` is non-standard
case 'size-change': {
// We expect the height to be a string with a unit
console.log('Setting iframe height to:', result.payload.height);
setIframeHeight(result.payload.height);
default: {
console.warn('unsupported message sent from MCP-UI:', result);
break;
}
}

return { status: 'handled' };
}, []);

return (
Expand All @@ -64,7 +65,10 @@ export default function MCPUIResourceRenderer({ content }: MCPUIResourceRenderer
resource={content.resource}
onUIAction={handleUIAction}
htmlProps={{
style: { minHeight: iframeHeight },
autoResizeIframe: {
height: true,
width: false, // set to false to allow for responsive design
},
Comment on lines +68 to +71
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mcp-ui add this based on our feedback

}}
/>
</div>
Expand Down
27 changes: 11 additions & 16 deletions ui/desktop/src/components/ToolCallWithResponse.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,24 +49,19 @@ export default function ToolCallWithResponse({
</div>
{/* MCP UI — Inline */}
{toolResponse?.toolResult?.value &&
toolResponse.toolResult.value.map((content, index, results) => {
toolResponse.toolResult.value.map((content, index) => {
if (content.type === 'resource' && content.resource.uri?.startsWith('ui://')) {
if (index === results.length - 1) {
return (
<>
<MCPUIResourceRenderer key={`${content.type}-${index}`} content={content} />
{/* Append a disclaimer if this is the last item in the array */}
<div className="mt-3 p-4 py-3 border border-borderSubtle rounded-lg bg-background-muted flex items-center">
<FlaskConical className="mr-2" size={20} />
<div className="text-sm font-medium mono">
MCP UI is experimental and may change at any time.
</div>
return (
<div key={`${content.type}-${index}`} className="mt-3">
<MCPUIResourceRenderer content={content} />
<div className="mt-3 p-4 py-3 border border-borderSubtle rounded-lg bg-background-muted flex items-center">
<FlaskConical className="mr-2" size={20} />
<div className="text-sm font-medium mono">
MCP UI is experimental and may change at any time.
</div>
</>
);
} else {
return <MCPUIResourceRenderer key={`${content.type}-${index}`} content={content} />;
}
</div>
</div>
Comment on lines +57 to +63
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

decided to simplify and always show the info box

);
} else {
return null;
}
Expand Down
Loading