mcp_powerdrill_list_datasets
Retrieve a list of available datasets from Powerdrill MCP Server. Specify a limit to control the number of datasets returned for smart AI data analysis and insights.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of datasets to return |
Implementation Reference
- src/index.ts:43-129 (handler)The handler function that executes the tool's logic: destructures input args, creates PowerdrillClient instance, fetches datasets via API, validates response, applies optional limit, formats output as JSON, handles no results and errors appropriately.async (args, extra) => { try { const { limit, pageNumber, pageSize, search } = args; // Initialize Powerdrill client const client = new (await import('./utils/powerdrillClient.js')).PowerdrillClient(); // Fetch datasets const response = await client.listDatasets({ pageNumber, pageSize, search }); // Check if response is valid if (!response) { throw new Error(`Empty response received from API`); } if (response.code !== 0) { throw new Error(`API returned error code: ${response.code}, message: ${response.message || 'No message'}`); } if (!response.data || !response.data.records) { throw new Error(`Invalid API response format: missing data.records property`); } // Apply limit if provided let datasets = response.data.records || []; if (limit && limit > 0) { datasets = datasets.slice(0, limit); } if (datasets.length === 0) { return { content: [ { type: "text", text: JSON.stringify({ message: "No datasets found", datasets: [] }) } ] }; } // Format the response as MCP content const result = { count: datasets.length, total: response.data.total_items || datasets.length, datasets: datasets.map((dataset: Dataset) => ({ id: dataset.id, name: dataset.name, description: dataset.description || '' })) }; // Return the formatted response return { content: [ { type: "text", text: JSON.stringify(result, null, 2) } ] }; } catch (error: any) { console.error(`Error listing datasets: ${error.message}`); console.error(error.stack); // Return error response return { content: [ { type: "text", text: JSON.stringify({ error: `Error listing datasets: ${error.message}`, errorType: error.name, errorStack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, null, 2) } ], isError: true }; } }
- src/index.ts:37-42 (schema)Zod schema defining the input parameters for the tool.{ limit: z.number().optional().describe('Maximum number of datasets to return'), pageNumber: z.number().optional().describe('The page number to start listing (default: 1)'), pageSize: z.number().optional().describe('The number of items on a single page (default: 10)'), search: z.string().optional().describe('Search for datasets by name') },
- src/index.ts:35-130 (registration)Registers the 'mcp_powerdrill_list_datasets' tool with the MCP server, providing name, input schema, and handler function.server.tool( 'mcp_powerdrill_list_datasets', { limit: z.number().optional().describe('Maximum number of datasets to return'), pageNumber: z.number().optional().describe('The page number to start listing (default: 1)'), pageSize: z.number().optional().describe('The number of items on a single page (default: 10)'), search: z.string().optional().describe('Search for datasets by name') }, async (args, extra) => { try { const { limit, pageNumber, pageSize, search } = args; // Initialize Powerdrill client const client = new (await import('./utils/powerdrillClient.js')).PowerdrillClient(); // Fetch datasets const response = await client.listDatasets({ pageNumber, pageSize, search }); // Check if response is valid if (!response) { throw new Error(`Empty response received from API`); } if (response.code !== 0) { throw new Error(`API returned error code: ${response.code}, message: ${response.message || 'No message'}`); } if (!response.data || !response.data.records) { throw new Error(`Invalid API response format: missing data.records property`); } // Apply limit if provided let datasets = response.data.records || []; if (limit && limit > 0) { datasets = datasets.slice(0, limit); } if (datasets.length === 0) { return { content: [ { type: "text", text: JSON.stringify({ message: "No datasets found", datasets: [] }) } ] }; } // Format the response as MCP content const result = { count: datasets.length, total: response.data.total_items || datasets.length, datasets: datasets.map((dataset: Dataset) => ({ id: dataset.id, name: dataset.name, description: dataset.description || '' })) }; // Return the formatted response return { content: [ { type: "text", text: JSON.stringify(result, null, 2) } ] }; } catch (error: any) { console.error(`Error listing datasets: ${error.message}`); console.error(error.stack); // Return error response return { content: [ { type: "text", text: JSON.stringify({ error: `Error listing datasets: ${error.message}`, errorType: error.name, errorStack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, null, 2) } ], isError: true }; } } );
- src/utils/powerdrillClient.ts:70-129 (helper)Supporting method in PowerdrillClient class that performs the actual API call to list datasets, constructing query parameters and handling network errors and response validation.async listDatasets(options: { pageNumber?: number; pageSize?: number; search?: string; timeout?: number; } = {}) { const timeout = options.timeout || 30000; // Default 30 second timeout try { // Build query parameters let queryParams = `user_id=${this.config.userId}`; if (options.pageNumber) { queryParams += `&page_number=${options.pageNumber}`; } if (options.pageSize) { queryParams += `&page_size=${options.pageSize}`; } if (options.search) { queryParams += `&search=${encodeURIComponent(options.search)}`; } const response = await this.client.get(`/datasets?${queryParams}`, { timeout: timeout, validateStatus: (status) => status >= 200 && status < 500 // Don't throw on 4xx errors }); // Handle HTTP errors manually if (response.status >= 400) { throw new Error(`HTTP error ${response.status}: ${response.statusText || 'Unknown error'}`); } // Validate response structure if (!response.data) { throw new Error('Invalid API response: missing data'); } return response.data; } catch (error: any) { if (error.code === 'ECONNABORTED') { console.error(`PowerdrillClient: Request timed out after ${timeout}ms`); throw new Error(`Request timed out after ${timeout}ms`); } if (error.response) { // The request was made and the server responded with a status code console.error(`PowerdrillClient: HTTP error ${error.response.status}`, error.response.data); throw new Error(`API error: ${error.response.status} ${error.response.statusText}`); } else if (error.request) { // The request was made but no response was received console.error('PowerdrillClient: No response received', error.request); throw new Error('No response received from API'); } console.error('PowerdrillClient: Error listing datasets:', error.message); throw error; } }
- src/index.ts:21-25 (schema)TypeScript interface defining the structure of a Dataset object used in the tool.interface Dataset { id: string; name: string; description?: string; }