list-flags.ts•3.75 kB
import { z } from "zod";
import { BucketeerClient } from "../api/client.js";
import { config, getEnvironmentId } from "../config.js";
import { logger } from "../utils/logger.js";
import type { ListFeaturesRequest } from "../types/bucketeer.js";
// Input schema for the list-flags tool
export const listFlagsSchema = z.object({
environmentId: z.string().optional(),
pageSize: z.number().min(1).max(100).optional().default(20),
cursor: z.string().optional(),
tags: z.array(z.string()).optional(),
orderBy: z.enum(["CREATED_AT", "UPDATED_AT", "NAME"]).optional(),
orderDirection: z.enum(["ASC", "DESC"]).optional(),
searchKeyword: z.string().optional(),
maintainer: z.string().optional(),
archived: z.boolean().optional(),
});
export type ListFlagsInput = z.infer<typeof listFlagsSchema>;
export const listFlagsTool = {
name: "listFeatureFlags",
description: "List all feature flags in the specified environment",
inputSchema: {
type: "object" as const,
properties: {
environmentId: {
type: "string",
description: "Environment ID (uses default if not provided)",
},
pageSize: {
type: "number",
description: "Number of items per page (1-100)",
default: 20,
},
cursor: {
type: "string",
description: "Pagination cursor for next page",
},
tags: {
type: "array",
items: { type: "string" },
description: "Filter by tags",
},
orderBy: {
type: "string",
enum: ["CREATED_AT", "UPDATED_AT", "NAME"],
description: "Field to order by",
},
orderDirection: {
type: "string",
enum: ["ASC", "DESC"],
description: "Order direction",
},
searchKeyword: {
type: "string",
description: "Search keyword for feature name or ID",
},
maintainer: {
type: "string",
description: "Filter by maintainer email",
},
archived: {
type: "boolean",
description: "Filter by archived status",
},
},
},
handler: async (input: unknown) => {
try {
// Validate input
const params = listFlagsSchema.parse(input);
logger.debug("Listing feature flags", params);
// Create API client
const client = new BucketeerClient(
config.bucketeerHost,
config.bucketeerApiKey,
);
// Prepare request
const request: ListFeaturesRequest = {
environmentId: getEnvironmentId(params.environmentId),
pageSize: params.pageSize,
cursor: params.cursor,
tags: params.tags,
orderBy: params.orderBy,
orderDirection: params.orderDirection,
searchKeyword: params.searchKeyword,
maintainer: params.maintainer,
archived: params.archived,
};
// Make API call
const response = await client.listFeatures(request);
logger.info(
`Successfully listed ${response.features.length} feature flags`,
);
return {
content: [
{
type: "text",
text: JSON.stringify(
{
success: true,
features: response.features,
cursor: response.cursor,
totalCount: response.totalCount,
},
null,
2,
),
},
],
};
} catch (error) {
logger.error("Failed to list feature flags", error);
if (error instanceof z.ZodError) {
return {
content: [
{
type: "text",
text: JSON.stringify(
{
success: false,
error: "Invalid input parameters",
details: error.issues,
},
null,
2,
),
},
],
isError: true,
};
}
return {
content: [
{
type: "text",
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : "Unknown error",
},
null,
2,
),
},
],
isError: true,
};
}
},
};