Skip to main content
Glama
powerdrillai

Powerdrill MCP Server

Official
by powerdrillai

mcp_powerdrill_create_job

Analyze Powerdrill datasets by creating AI-powered analysis jobs to answer natural language questions about your data.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
questionYesThe natural language question or prompt to analyze the data
dataset_idYesThe ID of the dataset to analyze
datasource_idsNoOptional array of specific data source IDs within the dataset to analyze
session_idYesSession ID to group related jobs
streamNoWhether to stream the results (default: false)
output_languageNoThe language for the output (default: AUTO)AUTO
job_modeNoThe job mode (default: AUTO)AUTO

Implementation Reference

  • MCP handler function that parses arguments, calls PowerdrillClient.createJob, processes the response blocks (simplifying TABLE/IMAGE), formats as MCP content, handles errors
    async (args, extra) => {
      try {
        // Initialize Powerdrill client
        const client = new (await import('./utils/powerdrillClient.js')).PowerdrillClient();
    
        // Create job parameters
        const jobParams = {
          question: args.question,
          dataset_id: args.dataset_id,
          datasource_ids: args.datasource_ids,
          session_id: args.session_id,
          stream: args.stream,
          output_language: args.output_language,
          job_mode: args.job_mode
        };
    
        // Create job
        const response = await client.createJob(jobParams);
    
        // Check if response is valid
        if (response.code !== 0 || !response.data) {
          throw new Error(`Invalid API response: ${JSON.stringify(response)}`);
        }
    
        // Process blocks for a cleaner response
        const processedBlocks = response.data.blocks.map((block: any) => {
          // For TABLE and IMAGE types, just include the URL and name
          if (block.type === 'TABLE' || block.type === 'IMAGE') {
            return {
              type: block.type,
              url: block.content.url,
              name: block.content.name,
              expires_at: block.content.expires_at
            };
          }
    
          // For other types, keep the original content
          return {
            type: block.type,
            content: block.content,
            stage: block.stage
          };
        });
    
        // Format the response as MCP content
        return {
          content: [
            {
              type: "text",
              text: JSON.stringify({
                job_id: response.data.job_id,
                blocks: processedBlocks
              }, null, 2)
            }
          ]
        };
      } catch (error: any) {
        console.error(`Error creating job: ${error.message}`);
    
        // Return error response
        return {
          content: [
            {
              type: "text",
              text: `Error creating job: ${error.message}`
            }
          ],
          isError: true
        };
      }
    }
  • Zod input schema defining parameters for the mcp_powerdrill_create_job tool
    {
      question: z.string().describe('The natural language question or prompt to analyze the data'),
      dataset_id: z.string().describe('The ID of the dataset to analyze'),
      datasource_ids: z.array(z.string()).optional().describe('Optional array of specific data source IDs within the dataset to analyze'),
      session_id: z.string().describe('Session ID to group related jobs'),
      stream: z.boolean().optional().default(false).describe('Whether to stream the results (default: false)'),
      output_language: z.string().optional().default('AUTO').describe('The language for the output (default: AUTO)'),
      job_mode: z.string().optional().default('AUTO').describe('The job mode (default: AUTO)')
    },
  • src/index.ts:187-269 (registration)
    Registration of the mcp_powerdrill_create_job tool on the MCP server using server.tool
    server.tool(
      'mcp_powerdrill_create_job',
      {
        question: z.string().describe('The natural language question or prompt to analyze the data'),
        dataset_id: z.string().describe('The ID of the dataset to analyze'),
        datasource_ids: z.array(z.string()).optional().describe('Optional array of specific data source IDs within the dataset to analyze'),
        session_id: z.string().describe('Session ID to group related jobs'),
        stream: z.boolean().optional().default(false).describe('Whether to stream the results (default: false)'),
        output_language: z.string().optional().default('AUTO').describe('The language for the output (default: AUTO)'),
        job_mode: z.string().optional().default('AUTO').describe('The job mode (default: AUTO)')
      },
      async (args, extra) => {
        try {
          // Initialize Powerdrill client
          const client = new (await import('./utils/powerdrillClient.js')).PowerdrillClient();
    
          // Create job parameters
          const jobParams = {
            question: args.question,
            dataset_id: args.dataset_id,
            datasource_ids: args.datasource_ids,
            session_id: args.session_id,
            stream: args.stream,
            output_language: args.output_language,
            job_mode: args.job_mode
          };
    
          // Create job
          const response = await client.createJob(jobParams);
    
          // Check if response is valid
          if (response.code !== 0 || !response.data) {
            throw new Error(`Invalid API response: ${JSON.stringify(response)}`);
          }
    
          // Process blocks for a cleaner response
          const processedBlocks = response.data.blocks.map((block: any) => {
            // For TABLE and IMAGE types, just include the URL and name
            if (block.type === 'TABLE' || block.type === 'IMAGE') {
              return {
                type: block.type,
                url: block.content.url,
                name: block.content.name,
                expires_at: block.content.expires_at
              };
            }
    
            // For other types, keep the original content
            return {
              type: block.type,
              content: block.content,
              stage: block.stage
            };
          });
    
          // Format the response as MCP content
          return {
            content: [
              {
                type: "text",
                text: JSON.stringify({
                  job_id: response.data.job_id,
                  blocks: processedBlocks
                }, null, 2)
              }
            ]
          };
        } catch (error: any) {
          console.error(`Error creating job: ${error.message}`);
    
          // Return error response
          return {
            content: [
              {
                type: "text",
                text: `Error creating job: ${error.message}`
              }
            ],
            isError: true
          };
        }
      }
    );
  • PowerdrillClient.createJob helper method that performs the actual API POST request to /jobs endpoint
    /**
     * Create a job to analyze data with natural language questions
     * @param params Parameters for creating a job
     * @returns Promise with the job result
     */
    async createJob(params: CreateJobParams) {
      try {
        // Include user_id in the request body
        const requestBody = {
          ...params,
          user_id: this.config.userId
        };
    
        const response = await this.client.post('/jobs', requestBody);
        return response.data;
      } catch (error: any) {
        console.error('Error creating job:', error.message);
        throw error;
      }
    }
  • TypeScript interface defining parameters for createJob in PowerdrillClient
    export interface CreateJobParams {
      session_id: string;
      question: string;
      dataset_id: string;
      datasource_ids?: string[];
      stream?: boolean;
      output_language?: string;
      job_mode?: string;
    }

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/powerdrillai/powerdrill-mcp'

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