/**
* Tool registration module
* Registers all built-in and custom tools with the MCP server
*/
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { ProviderManager } from "../providers/manager.js";
import {
BUILTIN_TOOL_LIST_BUCKETS,
BUILTIN_TOOL_LIST_OBJECTS,
BUILTIN_TOOL_GET_OBJECT,
BUILTIN_TOOL_GET_OBJECT_METADATA,
BUILTIN_TOOL_SEARCH_OBJECTS,
} from "./builtin-tools.js";
// Import tool implementations
import {
getListBucketsMetadata,
createListBucketsToolHandler,
listBucketsSchema,
} from "./list-buckets.js";
import {
getListObjectsMetadata,
createListObjectsToolHandler,
listObjectsSchema,
} from "./list-objects.js";
import {
getGetObjectMetadata,
createGetObjectToolHandler,
getObjectSchema,
} from "./get-object.js";
import {
getGetObjectMetadataMetadata,
createGetObjectMetadataToolHandler,
getObjectMetadataSchema,
} from "./get-object-metadata.js";
import {
getSearchObjectsMetadata,
createSearchObjectsToolHandler,
searchObjectsSchema,
} from "./search-objects.js";
import type { ToolConfig } from "../types/config.js";
/**
* Register all tool handlers with the MCP server
*/
export function registerTools(server: McpServer, tools?: ToolConfig[]): void {
const sourceIds = ProviderManager.getAvailableSourceIds();
if (sourceIds.length === 0) {
throw new Error("No storage sources configured");
}
// If no tool config provided, register all built-in tools for all sources
if (!tools || tools.length === 0) {
for (const sourceId of sourceIds) {
registerAllBuiltinTools(server, sourceId);
}
return;
}
// Group tools by source
const toolsBySource = new Map<string, ToolConfig[]>();
for (const tool of tools) {
const sourceTools = toolsBySource.get(tool.source) || [];
sourceTools.push(tool);
toolsBySource.set(tool.source, sourceTools);
}
// For sources without explicit tool config, register all built-in tools
for (const sourceId of sourceIds) {
if (!toolsBySource.has(sourceId)) {
registerAllBuiltinTools(server, sourceId);
}
}
// Register explicitly configured tools
for (const [sourceId, sourceTools] of toolsBySource) {
for (const toolConfig of sourceTools) {
registerTool(server, sourceId, toolConfig);
}
}
}
/**
* Register all built-in tools for a source
*/
function registerAllBuiltinTools(server: McpServer, sourceId: string): void {
registerListBucketsTool(server, sourceId);
registerListObjectsTool(server, sourceId);
registerGetObjectTool(server, sourceId);
registerGetObjectMetadataTool(server, sourceId);
registerSearchObjectsTool(server, sourceId);
}
/**
* Register a single tool based on config
*/
function registerTool(server: McpServer, sourceId: string, config: ToolConfig): void {
switch (config.name) {
case BUILTIN_TOOL_LIST_BUCKETS:
registerListBucketsTool(server, sourceId);
break;
case BUILTIN_TOOL_LIST_OBJECTS:
registerListObjectsTool(server, sourceId, (config as any).max_keys);
break;
case BUILTIN_TOOL_GET_OBJECT:
registerGetObjectTool(server, sourceId, (config as any).max_size);
break;
case BUILTIN_TOOL_GET_OBJECT_METADATA:
registerGetObjectMetadataTool(server, sourceId);
break;
case BUILTIN_TOOL_SEARCH_OBJECTS:
registerSearchObjectsTool(server, sourceId, (config as any).max_results);
break;
default:
// Custom tool - to be implemented
console.error(` - Custom tool '${config.name}' registration not yet implemented`);
break;
}
}
/**
* Register list_buckets tool
*/
function registerListBucketsTool(server: McpServer, sourceId: string): void {
const metadata = getListBucketsMetadata(sourceId);
server.registerTool(
metadata.name,
{
description: metadata.description,
inputSchema: listBucketsSchema,
annotations: metadata.annotations,
},
createListBucketsToolHandler(sourceId)
);
console.error(` - ${metadata.name} registered`);
}
/**
* Register list_objects tool
*/
function registerListObjectsTool(server: McpServer, sourceId: string, maxKeys?: number): void {
const metadata = getListObjectsMetadata(sourceId, maxKeys);
server.registerTool(
metadata.name,
{
description: metadata.description,
inputSchema: listObjectsSchema,
annotations: metadata.annotations,
},
createListObjectsToolHandler(sourceId, maxKeys)
);
console.error(` - ${metadata.name} registered`);
}
/**
* Register get_object tool
*/
function registerGetObjectTool(server: McpServer, sourceId: string, maxSize?: number): void {
const metadata = getGetObjectMetadata(sourceId, maxSize);
server.registerTool(
metadata.name,
{
description: metadata.description,
inputSchema: getObjectSchema,
annotations: metadata.annotations,
},
createGetObjectToolHandler(sourceId, maxSize)
);
console.error(` - ${metadata.name} registered`);
}
/**
* Register get_object_metadata tool
*/
function registerGetObjectMetadataTool(server: McpServer, sourceId: string): void {
const metadata = getGetObjectMetadataMetadata(sourceId);
server.registerTool(
metadata.name,
{
description: metadata.description,
inputSchema: getObjectMetadataSchema,
annotations: metadata.annotations,
},
createGetObjectMetadataToolHandler(sourceId)
);
console.error(` - ${metadata.name} registered`);
}
/**
* Register search_objects tool
*/
function registerSearchObjectsTool(server: McpServer, sourceId: string, maxResults?: number): void {
const metadata = getSearchObjectsMetadata(sourceId, maxResults);
server.registerTool(
metadata.name,
{
description: metadata.description,
inputSchema: searchObjectsSchema,
annotations: metadata.annotations,
},
createSearchObjectsToolHandler(sourceId, maxResults)
);
console.error(` - ${metadata.name} registered`);
}