UNPKG

@mseep/doit-mcp-server

Version:

DoiT official MCP Server

93 lines 4.14 kB
import { z } from "zod"; import { createErrorResponse, createSuccessResponse, formatZodError, handleGeneralError, makeDoitRequest, DOIT_API_BASE, } from "../utils/util.js"; // Schema definitions export const DimensionsArgumentsSchema = z.object({ filter: z .string() .optional() .describe("Filter string in format 'key:value|key:value'. Multiple values for same key are treated as OR, different keys as AND. The fields eligible for filtering are: type, label, key. use the filter parameter only if you know the exact value of the key, otherwise the filter should be empty."), pageToken: z .string() .optional() .describe("Token for pagination. Use this to get the next page of results."), }); // Tool metadata export const dimensionsTool = { name: "list_dimensions", description: "Lists Cloud Analytics dimensions that your account has access to. Use this tool to get the dimensions that you can use in the run_query tool.", inputSchema: { type: "object", properties: { filter: { type: "string", description: `Filter string (optional) in format 'key:value|key:value'. Multiple values for same key are treated as OR, different keys as AND. The fields eligible for filtering are: type, label, key. use the filter parameter only if you know the exact value of the key, otherwise the filter should be empty.`, }, pageToken: { type: "string", description: "Token for pagination. Use this to get the next page of results.", }, }, }, }; // Format a dimension for display export function formatDimension(dimension) { return [ `ID: ${dimension.id}`, `Label: ${dimension.label}`, `Type: ${dimension.type}`, "-----------", ].join("\n"); } // Handle the dimensions request export async function handleDimensionsRequest(args, token) { try { // Validate arguments const { filter, pageToken } = DimensionsArgumentsSchema.parse(args); // Create API URL with query parameters const params = new URLSearchParams(); if (filter) { params.append("filter", filter); } if (pageToken) { params.append("pageToken", pageToken); } params.append("maxResults", "60"); let dimensionsUrl = `${DOIT_API_BASE}/analytics/v1/dimensions`; if (params.toString()) { dimensionsUrl += `?${params.toString()}`; } try { const dimensionsData = await makeDoitRequest(dimensionsUrl, token, { method: "GET" }); if (!dimensionsData) { return createErrorResponse("Failed to retrieve dimensions data"); } const dimensions = dimensionsData.dimensions || []; const rowCount = dimensionsData.rowCount || 0; if (dimensions.length === 0) { return createErrorResponse("No dimensions found, please check the filter parameter, try without filter if you don't know the exact value of the key"); } const formattedDimensions = dimensions.map(formatDimension); // Create a descriptive message that includes filter information if provided let dimensionsText = `Found ${rowCount} dimensions`; if (filter) { dimensionsText += ` (filtered by: ${filter})`; } dimensionsText += `:`; dimensionsText += `\n\n${formattedDimensions.join("\n")} \n\n${dimensionsData.pageToken ? `Page token: ${dimensionsData.pageToken}` : ""}`; return createSuccessResponse(dimensionsText); } catch (error) { return handleGeneralError(error, "making DoiT API request"); } } catch (error) { if (error instanceof z.ZodError) { return createErrorResponse(formatZodError(error)); } return handleGeneralError(error, "handling dimensions request"); } } //# sourceMappingURL=dimensions.js.map