Skip to main content
Glama

get_result

Retrieve query results from AWS Athena after execution completes, specifying the query ID and optional row limit.

Instructions

Get results for a completed query. Returns error if query is still running.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryExecutionIdYesThe query execution ID
maxRowsNoMaximum number of rows to return (default: 1000)

Implementation Reference

  • Core implementation of the get_result tool: validates query status, fetches results from AWS Athena using GetQueryResultsCommand, processes columns and rows into structured output.
    async getQueryResults(queryExecutionId: string, maxRows?: number): Promise<QueryResult> {
      try {
        // Check query state first
        const status = await this.getQueryStatus(queryExecutionId);
    
        if (status.state === QueryExecutionState.RUNNING || status.state === QueryExecutionState.QUEUED) {
          throw {
            message: "Query is still running",
            code: "QUERY_STILL_RUNNING",
            queryExecutionId,
          };
        }
    
        if (status.state === QueryExecutionState.FAILED) {
          throw {
            message: status.stateChangeReason || "Query failed",
            code: "QUERY_FAILED",
            queryExecutionId,
          };
        }
    
        if (status.state !== QueryExecutionState.SUCCEEDED) {
          throw {
            message: `Unexpected query state: ${status.state}`,
            code: "UNEXPECTED_STATE",
            queryExecutionId,
          };
        }
    
        const results = await this.client.send(
          new GetQueryResultsCommand({
            QueryExecutionId: queryExecutionId,
            MaxResults: maxRows || 1000,
          })
        );
    
        if (!results.ResultSet) {
          throw new Error("No results returned from query");
        }
    
        const columns = results.ResultSet.ResultSetMetadata?.ColumnInfo?.map(
          (col) => col.Name || ""
        ) || [];
    
        const rows = (results.ResultSet.Rows || [])
          .slice(status.substatementType === 'SELECT' ? 1 : 0) // Skip header row if query is SELECT
          .map((row) => {
            const obj: Record<string, unknown> = {};
            row.Data?.forEach((data, index) => {
              if (columns[index]) {
                obj[columns[index]] = data.VarCharValue;
              }
            });
            return obj;
          });
    
        return {
          columns,
          rows,
          queryExecutionId,
          bytesScanned: status.statistics?.dataScannedInBytes || 0,
          executionTime: status.statistics?.engineExecutionTimeInMillis || 0,
        };
      } catch (error) {
        if (error instanceof InvalidRequestException) {
          throw {
            message: "Query execution not found",
            code: "QUERY_NOT_FOUND",
          };
        }
        throw error;
      }
    }
  • MCP CallToolRequest handler for get_result: validates input parameters and calls AthenaService.getQueryResults, returns JSON response.
    case "get_result": {
      if (!request.params.arguments?.queryExecutionId ||
          typeof request.params.arguments.queryExecutionId !== 'string') {
        throw new McpError(
          ErrorCode.InvalidParams,
          "Missing or invalid required parameter: queryExecutionId (string)"
        );
      }
    
      const maxRows = typeof request.params.arguments.maxRows === 'number' ?
        request.params.arguments.maxRows : undefined;
      const result = await this.athenaService.getQueryResults(
        request.params.arguments.queryExecutionId,
        maxRows
      );
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(result, null, 2),
          },
        ],
      };
    }
  • Tool schema and registration: defines name, description, input schema with queryExecutionId (required) and optional maxRows for the get_result tool in ListTools response.
    {
      name: "get_result",
      description: "Get results for a completed query. Returns error if query is still running.",
      inputSchema: {
        type: "object",
        properties: {
          queryExecutionId: {
            type: "string",
            description: "The query execution ID",
          },
          maxRows: {
            type: "number",
            description: "Maximum number of rows to return (default: 1000)",
            minimum: 1,
            maximum: 10000,
          },
        },
        required: ["queryExecutionId"],
      },
    },
  • TypeScript interface defining the output structure for query results returned by get_result.
    export interface QueryResult {
      columns: string[];
      rows: Record<string, unknown>[];
      queryExecutionId: string;
      bytesScanned: number;
      executionTime: number;
    }

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/lishenxydlgzs/aws-athena-mcp'

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