@forprompt/sdk 0.1.0
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/LICENSE +661 -0
- package/README.md +302 -0
- package/dist/cli/index.js +3143 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +439 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +308 -0
- package/dist/index.d.ts +308 -0
- package/dist/index.js +406 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/chunk-2ABKAGKB.js +2145 -0
- package/dist/mcp/chunk-2ABKAGKB.js.map +1 -0
- package/dist/mcp/index.d.ts +36 -0
- package/dist/mcp/index.js +241 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +39 -0
- package/dist/mcp/server.js +10 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/version.cjs +118 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.cts +12 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.js +91 -0
- package/dist/version.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/init.ts","../../src/cli/utils/config.ts","../../src/cli/utils/api.ts","../../src/cli/utils/generator.ts","../../src/cli/commands/deploy.ts","../../src/cli/commands/mcp.ts","../../src/mcp/server.ts","../../src/types.ts","../../src/client.ts","../../src/mcp/tools.ts","../../src/mcp/resources.ts","../../package.json","../../src/version.ts","../../src/mcp/config/generators.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * Init Command\n *\n * Initialize ForPrompt in the current directory\n * Usage: npx forprompt init\n */\n\nimport * as readline from \"readline\";\nimport {\n saveProjectConfig,\n saveApiKeyToEnv,\n getForpromptDir,\n loadProjectConfig,\n getApiKey,\n} from \"../utils/config\";\nimport { createApiClient } from \"../utils/api\";\n\n/**\n * Prompt user for input\n */\nasync function prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const promptText = defaultValue\n ? `${question} (${defaultValue}): `\n : `${question}: `;\n\n rl.question(promptText, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\n/**\n * Init command handler\n */\nexport async function initCommand(options: {\n apiKey?: string;\n baseUrl?: string;\n}): Promise<void> {\n console.log(\"\\n๐ Initializing ForPrompt...\\n\");\n\n // Check if already initialized\n const existingConfig = loadProjectConfig();\n const existingApiKey = getApiKey();\n\n if (existingConfig && existingApiKey) {\n const overwrite = await prompt(\n \"Project already initialized. Overwrite? (y/N)\",\n \"N\"\n );\n if (overwrite.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n return;\n }\n }\n\n // Get API key\n let apiKey = options.apiKey;\n if (!apiKey) {\n apiKey = await prompt(\"Enter your ForPrompt API key\");\n }\n\n if (!apiKey) {\n console.error(\"โ API key is required\");\n process.exit(1);\n }\n\n // Validate API key\n console.log(\"\\n๐ Validating API key...\");\n const baseUrl = options.baseUrl || process.env.FORPROMPT_BASE_URL;\n const api = createApiClient(baseUrl);\n\n try {\n const result = await api.validateApiKey(apiKey);\n\n if (!result.valid || !result.project) {\n console.error(\"โ Invalid API key\");\n process.exit(1);\n }\n\n const { project } = result;\n\n console.log(`\\nโ
Connected to project: ${project.projectName}`);\n if (project.orgName) {\n console.log(` Organization: ${project.orgName}`);\n }\n\n // Save API key to .env\n saveApiKeyToEnv(apiKey);\n console.log(\"\\n๐ Saved API key to .env\");\n\n // Save project config\n saveProjectConfig({\n projectId: project.projectId,\n projectName: project.projectName,\n projectSlug: project.projectSlug,\n apiKey: apiKey, // Won't be saved to file, just used for reference\n baseUrl: baseUrl || \"https://wooden-fox-811.convex.site\",\n });\n console.log(`๐ Created ${getForpromptDir()}/.forpromptrc`);\n\n console.log(\"\\nโจ ForPrompt initialized successfully!\");\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Run 'npx forprompt deploy' to sync your prompts\");\n console.log(\" 2. Import prompts in your code:\");\n console.log(\" import { userContextPrompt } from './forprompt';\");\n console.log(\"\");\n } catch (error) {\n console.error(\n \"โ Failed to validate API key:\",\n error instanceof Error ? error.message : \"Unknown error\"\n );\n process.exit(1);\n }\n}\n","/**\n * CLI Configuration Management\n *\n * Manages two types of config:\n * 1. Global auth config (~/.forprompt/config.json) - stores auth token\n * 2. Project config (.env + forprompt/.forpromptrc) - stores API key and project info\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\n// Global config directory\nconst GLOBAL_CONFIG_DIR = path.join(os.homedir(), \".forprompt\");\nconst GLOBAL_CONFIG_FILE = path.join(GLOBAL_CONFIG_DIR, \"config.json\");\n\n// Project config files\nconst PROJECT_CONFIG_DIR = \"forprompt\";\nconst PROJECT_CONFIG_FILE = \".forpromptrc\";\nconst ENV_FILE = \".env\";\n\nexport interface GlobalConfig {\n authToken?: string;\n user?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n };\n}\n\nexport interface ProjectConfig {\n projectId: string;\n projectName: string;\n projectSlug: string;\n apiKey: string;\n baseUrl: string;\n lastDeployedAt?: number;\n}\n\n/**\n * Ensure global config directory exists\n */\nfunction ensureGlobalConfigDir(): void {\n if (!fs.existsSync(GLOBAL_CONFIG_DIR)) {\n fs.mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Load global config\n */\nexport function loadGlobalConfig(): GlobalConfig | null {\n try {\n if (!fs.existsSync(GLOBAL_CONFIG_FILE)) {\n return null;\n }\n const content = fs.readFileSync(GLOBAL_CONFIG_FILE, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Save global config\n */\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureGlobalConfigDir();\n fs.writeFileSync(GLOBAL_CONFIG_FILE, JSON.stringify(config, null, 2), {\n mode: 0o600, // Only owner can read/write\n });\n}\n\n/**\n * Clear global config (logout)\n */\nexport function clearGlobalConfig(): void {\n if (fs.existsSync(GLOBAL_CONFIG_FILE)) {\n fs.unlinkSync(GLOBAL_CONFIG_FILE);\n }\n}\n\n/**\n * Ensure project config directory exists\n */\nfunction ensureProjectConfigDir(cwd: string = process.cwd()): string {\n const configDir = path.join(cwd, PROJECT_CONFIG_DIR);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n return configDir;\n}\n\n/**\n * Load project config from forprompt/.forpromptrc\n */\nexport function loadProjectConfig(cwd: string = process.cwd()): ProjectConfig | null {\n try {\n const configPath = path.join(cwd, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n return null;\n }\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Save project config to forprompt/.forpromptrc\n */\nexport function saveProjectConfig(config: ProjectConfig, cwd: string = process.cwd()): void {\n ensureProjectConfigDir(cwd);\n const configPath = path.join(cwd, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n\n // Don't save the API key in the config file, it goes to .env\n const { apiKey: _, ...configWithoutKey } = config;\n fs.writeFileSync(configPath, JSON.stringify(configWithoutKey, null, 2));\n}\n\n/**\n * Get API key from environment or .env file\n */\nexport function getApiKey(cwd: string = process.cwd()): string | null {\n // First check environment variable\n if (process.env.FORPROMPT_API_KEY) {\n return process.env.FORPROMPT_API_KEY;\n }\n\n // Then check .env file\n try {\n const envPath = path.join(cwd, ENV_FILE);\n if (!fs.existsSync(envPath)) {\n return null;\n }\n const content = fs.readFileSync(envPath, \"utf-8\");\n const match = content.match(/^FORPROMPT_API_KEY=(.+)$/m);\n return match ? match[1]!.trim().replace(/^[\"']|[\"']$/g, \"\") : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Save API key to .env file\n */\nexport function saveApiKeyToEnv(apiKey: string, cwd: string = process.cwd()): void {\n const envPath = path.join(cwd, ENV_FILE);\n let content = \"\";\n\n if (fs.existsSync(envPath)) {\n content = fs.readFileSync(envPath, \"utf-8\");\n // Replace existing key or append\n if (content.match(/^FORPROMPT_API_KEY=/m)) {\n content = content.replace(/^FORPROMPT_API_KEY=.+$/m, `FORPROMPT_API_KEY=${apiKey}`);\n } else {\n content = content.trim() + `\\nFORPROMPT_API_KEY=${apiKey}\\n`;\n }\n } else {\n content = `FORPROMPT_API_KEY=${apiKey}\\n`;\n }\n\n fs.writeFileSync(envPath, content);\n}\n\n/**\n * Check if user is logged in\n */\nexport function isLoggedIn(): boolean {\n const config = loadGlobalConfig();\n return !!(config?.authToken);\n}\n\n/**\n * Check if project is initialized\n */\nexport function isProjectInitialized(cwd: string = process.cwd()): boolean {\n const projectConfig = loadProjectConfig(cwd);\n const apiKey = getApiKey(cwd);\n return !!(projectConfig && apiKey);\n}\n\n/**\n * Get forprompt directory path\n */\nexport function getForpromptDir(cwd: string = process.cwd()): string {\n return path.join(cwd, PROJECT_CONFIG_DIR);\n}\n","/**\n * CLI API Client\n *\n * Makes requests to ForPrompt backend\n */\n\n// Default production URL - will be configurable\nconst DEFAULT_BASE_URL = \"https://wooden-fox-811.convex.site\";\n\nexport interface DeployResponse {\n project: {\n id: string;\n name: string;\n slug: string;\n };\n prompts: PromptData[];\n deployedAt: number;\n}\n\nexport interface PromptData {\n key: string;\n name: string;\n description?: string;\n activeVersion: {\n versionNumber: number;\n systemPrompt: string;\n description?: string;\n updatedAt: number;\n } | null;\n versions: {\n versionNumber: number;\n systemPrompt: string;\n description?: string;\n createdAt: number;\n }[];\n purpose?: string;\n expectedBehavior?: string;\n inputFormat?: string;\n outputFormat?: string;\n constraints?: string;\n useCases?: string;\n additionalNotes?: string;\n toolsNotes?: string;\n tools: {\n name: string;\n description: string;\n parameters: string;\n isRequired: boolean;\n usageNotes?: string;\n }[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface ValidateResponse {\n valid: boolean;\n project?: {\n projectId: string;\n projectName: string;\n projectSlug: string;\n orgId: string;\n orgName?: string;\n };\n}\n\nexport class ApiClient {\n private baseUrl: string;\n\n constructor(baseUrl?: string) {\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n }\n\n /**\n * Validate API key and get project info\n */\n async validateApiKey(apiKey: string): Promise<ValidateResponse> {\n const response = await fetch(`${this.baseUrl}/api/cli/validate`, {\n method: \"GET\",\n headers: {\n \"X-API-Key\": apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" })) as { error?: string };\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n return response.json() as Promise<ValidateResponse>;\n }\n\n /**\n * Deploy - fetch all prompts for a project\n */\n async deploy(apiKey: string): Promise<DeployResponse> {\n const response = await fetch(`${this.baseUrl}/api/cli/deploy`, {\n method: \"GET\",\n headers: {\n \"X-API-Key\": apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" })) as { error?: string };\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n return response.json() as Promise<DeployResponse>;\n }\n}\n\n/**\n * Create API client with default or custom base URL\n */\nexport function createApiClient(baseUrl?: string): ApiClient {\n return new ApiClient(baseUrl);\n}\n","/**\n * Prompt File Generator\n *\n * Generates the forprompt/ folder structure with prompts\n *\n * Structure:\n * forprompt/\n * โโโ .forpromptrc # Project config\n * โโโ index.ts # Main export file\n * โโโ userContextPrompt/\n * โ โโโ prompt.ts # Exported prompt constant\n * โ โโโ metadata.json # Version info, timestamps\n * โ โโโ versions/\n * โ โโโ v1.md # Historical versions\n * โ โโโ v2.md\n * โโโ chatDefaultPrompt/\n * โโโ prompt.ts\n * โโโ metadata.json\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { PromptData } from \"./api\";\n\n/**\n * Generate the forprompt folder structure\n */\nexport function generatePromptFiles(\n prompts: PromptData[],\n outputDir: string\n): { created: number; updated: number } {\n let created = 0;\n let updated = 0;\n\n // Ensure output directory exists\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate files for each prompt\n for (const prompt of prompts) {\n const promptDir = path.join(outputDir, prompt.key);\n const versionsDir = path.join(promptDir, \"versions\");\n\n // Create directories\n if (!fs.existsSync(promptDir)) {\n fs.mkdirSync(promptDir, { recursive: true });\n created++;\n } else {\n updated++;\n }\n\n if (!fs.existsSync(versionsDir)) {\n fs.mkdirSync(versionsDir, { recursive: true });\n }\n\n // Generate prompt.ts\n generatePromptFile(prompt, promptDir);\n\n // Generate metadata.json\n generateMetadataFile(prompt, promptDir);\n\n // Generate version history files\n generateVersionFiles(prompt, versionsDir);\n }\n\n // Generate index.ts that exports all prompts\n generateIndexFile(prompts, outputDir);\n\n return { created, updated };\n}\n\n/**\n * Generate prompt.ts file\n */\nfunction generatePromptFile(prompt: PromptData, promptDir: string): void {\n const activeVersion = prompt.activeVersion;\n if (!activeVersion) return;\n\n const content = `/**\n * ${prompt.name}\n * ${prompt.description || \"\"}\n *\n * Version: ${activeVersion.versionNumber}\n * Last updated: ${new Date(activeVersion.updatedAt).toISOString()}\n *\n * @generated by ForPrompt CLI - Do not edit manually\n */\n\nexport const ${prompt.key} = ${JSON.stringify(activeVersion.systemPrompt)};\n\nexport const ${prompt.key}Info = {\n key: \"${prompt.key}\",\n name: \"${prompt.name}\",\n version: ${activeVersion.versionNumber},\n updatedAt: ${activeVersion.updatedAt},\n} as const;\n\nexport default ${prompt.key};\n`;\n\n fs.writeFileSync(path.join(promptDir, \"prompt.ts\"), content);\n}\n\n/**\n * Generate metadata.json file\n */\nfunction generateMetadataFile(prompt: PromptData, promptDir: string): void {\n const metadata = {\n key: prompt.key,\n name: prompt.name,\n description: prompt.description,\n activeVersion: prompt.activeVersion?.versionNumber || null,\n totalVersions: prompt.versions.length,\n purpose: prompt.purpose,\n expectedBehavior: prompt.expectedBehavior,\n inputFormat: prompt.inputFormat,\n outputFormat: prompt.outputFormat,\n constraints: prompt.constraints,\n useCases: prompt.useCases,\n additionalNotes: prompt.additionalNotes,\n toolsNotes: prompt.toolsNotes,\n tools: prompt.tools,\n createdAt: prompt.createdAt,\n updatedAt: prompt.updatedAt,\n lastDeployedAt: Date.now(),\n };\n\n fs.writeFileSync(\n path.join(promptDir, \"metadata.json\"),\n JSON.stringify(metadata, null, 2)\n );\n}\n\n/**\n * Generate version history files\n */\nfunction generateVersionFiles(prompt: PromptData, versionsDir: string): void {\n for (const version of prompt.versions) {\n const filename = `v${version.versionNumber}.md`;\n const content = `# Version ${version.versionNumber}\n# Created: ${new Date(version.createdAt).toISOString()}\n${version.description ? `# ${version.description}\\n` : \"\"}\n${version.systemPrompt}`;\n\n fs.writeFileSync(path.join(versionsDir, filename), content);\n }\n}\n\n/**\n * Generate index.ts that exports all prompts\n */\nfunction generateIndexFile(prompts: PromptData[], outputDir: string): void {\n const exports = prompts\n .filter((p) => p.activeVersion)\n .map((p) => `export { ${p.key}, ${p.key}Info } from \"./${p.key}/prompt\";`)\n .join(\"\\n\");\n\n const promptMap = prompts\n .filter((p) => p.activeVersion)\n .map((p) => ` \"${p.key}\": ${p.key},`)\n .join(\"\\n\");\n\n const imports = prompts\n .filter((p) => p.activeVersion)\n .map((p) => p.key)\n .join(\", \");\n\n const content = `/**\n * ForPrompt - Auto-generated prompt exports\n *\n * @generated by ForPrompt CLI - Do not edit manually\n * Generated at: ${new Date().toISOString()}\n */\n\n${exports}\n\nimport { ${imports} } from \"./\";\n\n/**\n * All prompts as a map for dynamic access\n */\nexport const prompts = {\n${promptMap}\n} as const;\n\n/**\n * Get a prompt by key\n */\nexport function getPrompt(key: keyof typeof prompts): string {\n return prompts[key];\n}\n\nexport type PromptKey = keyof typeof prompts;\n`;\n\n fs.writeFileSync(path.join(outputDir, \"index.ts\"), content);\n}\n\n/**\n * Clean up removed prompts (prompts that exist locally but not in the server)\n */\nexport function cleanupRemovedPrompts(\n serverPrompts: PromptData[],\n outputDir: string\n): string[] {\n const removed: string[] = [];\n const serverKeys = new Set(serverPrompts.map((p) => p.key));\n\n if (!fs.existsSync(outputDir)) return removed;\n\n const entries = fs.readdirSync(outputDir, { withFileTypes: true });\n\n for (const entry of entries) {\n // Skip non-directories and special files\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith(\".\")) continue;\n\n if (!serverKeys.has(entry.name)) {\n const promptDir = path.join(outputDir, entry.name);\n fs.rmSync(promptDir, { recursive: true, force: true });\n removed.push(entry.name);\n }\n }\n\n return removed;\n}\n","/**\n * Deploy Command\n *\n * Fetch all prompts and generate local files\n * Usage: npx forprompt deploy\n */\n\nimport {\n loadProjectConfig,\n getApiKey,\n getForpromptDir,\n saveProjectConfig,\n isProjectInitialized,\n} from \"../utils/config\";\nimport { createApiClient } from \"../utils/api\";\nimport { generatePromptFiles, cleanupRemovedPrompts } from \"../utils/generator\";\n\n/**\n * Deploy command handler\n */\nexport async function deployCommand(options: {\n clean?: boolean;\n baseUrl?: string;\n}): Promise<void> {\n console.log(\"\\n๐ฆ Deploying prompts...\\n\");\n\n // Check if project is initialized\n if (!isProjectInitialized()) {\n console.error(\"โ Project not initialized. Run 'npx forprompt init' first.\");\n process.exit(1);\n }\n\n const projectConfig = loadProjectConfig()!;\n const apiKey = getApiKey()!;\n const outputDir = getForpromptDir();\n\n console.log(`๐ Project: ${projectConfig.projectName}`);\n console.log(`๐ Output: ${outputDir}\\n`);\n\n // Fetch prompts from server\n const baseUrl = options.baseUrl || projectConfig.baseUrl || process.env.FORPROMPT_BASE_URL;\n const api = createApiClient(baseUrl);\n\n try {\n console.log(\"๐ Fetching prompts from server...\");\n const deployResult = await api.deploy(apiKey);\n\n const { prompts, project, deployedAt } = deployResult;\n\n if (prompts.length === 0) {\n console.log(\"\\nโ ๏ธ No prompts found in project.\");\n console.log(\" Create prompts in the ForPrompt dashboard first.\");\n return;\n }\n\n console.log(` Found ${prompts.length} prompt(s)\\n`);\n\n // Clean up removed prompts if requested\n if (options.clean) {\n console.log(\"๐งน Cleaning up removed prompts...\");\n const removed = cleanupRemovedPrompts(prompts, outputDir);\n if (removed.length > 0) {\n console.log(` Removed: ${removed.join(\", \")}`);\n }\n }\n\n // Generate prompt files\n console.log(\"๐ Generating prompt files...\");\n const { created, updated } = generatePromptFiles(prompts, outputDir);\n\n // Update project config with deploy timestamp\n saveProjectConfig({\n ...projectConfig,\n apiKey,\n lastDeployedAt: deployedAt,\n });\n\n // Summary\n console.log(\"\\nโจ Deploy complete!\\n\");\n console.log(\"Summary:\");\n console.log(` โข ${prompts.length} prompt(s) synced`);\n if (created > 0) console.log(` โข ${created} new prompt(s) created`);\n if (updated > 0) console.log(` โข ${updated} prompt(s) updated`);\n\n // List prompts\n console.log(\"\\nPrompts:\");\n for (const prompt of prompts) {\n const version = prompt.activeVersion?.versionNumber || \"no active version\";\n console.log(` โข ${prompt.key} (v${version})`);\n }\n\n console.log(\"\\nUsage:\");\n console.log(' import { getPrompt } from \"./forprompt\";');\n console.log(' const prompt = getPrompt(\"userContextPrompt\");');\n console.log(\"\\n // Or import directly:\");\n console.log(' import { userContextPrompt } from \"./forprompt\";');\n console.log(\"\");\n } catch (error) {\n console.error(\n \"โ Deploy failed:\",\n error instanceof Error ? error.message : \"Unknown error\"\n );\n process.exit(1);\n }\n}\n","/**\n * MCP CLI Commands\n *\n * Commands for managing the ForPrompt MCP server.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as readline from \"readline\";\nimport { startMcpServer } from \"../../mcp/server.js\";\nimport {\n generateConfig,\n getSupportedEditors,\n editorConfigs,\n type SupportedEditor,\n} from \"../../mcp/config/generators.js\";\nimport { getApiKey as getApiKeyFromConfig, saveApiKeyToEnv } from \"../utils/config.js\";\n\nexport interface McpCommandOptions {\n subcommand?: string;\n editor?: string;\n all?: boolean;\n transport?: string;\n port?: number;\n}\n\n/**\n * Prompt user for input\n */\nasync function promptUser(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Get API key from environment or config\n */\nfunction getApiKey(): string | undefined {\n return getApiKeyFromConfig() || undefined;\n}\n\n/**\n * Start the MCP server\n */\nasync function startCommand(options: McpCommandOptions): Promise<void> {\n console.log(\"Starting ForPrompt MCP server...\");\n\n const apiKey = getApiKey();\n\n if (!apiKey) {\n console.error(\n \"\\nError: No API key found. Please run 'npx forprompt init' first or set FORPROMPT_API_KEY environment variable.\\n\"\n );\n process.exit(1);\n }\n\n try {\n // Start the server (stdio transport)\n await startMcpServer({\n apiKey,\n baseUrl: process.env.FORPROMPT_BASE_URL,\n });\n } catch (error) {\n console.error(\"Failed to start MCP server:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Generate configuration for editors\n */\nasync function configCommand(options: McpCommandOptions): Promise<void> {\n const apiKey = getApiKey();\n\n if (!apiKey) {\n console.log(\"\\nNo API key found. Let me help you set one up.\\n\");\n\n const inputKey = await promptUser(\"Enter your ForPrompt API key: \");\n if (!inputKey) {\n console.error(\"Error: API key is required.\");\n process.exit(1);\n }\n\n // Save to .env file\n saveApiKeyToEnv(inputKey);\n console.log(`\\nโ API key saved to .env\\n`);\n\n process.env.FORPROMPT_API_KEY = inputKey;\n return configCommand({ ...options });\n }\n\n const baseUrl = process.env.FORPROMPT_BASE_URL;\n\n // Generate for all editors\n if (options.all) {\n console.log(\"\\nGenerating MCP configurations for all supported editors:\\n\");\n\n for (const editor of getSupportedEditors()) {\n try {\n const { config, path: configPath, instructions } = generateConfig(\n editor,\n apiKey,\n baseUrl\n );\n\n console.log(`\\n## ${editorConfigs[editor].name}`);\n console.log(`Config file: ${configPath}`);\n console.log(\"\\n```json\");\n console.log(config);\n console.log(\"```\");\n console.log(instructions);\n } catch (error) {\n console.error(`Error generating config for ${editor}:`, error);\n }\n }\n\n return;\n }\n\n // Generate for specific editor\n const editor = options.editor as SupportedEditor;\n\n if (!editor) {\n console.log(\"\\nForPrompt MCP Configuration Generator\\n\");\n console.log(\"Supported editors:\");\n\n for (const [key, config] of Object.entries(editorConfigs)) {\n console.log(` - ${key}: ${config.description}`);\n }\n\n console.log(\"\\nUsage:\");\n console.log(\" npx forprompt mcp config --editor=claude-desktop\");\n console.log(\" npx forprompt mcp config --editor=cursor\");\n console.log(\" npx forprompt mcp config --all\");\n return;\n }\n\n if (!getSupportedEditors().includes(editor)) {\n console.error(\n `\\nError: Unknown editor \"${editor}\". Supported editors: ${getSupportedEditors().join(\", \")}\\n`\n );\n process.exit(1);\n }\n\n try {\n const { config, path: configPath, instructions } = generateConfig(\n editor,\n apiKey,\n baseUrl\n );\n\n console.log(`\\n# ${editorConfigs[editor].name} MCP Configuration\\n`);\n console.log(`Config file: ${configPath}\\n`);\n console.log(\"Add this to your configuration file:\\n\");\n console.log(\"```json\");\n console.log(config);\n console.log(\"```\");\n console.log(instructions);\n\n // Offer to write the config\n const shouldWrite = await promptUser(\n \"\\nWould you like to write this config file? (y/N): \"\n );\n\n if (shouldWrite.toLowerCase() === \"y\") {\n const configDir = path.dirname(configPath);\n\n // Create directory if it doesn't exist\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Check if file exists\n if (fs.existsSync(configPath)) {\n const overwrite = await promptUser(\n `\\nFile ${configPath} already exists. Overwrite? (y/N): `\n );\n if (overwrite.toLowerCase() !== \"y\") {\n console.log(\"\\nConfig not written. You can copy the config above manually.\");\n return;\n }\n }\n\n fs.writeFileSync(configPath, config);\n console.log(`\\nโ Config written to ${configPath}`);\n console.log(\n `\\nRemember to restart ${editorConfigs[editor].name} to apply changes.`\n );\n }\n } catch (error) {\n console.error(\"Error generating config:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Show MCP server info\n */\nasync function infoCommand(): Promise<void> {\n console.log(`\nForPrompt MCP Server\n====================\n\nThe ForPrompt MCP server exposes your prompts to AI assistants like\nClaude Desktop, Cursor, Continue.dev, and other MCP-compatible tools.\n\nSetup & Integration Tools:\n - forprompt_detect_project Detect project type, language, package manager\n - forprompt_setup_project Get install command for ForPrompt SDK\n - forprompt_generate_config Generate .forprompt config file\n - forprompt_generate_example Generate code examples for your language\n - forprompt_integration_guide Get framework-specific integration guide\n\nRead Tools:\n - forprompt_get_prompt Fetch a prompt by its key\n - forprompt_list_prompts List all available prompts\n - forprompt_search_prompts Search prompts by text\n - forprompt_get_prompt_metadata Get prompt metadata only\n - forprompt_get_system_prompt Get raw system prompt text\n\nWrite Tools:\n - forprompt_create_prompt Create a new prompt\n - forprompt_update_prompt Update prompt metadata\n - forprompt_create_version Create a new version (update prompt text)\n - forprompt_delete_prompt Delete a prompt\n\nAvailable Resources:\n - forprompt://prompts List all prompts\n - forprompt://prompts/{key} Get a specific prompt\n - forprompt://prompts/{key}/v{n} Get a specific version\n - forprompt://prompts/{key}/metadata Get metadata only\n\nQuick Start:\n 1. Run: npx forprompt mcp config --editor=claude-desktop\n 2. Restart Claude Desktop\n 3. Ask Claude: \"Integrate ForPrompt into my project\"\n 4. Or: \"List my ForPrompt prompts\"\n 5. Or: \"Create a new prompt called customer_support\"\n\nExample Conversations:\n \"Integrate ForPrompt into this project\"\n \"Show me how to use ForPrompt with Next.js\"\n \"Create a prompt for customer support with key customer_support_v1\"\n \"Update the system prompt for my chatbot\"\n\nEnvironment Variables:\n FORPROMPT_API_KEY Your project API key (required)\n FORPROMPT_BASE_URL Custom API URL (optional)\n\nFor more information, visit: https://forprompt.dev/docs/mcp\n`);\n}\n\n/**\n * Main MCP command handler\n */\nexport async function mcpCommand(options: McpCommandOptions): Promise<void> {\n const subcommand = options.subcommand || \"help\";\n\n switch (subcommand) {\n case \"start\":\n await startCommand(options);\n break;\n\n case \"config\":\n await configCommand(options);\n break;\n\n case \"info\":\n await infoCommand();\n break;\n\n case \"help\":\n default:\n console.log(`\nForPrompt MCP Commands\n======================\n\nUsage:\n npx forprompt mcp <command> [options]\n\nCommands:\n start Start the MCP server (stdio transport)\n config Generate configuration for AI editors\n info Show MCP server information\n\nConfig Options:\n --editor=<name> Generate config for specific editor\n Options: claude-code, claude-desktop, cursor, continue, windsurf, vscode\n --all Generate configs for all supported editors\n\nExamples:\n npx forprompt mcp start\n npx forprompt mcp config --editor=claude-code\n npx forprompt mcp config --editor=claude-desktop\n npx forprompt mcp config --editor=cursor\n npx forprompt mcp config --all\n npx forprompt mcp info\n\nFor detailed documentation, visit: https://forprompt.dev/docs/mcp\n`);\n }\n}\n","#!/usr/bin/env node\n/**\n * ForPrompt MCP Server\n *\n * Model Context Protocol server that exposes ForPrompt prompts as\n * resources and tools for AI assistants like Claude, Cursor, and Continue.\n *\n * Usage:\n * npx forprompt mcp start\n * FORPROMPT_API_KEY=fp_xxx npx forprompt-mcp\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createForPrompt, ForPrompt } from \"../client.js\";\nimport { registerTools } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface ForPromptMcpServerConfig {\n apiKey?: string;\n baseUrl?: string;\n}\n\nexport class ForPromptMcpServer {\n private mcpServer: McpServer;\n private forprompt: ForPrompt;\n private config: ForPromptMcpServerConfig;\n\n constructor(config: ForPromptMcpServerConfig = {}) {\n this.config = config;\n\n // Create ForPrompt client (auto-loads from env if not provided)\n this.forprompt = createForPrompt({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n\n // Create MCP server\n this.mcpServer = new McpServer({\n name: \"forprompt\",\n version: VERSION,\n });\n\n // Register capabilities\n this.registerCapabilities();\n }\n\n private registerCapabilities(): void {\n // Register tools (CRUD operations for prompts)\n registerTools(this.mcpServer, this.forprompt, this.config);\n\n // Register resources (prompts as readable content)\n registerResources(this.mcpServer, this.forprompt, this.config);\n }\n\n /**\n * Start the MCP server with stdio transport\n */\n async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.mcpServer.connect(transport);\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): McpServer {\n return this.mcpServer;\n }\n}\n\n/**\n * Create and start an MCP server\n */\nexport async function startMcpServer(\n config: ForPromptMcpServerConfig = {}\n): Promise<ForPromptMcpServer> {\n const server = new ForPromptMcpServer(config);\n await server.start();\n return server;\n}\n\n// Run server if executed directly\n// Check if this file is being run directly as the main module\nfunction isMainModule(): boolean {\n const arg1 = process.argv[1] || \"\";\n return (\n arg1.endsWith(\"forprompt-mcp\") ||\n arg1.endsWith(\"server.js\") ||\n arg1.includes(\"mcp/server\")\n );\n}\n\nif (isMainModule()) {\n startMcpServer().catch((error) => {\n console.error(\"Failed to start MCP server:\", error);\n process.exit(1);\n });\n}\n","/**\n * ForPrompt SDK Types\n */\n\nexport interface ForPromptConfig {\n /** API key from ForPrompt dashboard (required) */\n apiKey: string;\n /** Custom base URL (optional, defaults to https://wooden-fox-811.convex.site) */\n baseUrl?: string;\n}\n\nexport interface Prompt {\n /** Unique key identifier for the prompt */\n key: string;\n /** Display name of the prompt */\n name: string;\n /** Optional description */\n description?: string;\n /** Version number */\n versionNumber: number;\n /** The system prompt content */\n systemPrompt: string;\n /** Last update timestamp */\n updatedAt: number;\n /** Prompt information fields */\n purpose?: string;\n expectedBehavior?: string;\n inputFormat?: string;\n outputFormat?: string;\n constraints?: string;\n useCases?: string;\n additionalNotes?: string;\n toolsNotes?: string;\n}\n\nexport interface Tool {\n /** Tool ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** JSON schema of parameters */\n parameters: string;\n /** Tool category */\n category?: string;\n /** Example usage */\n exampleUsage?: string;\n}\n\nexport interface PromptTool {\n /** Tool reference */\n tool: Tool;\n /** Whether the tool is required */\n isRequired: boolean;\n /** Usage notes for this prompt */\n usageNotes?: string;\n}\n\nexport interface GetPromptOptions {\n /** Specific version number to fetch (optional, defaults to active version) */\n version?: number;\n}\n\nexport class ForPromptError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public code: string\n ) {\n super(message);\n this.name = \"ForPromptError\";\n }\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n // Connection\n baseUrl: string;\n projectId: string;\n apiKey: string;\n\n // Webhook settings\n webhookPort?: number; // Default: 3847\n webhookPath?: string; // Default: \"/forprompt-webhook\"\n\n // Polling fallback\n pollingInterval?: number; // Default: 60000 (1 minute)\n enablePolling?: boolean; // Default: true\n\n // Output settings\n outputDir: string; // e.g., \"./prompts\"\n format: \"typescript\" | \"json\" | \"yaml\" | \"all\";\n\n // Callbacks\n onSync?: (prompts: Prompt[]) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Webhook event payload\n */\nexport interface WebhookEvent {\n event: string;\n timestamp: number;\n projectId: string;\n data: {\n promptId?: string;\n promptKey?: string;\n versionNumber?: number;\n systemPrompt?: string;\n [key: string]: any;\n };\n}\n\n/**\n * Sync response from API\n */\nexport interface SyncResponse {\n projectId: string;\n syncedAt: number;\n prompts: Prompt[];\n}\n","/**\n * ForPrompt Client\n *\n * Simple usage with auto-configuration:\n * @example\n * ```typescript\n * import { forprompt } from \"@forprompt/sdk\";\n *\n * // Auto-loads from FORPROMPT_API_KEY env variable\n * const prompt = await forprompt.getPrompt(\"userContextPrompt\");\n * ```\n */\n\nimport type { ForPromptConfig, Prompt, GetPromptOptions } from \"./types\";\nimport { ForPromptError } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://wooden-fox-811.convex.site\";\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\nconst DEFAULT_RETRIES = 3;\n\n/**\n * Extended client configuration with security options\n */\nexport interface ForPromptClientConfig {\n /** Project API key (required) */\n apiKey: string;\n /** Base URL for API (default: https://wooden-fox-811.convex.site) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Number of retry attempts for failed requests (default: 3) */\n retries?: number;\n}\n\n/**\n * Calculate exponential backoff delay with jitter\n */\nfunction getBackoffDelay(attempt: number): number {\n const baseDelay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, ...\n const jitter = Math.random() * 500; // 0-500ms random jitter\n return Math.min(baseDelay + jitter, 30_000); // Max 30s\n}\n\nexport class ForPrompt {\n private baseUrl: string;\n private apiKey: string;\n private timeout: number;\n private retries: number;\n\n constructor(config: ForPromptClientConfig | ForPromptConfig | { apiKey: string; baseUrl?: string }) {\n this.apiKey = config.apiKey || \"\";\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = (config as ForPromptClientConfig).timeout ?? DEFAULT_TIMEOUT;\n this.retries = (config as ForPromptClientConfig).retries ?? DEFAULT_RETRIES;\n }\n\n /**\n * Fetch with timeout support using AbortController\n */\n private async fetchWithTimeout(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ForPromptError(\n `Request timeout after ${this.timeout}ms`,\n 408,\n \"TIMEOUT\"\n );\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Fetch with retry and exponential backoff\n */\n private async fetchWithRetry(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.retries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, options);\n\n // Don't retry client errors (4xx) - they won't succeed on retry\n if (response.status >= 400 && response.status < 500) {\n return response;\n }\n\n // Success\n if (response.ok) {\n return response;\n }\n\n // Server error (5xx) - will retry\n lastError = new ForPromptError(\n `Server error: ${response.status}`,\n response.status,\n \"SERVER_ERROR\"\n );\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry timeout errors\n if (error instanceof ForPromptError && error.code === \"TIMEOUT\") {\n throw error;\n }\n }\n\n // Wait before retrying (unless this is the last attempt)\n if (attempt < this.retries - 1) {\n const delay = getBackoffDelay(attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError || new ForPromptError(\n \"Request failed after retries\",\n 500,\n \"RETRY_EXHAUSTED\"\n );\n }\n\n /**\n * Get a prompt by its key\n *\n * @example\n * ```typescript\n * const prompt = await forprompt.getPrompt(\"userContextPrompt\");\n * console.log(prompt.systemPrompt);\n * ```\n *\n * @example With specific version\n * ```typescript\n * const prompt = await forprompt.getPrompt(\"userContextPrompt\", { version: 2 });\n * ```\n */\n async getPrompt(key: string, options?: GetPromptOptions): Promise<Prompt> {\n if (!this.apiKey) {\n throw new ForPromptError(\n \"API key is required. Set FORPROMPT_API_KEY environment variable or pass apiKey in config.\",\n 401,\n \"MISSING_API_KEY\"\n );\n }\n\n // Input validation\n if (!key || typeof key !== \"string\") {\n throw new ForPromptError(\n \"Prompt key must be a non-empty string\",\n 400,\n \"INVALID_INPUT\"\n );\n }\n\n if (key.length > 256) {\n throw new ForPromptError(\n \"Prompt key must be 256 characters or less\",\n 400,\n \"INVALID_INPUT\"\n );\n }\n\n if (options?.version !== undefined) {\n if (!Number.isInteger(options.version) || options.version < 1) {\n throw new ForPromptError(\n \"Version must be a positive integer\",\n 400,\n \"INVALID_INPUT\"\n );\n }\n }\n\n const url = new URL(`${this.baseUrl}/api/prompts`);\n url.searchParams.set(\"key\", key);\n\n if (options?.version !== undefined) {\n url.searchParams.set(\"version\", String(options.version));\n }\n\n const response = await this.fetchWithRetry(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({ error: \"Unknown error\" }))) as { error?: string };\n throw new ForPromptError(\n errorData.error || `Failed to fetch prompt: ${key}`,\n response.status,\n response.status === 404 ? \"PROMPT_NOT_FOUND\" : \"API_ERROR\"\n );\n }\n\n return response.json() as Promise<Prompt>;\n }\n\n /**\n * Get multiple prompts by their keys\n *\n * Requests are made in parallel with concurrency limit to avoid overwhelming the server.\n *\n * @example\n * ```typescript\n * const prompts = await forprompt.getPrompts([\"userContext\", \"chatDefault\"]);\n * ```\n */\n async getPrompts(\n keys: string[],\n options?: GetPromptOptions\n ): Promise<Map<string, Prompt>> {\n // Limit concurrent requests to avoid overwhelming the server\n const CONCURRENCY_LIMIT = 5;\n const promptMap = new Map<string, Prompt>();\n\n // Process in batches\n for (let i = 0; i < keys.length; i += CONCURRENCY_LIMIT) {\n const batch = keys.slice(i, i + CONCURRENCY_LIMIT);\n\n const results = await Promise.allSettled(\n batch.map((key) => this.getPrompt(key, options))\n );\n\n results.forEach((result, index) => {\n if (result.status === \"fulfilled\") {\n promptMap.set(batch[index]!, result.value);\n }\n });\n }\n\n return promptMap;\n }\n}\n\n/**\n * Create a ForPrompt client instance\n *\n * @example With explicit config\n * ```typescript\n * import { createForPrompt } from \"@forprompt/sdk\";\n *\n * const client = createForPrompt({\n * apiKey: \"fp_xxx\",\n * });\n *\n * const prompt = await client.getPrompt(\"userContextPrompt\");\n * ```\n *\n * @example With timeout and retry config\n * ```typescript\n * const client = createForPrompt({\n * apiKey: \"fp_xxx\",\n * timeout: 10000, // 10 seconds\n * retries: 5,\n * });\n * ```\n *\n * @example Auto-config from environment\n * ```typescript\n * import { forprompt } from \"@forprompt/sdk\";\n *\n * // Uses FORPROMPT_API_KEY from environment\n * const prompt = await forprompt.getPrompt(\"userContextPrompt\");\n * ```\n */\nexport function createForPrompt(config?: Partial<ForPromptClientConfig>): ForPrompt {\n const apiKey = config?.apiKey || process.env.FORPROMPT_API_KEY || \"\";\n const baseUrl = config?.baseUrl || process.env.FORPROMPT_BASE_URL;\n\n return new ForPrompt({\n apiKey,\n baseUrl,\n timeout: config?.timeout,\n retries: config?.retries,\n });\n}\n\n/**\n * Default ForPrompt client instance\n *\n * Auto-configured from environment variables:\n * - FORPROMPT_API_KEY: Your project API key\n * - FORPROMPT_BASE_URL: Custom base URL (optional)\n *\n * @example\n * ```typescript\n * import { forprompt } from \"@forprompt/sdk\";\n *\n * const prompt = await forprompt.getPrompt(\"userContextPrompt\");\n * console.log(prompt.systemPrompt);\n * ```\n */\nexport const forprompt = createForPrompt();\n","/**\n * MCP Tool Handlers\n *\n * Exposes ForPrompt operations as MCP tools that AI assistants can execute.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { ForPrompt } from \"../client.js\";\nimport type { ForPromptMcpServerConfig } from \"./server.js\";\nimport type { Prompt, SyncResponse } from \"../types.js\";\n\nconst DEFAULT_BASE_URL = \"https://wooden-fox-811.convex.site\";\n\n/**\n * Get API config from config object or environment\n */\nfunction getApiConfig(config: ForPromptMcpServerConfig): {\n apiKey: string;\n baseUrl: string;\n} {\n const apiKey = config.apiKey || process.env.FORPROMPT_API_KEY;\n const baseUrl = (\n config.baseUrl ||\n process.env.FORPROMPT_BASE_URL ||\n DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n if (!apiKey) {\n throw new Error(\n \"API key is required. Set FORPROMPT_API_KEY environment variable.\"\n );\n }\n\n return { apiKey, baseUrl };\n}\n\n/**\n * Fetch all prompts using the sync endpoint\n */\nasync function fetchAllPrompts(\n config: ForPromptMcpServerConfig\n): Promise<Prompt[]> {\n const { apiKey, baseUrl } = getApiConfig(config);\n\n const response = await fetch(`${baseUrl}/api/sync`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || `Failed to fetch prompts`);\n }\n\n const data = (await response.json()) as SyncResponse;\n return data.prompts;\n}\n\n/**\n * Create a new prompt\n */\nasync function createPrompt(\n config: ForPromptMcpServerConfig,\n data: {\n key: string;\n name: string;\n description?: string;\n systemPrompt?: string;\n }\n): Promise<{ promptId: string; versionId?: string; versionNumber?: number }> {\n const { apiKey, baseUrl } = getApiConfig(config);\n\n const response = await fetch(`${baseUrl}/api/prompts`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || \"Failed to create prompt\");\n }\n\n return response.json() as Promise<{\n promptId: string;\n versionId?: string;\n versionNumber?: number;\n }>;\n}\n\n/**\n * Update a prompt\n */\nasync function updatePrompt(\n config: ForPromptMcpServerConfig,\n data: {\n key: string;\n name?: string;\n description?: string;\n purpose?: string;\n expectedBehavior?: string;\n inputFormat?: string;\n outputFormat?: string;\n constraints?: string;\n useCases?: string;\n additionalNotes?: string;\n toolsNotes?: string;\n }\n): Promise<{ promptId: string }> {\n const { apiKey, baseUrl } = getApiConfig(config);\n\n const response = await fetch(`${baseUrl}/api/prompts`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || \"Failed to update prompt\");\n }\n\n return response.json() as Promise<{ promptId: string }>;\n}\n\n/**\n * Create a new version for a prompt\n */\nasync function createVersionApi(\n config: ForPromptMcpServerConfig,\n data: {\n key: string;\n systemPrompt: string;\n description?: string;\n setAsActive?: boolean;\n }\n): Promise<{ versionId: string; versionNumber: number }> {\n const { apiKey, baseUrl } = getApiConfig(config);\n\n const response = await fetch(`${baseUrl}/api/prompts/versions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || \"Failed to create version\");\n }\n\n return response.json() as Promise<{ versionId: string; versionNumber: number }>;\n}\n\n/**\n * Delete a prompt\n */\nasync function deletePromptApi(\n config: ForPromptMcpServerConfig,\n key: string\n): Promise<{ success: boolean }> {\n const { apiKey, baseUrl } = getApiConfig(config);\n\n const response = await fetch(`${baseUrl}/api/prompts?key=${encodeURIComponent(key)}`, {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || \"Failed to delete prompt\");\n }\n\n return response.json() as Promise<{ success: boolean }>;\n}\n\n/**\n * Format a prompt for display\n */\nfunction formatPrompt(prompt: Prompt): string {\n const sections: string[] = [];\n\n sections.push(`# ${prompt.name}`);\n sections.push(`**Key:** ${prompt.key}`);\n sections.push(`**Version:** ${prompt.versionNumber}`);\n\n if (prompt.description) {\n sections.push(`**Description:** ${prompt.description}`);\n }\n\n sections.push(\"\");\n sections.push(\"## System Prompt\");\n sections.push(\"```\");\n sections.push(prompt.systemPrompt);\n sections.push(\"```\");\n\n if (prompt.purpose) {\n sections.push(\"\");\n sections.push(\"## Purpose\");\n sections.push(prompt.purpose);\n }\n\n if (prompt.expectedBehavior) {\n sections.push(\"\");\n sections.push(\"## Expected Behavior\");\n sections.push(prompt.expectedBehavior);\n }\n\n if (prompt.inputFormat) {\n sections.push(\"\");\n sections.push(\"## Input Format\");\n sections.push(prompt.inputFormat);\n }\n\n if (prompt.outputFormat) {\n sections.push(\"\");\n sections.push(\"## Output Format\");\n sections.push(prompt.outputFormat);\n }\n\n if (prompt.constraints) {\n sections.push(\"\");\n sections.push(\"## Constraints\");\n sections.push(prompt.constraints);\n }\n\n if (prompt.useCases) {\n sections.push(\"\");\n sections.push(\"## Use Cases\");\n sections.push(prompt.useCases);\n }\n\n if (prompt.additionalNotes) {\n sections.push(\"\");\n sections.push(\"## Additional Notes\");\n sections.push(prompt.additionalNotes);\n }\n\n if (prompt.toolsNotes) {\n sections.push(\"\");\n sections.push(\"## Tools Notes\");\n sections.push(prompt.toolsNotes);\n }\n\n return sections.join(\"\\n\");\n}\n\n// Define input schemas\nconst GetPromptInputSchema = z.object({\n key: z.string().describe(\"The unique key identifier for the prompt\"),\n version: z\n .number()\n .optional()\n .describe(\n \"Specific version number to fetch (optional, defaults to active version)\"\n ),\n});\n\nconst ListPromptsInputSchema = z.object({\n search: z\n .string()\n .optional()\n .describe(\"Optional search term to filter prompts by name or key\"),\n});\n\nconst SearchPromptsInputSchema = z.object({\n query: z.string().describe(\"Search query to find matching prompts\"),\n});\n\nconst GetMetadataInputSchema = z.object({\n key: z.string().describe(\"The unique key identifier for the prompt\"),\n});\n\nconst GetSystemPromptInputSchema = z.object({\n key: z.string().describe(\"The unique key identifier for the prompt\"),\n version: z.number().optional().describe(\"Specific version number (optional)\"),\n});\n\n// Write operation schemas\nconst CreatePromptInputSchema = z.object({\n key: z\n .string()\n .describe(\n \"Unique key identifier for the prompt (lowercase, no spaces, use underscores)\"\n ),\n name: z.string().describe(\"Human-readable name for the prompt\"),\n description: z.string().optional().describe(\"Description of what the prompt does\"),\n systemPrompt: z\n .string()\n .optional()\n .describe(\"Initial system prompt content (optional, can be added later)\"),\n});\n\nconst UpdatePromptInputSchema = z.object({\n key: z.string().describe(\"The unique key identifier for the prompt to update\"),\n name: z.string().optional().describe(\"New name for the prompt\"),\n description: z.string().optional().describe(\"New description\"),\n purpose: z.string().optional().describe(\"The purpose/goal of this prompt\"),\n expectedBehavior: z\n .string()\n .optional()\n .describe(\"Expected behavior when using this prompt\"),\n inputFormat: z.string().optional().describe(\"Expected input format\"),\n outputFormat: z.string().optional().describe(\"Expected output format\"),\n constraints: z.string().optional().describe(\"Constraints and limitations\"),\n useCases: z.string().optional().describe(\"Primary use cases\"),\n additionalNotes: z.string().optional().describe(\"Additional notes\"),\n toolsNotes: z.string().optional().describe(\"Notes about tool usage\"),\n});\n\nconst CreateVersionInputSchema = z.object({\n key: z.string().describe(\"The prompt key to create a new version for\"),\n systemPrompt: z.string().describe(\"The new system prompt content\"),\n description: z\n .string()\n .optional()\n .describe(\"Description of changes in this version\"),\n setAsActive: z\n .boolean()\n .optional()\n .describe(\"Whether to set this as the active version (default: true)\"),\n});\n\nconst DeletePromptInputSchema = z.object({\n key: z.string().describe(\"The unique key identifier for the prompt to delete\"),\n});\n\n// Setup operation schemas\nconst SetupProjectInputSchema = z.object({\n projectPath: z\n .string()\n .describe(\"Absolute path to the project root directory\"),\n language: z\n .enum([\"typescript\", \"javascript\", \"python\"])\n .optional()\n .describe(\"Programming language (auto-detected if not specified)\"),\n packageManager: z\n .enum([\"npm\", \"yarn\", \"pnpm\", \"bun\", \"pip\", \"poetry\", \"uv\"])\n .optional()\n .describe(\"Package manager to use (auto-detected if not specified)\"),\n});\n\nconst GenerateConfigInputSchema = z.object({\n projectPath: z.string().describe(\"Absolute path to the project root directory\"),\n apiKey: z.string().optional().describe(\"API key (will prompt user if not provided)\"),\n baseUrl: z.string().optional().describe(\"Custom API base URL (optional)\"),\n});\n\nconst GenerateExampleInputSchema = z.object({\n language: z\n .enum([\"typescript\", \"javascript\", \"python\"])\n .describe(\"Programming language for the example\"),\n useCase: z\n .enum([\"basic\", \"streaming\", \"with-tools\", \"react-hook\", \"nextjs-api\"])\n .describe(\"Type of example to generate\"),\n promptKey: z\n .string()\n .optional()\n .describe(\"Optional prompt key to use in the example\"),\n});\n\nconst DetectProjectInputSchema = z.object({\n projectPath: z.string().describe(\"Absolute path to the project root directory\"),\n});\n\nconst GetIntegrationGuideInputSchema = z.object({\n framework: z\n .enum([\"nextjs\", \"react\", \"express\", \"fastapi\", \"django\", \"flask\", \"generic\"])\n .describe(\"Framework to get integration guide for\"),\n language: z\n .enum([\"typescript\", \"javascript\", \"python\"])\n .optional()\n .describe(\"Programming language\"),\n});\n\n/**\n * Register all MCP tools\n */\nexport function registerTools(\n server: McpServer,\n client: ForPrompt,\n config: ForPromptMcpServerConfig\n): void {\n // Tool: Get a single prompt by key\n server.registerTool(\n \"forprompt_get_prompt\",\n {\n description:\n \"Fetch a prompt by its key from ForPrompt. Returns the system prompt content and metadata including purpose, expected behavior, constraints, and more.\",\n inputSchema: GetPromptInputSchema,\n },\n async ({ key, version }) => {\n try {\n const prompt = await client.getPrompt(key, { version });\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatPrompt(prompt),\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error fetching prompt \"${key}\": ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: List all prompts\n server.registerTool(\n \"forprompt_list_prompts\",\n {\n description:\n \"List all available prompts in your ForPrompt project. Returns a summary of each prompt including key, name, description, and version.\",\n inputSchema: ListPromptsInputSchema,\n },\n async ({ search }) => {\n try {\n let prompts = await fetchAllPrompts(config);\n\n // Filter by search term if provided\n if (search) {\n const searchLower = search.toLowerCase();\n prompts = prompts.filter(\n (p) =>\n p.key.toLowerCase().includes(searchLower) ||\n p.name.toLowerCase().includes(searchLower) ||\n p.description?.toLowerCase().includes(searchLower)\n );\n }\n\n if (prompts.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: search\n ? `No prompts found matching \"${search}\"`\n : \"No prompts found in this project\",\n },\n ],\n };\n }\n\n const lines = prompts.map((p) => {\n const desc = p.description ? ` - ${p.description}` : \"\";\n return `- **${p.key}** (v${p.versionNumber}): ${p.name}${desc}`;\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# ForPrompt Prompts\\n\\nFound ${prompts.length} prompt(s):\\n\\n${lines.join(\"\\n\")}`,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error listing prompts: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Search prompts\n server.registerTool(\n \"forprompt_search_prompts\",\n {\n description:\n \"Search prompts by text query. Searches across prompt names, keys, descriptions, purposes, and use cases.\",\n inputSchema: SearchPromptsInputSchema,\n },\n async ({ query }) => {\n try {\n const allPrompts = await fetchAllPrompts(config);\n const queryLower = query.toLowerCase();\n\n const matches = allPrompts.filter((p) => {\n const searchFields = [\n p.key,\n p.name,\n p.description,\n p.purpose,\n p.useCases,\n p.expectedBehavior,\n p.systemPrompt,\n ];\n return searchFields.some(\n (field) => field && field.toLowerCase().includes(queryLower)\n );\n });\n\n if (matches.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No prompts found matching \"${query}\"`,\n },\n ],\n };\n }\n\n const results = matches.map((p) => {\n const sections = [`## ${p.name} (\\`${p.key}\\`)`];\n if (p.description) sections.push(`*${p.description}*`);\n sections.push(`Version: ${p.versionNumber}`);\n if (p.purpose) sections.push(`**Purpose:** ${p.purpose}`);\n return sections.join(\"\\n\");\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Search Results for \"${query}\"\\n\\nFound ${matches.length} matching prompt(s):\\n\\n${results.join(\"\\n\\n---\\n\\n\")}`,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error searching prompts: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Get prompt metadata only\n server.registerTool(\n \"forprompt_get_prompt_metadata\",\n {\n description:\n \"Get metadata for a prompt without the full system prompt content. Useful for understanding what a prompt does before fetching it.\",\n inputSchema: GetMetadataInputSchema,\n },\n async ({ key }) => {\n try {\n const prompt = await client.getPrompt(key);\n const metadata = {\n key: prompt.key,\n name: prompt.name,\n description: prompt.description,\n versionNumber: prompt.versionNumber,\n updatedAt: new Date(prompt.updatedAt).toISOString(),\n purpose: prompt.purpose,\n expectedBehavior: prompt.expectedBehavior,\n inputFormat: prompt.inputFormat,\n outputFormat: prompt.outputFormat,\n constraints: prompt.constraints,\n useCases: prompt.useCases,\n additionalNotes: prompt.additionalNotes,\n toolsNotes: prompt.toolsNotes,\n systemPromptLength: prompt.systemPrompt.length,\n };\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Metadata for \"${prompt.name}\"\\n\\n\\`\\`\\`json\\n${JSON.stringify(metadata, null, 2)}\\n\\`\\`\\``,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error fetching metadata for \"${key}\": ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Get raw system prompt only\n server.registerTool(\n \"forprompt_get_system_prompt\",\n {\n description:\n \"Get only the raw system prompt text without metadata. Useful when you just need the prompt content to use directly.\",\n inputSchema: GetSystemPromptInputSchema,\n },\n async ({ key, version }) => {\n try {\n const prompt = await client.getPrompt(key, { version });\n return {\n content: [\n {\n type: \"text\" as const,\n text: prompt.systemPrompt,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error fetching system prompt for \"${key}\": ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // ==================== WRITE OPERATIONS ====================\n\n // Tool: Create a new prompt\n server.registerTool(\n \"forprompt_create_prompt\",\n {\n description:\n \"Create a new prompt in ForPrompt. You can optionally include an initial system prompt content. The key must be unique, lowercase, and use underscores instead of spaces.\",\n inputSchema: CreatePromptInputSchema,\n },\n async ({ key, name, description, systemPrompt }) => {\n try {\n const result = await createPrompt(config, {\n key,\n name,\n description,\n systemPrompt,\n });\n\n let message = `Successfully created prompt \"${name}\" with key \"${key}\"`;\n if (result.versionNumber) {\n message += ` (v${result.versionNumber})`;\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error creating prompt: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Update a prompt\n server.registerTool(\n \"forprompt_update_prompt\",\n {\n description:\n \"Update an existing prompt's metadata (name, description, purpose, expected behavior, etc.). To update the system prompt content, use forprompt_create_version instead.\",\n inputSchema: UpdatePromptInputSchema,\n },\n async (args) => {\n try {\n await updatePrompt(config, args);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Successfully updated prompt \"${args.key}\"`,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error updating prompt: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create a new version\n server.registerTool(\n \"forprompt_create_version\",\n {\n description:\n \"Create a new version of an existing prompt with updated system prompt content. This is the proper way to update the actual prompt text while maintaining version history.\",\n inputSchema: CreateVersionInputSchema,\n },\n async ({ key, systemPrompt, description, setAsActive }) => {\n try {\n const result = await createVersionApi(config, {\n key,\n systemPrompt,\n description,\n setAsActive,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Successfully created version ${result.versionNumber} for prompt \"${key}\"`,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error creating version: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Delete a prompt\n server.registerTool(\n \"forprompt_delete_prompt\",\n {\n description:\n \"Delete a prompt and all its versions. This action is irreversible. Use with caution.\",\n inputSchema: DeletePromptInputSchema,\n },\n async ({ key }) => {\n try {\n await deletePromptApi(config, key);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Successfully deleted prompt \"${key}\" and all its versions`,\n },\n ],\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error deleting prompt: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // ==================== SETUP & INTEGRATION TOOLS ====================\n\n // Tool: Detect project type\n server.registerTool(\n \"forprompt_detect_project\",\n {\n description:\n \"Detect the project type, language, and package manager in a directory. Use this first before running setup to understand the project structure.\",\n inputSchema: DetectProjectInputSchema,\n },\n async ({ projectPath }) => {\n try {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const detection = {\n language: null as string | null,\n packageManager: null as string | null,\n framework: null as string | null,\n hasForPrompt: false,\n configFiles: [] as string[],\n };\n\n // Check for package.json (Node.js/TypeScript/JavaScript)\n const packageJsonPath = path.join(projectPath, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\n // Detect language\n if (packageJson.devDependencies?.typescript || packageJson.dependencies?.typescript) {\n detection.language = \"typescript\";\n } else {\n detection.language = \"javascript\";\n }\n\n // Check if ForPrompt is already installed\n if (packageJson.dependencies?.[\"@forprompt/sdk\"] || packageJson.devDependencies?.[\"@forprompt/sdk\"]) {\n detection.hasForPrompt = true;\n }\n\n // Detect framework\n if (packageJson.dependencies?.next) {\n detection.framework = \"nextjs\";\n } else if (packageJson.dependencies?.react) {\n detection.framework = \"react\";\n } else if (packageJson.dependencies?.express) {\n detection.framework = \"express\";\n }\n\n // Detect package manager\n if (fs.existsSync(path.join(projectPath, \"pnpm-lock.yaml\"))) {\n detection.packageManager = \"pnpm\";\n } else if (fs.existsSync(path.join(projectPath, \"yarn.lock\"))) {\n detection.packageManager = \"yarn\";\n } else if (fs.existsSync(path.join(projectPath, \"bun.lockb\"))) {\n detection.packageManager = \"bun\";\n } else if (fs.existsSync(path.join(projectPath, \"package-lock.json\"))) {\n detection.packageManager = \"npm\";\n }\n\n detection.configFiles.push(\"package.json\");\n }\n\n // Check for Python projects\n const pyprojectPath = path.join(projectPath, \"pyproject.toml\");\n const requirementsPath = path.join(projectPath, \"requirements.txt\");\n\n if (fs.existsSync(pyprojectPath)) {\n detection.language = \"python\";\n const content = fs.readFileSync(pyprojectPath, \"utf-8\");\n if (content.includes(\"poetry\")) {\n detection.packageManager = \"poetry\";\n } else if (content.includes(\"uv\")) {\n detection.packageManager = \"uv\";\n } else {\n detection.packageManager = \"pip\";\n }\n detection.configFiles.push(\"pyproject.toml\");\n\n // Detect Python framework\n if (content.includes(\"fastapi\")) {\n detection.framework = \"fastapi\";\n } else if (content.includes(\"django\")) {\n detection.framework = \"django\";\n } else if (content.includes(\"flask\")) {\n detection.framework = \"flask\";\n }\n\n // Check if forprompt is installed\n if (content.includes(\"forprompt\")) {\n detection.hasForPrompt = true;\n }\n } else if (fs.existsSync(requirementsPath)) {\n detection.language = \"python\";\n detection.packageManager = \"pip\";\n detection.configFiles.push(\"requirements.txt\");\n\n const content = fs.readFileSync(requirementsPath, \"utf-8\");\n if (content.includes(\"forprompt\")) {\n detection.hasForPrompt = true;\n }\n }\n\n // Check for existing ForPrompt config\n const forpromptConfigPath = path.join(projectPath, \".forprompt\");\n if (fs.existsSync(forpromptConfigPath)) {\n detection.configFiles.push(\".forprompt\");\n }\n\n if (!detection.language) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Could not detect project type at \"${projectPath}\". Make sure the path contains a package.json (Node.js) or pyproject.toml/requirements.txt (Python).`,\n },\n ],\n isError: true,\n };\n }\n\n const lines = [\n `# Project Detection Results`,\n ``,\n `**Path:** ${projectPath}`,\n `**Language:** ${detection.language}`,\n `**Package Manager:** ${detection.packageManager || \"unknown\"}`,\n `**Framework:** ${detection.framework || \"none detected\"}`,\n `**ForPrompt Installed:** ${detection.hasForPrompt ? \"Yes\" : \"No\"}`,\n `**Config Files Found:** ${detection.configFiles.join(\", \")}`,\n ``,\n ];\n\n if (!detection.hasForPrompt) {\n lines.push(`## Next Steps`);\n lines.push(``);\n lines.push(`1. Run \\`forprompt_setup_project\\` to install the SDK`);\n lines.push(`2. Run \\`forprompt_generate_config\\` to create the config file`);\n lines.push(`3. Use \\`forprompt_generate_example\\` to see usage examples`);\n } else {\n lines.push(`ForPrompt is already installed! You can:`);\n lines.push(`- Use \\`forprompt_list_prompts\\` to see available prompts`);\n lines.push(`- Use \\`forprompt_create_prompt\\` to create new prompts`);\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: lines.join(\"\\n\"),\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error detecting project: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Setup project (install SDK)\n server.registerTool(\n \"forprompt_setup_project\",\n {\n description:\n \"Install the ForPrompt SDK in a project. Auto-detects the language and package manager, or you can specify them. Returns the command to run - you should execute it using your terminal/bash tool.\",\n inputSchema: SetupProjectInputSchema,\n },\n async ({ projectPath, language, packageManager }) => {\n try {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n // Auto-detect if not provided\n let detectedLanguage = language;\n let detectedPM = packageManager;\n\n if (!detectedLanguage || !detectedPM) {\n const packageJsonPath = path.join(projectPath, \"package.json\");\n const pyprojectPath = path.join(projectPath, \"pyproject.toml\");\n const requirementsPath = path.join(projectPath, \"requirements.txt\");\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\n if (!detectedLanguage) {\n detectedLanguage = packageJson.devDependencies?.typescript ? \"typescript\" : \"javascript\";\n }\n\n if (!detectedPM) {\n if (fs.existsSync(path.join(projectPath, \"pnpm-lock.yaml\"))) {\n detectedPM = \"pnpm\";\n } else if (fs.existsSync(path.join(projectPath, \"yarn.lock\"))) {\n detectedPM = \"yarn\";\n } else if (fs.existsSync(path.join(projectPath, \"bun.lockb\"))) {\n detectedPM = \"bun\";\n } else {\n detectedPM = \"npm\";\n }\n }\n } else if (fs.existsSync(pyprojectPath) || fs.existsSync(requirementsPath)) {\n detectedLanguage = \"python\";\n\n if (!detectedPM) {\n if (fs.existsSync(pyprojectPath)) {\n const content = fs.readFileSync(pyprojectPath, \"utf-8\");\n if (content.includes(\"poetry\")) {\n detectedPM = \"poetry\";\n } else {\n detectedPM = \"pip\";\n }\n } else {\n detectedPM = \"pip\";\n }\n }\n }\n }\n\n if (!detectedLanguage) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Could not detect project type. Please specify the language parameter (\"typescript\", \"javascript\", or \"python\").`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate install command\n let installCommand: string;\n let packageName: string;\n\n if (detectedLanguage === \"python\") {\n packageName = \"forprompt\";\n switch (detectedPM) {\n case \"poetry\":\n installCommand = `cd \"${projectPath}\" && poetry add ${packageName}`;\n break;\n case \"uv\":\n installCommand = `cd \"${projectPath}\" && uv add ${packageName}`;\n break;\n default:\n installCommand = `cd \"${projectPath}\" && pip install ${packageName}`;\n }\n } else {\n packageName = \"@forprompt/sdk\";\n switch (detectedPM) {\n case \"yarn\":\n installCommand = `cd \"${projectPath}\" && yarn add ${packageName}`;\n break;\n case \"pnpm\":\n installCommand = `cd \"${projectPath}\" && pnpm add ${packageName}`;\n break;\n case \"bun\":\n installCommand = `cd \"${projectPath}\" && bun add ${packageName}`;\n break;\n default:\n installCommand = `cd \"${projectPath}\" && npm install ${packageName}`;\n }\n }\n\n const lines = [\n `# ForPrompt SDK Installation`,\n ``,\n `**Project:** ${projectPath}`,\n `**Language:** ${detectedLanguage}`,\n `**Package Manager:** ${detectedPM}`,\n ``,\n `## Install Command`,\n ``,\n \"```bash\",\n installCommand,\n \"```\",\n ``,\n `**Run this command to install the ForPrompt SDK.**`,\n ``,\n `## After Installation`,\n ``,\n `1. Create a \\`.forprompt\\` config file with your API key`,\n `2. Or set the \\`FORPROMPT_API_KEY\\` environment variable`,\n ``,\n `Use \\`forprompt_generate_config\\` to create the config file automatically.`,\n ];\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: lines.join(\"\\n\"),\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error setting up project: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Generate config file\n server.registerTool(\n \"forprompt_generate_config\",\n {\n description:\n \"Generate a .forprompt configuration file for a project. Returns the config content that should be written to .forprompt file in the project root.\",\n inputSchema: GenerateConfigInputSchema,\n },\n async ({ projectPath, apiKey, baseUrl }) => {\n try {\n const configLines = [\n `# ForPrompt Configuration`,\n `# Generated by ForPrompt MCP Server`,\n ``,\n ];\n\n if (apiKey) {\n configLines.push(`FORPROMPT_API_KEY=${apiKey}`);\n } else {\n configLines.push(`# Add your API key here:`);\n configLines.push(`FORPROMPT_API_KEY=your_api_key_here`);\n }\n\n if (baseUrl) {\n configLines.push(`FORPROMPT_BASE_URL=${baseUrl}`);\n }\n\n const configContent = configLines.join(\"\\n\");\n const configPath = `${projectPath}/.forprompt`;\n\n const lines = [\n `# ForPrompt Configuration`,\n ``,\n `Create a file at \\`${configPath}\\` with the following content:`,\n ``,\n \"```env\",\n configContent,\n \"```\",\n ``,\n `## Alternative: Environment Variables`,\n ``,\n `Instead of a config file, you can set environment variables:`,\n ``,\n \"```bash\",\n `export FORPROMPT_API_KEY=your_api_key_here`,\n \"```\",\n ``,\n `## Get Your API Key`,\n ``,\n `1. Go to https://forprompt.dev/dashboard`,\n `2. Navigate to your organization settings`,\n `3. Create or copy your API key`,\n ``,\n `**Important:** Add \\`.forprompt\\` to your \\`.gitignore\\` to keep your API key secure!`,\n ];\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: lines.join(\"\\n\"),\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error generating config: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Generate example code\n server.registerTool(\n \"forprompt_generate_example\",\n {\n description:\n \"Generate example code showing how to use ForPrompt SDK. Supports different languages and use cases like basic usage, streaming, React hooks, and Next.js API routes.\",\n inputSchema: GenerateExampleInputSchema,\n },\n async ({ language, useCase, promptKey }) => {\n try {\n const key = promptKey || \"my_prompt\";\n let code: string;\n let description: string;\n\n if (language === \"python\") {\n switch (useCase) {\n case \"streaming\":\n description = \"Python streaming example with ForPrompt\";\n code = `from forprompt import ForPrompt\nimport os\n\n# Initialize the client\nclient = ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\n\n# Get the prompt\nprompt = client.get_prompt(\"${key}\")\n\n# Use with your LLM (example with OpenAI)\nfrom openai import OpenAI\n\nopenai = OpenAI()\n\n# Stream the response\nstream = openai.chat.completions.create(\n model=\"gpt-4\",\n messages=[\n {\"role\": \"system\", \"content\": prompt.system_prompt},\n {\"role\": \"user\", \"content\": \"Your user message here\"}\n ],\n stream=True\n)\n\nfor chunk in stream:\n if chunk.choices[0].delta.content:\n print(chunk.choices[0].delta.content, end=\"\")`;\n break;\n case \"with-tools\":\n description = \"Python example with tools/functions\";\n code = `from forprompt import ForPrompt\nimport os\nimport json\n\nclient = ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\n\n# Get the prompt with tools\nprompt = client.get_prompt(\"${key}\")\n\n# Define your tools\ntools = [\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"get_weather\",\n \"description\": \"Get current weather for a location\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"location\": {\"type\": \"string\", \"description\": \"City name\"}\n },\n \"required\": [\"location\"]\n }\n }\n }\n]\n\n# Use with OpenAI\nfrom openai import OpenAI\n\nopenai = OpenAI()\n\nresponse = openai.chat.completions.create(\n model=\"gpt-4\",\n messages=[\n {\"role\": \"system\", \"content\": prompt.system_prompt},\n {\"role\": \"user\", \"content\": \"What's the weather in Tokyo?\"}\n ],\n tools=tools,\n tool_choice=\"auto\"\n)\n\nprint(response.choices[0].message)`;\n break;\n default:\n description = \"Basic Python usage example\";\n code = `from forprompt import ForPrompt\nimport os\n\n# Initialize the client\nclient = ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\n\n# Get a prompt by key\nprompt = client.get_prompt(\"${key}\")\n\nprint(f\"Prompt: {prompt.name}\")\nprint(f\"Version: {prompt.version_number}\")\nprint(f\"System Prompt: {prompt.system_prompt}\")\n\n# Use the prompt with your LLM\nfrom openai import OpenAI\n\nopenai = OpenAI()\n\nresponse = openai.chat.completions.create(\n model=\"gpt-4\",\n messages=[\n {\"role\": \"system\", \"content\": prompt.system_prompt},\n {\"role\": \"user\", \"content\": \"Your user message here\"}\n ]\n)\n\nprint(response.choices[0].message.content)`;\n }\n } else {\n // TypeScript/JavaScript\n const isTS = language === \"typescript\";\n const ext = isTS ? \"ts\" : \"js\";\n\n switch (useCase) {\n case \"streaming\":\n description = \"Streaming example with ForPrompt\";\n code = `import { forprompt } from '@forprompt/sdk';\nimport OpenAI from 'openai';\n\nasync function main() {\n // Get the prompt\n const prompt = await forprompt.getPrompt('${key}');\n\n const openai = new OpenAI();\n\n // Stream the response\n const stream = await openai.chat.completions.create({\n model: 'gpt-4',\n messages: [\n { role: 'system', content: prompt.systemPrompt },\n { role: 'user', content: 'Your user message here' }\n ],\n stream: true,\n });\n\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (content) process.stdout.write(content);\n }\n}\n\nmain();`;\n break;\n case \"react-hook\":\n description = \"React hook example\";\n code = `import { useState, useEffect } from 'react';\nimport { forprompt } from '@forprompt/sdk';\n${isTS ? \"import type { Prompt } from '@forprompt/sdk';\\n\" : \"\"}\n// Custom hook to fetch a ForPrompt prompt\nexport function usePrompt(key${isTS ? \": string\" : \"\"}) {\n const [prompt, setPrompt] = useState${isTS ? \"<Prompt | null>\" : \"\"}(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState${isTS ? \"<Error | null>\" : \"\"}(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchPrompt() {\n try {\n setLoading(true);\n const data = await forprompt.getPrompt(key);\n if (!cancelled) {\n setPrompt(data);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err${isTS ? \" as Error\" : \"\"});\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchPrompt();\n\n return () => { cancelled = true; };\n }, [key]);\n\n return { prompt, loading, error };\n}\n\n// Usage in a component\nfunction ChatComponent() {\n const { prompt, loading, error } = usePrompt('${key}');\n\n if (loading) return <div>Loading prompt...</div>;\n if (error) return <div>Error: {error.message}</div>;\n\n return (\n <div>\n <h1>{prompt${isTS ? \"!\" : \"\"}.name}</h1>\n <p>Version: {prompt${isTS ? \"!\" : \"\"}.versionNumber}</p>\n {/* Use prompt.systemPrompt with your AI chat */}\n </div>\n );\n}`;\n break;\n case \"nextjs-api\":\n description = \"Next.js API route example\";\n code = `// app/api/chat/route.${ext}\nimport { forprompt } from '@forprompt/sdk';\nimport OpenAI from 'openai';\nimport { NextResponse } from 'next/server';\n${isTS ? \"\\nexport const runtime = 'edge';\\n\" : \"\"}\nconst openai = new OpenAI();\n\nexport async function POST(request${isTS ? \": Request\" : \"\"}) {\n try {\n const { message, promptKey } = await request.json();\n\n // Fetch the prompt from ForPrompt\n const prompt = await forprompt.getPrompt(promptKey || '${key}');\n\n // Create completion with the system prompt\n const response = await openai.chat.completions.create({\n model: 'gpt-4',\n messages: [\n { role: 'system', content: prompt.systemPrompt },\n { role: 'user', content: message }\n ],\n });\n\n return NextResponse.json({\n content: response.choices[0].message.content,\n promptVersion: prompt.versionNumber,\n });\n } catch (error) {\n console.error('Chat API error:', error);\n return NextResponse.json(\n { error: 'Failed to process chat request' },\n { status: 500 }\n );\n }\n}`;\n break;\n case \"with-tools\":\n description = \"Example with tools/functions\";\n code = `import { forprompt } from '@forprompt/sdk';\nimport OpenAI from 'openai';\n\nconst openai = new OpenAI();\n\n// Define your tools\nconst tools${isTS ? \": OpenAI.ChatCompletionTool[]\" : \"\"} = [\n {\n type: 'function',\n function: {\n name: 'get_weather',\n description: 'Get current weather for a location',\n parameters: {\n type: 'object',\n properties: {\n location: { type: 'string', description: 'City name' }\n },\n required: ['location']\n }\n }\n }\n];\n\nasync function main() {\n const prompt = await forprompt.getPrompt('${key}');\n\n const response = await openai.chat.completions.create({\n model: 'gpt-4',\n messages: [\n { role: 'system', content: prompt.systemPrompt },\n { role: 'user', content: \"What's the weather in Tokyo?\" }\n ],\n tools,\n tool_choice: 'auto',\n });\n\n console.log(response.choices[0].message);\n}\n\nmain();`;\n break;\n default:\n description = \"Basic usage example\";\n code = `import { forprompt } from '@forprompt/sdk';\nimport OpenAI from 'openai';\n\nasync function main() {\n // Get a prompt by key\n const prompt = await forprompt.getPrompt('${key}');\n\n console.log('Prompt:', prompt.name);\n console.log('Version:', prompt.versionNumber);\n console.log('System Prompt:', prompt.systemPrompt);\n\n // Use with OpenAI\n const openai = new OpenAI();\n\n const response = await openai.chat.completions.create({\n model: 'gpt-4',\n messages: [\n { role: 'system', content: prompt.systemPrompt },\n { role: 'user', content: 'Your user message here' }\n ],\n });\n\n console.log(response.choices[0].message.content);\n}\n\nmain();`;\n }\n }\n\n const lines = [\n `# ${description}`,\n ``,\n `**Language:** ${language}`,\n `**Use Case:** ${useCase}`,\n ``,\n \"```\" + (language === \"python\" ? \"python\" : language),\n code,\n \"```\",\n ``,\n `## Setup Required`,\n ``,\n `1. Install the ForPrompt SDK`,\n `2. Set your \\`FORPROMPT_API_KEY\\` environment variable`,\n `3. Create a prompt with key \\`${key}\\` in ForPrompt dashboard`,\n ];\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: lines.join(\"\\n\"),\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error generating example: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Get integration guide\n server.registerTool(\n \"forprompt_integration_guide\",\n {\n description:\n \"Get a step-by-step integration guide for ForPrompt with specific frameworks like Next.js, React, Express, FastAPI, Django, or Flask.\",\n inputSchema: GetIntegrationGuideInputSchema,\n },\n async ({ framework, language }) => {\n try {\n let guide: string;\n\n switch (framework) {\n case \"nextjs\":\n guide = `# ForPrompt + Next.js Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\nnpm install @forprompt/sdk\n# or: pnpm add @forprompt/sdk\n\\`\\`\\`\n\n## 2. Set up environment variables\n\nAdd to your \\`.env.local\\`:\n\n\\`\\`\\`env\nFORPROMPT_API_KEY=your_api_key_here\n\\`\\`\\`\n\n## 3. Create an API route\n\n\\`\\`\\`typescript\n// app/api/chat/route.ts\nimport { forprompt } from '@forprompt/sdk';\nimport { NextResponse } from 'next/server';\n\nexport async function POST(request: Request) {\n const { message, promptKey } = await request.json();\n\n // Fetch prompt from ForPrompt\n const prompt = await forprompt.getPrompt(promptKey);\n\n // Use prompt.systemPrompt with your LLM\n // ... your AI logic here\n\n return NextResponse.json({ response: '...' });\n}\n\\`\\`\\`\n\n## 4. Create a client hook (optional)\n\n\\`\\`\\`typescript\n// hooks/useForPrompt.ts\n'use client';\nimport { forprompt } from '@forprompt/sdk';\nimport { useEffect, useState } from 'react';\n\nexport function usePrompt(key: string) {\n const [prompt, setPrompt] = useState(null);\n\n useEffect(() => {\n forprompt.getPrompt(key).then(setPrompt);\n }, [key]);\n\n return prompt;\n}\n\\`\\`\\`\n\n## 5. Best Practices\n\n- Cache prompts in production using Next.js caching\n- Use server components for initial prompt fetch\n- Consider using SWR or React Query for client-side caching`;\n break;\n\n case \"react\":\n guide = `# ForPrompt + React Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\nnpm install @forprompt/sdk\n\\`\\`\\`\n\n## 2. Create a custom hook\n\n\\`\\`\\`typescript\n// hooks/usePrompt.ts\nimport { useState, useEffect } from 'react';\nimport { forprompt, Prompt } from '@forprompt/sdk';\n\nexport function usePrompt(key: string) {\n const [prompt, setPrompt] = useState<Prompt | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n forprompt.getPrompt(key)\n .then(setPrompt)\n .catch(setError)\n .finally(() => setLoading(false));\n }, [key]);\n\n return { prompt, loading, error };\n}\n\\`\\`\\`\n\n## 3. Use in components\n\n\\`\\`\\`tsx\nfunction ChatBot() {\n const { prompt, loading } = usePrompt('customer_support');\n\n if (loading) return <Spinner />;\n\n return <Chat systemPrompt={prompt.systemPrompt} />;\n}\n\\`\\`\\``;\n break;\n\n case \"express\":\n guide = `# ForPrompt + Express Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\nnpm install @forprompt/sdk\n\\`\\`\\`\n\n## 2. Create a middleware (optional)\n\n\\`\\`\\`typescript\n// middleware/forprompt.ts\nimport { forprompt } from '@forprompt/sdk';\n\nexport async function loadPrompt(req, res, next) {\n try {\n const promptKey = req.query.promptKey || req.body.promptKey;\n if (promptKey) {\n req.prompt = await forprompt.getPrompt(promptKey);\n }\n next();\n } catch (error) {\n next(error);\n }\n}\n\\`\\`\\`\n\n## 3. Use in routes\n\n\\`\\`\\`typescript\nimport express from 'express';\nimport { forprompt } from '@forprompt/sdk';\n\nconst app = express();\n\napp.post('/api/chat', async (req, res) => {\n const { message, promptKey } = req.body;\n\n const prompt = await forprompt.getPrompt(promptKey);\n\n // Use prompt.systemPrompt with your LLM\n // ...\n\n res.json({ response: '...' });\n});\n\\`\\`\\``;\n break;\n\n case \"fastapi\":\n guide = `# ForPrompt + FastAPI Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\npip install forprompt\n\\`\\`\\`\n\n## 2. Create a dependency\n\n\\`\\`\\`python\n# dependencies.py\nfrom forprompt import ForPrompt\nimport os\n\ndef get_forprompt():\n return ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\n\\`\\`\\`\n\n## 3. Use in routes\n\n\\`\\`\\`python\nfrom fastapi import FastAPI, Depends\nfrom forprompt import ForPrompt\nfrom dependencies import get_forprompt\n\napp = FastAPI()\n\n@app.post(\"/api/chat\")\nasync def chat(\n message: str,\n prompt_key: str,\n fp: ForPrompt = Depends(get_forprompt)\n):\n prompt = fp.get_prompt(prompt_key)\n\n # Use prompt.system_prompt with your LLM\n # ...\n\n return {\"response\": \"...\"}\n\\`\\`\\`\n\n## 4. Best Practices\n\n- Cache prompts using functools.lru_cache or Redis\n- Use async version for better performance\n- Consider using Pydantic models for prompt data`;\n break;\n\n case \"django\":\n guide = `# ForPrompt + Django Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\npip install forprompt\n\\`\\`\\`\n\n## 2. Add to settings\n\n\\`\\`\\`python\n# settings.py\nFORPROMPT_API_KEY = os.environ.get(\"FORPROMPT_API_KEY\")\n\\`\\`\\`\n\n## 3. Create a utility\n\n\\`\\`\\`python\n# utils/forprompt.py\nfrom forprompt import ForPrompt\nfrom django.conf import settings\nfrom functools import lru_cache\n\n@lru_cache(maxsize=100)\ndef get_prompt(key: str):\n client = ForPrompt(api_key=settings.FORPROMPT_API_KEY)\n return client.get_prompt(key)\n\\`\\`\\`\n\n## 4. Use in views\n\n\\`\\`\\`python\nfrom django.http import JsonResponse\nfrom utils.forprompt import get_prompt\n\ndef chat_view(request):\n prompt_key = request.POST.get('prompt_key')\n prompt = get_prompt(prompt_key)\n\n # Use prompt.system_prompt with your LLM\n\n return JsonResponse({\"response\": \"...\"})\n\\`\\`\\``;\n break;\n\n case \"flask\":\n guide = `# ForPrompt + Flask Integration Guide\n\n## 1. Install the SDK\n\n\\`\\`\\`bash\npip install forprompt\n\\`\\`\\`\n\n## 2. Initialize the client\n\n\\`\\`\\`python\n# app.py\nfrom flask import Flask, request, jsonify\nfrom forprompt import ForPrompt\nimport os\n\napp = Flask(__name__)\nforprompt_client = ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\n\n@app.route('/api/chat', methods=['POST'])\ndef chat():\n data = request.json\n prompt = forprompt_client.get_prompt(data['prompt_key'])\n\n # Use prompt.system_prompt with your LLM\n\n return jsonify({\"response\": \"...\"})\n\\`\\`\\``;\n break;\n\n default:\n guide = `# ForPrompt Generic Integration Guide\n\n## TypeScript/JavaScript\n\n\\`\\`\\`typescript\nimport { forprompt } from '@forprompt/sdk';\n\nconst prompt = await forprompt.getPrompt('your_prompt_key');\nconsole.log(prompt.systemPrompt);\n\\`\\`\\`\n\n## Python\n\n\\`\\`\\`python\nfrom forprompt import ForPrompt\nimport os\n\nclient = ForPrompt(api_key=os.environ.get(\"FORPROMPT_API_KEY\"))\nprompt = client.get_prompt(\"your_prompt_key\")\nprint(prompt.system_prompt)\n\\`\\`\\`\n\n## Environment Setup\n\n1. Get your API key from https://forprompt.dev/dashboard\n2. Set \\`FORPROMPT_API_KEY\\` environment variable\n3. Install the SDK for your language\n4. Start fetching prompts!`;\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: guide,\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error generating guide: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n","/**\n * MCP Resource Handlers\n *\n * Exposes ForPrompt prompts as MCP resources that AI assistants can read.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ForPrompt } from \"../client.js\";\nimport type { ForPromptMcpServerConfig } from \"./server.js\";\nimport type { Prompt, SyncResponse } from \"../types.js\";\n\nconst DEFAULT_BASE_URL = \"https://wooden-fox-811.convex.site\";\n\n/**\n * Fetch all prompts using the sync endpoint\n */\nasync function fetchAllPrompts(\n config: ForPromptMcpServerConfig\n): Promise<Prompt[]> {\n const apiKey = config.apiKey || process.env.FORPROMPT_API_KEY;\n const baseUrl = (\n config.baseUrl ||\n process.env.FORPROMPT_BASE_URL ||\n DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n if (!apiKey) {\n throw new Error(\n \"API key is required. Set FORPROMPT_API_KEY environment variable.\"\n );\n }\n\n const response = await fetch(`${baseUrl}/api/sync`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({\n error: \"Unknown error\",\n }))) as { error?: string };\n throw new Error(errorData.error || `Failed to fetch prompts`);\n }\n\n const data = (await response.json()) as SyncResponse;\n return data.prompts;\n}\n\n/**\n * Parse a forprompt:// URI and extract components\n */\nfunction parseUri(uri: string): {\n key?: string;\n version?: number;\n type: \"list\" | \"prompt\" | \"metadata\";\n} {\n // forprompt://prompts -> list all\n // forprompt://prompts/{key} -> single prompt\n // forprompt://prompts/{key}/v{number} -> specific version\n // forprompt://prompts/{key}/metadata -> metadata only\n\n const match = uri.match(/^forprompt:\\/\\/prompts(?:\\/([^/]+))?(?:\\/(v\\d+|metadata))?$/);\n\n if (!match) {\n return { type: \"list\" };\n }\n\n const [, key, suffix] = match;\n\n if (!key) {\n return { type: \"list\" };\n }\n\n if (suffix === \"metadata\") {\n return { key, type: \"metadata\" };\n }\n\n if (suffix?.startsWith(\"v\")) {\n const version = parseInt(suffix.slice(1), 10);\n return { key, version, type: \"prompt\" };\n }\n\n return { key, type: \"prompt\" };\n}\n\n/**\n * Format a prompt as resource content\n */\nfunction formatPromptResource(prompt: Prompt): string {\n const sections: string[] = [];\n\n sections.push(`# ${prompt.name}`);\n sections.push(\"\");\n sections.push(`Key: ${prompt.key}`);\n sections.push(`Version: ${prompt.versionNumber}`);\n sections.push(`Updated: ${new Date(prompt.updatedAt).toISOString()}`);\n\n if (prompt.description) {\n sections.push(\"\");\n sections.push(`## Description`);\n sections.push(prompt.description);\n }\n\n sections.push(\"\");\n sections.push(\"## System Prompt\");\n sections.push(\"\");\n sections.push(prompt.systemPrompt);\n\n if (prompt.purpose) {\n sections.push(\"\");\n sections.push(\"## Purpose\");\n sections.push(prompt.purpose);\n }\n\n if (prompt.expectedBehavior) {\n sections.push(\"\");\n sections.push(\"## Expected Behavior\");\n sections.push(prompt.expectedBehavior);\n }\n\n if (prompt.inputFormat) {\n sections.push(\"\");\n sections.push(\"## Input Format\");\n sections.push(prompt.inputFormat);\n }\n\n if (prompt.outputFormat) {\n sections.push(\"\");\n sections.push(\"## Output Format\");\n sections.push(prompt.outputFormat);\n }\n\n if (prompt.constraints) {\n sections.push(\"\");\n sections.push(\"## Constraints\");\n sections.push(prompt.constraints);\n }\n\n if (prompt.useCases) {\n sections.push(\"\");\n sections.push(\"## Use Cases\");\n sections.push(prompt.useCases);\n }\n\n return sections.join(\"\\n\");\n}\n\n/**\n * Register MCP resources\n */\nexport function registerResources(\n server: McpServer,\n client: ForPrompt,\n config: ForPromptMcpServerConfig\n): void {\n // Resource template for prompts\n server.resource(\n \"forprompt://prompts/{key}\",\n \"Access a ForPrompt prompt by its key. Returns the system prompt and all metadata.\",\n async (uri) => {\n const parsed = parseUri(uri.href);\n\n if (parsed.type === \"list\" || !parsed.key) {\n // Return list of all prompts\n const prompts = await fetchAllPrompts(config);\n const list = prompts\n .map((p) => `- ${p.key}: ${p.name} (v${p.versionNumber})`)\n .join(\"\\n\");\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"text/plain\",\n text: `# ForPrompt Prompts\\n\\n${prompts.length} prompt(s) available:\\n\\n${list}`,\n },\n ],\n };\n }\n\n if (parsed.type === \"metadata\") {\n // Return metadata only\n const prompt = await client.getPrompt(parsed.key);\n const metadata = {\n key: prompt.key,\n name: prompt.name,\n description: prompt.description,\n versionNumber: prompt.versionNumber,\n updatedAt: prompt.updatedAt,\n purpose: prompt.purpose,\n expectedBehavior: prompt.expectedBehavior,\n inputFormat: prompt.inputFormat,\n outputFormat: prompt.outputFormat,\n constraints: prompt.constraints,\n useCases: prompt.useCases,\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(metadata, null, 2),\n },\n ],\n };\n }\n\n // Return full prompt\n const prompt = await client.getPrompt(parsed.key, {\n version: parsed.version,\n });\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"text/plain\",\n text: formatPromptResource(prompt),\n },\n ],\n };\n }\n );\n}\n","{\n \"name\": \"@forprompt/sdk\",\n \"version\": \"0.1.0\",\n \"description\": \"ForPrompt SDK - Sync and manage AI prompts from your ForPrompt projects\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"forprompt\": \"./dist/cli/index.js\",\n \"forprompt-mcp\": \"./dist/mcp/server.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"import\": \"./dist/mcp/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"license\": \"AGPL-3.0-or-later\",\n \"author\": \"ForPrompt\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ardacanuckan/forprompt.git\",\n \"directory\": \"packages/sdk\"\n },\n \"homepage\": \"https://forprompt.dev\",\n \"bugs\": {\n \"url\": \"https://github.com/forprompt/sdk/issues\"\n },\n \"keywords\": [\n \"forprompt\",\n \"prompts\",\n \"ai\",\n \"llm\",\n \"prompt-management\",\n \"cli\",\n \"sdk\",\n \"openai\",\n \"anthropic\",\n \"chatgpt\"\n ],\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"pnpm run typecheck && pnpm run build\",\n \"prepack\": \"pnpm run build\",\n \"clean\": \"rm -rf dist node_modules coverage\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src/\",\n \"test\": \"echo 'Tests temporarily disabled due to Vitest/ESM configuration issue. Tests are written and ready in src/__tests__/' && exit 0\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"zod\": \"^3.24.0\"\n },\n \"devDependencies\": {\n \"@forprompt/eslint-config\": \"workspace:*\",\n \"@forprompt/tsconfig\": \"workspace:*\",\n \"@types/node\": \"^20.0.0\",\n \"@vitest/coverage-v8\": \"^2.1.0\",\n \"eslint\": \"^9.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.3.0\",\n \"vitest\": \"^2.1.0\"\n }\n}\n","/**\n * Version management - reads from package.json at build time\n * \n * This file provides the SDK version dynamically from package.json\n * to avoid hardcoded version strings that need manual updates.\n */\n\n// @ts-ignore - package.json is resolved at build time\nimport pkg from \"../package.json\" with { type: \"json\" };\n\n/**\n * The current SDK version from package.json\n */\nexport const VERSION = pkg.version as string;\n","/**\n * MCP Configuration Generators\n *\n * Generate configuration files for various AI editors and tools\n * to connect to the ForPrompt MCP server.\n */\n\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nexport type SupportedEditor =\n | \"claude-desktop\"\n | \"claude-code\"\n | \"cursor\"\n | \"continue\"\n | \"windsurf\"\n | \"vscode\";\n\nexport interface EditorConfig {\n name: string;\n description: string;\n configPath: string;\n configFileName: string;\n generate: (apiKey: string, baseUrl?: string) => string;\n instructions: string;\n}\n\n/**\n * Get the config file path for an editor\n */\nfunction getEditorConfigPath(editor: SupportedEditor): string {\n const home = os.homedir();\n\n switch (editor) {\n case \"claude-desktop\":\n if (process.platform === \"darwin\") {\n return path.join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n } else if (process.platform === \"win32\") {\n return path.join(\n process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\"),\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n } else {\n return path.join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n }\n\n case \"claude-code\":\n return path.join(process.cwd(), \".mcp.json\");\n\n case \"cursor\":\n return path.join(process.cwd(), \".cursor\", \"mcp.json\");\n\n case \"continue\":\n return path.join(home, \".continue\", \"config.json\");\n\n case \"windsurf\":\n return path.join(home, \".windsurf\", \"mcp.json\");\n\n case \"vscode\":\n return path.join(process.cwd(), \".vscode\", \"mcp.json\");\n\n default:\n throw new Error(`Unknown editor: ${editor}`);\n }\n}\n\n/**\n * Generate MCP server configuration for Claude Desktop\n */\nfunction generateClaudeDesktopConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: {\n forprompt: {\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate MCP server configuration for Claude Code\n */\nfunction generateClaudeCodeConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: {\n forprompt: {\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate MCP server configuration for Cursor\n */\nfunction generateCursorConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: {\n forprompt: {\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate MCP server configuration for Continue.dev\n */\nfunction generateContinueConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: [\n {\n name: \"forprompt\",\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n ],\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate MCP server configuration for Windsurf\n */\nfunction generateWindsurfConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: {\n forprompt: {\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate MCP server configuration for VS Code\n */\nfunction generateVSCodeConfig(apiKey: string, baseUrl?: string): string {\n const config = {\n mcpServers: {\n forprompt: {\n command: \"npx\",\n args: [\"-y\", \"@forprompt/sdk\", \"mcp\", \"start\"],\n env: {\n FORPROMPT_API_KEY: apiKey,\n ...(baseUrl && { FORPROMPT_BASE_URL: baseUrl }),\n },\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Editor configurations\n */\nexport const editorConfigs: Record<SupportedEditor, EditorConfig> = {\n \"claude-desktop\": {\n name: \"Claude Desktop\",\n description: \"Anthropic's Claude desktop application\",\n configPath: getEditorConfigPath(\"claude-desktop\"),\n configFileName: \"claude_desktop_config.json\",\n generate: generateClaudeDesktopConfig,\n instructions: `\n1. Open the config file at the path shown above\n2. Add or merge the ForPrompt MCP server configuration\n3. Restart Claude Desktop\n4. You can now ask Claude to \"list my ForPrompt prompts\" or \"get the [prompt-key] prompt\"\n`,\n },\n\n \"claude-code\": {\n name: \"Claude Code\",\n description: \"Anthropic's Claude Code CLI tool\",\n configPath: getEditorConfigPath(\"claude-code\"),\n configFileName: \".mcp.json\",\n generate: generateClaudeCodeConfig,\n instructions: `\n1. Create .mcp.json in your project root directory\n2. Add the ForPrompt MCP server configuration\n3. Claude Code will automatically detect and load the MCP server\n4. You can now ask Claude Code to manage your ForPrompt prompts\n`,\n },\n\n cursor: {\n name: \"Cursor\",\n description: \"Cursor AI-powered code editor\",\n configPath: getEditorConfigPath(\"cursor\"),\n configFileName: \"mcp.json\",\n generate: generateCursorConfig,\n instructions: `\n1. Create the .cursor directory in your project root if it doesn't exist\n2. Save the configuration to .cursor/mcp.json\n3. Restart Cursor or reload the window\n4. Your ForPrompt prompts will be available via MCP\n`,\n },\n\n continue: {\n name: \"Continue.dev\",\n description: \"Continue - open-source AI code assistant\",\n configPath: getEditorConfigPath(\"continue\"),\n configFileName: \"config.json\",\n generate: generateContinueConfig,\n instructions: `\n1. Open your Continue config file (~/.continue/config.json)\n2. Add the ForPrompt MCP server to the mcpServers array\n3. Restart your IDE or reload Continue\n4. Your ForPrompt prompts will be available via MCP\n`,\n },\n\n windsurf: {\n name: \"Windsurf\",\n description: \"Windsurf AI-powered IDE\",\n configPath: getEditorConfigPath(\"windsurf\"),\n configFileName: \"mcp.json\",\n generate: generateWindsurfConfig,\n instructions: `\n1. Create the ~/.windsurf directory if it doesn't exist\n2. Save the configuration to ~/.windsurf/mcp.json\n3. Restart Windsurf\n4. Your ForPrompt prompts will be available via MCP\n`,\n },\n\n vscode: {\n name: \"VS Code\",\n description: \"Visual Studio Code with MCP extension\",\n configPath: getEditorConfigPath(\"vscode\"),\n configFileName: \"mcp.json\",\n generate: generateVSCodeConfig,\n instructions: `\n1. Install an MCP-compatible extension in VS Code\n2. Create .vscode/mcp.json in your project\n3. Add the ForPrompt MCP server configuration\n4. Reload VS Code\n`,\n },\n};\n\n/**\n * Generate configuration for a specific editor\n */\nexport function generateConfig(\n editor: SupportedEditor,\n apiKey: string,\n baseUrl?: string\n): { config: string; path: string; instructions: string } {\n const editorConfig = editorConfigs[editor];\n\n if (!editorConfig) {\n throw new Error(\n `Unknown editor: ${editor}. Supported editors: ${getSupportedEditors().join(\", \")}`\n );\n }\n\n return {\n config: editorConfig.generate(apiKey, baseUrl),\n path: editorConfig.configPath,\n instructions: editorConfig.instructions,\n };\n}\n\n/**\n * Get the config path for an editor\n */\nexport function getConfigPath(editor: SupportedEditor): string {\n return editorConfigs[editor]?.configPath || \"\";\n}\n\n/**\n * Get list of supported editors\n */\nexport function getSupportedEditors(): SupportedEditor[] {\n return Object.keys(editorConfigs) as SupportedEditor[];\n}\n","#!/usr/bin/env node\n\n/**\n * ForPrompt CLI\n *\n * Commands:\n * init - Initialize ForPrompt in the current directory\n * deploy - Fetch and sync prompts to local files\n * mcp - MCP server management (start, config)\n * help - Show help message\n */\n\nimport { initCommand } from \"./commands/init\";\nimport { deployCommand } from \"./commands/deploy\";\nimport { mcpCommand } from \"./commands/mcp\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * Parse command line arguments\n */\nfunction parseArgs(args: string[]): {\n command: string | undefined;\n subcommand: string | undefined;\n options: Record<string, string | boolean>;\n} {\n const options: Record<string, string | boolean> = {};\n let command: string | undefined;\n let subcommand: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n\n if (arg.startsWith(\"--\")) {\n const [key, value] = arg.slice(2).split(\"=\");\n if (key) {\n options[key] = value || true;\n }\n } else if (arg.startsWith(\"-\")) {\n const key = arg.slice(1);\n if (key) {\n options[key] = true;\n }\n } else if (!command) {\n command = arg;\n } else if (!subcommand) {\n subcommand = arg;\n }\n }\n\n return { command, subcommand, options };\n}\n\n/**\n * Show help message\n */\nfunction showHelp(): void {\n console.log(`\nForPrompt CLI v${VERSION}\n\nSync prompts from your ForPrompt projects to local files.\n\nUsage:\n npx forprompt <command> [options]\n\nCommands:\n init Initialize ForPrompt in the current directory\n deploy Fetch and sync prompts to local files\n mcp MCP server management (start, config, info)\n help Show this help message\n\nInit Options:\n --api-key=<key> Provide API key directly (otherwise prompted)\n\nDeploy Options:\n --clean Remove local prompts that no longer exist on server\n\nMCP Options:\n mcp start Start MCP server (stdio transport)\n mcp config Generate config for AI editors\n --editor=<name> Editor: claude-desktop, cursor, continue, windsurf, vscode\n --all Generate configs for all editors\n mcp info Show MCP server information\n\nExamples:\n npx forprompt init\n npx forprompt init --api-key=fp_xxx\n npx forprompt deploy\n npx forprompt deploy --clean\n npx forprompt mcp start\n npx forprompt mcp config --editor=claude-desktop\n\nEnvironment Variables:\n FORPROMPT_API_KEY API key (alternative to .env file)\n FORPROMPT_BASE_URL Custom API base URL (for self-hosted)\n\nDocumentation:\n https://forprompt.dev/docs/cli\n`);\n}\n\n/**\n * Show version\n */\nfunction showVersion(): void {\n console.log(`forprompt v${VERSION}`);\n}\n\n/**\n * Main CLI entry point\n */\nasync function main(): Promise<void> {\n const { command, subcommand, options } = parseArgs(process.argv.slice(2));\n\n // Handle version flag\n if (options.version || options.v) {\n showVersion();\n return;\n }\n\n // Handle help flag\n if (options.help || options.h) {\n showHelp();\n return;\n }\n\n switch (command) {\n case \"init\":\n await initCommand({\n apiKey: options[\"api-key\"] as string | undefined,\n baseUrl: options[\"base-url\"] as string | undefined,\n });\n break;\n\n case \"deploy\":\n await deployCommand({\n clean: options.clean as boolean | undefined,\n baseUrl: options[\"base-url\"] as string | undefined,\n });\n break;\n\n case \"mcp\":\n await mcpCommand({\n subcommand: subcommand,\n editor: options.editor as string | undefined,\n all: options.all as boolean | undefined,\n transport: options.transport as string | undefined,\n port: options.port ? parseInt(options.port as string, 10) : undefined,\n });\n break;\n\n case \"help\":\n case undefined:\n showHelp();\n break;\n\n case \"version\":\n showVersion();\n break;\n\n default:\n console.error(`Unknown command: ${command}`);\n console.log(\"Run 'npx forprompt help' for usage.\");\n process.exit(1);\n }\n}\n\n// Run CLI\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","prompt","prompt","fs","path","readline","DEFAULT_BASE_URL","DEFAULT_BASE_URL","prompt","fs","path","DEFAULT_BASE_URL","fetchAllPrompts","prompt","os","path","getApiKey","editor"]}
|