import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { BirstClient } from "../../client/birstClient.js";
import { z } from "zod";
interface Hierarchy {
name: string;
levels?: HierarchyLevel[];
cardinality?: string;
}
interface HierarchyLevel {
name: string;
ordinal?: number;
}
const inputSchema = z.object({
spaceId: z.string().describe("The ID of the space to list hierarchies from"),
});
export function registerListHierarchies(server: McpServer, client: BirstClient): void {
server.tool(
"birst_list_hierarchies",
"List dimensional hierarchies in a Birst space. Hierarchies define drill-down paths for analytics.",
inputSchema.shape,
async (args) => {
const { spaceId } = inputSchema.parse(args);
const hierarchies = await client.rest<Hierarchy[]>(
`/spaces/${spaceId}/hierarchies`
);
const simplified = hierarchies.map((hierarchy) => ({
name: hierarchy.name,
cardinality: hierarchy.cardinality,
levels: hierarchy.levels?.map((level) => ({
name: level.name,
ordinal: level.ordinal,
})),
}));
return {
content: [
{
type: "text" as const,
text: JSON.stringify(
{
success: true,
spaceId,
count: hierarchies.length,
hierarchies: simplified,
},
null,
2
),
},
],
};
}
);
}