/* MCP bundle / plugin manifest builders for program.appConfig env-mapped entries. */ import type { CliAppConfigEntry, CliProgram } from "../core/types.ts"; import { configEntryRequired, configEntrySensitive, configUserConfigKey, defaultConfigEntryTitle, jsonSchemaRequiredKeys, } from "./entry.ts"; import { effectiveJsonSchema } from "./schema.ts"; function buildConfigUserConfigEntry( key: string, entry: CliAppConfigEntry, jsonSchemaRequired: Set | undefined, ): Record { return { type: "string", title: entry.title ?? defaultConfigEntryTitle(key), description: entry.description, sensitive: configEntrySensitive(key, entry), required: configEntryRequired(key, entry, jsonSchemaRequired), }; } /** Builds MCPB/plugin user_config from schema entries with `env` set. */ export function buildProgramUserConfig(program: CliProgram): Record | undefined { const appConfig = program.appConfig; if (!appConfig) { return undefined; } const jsonSchema = effectiveJsonSchema(program); const fromSchema = jsonSchema ? jsonSchemaRequiredKeys(jsonSchema) : undefined; const out: Record = {}; for (const [key, entry] of Object.entries(appConfig.entries)) { if (!entry.env) { continue; } out[configUserConfigKey(key)] = buildConfigUserConfigEntry(key, entry, fromSchema); } return Object.keys(out).length > 0 ? out : undefined; } /** Plugin .mcp.json env mapping from program.appConfig env entries. */ export function buildPluginMcpEnvMapping(program: CliProgram): Record | undefined { const appConfig = program.appConfig; if (!appConfig) { return undefined; } const out: Record = {}; for (const [key, entry] of Object.entries(appConfig.entries)) { if (!entry.env) { continue; } const manifestKey = configUserConfigKey(key); out[entry.env] = `\${user_config.${manifestKey}}`; } return Object.keys(out).length > 0 ? out : undefined; } /** * Plugin mcp.json env mapping for Cursor from program.appConfig env entries. */ export function buildCursorPluginMcpEnvMapping( /** CLI program schema. */ program: CliProgram, ): Record | undefined { const appConfig = program.appConfig; if (!appConfig) { return undefined; } const out: Record = {}; for (const entry of Object.values(appConfig.entries)) { if (!entry.env) { continue; } out[entry.env] = `\${${entry.env}}`; } return Object.keys(out).length > 0 ? out : undefined; } /** * Builds Cursor plugin variables schema from program.appConfig env-mapped entries. */ export function buildCursorPluginVariables( /** CLI program schema. */ program: CliProgram, ): Record | undefined { const appConfig = program.appConfig; if (!appConfig) { return undefined; } const properties: Record = {}; const required: string[] = []; for (const entry of Object.values(appConfig.entries)) { if (!entry.env) { continue; } properties[entry.env] = { type: "string", ...(entry.description ? { description: entry.description } : {}), }; if (entry.required) { required.push(entry.env); } } if (Object.keys(properties).length === 0) { return undefined; } return { type: "object", properties, ...(required.length > 0 ? { required } : {}), }; }