Files
bolt-diy/app/components/@settings/tabs/mcp/McpServerListItem.tsx
Roamin 5de162eec8 feat(mcp): add Model Context Protocol integration
Add  MCP integration including:
- New MCP settings tab with server configuration
- Tool invocation UI components
- API endpoints for MCP management
- Integration with chat system for tool execution
- Example configurations
2025-07-10 17:54:15 +00:00

71 lines
2.4 KiB
TypeScript

import type { Tool } from 'ai';
type ParameterProperty = {
type?: string;
description?: string;
};
type ToolParameters = {
jsonSchema: {
properties?: Record<string, ParameterProperty>;
required?: string[];
};
};
type McpToolProps = {
toolName: string;
toolSchema: Tool;
};
export default function McpServerListItem({ toolName, toolSchema }: McpToolProps) {
if (!toolSchema) {
return null;
}
const parameters = (toolSchema.parameters as ToolParameters)?.jsonSchema.properties || {};
const requiredParams = (toolSchema.parameters as ToolParameters)?.jsonSchema.required || [];
return (
<div className="mt-2 ml-4 p-3 rounded-md bg-bolt-elements-background-depth-2 text-xs">
<div className="flex flex-col gap-1.5">
<h3 className="text-bolt-elements-textPrimary font-semibold truncate" title={toolName}>
{toolName}
</h3>
<p className="text-bolt-elements-textSecondary">{toolSchema.description || 'No description available'}</p>
{Object.keys(parameters).length > 0 && (
<div className="mt-2.5">
<h4 className="text-bolt-elements-textSecondary font-semibold mb-1.5">Parameters:</h4>
<ul className="ml-1 space-y-2">
{Object.entries(parameters).map(([paramName, paramDetails]) => (
<li key={paramName} className="break-words">
<div className="flex items-start">
<span className="font-medium text-bolt-elements-textPrimary">
{paramName}
{requiredParams.includes(paramName) && (
<span className="text-red-600 dark:text-red-400 ml-1">*</span>
)}
</span>
<span className="mx-2 text-bolt-elements-textSecondary"></span>
<div className="flex-1">
{paramDetails.type && (
<span className="text-bolt-elements-textSecondary italic">{paramDetails.type}</span>
)}
{paramDetails.description && (
<div className="mt-0.5 text-bolt-elements-textSecondary">{paramDetails.description}</div>
)}
</div>
</div>
</li>
))}
</ul>
</div>
)}
</div>
</div>
);
}