Skip to main content
Glama
index.ts5.96 kB
/** * 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`); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zq940222/OssHub'

If you have feedback or need assistance with the MCP directory API, please join our Discord server