flagr-mcp 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- #!/usr/bin/env node
3
2
 
4
3
  // src/index.ts
5
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -26,7 +25,11 @@ async function apiRequest(path, options = {}) {
26
25
  const error = await response.text();
27
26
  throw new Error(`Flagr API error (${response.status}): ${error}`);
28
27
  }
29
- return response.json();
28
+ const text = await response.text();
29
+ if (!text) {
30
+ return void 0;
31
+ }
32
+ return JSON.parse(text);
30
33
  }
31
34
  async function listFlags(params) {
32
35
  const searchParams = new URLSearchParams();
@@ -436,6 +439,7 @@ async function handleSetDistribution(params) {
436
439
  }
437
440
  return {
438
441
  variantID: variant.id,
442
+ variantKey: variant.key,
439
443
  percent: d.percent
440
444
  };
441
445
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/tools/flags.ts","../src/client.ts","../src/tools/segments.ts","../src/tools/variants.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Flagr MCP Server\n *\n * Provides tools for managing feature flags in Flagr via Cursor IDE.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\n\n// Flag tools\nimport {\n ListFlagsSchema,\n GetFlagSchema,\n CreateFlagSchema,\n UpdateFlagSchema,\n DeleteFlagSchema,\n handleListFlags,\n handleGetFlag,\n handleCreateFlag,\n handleUpdateFlag,\n handleDeleteFlag,\n} from './tools/flags.js'\n\n// Segment tools\nimport {\n CreateSegmentSchema,\n UpdateSegmentSchema,\n DeleteSegmentSchema,\n CreateConstraintSchema,\n DeleteConstraintSchema,\n handleCreateSegment,\n handleUpdateSegment,\n handleDeleteSegment,\n handleCreateConstraint,\n handleDeleteConstraint,\n} from './tools/segments.js'\n\n// Variant tools\nimport {\n CreateVariantSchema,\n DeleteVariantSchema,\n SetDistributionSchema,\n handleCreateVariant,\n handleDeleteVariant,\n handleSetDistribution,\n} from './tools/variants.js'\n\n// Create MCP server\nconst server = new McpServer({\n name: 'flagr-mcp',\n version: '1.0.0',\n})\n\n// Register flag tools\nserver.tool(\n 'list_flags',\n 'List all feature flags with optional filters',\n ListFlagsSchema.shape,\n async (params) => {\n try {\n const result = await handleListFlags(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'get_flag',\n 'Get details of a specific feature flag by ID or key',\n GetFlagSchema.shape,\n async (params) => {\n try {\n const result = await handleGetFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool('create_flag', 'Create a new feature flag', CreateFlagSchema.shape, async (params) => {\n try {\n const result = await handleCreateFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n})\n\nserver.tool(\n 'update_flag',\n 'Update an existing feature flag (enable/disable, change description)',\n UpdateFlagSchema.shape,\n async (params) => {\n try {\n const result = await handleUpdateFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool('delete_flag', 'Delete a feature flag', DeleteFlagSchema.shape, async (params) => {\n try {\n const result = await handleDeleteFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n})\n\n// Register segment tools\nserver.tool(\n 'create_segment',\n 'Create a new segment on a feature flag',\n CreateSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'update_segment',\n 'Update an existing segment',\n UpdateSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleUpdateSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_segment',\n 'Delete a segment from a flag',\n DeleteSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'create_constraint',\n 'Add a constraint to a segment (e.g., role=MOD, environment=production)',\n CreateConstraintSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateConstraint(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_constraint',\n 'Delete a constraint from a segment',\n DeleteConstraintSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteConstraint(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\n// Register variant tools\nserver.tool(\n 'create_variant',\n 'Create a new variant on a feature flag (e.g., \"on\", \"off\", \"control\")',\n CreateVariantSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateVariant(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_variant',\n 'Delete a variant from a flag',\n DeleteVariantSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteVariant(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'set_distribution',\n 'Set variant distribution percentages for a segment',\n SetDistributionSchema.shape,\n async (params) => {\n try {\n const result = await handleSetDistribution(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\n// Start server\nasync function main() {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n console.error('Flagr MCP Server running on stdio')\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error)\n process.exit(1)\n})\n","import { z } from 'zod'\nimport {\n listFlags,\n getFlag,\n getFlagByKey,\n createFlag,\n updateFlag,\n deleteFlag,\n createTag,\n type FlagrFlag,\n} from '../client.js'\n\n// Schemas for tool parameters\nexport const ListFlagsSchema = z.object({\n enabled: z.boolean().optional().describe('Filter by enabled status'),\n key: z.string().optional().describe('Filter by flag key (exact match)'),\n tags: z.string().optional().describe('Filter by tags (comma-separated)'),\n limit: z.number().optional().describe('Maximum number of flags to return'),\n})\n\nexport const GetFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key'),\n})\n\nexport const CreateFlagSchema = z.object({\n key: z.string().describe('Unique flag key (e.g., TerminalExitStrategies)'),\n description: z.string().describe('Human-readable description of the flag'),\n enabled: z.boolean().optional().default(false).describe('Enable flag immediately'),\n tags: z.array(z.string()).optional().describe('Tags to add to the flag'),\n})\n\nexport const UpdateFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key (alternative to flagId)'),\n enabled: z.boolean().optional().describe('Enable or disable the flag'),\n description: z.string().optional().describe('New description'),\n notes: z.string().optional().describe('Notes about the flag'),\n})\n\nexport const DeleteFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key (alternative to flagId)'),\n})\n\n// Format flag for display\nfunction formatFlag(flag: FlagrFlag): string {\n const segments = flag.segments\n .map((s) => {\n const constraints = s.constraints\n .map((c) => `${c.property} ${c.operator} \"${c.value}\"`)\n .join(' AND ')\n return ` - ${s.description} (${s.rolloutPercent}%)${constraints ? `: ${constraints}` : ''}`\n })\n .join('\\n')\n\n const variants = flag.variants.map((v) => v.key).join(', ')\n const tags = flag.tags.map((t) => t.value).join(', ')\n\n return `\n**${flag.key}** (ID: ${flag.id})\n- Enabled: ${flag.enabled ? 'Yes' : 'No'}\n- Description: ${flag.description}\n- Variants: ${variants || 'None'}\n- Tags: ${tags || 'None'}\n- Segments:\n${segments || ' None'}\n`.trim()\n}\n\n// Tool implementations\nexport async function handleListFlags(params: z.infer<typeof ListFlagsSchema>): Promise<string> {\n const flags = await listFlags(params)\n\n if (flags.length === 0) {\n return 'No flags found matching the criteria.'\n }\n\n const summary = flags\n .map(\n (f) =>\n `- **${f.key}** (ID: ${f.id}) - ${f.enabled ? 'Enabled' : 'Disabled'} - ${f.description}`\n )\n .join('\\n')\n\n return `Found ${flags.length} flag(s):\\n\\n${summary}`\n}\n\nexport async function handleGetFlag(params: z.infer<typeof GetFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flag: FlagrFlag | null = null\n\n if (params.flagId) {\n flag = await getFlag(params.flagId)\n } else if (params.key) {\n flag = await getFlagByKey(params.key)\n }\n\n if (!flag) {\n return `Flag not found: ${params.key || params.flagId}`\n }\n\n return formatFlag(flag)\n}\n\nexport async function handleCreateFlag(params: z.infer<typeof CreateFlagSchema>): Promise<string> {\n const flag = await createFlag({\n key: params.key,\n description: params.description,\n })\n\n // Enable if requested\n if (params.enabled) {\n await updateFlag(flag.id, { enabled: true })\n }\n\n // Add tags if provided\n if (params.tags && params.tags.length > 0) {\n for (const tag of params.tags) {\n await createTag(flag.id, tag)\n }\n }\n\n // Fetch updated flag\n const updatedFlag = await getFlag(flag.id)\n\n return `Flag created successfully!\\n\\n${formatFlag(updatedFlag)}`\n}\n\nexport async function handleUpdateFlag(params: z.infer<typeof UpdateFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flagId = params.flagId\n\n if (!flagId && params.key) {\n const flag = await getFlagByKey(params.key)\n if (!flag) {\n throw new Error(`Flag not found: ${params.key}`)\n }\n flagId = flag.id\n }\n\n const updateData: Record<string, unknown> = {}\n if (params.enabled !== undefined) updateData.enabled = params.enabled\n if (params.description) updateData.description = params.description\n if (params.notes) updateData.notes = params.notes\n\n const flag = await updateFlag(flagId!, updateData)\n\n return `Flag updated successfully!\\n\\n${formatFlag(flag)}`\n}\n\nexport async function handleDeleteFlag(params: z.infer<typeof DeleteFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flagId = params.flagId\n let flagKey = params.key\n\n if (!flagId && params.key) {\n const flag = await getFlagByKey(params.key)\n if (!flag) {\n throw new Error(`Flag not found: ${params.key}`)\n }\n flagId = flag.id\n flagKey = flag.key\n }\n\n await deleteFlag(flagId!)\n\n return `Flag \"${flagKey}\" (ID: ${flagId}) has been deleted.`\n}\n","/**\n * Flagr HTTP Client\n * Wraps the Flagr API for feature flag management\n */\n\nconst FLAGR_URL = process.env.FLAGR_URL\n\nif (!FLAGR_URL) {\n throw new Error('FLAGR_URL environment variable is required')\n}\n\nexport interface FlagrTag {\n id: number\n value: string\n}\n\nexport interface FlagrConstraint {\n id: number\n property: string\n operator: string\n value: string\n}\n\nexport interface FlagrDistribution {\n id: number\n percent: number\n variantKey: string\n variantID: number\n}\n\nexport interface FlagrVariant {\n id: number\n key: string\n attachment?: Record<string, unknown>\n}\n\nexport interface FlagrSegment {\n id: number\n description: string\n constraints: FlagrConstraint[]\n distributions: FlagrDistribution[]\n rank: number\n rolloutPercent: number\n}\n\nexport interface FlagrFlag {\n id: number\n key: string\n description: string\n enabled: boolean\n tags: FlagrTag[]\n segments: FlagrSegment[]\n variants: FlagrVariant[]\n dataRecordsEnabled: boolean\n entityType?: string\n notes?: string\n createdBy?: string\n updatedBy?: string\n updatedAt?: string\n}\n\nexport interface CreateFlagRequest {\n key: string\n description: string\n}\n\nexport interface UpdateFlagRequest {\n description?: string\n enabled?: boolean\n dataRecordsEnabled?: boolean\n entityType?: string\n notes?: string\n}\n\nexport interface CreateSegmentRequest {\n description: string\n rolloutPercent: number\n}\n\nexport interface CreateConstraintRequest {\n property: string\n operator: string\n value: string\n}\n\nexport interface CreateVariantRequest {\n key: string\n attachment?: Record<string, unknown>\n}\n\nexport interface SetDistributionRequest {\n distributions: Array<{\n variantKey: string\n percent: number\n }>\n}\n\nasync function apiRequest<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${FLAGR_URL}/api/v1${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Flagr API error (${response.status}): ${error}`)\n }\n\n return response.json() as Promise<T>\n}\n\n// Flag operations\nexport async function listFlags(params?: {\n enabled?: boolean\n key?: string\n tags?: string\n limit?: number\n}): Promise<FlagrFlag[]> {\n const searchParams = new URLSearchParams()\n if (params?.enabled !== undefined) searchParams.set('enabled', String(params.enabled))\n if (params?.key) searchParams.set('key', params.key)\n if (params?.tags) searchParams.set('tags', params.tags)\n if (params?.limit) searchParams.set('limit', String(params.limit))\n searchParams.set('preload', 'true')\n\n const query = searchParams.toString()\n return apiRequest<FlagrFlag[]>(`/flags${query ? `?${query}` : ''}`)\n}\n\nexport async function getFlag(flagId: number): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>(`/flags/${flagId}`)\n}\n\nexport async function getFlagByKey(key: string): Promise<FlagrFlag | null> {\n const flags = await listFlags({ key })\n return flags.find((f) => f.key === key) || null\n}\n\nexport async function createFlag(data: CreateFlagRequest): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>('/flags', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function updateFlag(flagId: number, data: UpdateFlagRequest): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>(`/flags/${flagId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteFlag(flagId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}`, {\n method: 'DELETE',\n })\n}\n\n// Segment operations\nexport async function createSegment(\n flagId: number,\n data: CreateSegmentRequest\n): Promise<FlagrSegment> {\n return apiRequest<FlagrSegment>(`/flags/${flagId}/segments`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function updateSegment(\n flagId: number,\n segmentId: number,\n data: Partial<CreateSegmentRequest>\n): Promise<FlagrSegment> {\n return apiRequest<FlagrSegment>(`/flags/${flagId}/segments/${segmentId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteSegment(flagId: number, segmentId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/segments/${segmentId}`, {\n method: 'DELETE',\n })\n}\n\n// Constraint operations\nexport async function createConstraint(\n flagId: number,\n segmentId: number,\n data: CreateConstraintRequest\n): Promise<FlagrConstraint> {\n return apiRequest<FlagrConstraint>(`/flags/${flagId}/segments/${segmentId}/constraints`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteConstraint(\n flagId: number,\n segmentId: number,\n constraintId: number\n): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/segments/${segmentId}/constraints/${constraintId}`, {\n method: 'DELETE',\n })\n}\n\n// Variant operations\nexport async function createVariant(\n flagId: number,\n data: CreateVariantRequest\n): Promise<FlagrVariant> {\n return apiRequest<FlagrVariant>(`/flags/${flagId}/variants`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteVariant(flagId: number, variantId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/variants/${variantId}`, {\n method: 'DELETE',\n })\n}\n\n// Distribution operations\nexport async function setDistributions(\n flagId: number,\n segmentId: number,\n distributions: Array<{ variantID: number; percent: number }>\n): Promise<FlagrDistribution[]> {\n return apiRequest<FlagrDistribution[]>(`/flags/${flagId}/segments/${segmentId}/distributions`, {\n method: 'PUT',\n body: JSON.stringify({ distributions }),\n })\n}\n\n// Tag operations\nexport async function createTag(flagId: number, value: string): Promise<FlagrTag> {\n return apiRequest<FlagrTag>(`/flags/${flagId}/tags`, {\n method: 'POST',\n body: JSON.stringify({ value }),\n })\n}\n\nexport async function deleteTag(flagId: number, tagId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/tags/${tagId}`, {\n method: 'DELETE',\n })\n}\n","import { z } from 'zod'\nimport {\n getFlagByKey,\n getFlag,\n createSegment,\n updateSegment,\n deleteSegment,\n createConstraint,\n deleteConstraint,\n type FlagrSegment,\n} from '../client.js'\n\n// Schemas\nexport const CreateSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n description: z.string().describe('Segment description (e.g., \"MOD users only\")'),\n rolloutPercent: z\n .number()\n .min(0)\n .max(100)\n .default(100)\n .describe('Percentage of matching entities to include (0-100)'),\n})\n\nexport const UpdateSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to update'),\n description: z.string().optional().describe('New segment description'),\n rolloutPercent: z.number().min(0).max(100).optional().describe('New rollout percentage'),\n})\n\nexport const DeleteSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to delete'),\n})\n\nexport const CreateConstraintSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to add constraint to'),\n property: z\n .string()\n .describe('Entity context property to check (e.g., \"role\", \"userId\", \"environment\")'),\n operator: z\n .enum([\n 'EQ',\n 'NEQ',\n 'LT',\n 'LTE',\n 'GT',\n 'GTE',\n 'EREG',\n 'NEREG',\n 'IN',\n 'NOTIN',\n 'CONTAINS',\n 'NOTCONTAINS',\n ])\n .describe('Comparison operator'),\n value: z.string().describe('Value to compare against (for IN/NOTIN, use comma-separated values)'),\n})\n\nexport const DeleteConstraintSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID'),\n constraintId: z.number().describe('Constraint ID to delete'),\n})\n\n// Helper to resolve flag ID\nasync function resolveFlagId(flagId?: number, flagKey?: string): Promise<number> {\n if (flagId) return flagId\n\n if (flagKey) {\n const flag = await getFlagByKey(flagKey)\n if (!flag) {\n throw new Error(`Flag not found: ${flagKey}`)\n }\n return flag.id\n }\n\n throw new Error('Either flagId or flagKey must be provided')\n}\n\n// Format segment for display\nfunction formatSegment(segment: FlagrSegment): string {\n const constraints =\n segment.constraints.length > 0\n ? segment.constraints.map((c) => ` - ${c.property} ${c.operator} \"${c.value}\"`).join('\\n')\n : ' None'\n\n const distributions =\n segment.distributions.length > 0\n ? segment.distributions.map((d) => ` - ${d.variantKey}: ${d.percent}%`).join('\\n')\n : ' None'\n\n return `\n**Segment ${segment.id}**: ${segment.description}\n- Rollout: ${segment.rolloutPercent}%\n- Rank: ${segment.rank}\n- Constraints:\n${constraints}\n- Distributions:\n${distributions}\n`.trim()\n}\n\n// Tool implementations\nexport async function handleCreateSegment(\n params: z.infer<typeof CreateSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const segment = await createSegment(flagId, {\n description: params.description,\n rolloutPercent: params.rolloutPercent,\n })\n\n const flag = await getFlag(flagId)\n\n return `Segment created successfully on flag \"${flag.key}\"!\\n\\n${formatSegment(segment)}`\n}\n\nexport async function handleUpdateSegment(\n params: z.infer<typeof UpdateSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const updateData: Record<string, unknown> = {}\n if (params.description) updateData.description = params.description\n if (params.rolloutPercent !== undefined) updateData.rolloutPercent = params.rolloutPercent\n\n const segment = await updateSegment(flagId, params.segmentId, updateData)\n\n return `Segment updated successfully!\\n\\n${formatSegment(segment)}`\n}\n\nexport async function handleDeleteSegment(\n params: z.infer<typeof DeleteSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteSegment(flagId, params.segmentId)\n\n return `Segment ${params.segmentId} has been deleted.`\n}\n\nexport async function handleCreateConstraint(\n params: z.infer<typeof CreateConstraintSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const constraint = await createConstraint(flagId, params.segmentId, {\n property: params.property,\n operator: params.operator,\n value: params.value,\n })\n\n const flag = await getFlag(flagId)\n const segment = flag.segments.find((s) => s.id === params.segmentId)\n\n return `Constraint created successfully!\n\n**Constraint ${constraint.id}**\n- Property: ${constraint.property}\n- Operator: ${constraint.operator}\n- Value: \"${constraint.value}\"\n- On segment: ${segment?.description || params.segmentId}\n- On flag: ${flag.key}`\n}\n\nexport async function handleDeleteConstraint(\n params: z.infer<typeof DeleteConstraintSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteConstraint(flagId, params.segmentId, params.constraintId)\n\n return `Constraint ${params.constraintId} has been deleted from segment ${params.segmentId}.`\n}\n","import { z } from 'zod'\nimport {\n getFlagByKey,\n getFlag,\n createVariant,\n deleteVariant,\n setDistributions,\n type FlagrVariant,\n} from '../client.js'\n\n// Schemas\nexport const CreateVariantSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n key: z.string().describe('Variant key (e.g., \"on\", \"off\", \"control\", \"treatment\")'),\n attachment: z.record(z.unknown()).optional().describe('Optional JSON attachment for the variant'),\n})\n\nexport const DeleteVariantSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n variantId: z.number().describe('Variant ID to delete'),\n})\n\nexport const SetDistributionSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to set distribution for'),\n distributions: z\n .array(\n z.object({\n variantKey: z.string().describe('Variant key'),\n percent: z.number().min(0).max(100).describe('Percentage (0-100)'),\n })\n )\n .describe('Distribution percentages (must sum to 100)'),\n})\n\n// Helper to resolve flag ID\nasync function resolveFlagId(flagId?: number, flagKey?: string): Promise<number> {\n if (flagId) return flagId\n\n if (flagKey) {\n const flag = await getFlagByKey(flagKey)\n if (!flag) {\n throw new Error(`Flag not found: ${flagKey}`)\n }\n return flag.id\n }\n\n throw new Error('Either flagId or flagKey must be provided')\n}\n\n// Format variant for display\nfunction formatVariant(variant: FlagrVariant): string {\n const attachment = variant.attachment\n ? `\\n- Attachment: ${JSON.stringify(variant.attachment)}`\n : ''\n\n return `**Variant ${variant.id}**: ${variant.key}${attachment}`\n}\n\n// Tool implementations\nexport async function handleCreateVariant(\n params: z.infer<typeof CreateVariantSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const variant = await createVariant(flagId, {\n key: params.key,\n attachment: params.attachment,\n })\n\n const flag = await getFlag(flagId)\n\n return `Variant created successfully on flag \"${flag.key}\"!\\n\\n${formatVariant(variant)}`\n}\n\nexport async function handleDeleteVariant(\n params: z.infer<typeof DeleteVariantSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteVariant(flagId, params.variantId)\n\n return `Variant ${params.variantId} has been deleted.`\n}\n\nexport async function handleSetDistribution(\n params: z.infer<typeof SetDistributionSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n // Validate distributions sum to 100\n const sum = params.distributions.reduce((acc, d) => acc + d.percent, 0)\n if (sum !== 100) {\n throw new Error(`Distribution percentages must sum to 100, got ${sum}`)\n }\n\n // Get flag to resolve variant keys to IDs\n const flag = await getFlag(flagId)\n\n const distributionsWithIds = params.distributions.map((d) => {\n const variant = flag.variants.find((v) => v.key === d.variantKey)\n if (!variant) {\n throw new Error(\n `Variant \"${d.variantKey}\" not found on flag \"${flag.key}\". Available variants: ${flag.variants.map((v) => v.key).join(', ')}`\n )\n }\n return {\n variantID: variant.id,\n percent: d.percent,\n }\n })\n\n const distributions = await setDistributions(flagId, params.segmentId, distributionsWithIds)\n\n const segment = flag.segments.find((s) => s.id === params.segmentId)\n\n const formatted = distributions.map((d) => `- ${d.variantKey}: ${d.percent}%`).join('\\n')\n\n return `Distribution set successfully on segment \"${segment?.description || params.segmentId}\" of flag \"${flag.key}\"!\\n\\n${formatted}`\n}\n"],"mappings":"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","names":["flag","z","z","z","z","resolveFlagId"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tools/flags.ts","../src/client.ts","../src/tools/segments.ts","../src/tools/variants.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Flagr MCP Server\n *\n * Provides tools for managing feature flags in Flagr via Cursor IDE.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\n\n// Flag tools\nimport {\n ListFlagsSchema,\n GetFlagSchema,\n CreateFlagSchema,\n UpdateFlagSchema,\n DeleteFlagSchema,\n handleListFlags,\n handleGetFlag,\n handleCreateFlag,\n handleUpdateFlag,\n handleDeleteFlag,\n} from './tools/flags.js'\n\n// Segment tools\nimport {\n CreateSegmentSchema,\n UpdateSegmentSchema,\n DeleteSegmentSchema,\n CreateConstraintSchema,\n DeleteConstraintSchema,\n handleCreateSegment,\n handleUpdateSegment,\n handleDeleteSegment,\n handleCreateConstraint,\n handleDeleteConstraint,\n} from './tools/segments.js'\n\n// Variant tools\nimport {\n CreateVariantSchema,\n DeleteVariantSchema,\n SetDistributionSchema,\n handleCreateVariant,\n handleDeleteVariant,\n handleSetDistribution,\n} from './tools/variants.js'\n\n// Create MCP server\nconst server = new McpServer({\n name: 'flagr-mcp',\n version: '1.0.0',\n})\n\n// Register flag tools\nserver.tool(\n 'list_flags',\n 'List all feature flags with optional filters',\n ListFlagsSchema.shape,\n async (params) => {\n try {\n const result = await handleListFlags(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'get_flag',\n 'Get details of a specific feature flag by ID or key',\n GetFlagSchema.shape,\n async (params) => {\n try {\n const result = await handleGetFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool('create_flag', 'Create a new feature flag', CreateFlagSchema.shape, async (params) => {\n try {\n const result = await handleCreateFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n})\n\nserver.tool(\n 'update_flag',\n 'Update an existing feature flag (enable/disable, change description)',\n UpdateFlagSchema.shape,\n async (params) => {\n try {\n const result = await handleUpdateFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool('delete_flag', 'Delete a feature flag', DeleteFlagSchema.shape, async (params) => {\n try {\n const result = await handleDeleteFlag(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n})\n\n// Register segment tools\nserver.tool(\n 'create_segment',\n 'Create a new segment on a feature flag',\n CreateSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'update_segment',\n 'Update an existing segment',\n UpdateSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleUpdateSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_segment',\n 'Delete a segment from a flag',\n DeleteSegmentSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteSegment(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'create_constraint',\n 'Add a constraint to a segment (e.g., role=MOD, environment=production)',\n CreateConstraintSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateConstraint(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_constraint',\n 'Delete a constraint from a segment',\n DeleteConstraintSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteConstraint(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\n// Register variant tools\nserver.tool(\n 'create_variant',\n 'Create a new variant on a feature flag (e.g., \"on\", \"off\", \"control\")',\n CreateVariantSchema.shape,\n async (params) => {\n try {\n const result = await handleCreateVariant(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'delete_variant',\n 'Delete a variant from a flag',\n DeleteVariantSchema.shape,\n async (params) => {\n try {\n const result = await handleDeleteVariant(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\nserver.tool(\n 'set_distribution',\n 'Set variant distribution percentages for a segment',\n SetDistributionSchema.shape,\n async (params) => {\n try {\n const result = await handleSetDistribution(params)\n return { content: [{ type: 'text', text: result }] }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error: ${(error as Error).message}` }],\n isError: true,\n }\n }\n }\n)\n\n// Start server\nasync function main() {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n console.error('Flagr MCP Server running on stdio')\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error)\n process.exit(1)\n})\n","import { z } from 'zod'\nimport {\n listFlags,\n getFlag,\n getFlagByKey,\n createFlag,\n updateFlag,\n deleteFlag,\n createTag,\n type FlagrFlag,\n} from '../client.js'\n\n// Schemas for tool parameters\nexport const ListFlagsSchema = z.object({\n enabled: z.boolean().optional().describe('Filter by enabled status'),\n key: z.string().optional().describe('Filter by flag key (exact match)'),\n tags: z.string().optional().describe('Filter by tags (comma-separated)'),\n limit: z.number().optional().describe('Maximum number of flags to return'),\n})\n\nexport const GetFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key'),\n})\n\nexport const CreateFlagSchema = z.object({\n key: z.string().describe('Unique flag key (e.g., TerminalExitStrategies)'),\n description: z.string().describe('Human-readable description of the flag'),\n enabled: z.boolean().optional().default(false).describe('Enable flag immediately'),\n tags: z.array(z.string()).optional().describe('Tags to add to the flag'),\n})\n\nexport const UpdateFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key (alternative to flagId)'),\n enabled: z.boolean().optional().describe('Enable or disable the flag'),\n description: z.string().optional().describe('New description'),\n notes: z.string().optional().describe('Notes about the flag'),\n})\n\nexport const DeleteFlagSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n key: z.string().optional().describe('Flag key (alternative to flagId)'),\n})\n\n// Format flag for display\nfunction formatFlag(flag: FlagrFlag): string {\n const segments = flag.segments\n .map((s) => {\n const constraints = s.constraints\n .map((c) => `${c.property} ${c.operator} \"${c.value}\"`)\n .join(' AND ')\n return ` - ${s.description} (${s.rolloutPercent}%)${constraints ? `: ${constraints}` : ''}`\n })\n .join('\\n')\n\n const variants = flag.variants.map((v) => v.key).join(', ')\n const tags = flag.tags.map((t) => t.value).join(', ')\n\n return `\n**${flag.key}** (ID: ${flag.id})\n- Enabled: ${flag.enabled ? 'Yes' : 'No'}\n- Description: ${flag.description}\n- Variants: ${variants || 'None'}\n- Tags: ${tags || 'None'}\n- Segments:\n${segments || ' None'}\n`.trim()\n}\n\n// Tool implementations\nexport async function handleListFlags(params: z.infer<typeof ListFlagsSchema>): Promise<string> {\n const flags = await listFlags(params)\n\n if (flags.length === 0) {\n return 'No flags found matching the criteria.'\n }\n\n const summary = flags\n .map(\n (f) =>\n `- **${f.key}** (ID: ${f.id}) - ${f.enabled ? 'Enabled' : 'Disabled'} - ${f.description}`\n )\n .join('\\n')\n\n return `Found ${flags.length} flag(s):\\n\\n${summary}`\n}\n\nexport async function handleGetFlag(params: z.infer<typeof GetFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flag: FlagrFlag | null = null\n\n if (params.flagId) {\n flag = await getFlag(params.flagId)\n } else if (params.key) {\n flag = await getFlagByKey(params.key)\n }\n\n if (!flag) {\n return `Flag not found: ${params.key || params.flagId}`\n }\n\n return formatFlag(flag)\n}\n\nexport async function handleCreateFlag(params: z.infer<typeof CreateFlagSchema>): Promise<string> {\n const flag = await createFlag({\n key: params.key,\n description: params.description,\n })\n\n // Enable if requested\n if (params.enabled) {\n await updateFlag(flag.id, { enabled: true })\n }\n\n // Add tags if provided\n if (params.tags && params.tags.length > 0) {\n for (const tag of params.tags) {\n await createTag(flag.id, tag)\n }\n }\n\n // Fetch updated flag\n const updatedFlag = await getFlag(flag.id)\n\n return `Flag created successfully!\\n\\n${formatFlag(updatedFlag)}`\n}\n\nexport async function handleUpdateFlag(params: z.infer<typeof UpdateFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flagId = params.flagId\n\n if (!flagId && params.key) {\n const flag = await getFlagByKey(params.key)\n if (!flag) {\n throw new Error(`Flag not found: ${params.key}`)\n }\n flagId = flag.id\n }\n\n const updateData: Record<string, unknown> = {}\n if (params.enabled !== undefined) updateData.enabled = params.enabled\n if (params.description) updateData.description = params.description\n if (params.notes) updateData.notes = params.notes\n\n const flag = await updateFlag(flagId!, updateData)\n\n return `Flag updated successfully!\\n\\n${formatFlag(flag)}`\n}\n\nexport async function handleDeleteFlag(params: z.infer<typeof DeleteFlagSchema>): Promise<string> {\n if (!params.flagId && !params.key) {\n throw new Error('Either flagId or key must be provided')\n }\n\n let flagId = params.flagId\n let flagKey = params.key\n\n if (!flagId && params.key) {\n const flag = await getFlagByKey(params.key)\n if (!flag) {\n throw new Error(`Flag not found: ${params.key}`)\n }\n flagId = flag.id\n flagKey = flag.key\n }\n\n await deleteFlag(flagId!)\n\n return `Flag \"${flagKey}\" (ID: ${flagId}) has been deleted.`\n}\n","/**\n * Flagr HTTP Client\n * Wraps the Flagr API for feature flag management\n */\n\nconst FLAGR_URL = process.env.FLAGR_URL\n\nif (!FLAGR_URL) {\n throw new Error('FLAGR_URL environment variable is required')\n}\n\nexport interface FlagrTag {\n id: number\n value: string\n}\n\nexport interface FlagrConstraint {\n id: number\n property: string\n operator: string\n value: string\n}\n\nexport interface FlagrDistribution {\n id: number\n percent: number\n variantKey: string\n variantID: number\n}\n\nexport interface FlagrVariant {\n id: number\n key: string\n attachment?: Record<string, unknown>\n}\n\nexport interface FlagrSegment {\n id: number\n description: string\n constraints: FlagrConstraint[]\n distributions: FlagrDistribution[]\n rank: number\n rolloutPercent: number\n}\n\nexport interface FlagrFlag {\n id: number\n key: string\n description: string\n enabled: boolean\n tags: FlagrTag[]\n segments: FlagrSegment[]\n variants: FlagrVariant[]\n dataRecordsEnabled: boolean\n entityType?: string\n notes?: string\n createdBy?: string\n updatedBy?: string\n updatedAt?: string\n}\n\nexport interface CreateFlagRequest {\n key: string\n description: string\n}\n\nexport interface UpdateFlagRequest {\n description?: string\n enabled?: boolean\n dataRecordsEnabled?: boolean\n entityType?: string\n notes?: string\n}\n\nexport interface CreateSegmentRequest {\n description: string\n rolloutPercent: number\n}\n\nexport interface CreateConstraintRequest {\n property: string\n operator: string\n value: string\n}\n\nexport interface CreateVariantRequest {\n key: string\n attachment?: Record<string, unknown>\n}\n\nexport interface SetDistributionRequest {\n distributions: Array<{\n variantKey: string\n percent: number\n }>\n}\n\nasync function apiRequest<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${FLAGR_URL}/api/v1${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Flagr API error (${response.status}): ${error}`)\n }\n\n const text = await response.text()\n if (!text) {\n return undefined as T\n }\n\n return JSON.parse(text) as T\n}\n\n// Flag operations\nexport async function listFlags(params?: {\n enabled?: boolean\n key?: string\n tags?: string\n limit?: number\n}): Promise<FlagrFlag[]> {\n const searchParams = new URLSearchParams()\n if (params?.enabled !== undefined) searchParams.set('enabled', String(params.enabled))\n if (params?.key) searchParams.set('key', params.key)\n if (params?.tags) searchParams.set('tags', params.tags)\n if (params?.limit) searchParams.set('limit', String(params.limit))\n searchParams.set('preload', 'true')\n\n const query = searchParams.toString()\n return apiRequest<FlagrFlag[]>(`/flags${query ? `?${query}` : ''}`)\n}\n\nexport async function getFlag(flagId: number): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>(`/flags/${flagId}`)\n}\n\nexport async function getFlagByKey(key: string): Promise<FlagrFlag | null> {\n const flags = await listFlags({ key })\n return flags.find((f) => f.key === key) || null\n}\n\nexport async function createFlag(data: CreateFlagRequest): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>('/flags', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function updateFlag(flagId: number, data: UpdateFlagRequest): Promise<FlagrFlag> {\n return apiRequest<FlagrFlag>(`/flags/${flagId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteFlag(flagId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}`, {\n method: 'DELETE',\n })\n}\n\n// Segment operations\nexport async function createSegment(\n flagId: number,\n data: CreateSegmentRequest\n): Promise<FlagrSegment> {\n return apiRequest<FlagrSegment>(`/flags/${flagId}/segments`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function updateSegment(\n flagId: number,\n segmentId: number,\n data: Partial<CreateSegmentRequest>\n): Promise<FlagrSegment> {\n return apiRequest<FlagrSegment>(`/flags/${flagId}/segments/${segmentId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteSegment(flagId: number, segmentId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/segments/${segmentId}`, {\n method: 'DELETE',\n })\n}\n\n// Constraint operations\nexport async function createConstraint(\n flagId: number,\n segmentId: number,\n data: CreateConstraintRequest\n): Promise<FlagrConstraint> {\n return apiRequest<FlagrConstraint>(`/flags/${flagId}/segments/${segmentId}/constraints`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteConstraint(\n flagId: number,\n segmentId: number,\n constraintId: number\n): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/segments/${segmentId}/constraints/${constraintId}`, {\n method: 'DELETE',\n })\n}\n\n// Variant operations\nexport async function createVariant(\n flagId: number,\n data: CreateVariantRequest\n): Promise<FlagrVariant> {\n return apiRequest<FlagrVariant>(`/flags/${flagId}/variants`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteVariant(flagId: number, variantId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/variants/${variantId}`, {\n method: 'DELETE',\n })\n}\n\n// Distribution operations\nexport async function setDistributions(\n flagId: number,\n segmentId: number,\n distributions: Array<{ variantID: number; variantKey: string; percent: number }>\n): Promise<FlagrDistribution[]> {\n return apiRequest<FlagrDistribution[]>(`/flags/${flagId}/segments/${segmentId}/distributions`, {\n method: 'PUT',\n body: JSON.stringify({ distributions }),\n })\n}\n\n// Tag operations\nexport async function createTag(flagId: number, value: string): Promise<FlagrTag> {\n return apiRequest<FlagrTag>(`/flags/${flagId}/tags`, {\n method: 'POST',\n body: JSON.stringify({ value }),\n })\n}\n\nexport async function deleteTag(flagId: number, tagId: number): Promise<void> {\n await apiRequest<void>(`/flags/${flagId}/tags/${tagId}`, {\n method: 'DELETE',\n })\n}\n","import { z } from 'zod'\nimport {\n getFlagByKey,\n getFlag,\n createSegment,\n updateSegment,\n deleteSegment,\n createConstraint,\n deleteConstraint,\n type FlagrSegment,\n} from '../client.js'\n\n// Schemas\nexport const CreateSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n description: z.string().describe('Segment description (e.g., \"MOD users only\")'),\n rolloutPercent: z\n .number()\n .min(0)\n .max(100)\n .default(100)\n .describe('Percentage of matching entities to include (0-100)'),\n})\n\nexport const UpdateSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to update'),\n description: z.string().optional().describe('New segment description'),\n rolloutPercent: z.number().min(0).max(100).optional().describe('New rollout percentage'),\n})\n\nexport const DeleteSegmentSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to delete'),\n})\n\nexport const CreateConstraintSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to add constraint to'),\n property: z\n .string()\n .describe('Entity context property to check (e.g., \"role\", \"userId\", \"environment\")'),\n operator: z\n .enum([\n 'EQ',\n 'NEQ',\n 'LT',\n 'LTE',\n 'GT',\n 'GTE',\n 'EREG',\n 'NEREG',\n 'IN',\n 'NOTIN',\n 'CONTAINS',\n 'NOTCONTAINS',\n ])\n .describe('Comparison operator'),\n value: z.string().describe('Value to compare against (for IN/NOTIN, use comma-separated values)'),\n})\n\nexport const DeleteConstraintSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID'),\n constraintId: z.number().describe('Constraint ID to delete'),\n})\n\n// Helper to resolve flag ID\nasync function resolveFlagId(flagId?: number, flagKey?: string): Promise<number> {\n if (flagId) return flagId\n\n if (flagKey) {\n const flag = await getFlagByKey(flagKey)\n if (!flag) {\n throw new Error(`Flag not found: ${flagKey}`)\n }\n return flag.id\n }\n\n throw new Error('Either flagId or flagKey must be provided')\n}\n\n// Format segment for display\nfunction formatSegment(segment: FlagrSegment): string {\n const constraints =\n segment.constraints.length > 0\n ? segment.constraints.map((c) => ` - ${c.property} ${c.operator} \"${c.value}\"`).join('\\n')\n : ' None'\n\n const distributions =\n segment.distributions.length > 0\n ? segment.distributions.map((d) => ` - ${d.variantKey}: ${d.percent}%`).join('\\n')\n : ' None'\n\n return `\n**Segment ${segment.id}**: ${segment.description}\n- Rollout: ${segment.rolloutPercent}%\n- Rank: ${segment.rank}\n- Constraints:\n${constraints}\n- Distributions:\n${distributions}\n`.trim()\n}\n\n// Tool implementations\nexport async function handleCreateSegment(\n params: z.infer<typeof CreateSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const segment = await createSegment(flagId, {\n description: params.description,\n rolloutPercent: params.rolloutPercent,\n })\n\n const flag = await getFlag(flagId)\n\n return `Segment created successfully on flag \"${flag.key}\"!\\n\\n${formatSegment(segment)}`\n}\n\nexport async function handleUpdateSegment(\n params: z.infer<typeof UpdateSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const updateData: Record<string, unknown> = {}\n if (params.description) updateData.description = params.description\n if (params.rolloutPercent !== undefined) updateData.rolloutPercent = params.rolloutPercent\n\n const segment = await updateSegment(flagId, params.segmentId, updateData)\n\n return `Segment updated successfully!\\n\\n${formatSegment(segment)}`\n}\n\nexport async function handleDeleteSegment(\n params: z.infer<typeof DeleteSegmentSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteSegment(flagId, params.segmentId)\n\n return `Segment ${params.segmentId} has been deleted.`\n}\n\nexport async function handleCreateConstraint(\n params: z.infer<typeof CreateConstraintSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const constraint = await createConstraint(flagId, params.segmentId, {\n property: params.property,\n operator: params.operator,\n value: params.value,\n })\n\n const flag = await getFlag(flagId)\n const segment = flag.segments.find((s) => s.id === params.segmentId)\n\n return `Constraint created successfully!\n\n**Constraint ${constraint.id}**\n- Property: ${constraint.property}\n- Operator: ${constraint.operator}\n- Value: \"${constraint.value}\"\n- On segment: ${segment?.description || params.segmentId}\n- On flag: ${flag.key}`\n}\n\nexport async function handleDeleteConstraint(\n params: z.infer<typeof DeleteConstraintSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteConstraint(flagId, params.segmentId, params.constraintId)\n\n return `Constraint ${params.constraintId} has been deleted from segment ${params.segmentId}.`\n}\n","import { z } from 'zod'\nimport {\n getFlagByKey,\n getFlag,\n createVariant,\n deleteVariant,\n setDistributions,\n type FlagrVariant,\n} from '../client.js'\n\n// Schemas\nexport const CreateVariantSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n key: z.string().describe('Variant key (e.g., \"on\", \"off\", \"control\", \"treatment\")'),\n attachment: z.record(z.unknown()).optional().describe('Optional JSON attachment for the variant'),\n})\n\nexport const DeleteVariantSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n variantId: z.number().describe('Variant ID to delete'),\n})\n\nexport const SetDistributionSchema = z.object({\n flagId: z.number().optional().describe('Flag ID'),\n flagKey: z.string().optional().describe('Flag key (alternative to flagId)'),\n segmentId: z.number().describe('Segment ID to set distribution for'),\n distributions: z\n .array(\n z.object({\n variantKey: z.string().describe('Variant key'),\n percent: z.number().min(0).max(100).describe('Percentage (0-100)'),\n })\n )\n .describe('Distribution percentages (must sum to 100)'),\n})\n\n// Helper to resolve flag ID\nasync function resolveFlagId(flagId?: number, flagKey?: string): Promise<number> {\n if (flagId) return flagId\n\n if (flagKey) {\n const flag = await getFlagByKey(flagKey)\n if (!flag) {\n throw new Error(`Flag not found: ${flagKey}`)\n }\n return flag.id\n }\n\n throw new Error('Either flagId or flagKey must be provided')\n}\n\n// Format variant for display\nfunction formatVariant(variant: FlagrVariant): string {\n const attachment = variant.attachment\n ? `\\n- Attachment: ${JSON.stringify(variant.attachment)}`\n : ''\n\n return `**Variant ${variant.id}**: ${variant.key}${attachment}`\n}\n\n// Tool implementations\nexport async function handleCreateVariant(\n params: z.infer<typeof CreateVariantSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n const variant = await createVariant(flagId, {\n key: params.key,\n attachment: params.attachment,\n })\n\n const flag = await getFlag(flagId)\n\n return `Variant created successfully on flag \"${flag.key}\"!\\n\\n${formatVariant(variant)}`\n}\n\nexport async function handleDeleteVariant(\n params: z.infer<typeof DeleteVariantSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n await deleteVariant(flagId, params.variantId)\n\n return `Variant ${params.variantId} has been deleted.`\n}\n\nexport async function handleSetDistribution(\n params: z.infer<typeof SetDistributionSchema>\n): Promise<string> {\n const flagId = await resolveFlagId(params.flagId, params.flagKey)\n\n // Validate distributions sum to 100\n const sum = params.distributions.reduce((acc, d) => acc + d.percent, 0)\n if (sum !== 100) {\n throw new Error(`Distribution percentages must sum to 100, got ${sum}`)\n }\n\n // Get flag to resolve variant keys to IDs\n const flag = await getFlag(flagId)\n\n const distributionsWithIds = params.distributions.map((d) => {\n const variant = flag.variants.find((v) => v.key === d.variantKey)\n if (!variant) {\n throw new Error(\n `Variant \"${d.variantKey}\" not found on flag \"${flag.key}\". Available variants: ${flag.variants.map((v) => v.key).join(', ')}`\n )\n }\n return {\n variantID: variant.id,\n variantKey: variant.key,\n percent: d.percent,\n }\n })\n\n const distributions = await setDistributions(flagId, params.segmentId, distributionsWithIds)\n\n const segment = flag.segments.find((s) => s.id === params.segmentId)\n\n const formatted = distributions.map((d) => `- ${d.variantKey}: ${d.percent}%`).join('\\n')\n\n return `Distribution set successfully on segment \"${segment?.description || params.segmentId}\" of flag \"${flag.key}\"!\\n\\n${formatted}`\n}\n"],"mappings":"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","names":["flag","z","z","z","z","resolveFlagId"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flagr-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "MCP Server for managing Flagr feature flags via Cursor IDE",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",