import React from 'react' import { Box, Text } from '@anthropic/ink' import { extractMcpToolDisplayName, getMcpDisplayName, } from '../../services/mcp/mcpStringUtils.js' import type { Tool } from '../../Tool.js' import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js' import { Dialog } from '@anthropic/ink' import type { ServerInfo } from './types.js' type Props = { tool: Tool server: ServerInfo onBack: () => void } export function MCPToolDetailView({ tool, server, onBack, }: Props): React.ReactNode { const [toolDescription, setToolDescription] = React.useState('') const toolName = getMcpDisplayName(tool.name, server.name) const fullDisplayName = tool.userFacingName ? tool.userFacingName({}) : toolName const displayName = extractMcpToolDisplayName(fullDisplayName) const isReadOnly = tool.isReadOnly?.({}) ?? false const isDestructive = tool.isDestructive?.({}) ?? false const isOpenWorld = tool.isOpenWorld?.({}) ?? false React.useEffect(() => { async function loadDescription() { try { const desc = await tool.description( {}, { isNonInteractiveSession: false, toolPermissionContext: { mode: 'default' as const, additionalWorkingDirectories: new Map(), alwaysAllowRules: {}, alwaysDenyRules: {}, alwaysAskRules: {}, isBypassPermissionsModeAvailable: false, }, tools: [], }, ) setToolDescription(desc) } catch { setToolDescription('Failed to load description') } } void loadDescription() }, [tool]) const titleContent = ( <> {displayName} {isReadOnly && [read-only]} {isDestructive && [destructive]} {isOpenWorld && [open-world]} ) return ( exitState.pending ? ( Press {exitState.keyName} again to exit ) : ( ) } > Tool name: {toolName} Full name: {tool.name} {toolDescription && ( Description: {toolDescription} )} {tool.inputJSONSchema && tool.inputJSONSchema.properties && Object.keys(tool.inputJSONSchema.properties).length > 0 && ( Parameters: {Object.entries(tool.inputJSONSchema.properties).map( ([key, value]) => { const required = tool.inputJSONSchema?.required as | string[] | undefined const isRequired = required?.includes(key) return ( • {key} {isRequired && (required)}:{' '} {typeof value === 'object' && value && 'type' in value ? String(value.type) : 'unknown'} {typeof value === 'object' && value && 'description' in value && ( - {String(value.description)} )} ) }, )} )} ) }