extractDiscoveredToolNames method
Extract tool names from tool_reference blocks in message history.
When dynamic tool loading is enabled, MCP tools are not predeclared. Instead, they are discovered via ToolSearchTool which returns tool_reference blocks.
Implementation
Set<String> extractDiscoveredToolNames(List<ToolSearchMessage> messages) {
final discovered = <String>{};
int carriedFromBoundary = 0;
for (final msg in messages) {
// Compact boundary carries the pre-compact discovered set.
if (msg.type == 'system' && msg.subtype == 'compact_boundary') {
final carried = msg.compactMetadata?['preCompactDiscoveredTools'];
if (carried is List) {
for (final name in carried) {
if (name is String) {
discovered.add(name);
carriedFromBoundary++;
}
}
}
continue;
}
if (msg.type != 'user') continue;
final content = msg.message?['content'];
if (content is! List) continue;
for (final block in content) {
if (block is! Map<String, dynamic>) continue;
if (isToolResultBlockWithContent(block)) {
final blockContent = block['content'] as List;
for (final item in blockContent) {
if (item is Map<String, dynamic> && isToolReferenceWithName(item)) {
discovered.add(item['tool_name'] as String);
}
}
}
}
}
if (discovered.isNotEmpty) {
_logDebug(
'Dynamic tool loading: found ${discovered.length} discovered tools'
'${carriedFromBoundary > 0 ? ' ($carriedFromBoundary carried from compact boundary)' : ''}',
);
}
discoveredToolNames.value = discovered;
return discovered;
}