@postmcp/cli 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +17 -3
- package/dist/bin.js.map +1 -1
- package/dist/bin.mjs +17 -3
- package/dist/bin.mjs.map +1 -1
- package/package.json +3 -3
package/dist/bin.js
CHANGED
|
@@ -871,17 +871,31 @@ async function studioCommand(specArg, options = {}) {
|
|
|
871
871
|
}
|
|
872
872
|
}
|
|
873
873
|
if (child) {
|
|
874
|
-
await new Promise((
|
|
875
|
-
child?.on("close", () =>
|
|
874
|
+
await new Promise((resolve5) => {
|
|
875
|
+
child?.on("close", () => resolve5());
|
|
876
876
|
});
|
|
877
877
|
}
|
|
878
878
|
}
|
|
879
879
|
|
|
880
880
|
// src/bin.ts
|
|
881
|
+
var import_fs = require("fs");
|
|
882
|
+
var import_path = require("path");
|
|
881
883
|
var import_picocolors7 = __toESM(require("picocolors"));
|
|
884
|
+
function getCliVersion() {
|
|
885
|
+
if (true) {
|
|
886
|
+
return "0.1.11";
|
|
887
|
+
}
|
|
888
|
+
try {
|
|
889
|
+
const dir = typeof __dirname !== "undefined" ? __dirname : process.cwd();
|
|
890
|
+
const pkg = JSON.parse((0, import_fs.readFileSync)((0, import_path.resolve)(dir, "../package.json"), "utf8"));
|
|
891
|
+
return pkg.version || "unknown";
|
|
892
|
+
} catch {
|
|
893
|
+
return "unknown";
|
|
894
|
+
}
|
|
895
|
+
}
|
|
882
896
|
function createCli() {
|
|
883
897
|
const program = new import_commander.Command();
|
|
884
|
-
program.name("postmcp").description("The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.").version(
|
|
898
|
+
program.name("postmcp").description("The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.").version(getCliVersion());
|
|
885
899
|
program.command("run [spec]").description("Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec").option("-b, --base-url <url>", "Override target API base URL").option("-t, --transport <type>", "Transport type: stdio or http (default: stdio)", "stdio").option("-p, --port <number>", "Port for Streamable HTTP server").option("-H, --header <key:value...>", "Custom request headers (can be specified multiple times)", (val, prev = []) => [...prev, val]).option("--bearer <token>", "Bearer authentication token or $ENV_VAR").option("--api-key <name=value>", "API key credentials (e.g. key=val, header:key=val, query:key=val)").option("--jit", "Force Just-In-Time dynamic tool routing").option("--no-jit", "Disable JIT mode and expose all tools statically").option("--hot-tool-keywords <keywords>", "Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools").option("--dry-run", "Simulate mutation & critical requests without real API execution").option("--token-diet", "Enable Token Diet response optimization (enabled by default)").option("--no-token-diet", "Disable Token Diet payload pruning & markdown tables").option("--max-tokens <number>", "Token ceiling per tool response", "2500").option("--env-file <path>", "Custom .env file path to load").option("-c, --config <path>", "Custom postmcp.config.json path").action((spec, opts) => {
|
|
886
900
|
runCommand(spec, opts).catch((err) => {
|
|
887
901
|
console.error(import_picocolors7.default.red(`Fatal error: ${err.message}`));
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin.ts","../src/commands/run.ts","../src/config/loader.ts","../src/presets/index.ts","../src/commands/inspect.ts","../src/commands/generate.ts","../src/commands/export.ts","../src/commands/presets.ts","../src/commands/studio.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { inspectCommand } from './commands/inspect.js';\nimport { generateCommand } from './commands/generate.js';\nimport { exportCommand } from './commands/export.js';\nimport { listPresetsCommand, syncPresetsCommand } from './commands/presets.js';\nimport { studioCommand } from './commands/studio.js';\nimport pc from 'picocolors';\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('postmcp')\n .description('The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.')\n .version('0.1.8');\n\n // 1. Run Command\n program\n .command('run [spec]')\n .description('Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec')\n .option('-b, --base-url <url>', 'Override target API base URL')\n .option('-t, --transport <type>', 'Transport type: stdio or http (default: stdio)', 'stdio')\n .option('-p, --port <number>', 'Port for Streamable HTTP server')\n .option('-H, --header <key:value...>', 'Custom request headers (can be specified multiple times)', (val, prev: string[] = []) => [...prev, val])\n .option('--bearer <token>', 'Bearer authentication token or $ENV_VAR')\n .option('--api-key <name=value>', 'API key credentials (e.g. key=val, header:key=val, query:key=val)')\n .option('--jit', 'Force Just-In-Time dynamic tool routing')\n .option('--no-jit', 'Disable JIT mode and expose all tools statically')\n .option('--hot-tool-keywords <keywords>', 'Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools')\n .option('--dry-run', 'Simulate mutation & critical requests without real API execution')\n .option('--token-diet', 'Enable Token Diet response optimization (enabled by default)')\n .option('--no-token-diet', 'Disable Token Diet payload pruning & markdown tables')\n .option('--max-tokens <number>', 'Token ceiling per tool response', '2500')\n .option('--env-file <path>', 'Custom .env file path to load')\n .option('-c, --config <path>', 'Custom postmcp.config.json path')\n .action((spec, opts) => {\n runCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 2. Inspect Command\n program\n .command('inspect <spec>')\n .description('Inspect an OpenAPI specification: summary, methods breakdown, risk tiers, and JIT recommendation')\n .option('--json', 'Output machine-readable normalized AST JSON')\n .action((spec, opts) => {\n inspectCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 3. Generate Command\n program\n .command('generate <spec>')\n .description('Generate a complete standalone TS or PY MCP server project')\n .option('-t, --target <language>', 'Target language: ts or py (default: ts)')\n .option('-l, --lang <language>', 'Alias for --target')\n .option('-o, --out <directory>', 'Output directory for the generated project')\n .action((spec, opts) => {\n generateCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 4. Export Command\n program\n .command('export <spec>')\n .description('1-Click configuration exporter for Cursor, Claude Desktop, and Windsurf')\n .option('-t, --target <name>', 'Target client: cursor, claude, windsurf, or all')\n .option('--client <name>', 'Alias for --target')\n .option('-w, --write', 'Automatically merge and write configuration directly to the client config file on disk')\n .option('--bearer <token>', 'Bearer token for client configuration environment')\n .option('-b, --base-url <url>', 'Base URL override for client configuration environment')\n .option('-e, --env <key=val...>', 'Environment variables for client configuration', (val, prev: string[] = []) => [...prev, val])\n .action((spec, opts) => {\n const target = opts.target || opts.client || 'all';\n exportCommand(spec, { ...opts, target, client: target }).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 5. Presets Command with subcommands & default action\n const presetsCmd = program\n .command('presets')\n .description('Manage and explore bundled top 50+ API presets')\n .argument('[filter]', 'Optional search query or category filter')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('list [filter]')\n .description('List all available presets in catalog')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('sync')\n .description('Sync latest OpenAPI schemas from GitHub to local cache (~/.postmcp/presets/)')\n .action(() => {\n syncPresetsCommand().catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 6. Studio Command\n program\n .command('studio [spec]')\n .description('Launch the PostMCP Visual Web Studio')\n .option('-p, --port <port>', 'Studio port', '3000')\n .option('--dev', 'Run Next.js in Turbopack development mode')\n .option('--no-open', 'Do not automatically open browser')\n .action((spec, opts) => {\n studioCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n return program;\n}\n\nif (process.env.NODE_ENV !== 'test') {\n const cli = createCli();\n cli.parse(process.argv);\n}\n","import { parseOpenAPI, startStdioServer, startHttpServer, AuthConfig, NormalizedSpec } from '@postmcp/core';\nimport type { RunCommandOptions } from '@postmcp/types';\nimport { loadEnvFile, loadConfigFile, parseHeaderFlags, parseApiKeyFlag } from '../config/loader.js';\nimport { resolvePresetSpec, getPreset, buildPresetAuthConfig, ALL_PRESETS, Preset } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { RunCommandOptions };\n\nexport async function runCommand(specArg: string, options: RunCommandOptions): Promise<void> {\n // 1. Load environment and configuration files\n loadEnvFile(options.envFile);\n const fileConfig = loadConfigFile(options.config);\n\n let specPath: string | object | undefined = specArg || fileConfig.spec;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp run <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset: Preset | undefined = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n } else if (typeof specPath === 'string') {\n const lower = specPath.toLowerCase();\n preset = ALL_PRESETS.find(\n (p: Preset) =>\n (p.specUrl && lower.includes(p.specUrl.toLowerCase())) ||\n (p.id && (lower.includes(`/${p.id}/`) || lower.includes(`/${p.id}.`) || lower.includes(`/${p.id}-`) || lower.includes(`${p.id}.tech`)))\n );\n }\n\n // 2. Parse OpenAPI Specification\n let parsedSpec: NormalizedSpec;\n try {\n parsedSpec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse OpenAPI specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n // If preset or config defines additional composite macros, wire them into parsed spec\n if (preset && preset.macros && preset.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...preset.macros];\n }\n if (fileConfig.macros && fileConfig.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...fileConfig.macros];\n }\n\n // If config defines enabledOperations, filter out disabled operations (Finding 5)\n if (fileConfig.enabledOperations && Object.keys(fileConfig.enabledOperations).length > 0) {\n parsedSpec.operations = parsedSpec.operations.filter(\n (op: any) => fileConfig.enabledOperations![op.id] !== false\n );\n }\n\n // 3. Build Auth Configuration with preset-specific auth dispatching (Finding 1)\n const cliHeaders = parseHeaderFlags(options.header);\n const cliApiKey = parseApiKeyFlag(options.apiKey);\n const presetAuthConfig = preset ? buildPresetAuthConfig(preset, process.env) : {};\n\n const authConfig: AuthConfig = {\n headers: { ...presetAuthConfig.headers, ...fileConfig.auth?.headers, ...cliHeaders },\n bearerToken:\n options.bearer ||\n fileConfig.auth?.bearerToken ||\n presetAuthConfig.bearerToken ||\n process.env.API_KEY ||\n process.env.BEARER_TOKEN,\n apiKey: cliApiKey || fileConfig.auth?.apiKey || presetAuthConfig.apiKey,\n basicAuth: fileConfig.auth?.basicAuth || presetAuthConfig.basicAuth,\n securitySchemes: {\n ...presetAuthConfig.securitySchemes,\n ...fileConfig.auth?.securitySchemes,\n },\n allowedExternalHosts: fileConfig.auth?.allowedExternalHosts,\n allowCrossOriginAuth: fileConfig.auth?.allowCrossOriginAuth,\n };\n\n const transport = options.transport || fileConfig.transport || (options.port ? 'http' : 'stdio');\n const resolvedBaseUrl =\n options.baseUrl ||\n fileConfig.baseUrl ||\n process.env.BASE_URL ||\n (parsedSpec.servers.length > 0 ? parsedSpec.servers[0].url : preset?.defaultBaseUrl);\n\n let isJit: boolean | { forceJIT?: boolean; maxMountedTools?: number; hotToolKeywords?: string[] } | undefined;\n if (options.jit !== undefined) {\n if (typeof fileConfig.jit === 'object') {\n isJit = {\n forceJIT: options.jit,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n } else {\n isJit = options.jit;\n }\n } else if (fileConfig.jit !== undefined) {\n if (typeof fileConfig.jit === 'boolean') {\n isJit = fileConfig.jit;\n } else {\n isJit = {\n forceJIT: fileConfig.jit.enabled,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n }\n }\n const isDryRun = options.dryRun !== undefined ? options.dryRun : fileConfig.dryRun;\n const isTokenDiet = options.tokenDiet !== undefined ? options.tokenDiet : fileConfig.tokenDiet?.enabled !== false;\n const maxTokens = options.maxTokens ? parseInt(options.maxTokens, 10) : fileConfig.tokenDiet?.maxTokens || 2500;\n\n let hotToolKeywords: string[] | undefined;\n if (options.hotToolKeywords) {\n hotToolKeywords = options.hotToolKeywords.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (fileConfig.hotToolKeywords) {\n hotToolKeywords = fileConfig.hotToolKeywords;\n } else if (typeof fileConfig.jit === 'object' && fileConfig.jit.hotToolKeywords) {\n hotToolKeywords = fileConfig.jit.hotToolKeywords;\n }\n\n // 4. Build path-specific field masks from preset & file config (Finding 2 & 5)\n const pathFieldMasks: Record<string, string[]> = {};\n if (preset?.fieldMasks) {\n for (const fm of preset.fieldMasks) {\n pathFieldMasks[fm.path] = fm.fields;\n }\n }\n if (fileConfig.fieldMasks) {\n Object.assign(pathFieldMasks, fileConfig.fieldMasks);\n }\n\n const serverOptions = {\n spec: parsedSpec,\n baseUrl: resolvedBaseUrl,\n auth: authConfig,\n jit: isJit,\n hotToolKeywords,\n dryRun: isDryRun,\n tokenDiet: {\n enabled: isTokenDiet,\n maxTokens,\n pathFieldMasks: isTokenDiet && Object.keys(pathFieldMasks).length > 0 ? pathFieldMasks : undefined,\n convertToMarkdownTable: fileConfig.tokenDiet?.convertToMarkdownTable !== false,\n },\n serverName: parsedSpec.title,\n serverVersion: parsedSpec.version,\n };\n\n if (transport === 'http') {\n const port = options.port ? parseInt(options.port, 10) : fileConfig.port || 3000;\n const host = options.host || 'localhost';\n\n const { url } = await startHttpServer({\n ...serverOptions,\n port,\n host,\n });\n\n console.log(pc.green(`PostMCP Streamable HTTP server listening at: ${pc.bold(url)}`));\n console.log(pc.dim(` Service: ${parsedSpec.title} (v${parsedSpec.version}) | Endpoints: ${parsedSpec.operations.length}`));\n if (isDryRun) {\n console.log(pc.yellow(` Mode: DRY-RUN SIMULATION (Mutations simulated, no real side effects)`));\n }\n } else {\n // Default: stdio transport for Cursor, Claude Desktop, Antigravity\n await startStdioServer(serverOptions);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport dotenv from 'dotenv';\nimport { AuthConfig } from '@postmcp/core';\nimport type { PostMcpCliConfig } from '@postmcp/types';\n\nexport type { PostMcpCliConfig };\n\nexport function loadEnvFile(envFilePath?: string): void {\n if (envFilePath) {\n const resolved = path.resolve(envFilePath);\n if (fs.existsSync(resolved)) {\n dotenv.config({ path: resolved });\n }\n } else {\n // Default to .env in cwd if exists\n const defaultEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(defaultEnv)) {\n dotenv.config({ path: defaultEnv });\n }\n }\n}\n\nexport function loadConfigFile(configPath?: string): PostMcpCliConfig {\n let targetPath = configPath ? path.resolve(configPath) : null;\n\n if (!targetPath) {\n const candidates = ['postmcp.config.json', 'postmcp.json', '.postmcprc.json'];\n for (const c of candidates) {\n const candidatePath = path.resolve(process.cwd(), c);\n if (fs.existsSync(candidatePath)) {\n targetPath = candidatePath;\n break;\n }\n }\n }\n\n if (targetPath && fs.existsSync(targetPath)) {\n try {\n const content = fs.readFileSync(targetPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n return {};\n}\n\nexport function parseHeaderFlags(headers?: string[]): Record<string, string> {\n if (!headers || !Array.isArray(headers)) return {};\n const result: Record<string, string> = {};\n for (const h of headers) {\n const colonIdx = h.indexOf(':');\n if (colonIdx !== -1) {\n const key = h.slice(0, colonIdx).trim();\n const val = h.slice(colonIdx + 1).trim();\n if (key && val) {\n result[key] = val;\n }\n }\n }\n return result;\n}\n\nexport function parseApiKeyFlag(apiKeyStr?: string): { name: string; value: string; in: 'header' | 'query' | 'cookie' } | undefined {\n if (!apiKeyStr) return undefined;\n // Format: \"name=value\" or \"header:name=value\" or \"query:name=value\"\n let location: 'header' | 'query' | 'cookie' = 'header';\n let rest = apiKeyStr;\n\n if (apiKeyStr.startsWith('query:')) {\n location = 'query';\n rest = apiKeyStr.slice(6);\n } else if (apiKeyStr.startsWith('header:')) {\n location = 'header';\n rest = apiKeyStr.slice(7);\n } else if (apiKeyStr.startsWith('cookie:')) {\n location = 'cookie';\n rest = apiKeyStr.slice(7);\n }\n\n const eqIdx = rest.indexOf('=');\n if (eqIdx !== -1) {\n const name = rest.slice(0, eqIdx).trim();\n const value = rest.slice(eqIdx + 1).trim();\n if (name && value) {\n return { name, value, in: location };\n }\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport axios from 'axios';\nimport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset } from '@postmcp/presets';\n\nexport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset };\nexport const BUNDLED_PRESETS = PRESETS_BY_ID;\n\nexport function getPresetCacheDir(): string {\n try {\n const dir = path.join(os.homedir(), '.postmcp', 'presets');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n } catch {\n const fallbackDir = path.join(os.tmpdir(), 'postmcp-presets');\n if (!fs.existsSync(fallbackDir)) {\n try {\n fs.mkdirSync(fallbackDir, { recursive: true });\n } catch {\n // Ignore fallback dir creation errors\n }\n }\n return fallbackDir;\n }\n}\n\nexport async function resolvePresetSpec(presetIdOrAlias: string): Promise<string | object> {\n const cleanId = presetIdOrAlias.replace(/^@/, '').toLowerCase().trim();\n const preset = getPreset(cleanId);\n\n if (!preset) {\n throw new Error(`Unknown preset '@${cleanId}'. Run 'postmcp presets list' to see all available presets.`);\n }\n\n // Check local cache first\n const cacheDir = getPresetCacheDir();\n const cacheFile = path.join(cacheDir, `${cleanId}.json`);\n if (fs.existsSync(cacheFile)) {\n return cacheFile;\n }\n\n // If remote spec URL exists, try to fetch and cache it\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n try {\n fs.writeFileSync(cacheFile, res.data, 'utf-8');\n return cacheFile;\n } catch {\n return res.data;\n }\n } catch {\n // Remote fetch failed, fall through to bundledSpec\n }\n }\n\n // If bundledSpec exists, write to cache and return\n if (preset.bundledSpec) {\n try {\n fs.writeFileSync(cacheFile, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n return cacheFile;\n } catch {\n return preset.bundledSpec;\n }\n }\n\n if (preset.specUrl) {\n return preset.specUrl;\n }\n\n throw new Error(`Preset '@${cleanId}' has no specification available.`);\n}\n\nexport async function syncAllPresets(): Promise<string[]> {\n const synced: string[] = [];\n const cacheDir = getPresetCacheDir();\n\n for (const preset of ALL_PRESETS) {\n const filePath = path.join(cacheDir, `${preset.id}.json`);\n let wrote = false;\n\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n fs.writeFileSync(filePath, res.data, 'utf-8');\n wrote = true;\n } catch {\n // Fallback to bundled spec\n }\n }\n\n if (!wrote && preset.bundledSpec) {\n try {\n fs.writeFileSync(filePath, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n wrote = true;\n } catch {\n // Ignore filesystem write error\n }\n }\n\n if (wrote) {\n synced.push(preset.id);\n }\n }\n\n return synced;\n}\n","import { parseOpenAPI } from '@postmcp/core';\nimport type { InspectCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec, getPreset } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport type { InspectCommandOptions };\n\nexport function estimateSpecTokenSavings(spec: any): { rawTokens: number; optimizedTokens: number; savingsPct: number } {\n const rawTokensPerOp = spec.operations.map((op: any) => {\n const descLen = (op.description || op.summary || '').length;\n const schemaLen = JSON.stringify(op.inputSchema || {}).length;\n return Math.ceil((descLen + schemaLen + 50) / 4);\n });\n\n const totalRawToolTokens = rawTokensPerOp.reduce((a: number, b: number) => a + b, 0);\n // In JIT mode, prompt contains tool_search (~120 tokens) + max 5 mounted active tools\n const avgOpTokens = spec.operations.length > 0 ? Math.ceil(totalRawToolTokens / spec.operations.length) : 0;\n const jitPromptTokens = 120 + Math.min(spec.operations.length, 5) * Math.ceil(avgOpTokens * 0.4); // 40% with diet\n\n const raw = Math.max(totalRawToolTokens, 200);\n const optimized = Math.min(raw, jitPromptTokens);\n const savingsPct = Math.max(15, Math.round(((raw - optimized) / raw) * 100));\n\n return {\n rawTokens: raw,\n optimizedTokens: optimized,\n savingsPct,\n };\n}\n\nexport async function inspectCommand(specArg: string, options: InspectCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp inspect <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n if (preset && preset.macros && preset.macros.length > 0) {\n spec.macros = [...(spec.macros || []), ...preset.macros];\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(spec, null, 2));\n return;\n }\n\n // Token savings estimation\n const tokenMetrics = estimateSpecTokenSavings(spec);\n\n // Header Banner\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP API Inspection: ${spec.title} (v${spec.version})`)));\n if (spec.description) {\n console.log(pc.dim(spec.description.slice(0, 120) + (spec.description.length > 120 ? '...' : '')));\n }\n console.log();\n\n // 1. Overview Table\n const overviewTable = new Table({\n head: [pc.bold('Metric'), pc.bold('Value')],\n colWidths: [25, 55],\n });\n\n const totalOps = spec.operations.length;\n const methodsCount: Record<string, number> = {};\n const riskCounts = { READ_ONLY: 0, MUTATION: 0, CRITICAL: 0 };\n\n for (const op of spec.operations) {\n const m = op.method.toUpperCase();\n methodsCount[m] = (methodsCount[m] || 0) + 1;\n riskCounts[op.riskTier] = (riskCounts[op.riskTier] || 0) + 1;\n }\n\n const methodsStr = Object.entries(methodsCount)\n .map(([m, c]) => `${m}: ${c}`)\n .join(' | ');\n\n const defaultUrl = spec.servers.length > 0 ? spec.servers[0].url : 'None declared';\n const secSchemeEntries = Object.entries<any>(spec.securitySchemes || {});\n let secSchemesDisplay = 'None declared';\n if (secSchemeEntries.length > 0) {\n secSchemesDisplay = secSchemeEntries\n .map(([name, s]) => {\n if (s.type === 'http') return `${name} (HTTP ${s.scheme || 'bearer'})`;\n if (s.type === 'apiKey') return `${name} (API key in ${s.in || 'header'}: ${s.name || name})`;\n return `${name} (${s.type || 'custom'})`;\n })\n .join(', ');\n }\n const recommendedJit = totalOps > 20 ? pc.green('Yes (Dynamic JIT routing recommended)') : pc.blue('No (Static direct tools)');\n const savingsDisplay = pc.green(`~${tokenMetrics.savingsPct}% (${tokenMetrics.rawTokens.toLocaleString()} → ${tokenMetrics.optimizedTokens.toLocaleString()} tokens)`);\n\n overviewTable.push(\n ['Total Endpoints', `${totalOps} operations`],\n ['HTTP Methods', methodsStr],\n ['Base URL', defaultUrl],\n ['Security Schemes', secSchemesDisplay],\n ['JIT Router Mode', recommendedJit],\n ['Est. Token Savings', savingsDisplay],\n ['Macros / Workflows', `${spec.macros?.length || 0} composite macros`]\n );\n\n console.log(overviewTable.toString());\n console.log();\n\n // 2. Token Diet & Context Optimization Preview\n console.log(pc.bold('Token Diet & Context Optimization Preview:'));\n console.log(` ● Full Static Tool Declarations: ~${tokenMetrics.rawTokens.toLocaleString()} tokens`);\n console.log(` ● PostMCP JIT + Token Diet: ~${tokenMetrics.optimizedTokens.toLocaleString()} tokens`);\n console.log(` ● Context Window Savings: ${pc.bold(pc.green(`~${tokenMetrics.savingsPct}% saved`))}`);\n console.log();\n\n // 3. Authentication Guide\n if (secSchemeEntries.length > 0) {\n console.log(pc.bold('Authentication Guide:'));\n for (const [name, scheme] of secSchemeEntries) {\n if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'bearer') {\n console.log(` ● ${pc.cyan(name)}: HTTP Bearer Token`);\n console.log(` Header: Authorization: Bearer <token>`);\n console.log(` CLI Option: --bearer <token> (e.g. --bearer $MY_API_KEY)`);\n console.log(` Environment: BEARER_TOKEN or API_KEY`);\n } else if (scheme.type === 'apiKey') {\n const loc = scheme.in || 'header';\n const keyName = scheme.name || name;\n console.log(` ● ${pc.cyan(name)}: API Key in ${loc} (${pc.bold(keyName)})`);\n if (loc === 'header') {\n console.log(` CLI Option: --api-key \"${keyName}=<token>\" or -H \"${keyName}: <token>\"`);\n } else if (loc === 'query') {\n console.log(` CLI Option: --api-key \"query:${keyName}=<token>\"`);\n }\n console.log(` Environment: Set via custom header / config`);\n } else if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'basic') {\n console.log(` ● ${pc.cyan(name)}: HTTP Basic Auth`);\n console.log(` CLI Option: -H \"Authorization: Basic <base64>\"`);\n } else {\n console.log(` ● ${pc.cyan(name)}: ${scheme.type || 'Custom'}`);\n }\n }\n console.log();\n }\n\n // 4. Risk Tiers Breakdown\n console.log(pc.bold('Safety & Risk Tier Breakdown:'));\n console.log(` ${pc.green('● READ_ONLY')}: ${riskCounts.READ_ONLY} endpoints (Safe for autonomous exploration)`);\n console.log(` ${pc.yellow('● MUTATION')}: ${riskCounts.MUTATION} endpoints (Creates or updates data)`);\n console.log(` ${pc.red('● CRITICAL')}: ${riskCounts.CRITICAL} endpoints (Destructive actions / simulated in dry-run)`);\n console.log();\n\n // 4. Sample Endpoints List\n console.log(pc.bold(`Operations List (Showing first 10 of ${totalOps}):`));\n const opTable = new Table({\n head: [pc.bold('Tool Name (ID)'), pc.bold('Method'), pc.bold('Path'), pc.bold('Risk Tier')],\n colWidths: [22, 10, 32, 14],\n });\n\n const sampleOps = spec.operations.slice(0, 10);\n for (const op of sampleOps) {\n const tierColor =\n op.riskTier === 'READ_ONLY' ? pc.green(op.riskTier) : op.riskTier === 'CRITICAL' ? pc.red(op.riskTier) : pc.yellow(op.riskTier);\n opTable.push([op.id, op.method.toUpperCase(), op.path, tierColor]);\n }\n\n console.log(opTable.toString());\n if (totalOps > 10) {\n console.log(pc.dim(` ... and ${totalOps - 10} more endpoints.`));\n }\n console.log();\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseOpenAPI, generateProject, generateTypeScriptProject, generatePythonProject } from '@postmcp/core';\nimport type { GenerateCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { GenerateCommandOptions };\n\nexport async function generateCommand(specArg: string, options: GenerateCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp generate <spec-path-or-url-or-@preset> --target <python|typescript>'));\n process.exit(1);\n return;\n }\n\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n const rawLang = (options.lang || options.target || 'ts').toLowerCase();\n let targetLang: 'ts' | 'py';\n if (rawLang === 'ts' || rawLang === 'typescript') {\n targetLang = 'ts';\n } else if (rawLang === 'py' || rawLang === 'python') {\n targetLang = 'py';\n } else {\n console.error(pc.red(`Unsupported language '${rawLang}'. Supported languages: 'ts', 'py'.`));\n process.exit(1);\n return;\n }\n\n const outDir = path.resolve(options.out || `./${spec.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp`);\n\n console.log(pc.cyan(`Generating standalone ${pc.bold(targetLang.toUpperCase())} MCP server for '${spec.title}'...`));\n\n const project = targetLang === 'ts'\n ? generateTypeScriptProject(spec)\n : generatePythonProject(spec);\n\n // Write files to target directory\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const [relativePath, content] of Object.entries(project.files)) {\n const filePath = path.join(outDir, relativePath);\n const parentDir = path.dirname(filePath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n console.log(` ${pc.green('+')} ${relativePath}`);\n }\n\n console.log();\n console.log(pc.green(`Standalone MCP server successfully generated at:`));\n console.log(` ${pc.bold(outDir)}`);\n console.log();\n console.log(pc.dim('Next steps:'));\n if (targetLang === 'ts') {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' npm install');\n console.log(' npm run build');\n console.log(' npm start');\n } else {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' pip install -r requirements.txt');\n console.log(' python server.py');\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { parseOpenAPI } from '@postmcp/core';\nimport type { ExportCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { ExportCommandOptions };\n\nexport function getClientConfigPath(client: 'cursor' | 'claude' | 'windsurf'): string {\n const home = os.homedir();\n if (client === 'cursor') {\n return path.join(process.cwd(), '.cursor', 'mcp.json');\n }\n if (client === 'claude') {\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n if (process.platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n // Linux\n return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');\n }\n if (client === 'windsurf') {\n return path.join(home, '.codeium', 'windsurf', 'mcp_config.json');\n }\n return path.join(process.cwd(), 'mcp.json');\n}\n\nexport function buildClientConfigSnippet(\n serverKey: string,\n specPath: string,\n options: ExportCommandOptions\n): object {\n const env: Record<string, string> = {};\n if (options.bearer) {\n env['API_KEY'] = options.bearer;\n }\n if (options.baseUrl) {\n env['BASE_URL'] = options.baseUrl;\n }\n if (options.env) {\n for (const e of options.env) {\n const [k, v] = e.split('=');\n if (k && v) env[k] = v;\n }\n }\n\n return {\n mcpServers: {\n [serverKey]: {\n command: 'npx',\n args: ['-y', '@postmcp/cli', 'run', specPath],\n env: Object.keys(env).length > 0 ? env : undefined,\n },\n },\n };\n}\n\nexport async function exportCommand(specArg: string, options: ExportCommandOptions): Promise<void> {\n let specPath = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp export <spec-path-or-url-or-@preset> --target cursor|claude|windsurf|all'));\n process.exit(1);\n }\n\n let serverKey = 'api-server';\n if (specPath.startsWith('@')) {\n serverKey = specPath.replace(/^@/, '').toLowerCase();\n } else {\n try {\n const parsed = await parseOpenAPI(specPath);\n serverKey = parsed.title.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'api-server';\n } catch {\n serverKey = 'api-server';\n }\n }\n\n const selectedTarget = (options.client || options.target || 'all').toLowerCase();\n const clientsToExport: Array<'cursor' | 'claude' | 'windsurf'> =\n selectedTarget === 'all'\n ? ['cursor', 'claude', 'windsurf']\n : [selectedTarget as 'cursor' | 'claude' | 'windsurf'];\n\n console.log(pc.bold(pc.cyan(`PostMCP 1-Click Client Configuration Exporter`)));\n console.log();\n\n for (const c of clientsToExport) {\n const configPath = getClientConfigPath(c);\n const snippet = buildClientConfigSnippet(serverKey, specPath, options);\n const formattedSnippet = JSON.stringify(snippet, null, 2);\n\n console.log(pc.bold(pc.green(`▶ ${c.toUpperCase()} (${c === 'cursor' ? 'Project Local' : 'Global Client'})`)));\n console.log(pc.dim(` Config path: ${configPath}`));\n console.log();\n console.log(pc.gray(formattedSnippet));\n console.log();\n\n if (options.write) {\n try {\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, 'utf-8');\n existingConfig = JSON.parse(raw);\n }\n\n existingConfig.mcpServers = existingConfig.mcpServers || {};\n existingConfig.mcpServers[serverKey] = (snippet as any).mcpServers[serverKey];\n\n const parentDir = path.dirname(configPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), 'utf-8');\n console.log(pc.green(` Successfully merged and written to ${configPath}`));\n } catch (err: any) {\n console.error(pc.red(` Failed to write to ${configPath}: ${err.message}`));\n }\n console.log();\n }\n }\n\n if (!options.write) {\n console.log(pc.dim(`Tip: Pass '--write' to automatically install this configuration into your client settings.`));\n }\n}\n","import { ALL_PRESETS, syncAllPresets } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport async function listPresetsCommand(categoryOrQuery?: string): Promise<void> {\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP Presets Catalog (${ALL_PRESETS.length} Curated Developer APIs)`)));\n console.log(pc.dim(`Run any preset instantly using: postmcp run @<preset_id>`));\n console.log();\n\n let displayedPresets = ALL_PRESETS;\n if (categoryOrQuery) {\n const q = categoryOrQuery.toLowerCase().trim();\n displayedPresets = ALL_PRESETS.filter((p: any) => {\n return (\n p.id.toLowerCase().includes(q) ||\n p.name.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n (p.tags && p.tags.some((t: string) => t.toLowerCase().includes(q)))\n );\n });\n }\n\n const table = new Table({\n head: [pc.bold('Preset ID'), pc.bold('API Name'), pc.bold('Category'), pc.bold('Authentication'), pc.bold('Run Command')],\n colWidths: [14, 26, 22, 28, 26],\n });\n\n for (const meta of displayedPresets) {\n table.push([\n pc.bold(pc.magenta(`@${meta.id}`)),\n meta.name,\n meta.category,\n pc.dim(meta.authType),\n pc.green(`postmcp run @${meta.id}`),\n ]);\n }\n\n console.log(table.toString());\n console.log();\n console.log(pc.dim(`Total Presets: ${displayedPresets.length} of ${ALL_PRESETS.length}`));\n console.log(pc.dim(`Run 'postmcp presets sync' to update offline cached schemas from GitHub.`));\n console.log();\n}\n\nexport async function syncPresetsCommand(): Promise<void> {\n console.log(pc.cyan(`Syncing latest OpenAPI schemas for all presets...`));\n try {\n const synced = await syncAllPresets();\n console.log(pc.green(`Successfully synced ${synced.length} presets to local cache (~/.postmcp/presets/):`));\n for (const id of synced) {\n console.log(` ${pc.green('●')} @${id}`);\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to sync presets: ${err.message}`));\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { spawn, ChildProcess } from 'node:child_process';\nimport open from 'open';\nimport axios from 'axios';\nimport pc from 'picocolors';\n\nexport interface StudioCommandOptions {\n port?: string;\n noOpen?: boolean;\n dev?: boolean;\n}\n\nexport function findStudioDir(): string {\n // 1. Check workspace and local monorepo paths first\n const workspaceCandidates = [\n path.resolve(process.cwd(), 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', 'studio'),\n path.resolve(__dirname, '..', '..', '..', 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', '..', '..', 'packages', 'studio'),\n ];\n\n for (const candidate of workspaceCandidates) {\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n }\n\n // 2. Search upwards from cwd and __dirname for monorepo packages/studio\n for (const startDir of [process.cwd(), __dirname]) {\n let cur = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(cur, 'packages', 'studio');\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n }\n\n // 3. Try resolving via Node module resolution (published npx postmcp)\n try {\n const customRequire = typeof createRequire !== 'undefined' ? createRequire(__filename) : (require as any);\n const pkgPath = customRequire.resolve('@postmcp/studio/package.json');\n if (fs.existsSync(pkgPath)) {\n const resolved = path.dirname(pkgPath);\n // If resolved into .pnpm cache inside a monorepo, prefer the live monorepo packages/studio\n const monorepoCandidate = path.resolve(resolved, '../../../../packages/studio');\n if (fs.existsSync(path.join(monorepoCandidate, 'package.json'))) {\n return monorepoCandidate;\n }\n return resolved;\n }\n } catch {\n // Module resolution fallback\n }\n\n // Fallback to packages/studio in workspace\n return path.resolve(process.cwd(), 'packages', 'studio');\n}\n\nexport async function waitForServer(url: string, timeoutMs: number = 20000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await axios.get(url, { timeout: 1000, validateStatus: () => true });\n if (res.status >= 200 && res.status < 500) {\n return true;\n }\n } catch {\n // Server not ready yet\n }\n await new Promise((r) => setTimeout(r, 400));\n }\n return false;\n}\n\nexport async function studioCommand(specArg?: string, options: StudioCommandOptions = {}): Promise<void> {\n const port = options.port || '3000';\n const baseUrl = `http://localhost:${port}`;\n const targetUrl = specArg ? `${baseUrl}?spec=${encodeURIComponent(specArg)}` : baseUrl;\n const studioDir = findStudioDir();\n\n console.log();\n console.log(pc.bold(pc.cyan(`Starting PostMCP Visual Web Studio...`)));\n console.log(` Port: ${pc.bold(pc.green(port))}`);\n console.log(` Studio Dir: ${pc.dim(studioDir)}`);\n if (specArg) {\n console.log(` Initial Spec: ${pc.dim(specArg)}`);\n }\n console.log();\n\n let child: ChildProcess | null = null;\n\n if (fs.existsSync(studioDir)) {\n const srcDir = path.join(studioDir, 'src');\n const nextDir = path.join(studioDir, '.next');\n let isStale = false;\n if (fs.existsSync(srcDir) && fs.existsSync(nextDir)) {\n try {\n const nextMtime = fs.statSync(nextDir).mtimeMs;\n const pageMtime = fs.statSync(path.join(srcDir, 'app', 'page.tsx')).mtimeMs;\n if (pageMtime > nextMtime) {\n isStale = true;\n }\n } catch {}\n }\n\n const isBuilt = fs.existsSync(nextDir) && !isStale;\n const preferDev = options.dev || isStale;\n // In standalone or monorepo environments, prefer npx next or pnpm\n const isPnpm = fs.existsSync(path.join(studioDir, '..', '..', 'pnpm-lock.yaml'));\n const command = isPnpm ? 'pnpm' : 'npx';\n const args = isPnpm\n ? isBuilt && !preferDev\n ? ['start', '--port', port]\n : ['dev', '--port', port]\n : isBuilt && !preferDev\n ? ['next', 'start', '-p', port]\n : ['next', 'dev', '-p', port];\n\n try {\n child = spawn(command, args, {\n cwd: studioDir,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: port,\n NEXT_PUBLIC_INITIAL_SPEC: specArg || '',\n STUDIO_INITIAL_SPEC: specArg || '',\n POSTMCP_WORKSPACE: process.cwd(),\n WORKSPACE_CWD: process.cwd(),\n },\n });\n\n const cleanup = () => {\n if (child) {\n try {\n child.kill('SIGINT');\n } catch {\n // Ignore kill errors\n }\n }\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('exit', cleanup);\n } catch (err: any) {\n console.log(pc.yellow(` Note: Running in detached standalone mode: ${err.message}`));\n }\n }\n\n // Wait for server to become responsive\n const isReady = await waitForServer(baseUrl, 15000);\n\n if (isReady) {\n console.log(pc.green(`PostMCP Visual Web Studio ready at: ${pc.bold(targetUrl)}`));\n } else {\n console.log(pc.dim(` Studio server starting at: ${targetUrl}`));\n }\n\n if (!options.noOpen) {\n try {\n await open(targetUrl);\n console.log(pc.dim(`Opening Web Studio in your default browser...`));\n } catch {\n console.log(pc.dim(`Please open ${targetUrl} in your browser.`));\n }\n }\n\n // If running interactively, wait for child process\n if (child) {\n await new Promise<void>((resolve) => {\n child?.on('close', () => resolve());\n });\n }\n}\n"],"mappings":"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","names":["dotenv","fs","path","axios","pc","import_core","import_picocolors","pc","Table","fs","path","import_core","import_picocolors","pc","fs","path","os","import_core","import_picocolors","pc","import_cli_table3","import_picocolors","pc","Table","path","fs","import_axios","import_picocolors","axios","pc","open","resolve","import_picocolors","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin.ts","../src/commands/run.ts","../src/config/loader.ts","../src/presets/index.ts","../src/commands/inspect.ts","../src/commands/generate.ts","../src/commands/export.ts","../src/commands/presets.ts","../src/commands/studio.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { inspectCommand } from './commands/inspect.js';\nimport { generateCommand } from './commands/generate.js';\nimport { exportCommand } from './commands/export.js';\nimport { listPresetsCommand, syncPresetsCommand } from './commands/presets.js';\nimport { studioCommand } from './commands/studio.js';\nimport { readFileSync } from 'fs';\nimport { resolve } from 'path';\nimport pc from 'picocolors';\n\ndeclare const __POSTMCP_VERSION__: string | undefined;\n\nfunction getCliVersion(): string {\n if (typeof __POSTMCP_VERSION__ === 'string') {\n return __POSTMCP_VERSION__;\n }\n try {\n const dir = typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n const pkg = JSON.parse(readFileSync(resolve(dir, '../package.json'), 'utf8'));\n return pkg.version || 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('postmcp')\n .description('The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.')\n .version(getCliVersion());\n\n // 1. Run Command\n program\n .command('run [spec]')\n .description('Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec')\n .option('-b, --base-url <url>', 'Override target API base URL')\n .option('-t, --transport <type>', 'Transport type: stdio or http (default: stdio)', 'stdio')\n .option('-p, --port <number>', 'Port for Streamable HTTP server')\n .option('-H, --header <key:value...>', 'Custom request headers (can be specified multiple times)', (val, prev: string[] = []) => [...prev, val])\n .option('--bearer <token>', 'Bearer authentication token or $ENV_VAR')\n .option('--api-key <name=value>', 'API key credentials (e.g. key=val, header:key=val, query:key=val)')\n .option('--jit', 'Force Just-In-Time dynamic tool routing')\n .option('--no-jit', 'Disable JIT mode and expose all tools statically')\n .option('--hot-tool-keywords <keywords>', 'Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools')\n .option('--dry-run', 'Simulate mutation & critical requests without real API execution')\n .option('--token-diet', 'Enable Token Diet response optimization (enabled by default)')\n .option('--no-token-diet', 'Disable Token Diet payload pruning & markdown tables')\n .option('--max-tokens <number>', 'Token ceiling per tool response', '2500')\n .option('--env-file <path>', 'Custom .env file path to load')\n .option('-c, --config <path>', 'Custom postmcp.config.json path')\n .action((spec, opts) => {\n runCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 2. Inspect Command\n program\n .command('inspect <spec>')\n .description('Inspect an OpenAPI specification: summary, methods breakdown, risk tiers, and JIT recommendation')\n .option('--json', 'Output machine-readable normalized AST JSON')\n .action((spec, opts) => {\n inspectCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 3. Generate Command\n program\n .command('generate <spec>')\n .description('Generate a complete standalone TS or PY MCP server project')\n .option('-t, --target <language>', 'Target language: ts or py (default: ts)')\n .option('-l, --lang <language>', 'Alias for --target')\n .option('-o, --out <directory>', 'Output directory for the generated project')\n .action((spec, opts) => {\n generateCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 4. Export Command\n program\n .command('export <spec>')\n .description('1-Click configuration exporter for Cursor, Claude Desktop, and Windsurf')\n .option('-t, --target <name>', 'Target client: cursor, claude, windsurf, or all')\n .option('--client <name>', 'Alias for --target')\n .option('-w, --write', 'Automatically merge and write configuration directly to the client config file on disk')\n .option('--bearer <token>', 'Bearer token for client configuration environment')\n .option('-b, --base-url <url>', 'Base URL override for client configuration environment')\n .option('-e, --env <key=val...>', 'Environment variables for client configuration', (val, prev: string[] = []) => [...prev, val])\n .action((spec, opts) => {\n const target = opts.target || opts.client || 'all';\n exportCommand(spec, { ...opts, target, client: target }).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 5. Presets Command with subcommands & default action\n const presetsCmd = program\n .command('presets')\n .description('Manage and explore bundled top 50+ API presets')\n .argument('[filter]', 'Optional search query or category filter')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('list [filter]')\n .description('List all available presets in catalog')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('sync')\n .description('Sync latest OpenAPI schemas from GitHub to local cache (~/.postmcp/presets/)')\n .action(() => {\n syncPresetsCommand().catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 6. Studio Command\n program\n .command('studio [spec]')\n .description('Launch the PostMCP Visual Web Studio')\n .option('-p, --port <port>', 'Studio port', '3000')\n .option('--dev', 'Run Next.js in Turbopack development mode')\n .option('--no-open', 'Do not automatically open browser')\n .action((spec, opts) => {\n studioCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n return program;\n}\n\nif (process.env.NODE_ENV !== 'test') {\n const cli = createCli();\n cli.parse(process.argv);\n}\n","import { parseOpenAPI, startStdioServer, startHttpServer, AuthConfig, NormalizedSpec } from '@postmcp/core';\nimport type { RunCommandOptions } from '@postmcp/types';\nimport { loadEnvFile, loadConfigFile, parseHeaderFlags, parseApiKeyFlag } from '../config/loader.js';\nimport { resolvePresetSpec, getPreset, buildPresetAuthConfig, ALL_PRESETS, Preset } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { RunCommandOptions };\n\nexport async function runCommand(specArg: string, options: RunCommandOptions): Promise<void> {\n // 1. Load environment and configuration files\n loadEnvFile(options.envFile);\n const fileConfig = loadConfigFile(options.config);\n\n let specPath: string | object | undefined = specArg || fileConfig.spec;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp run <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset: Preset | undefined = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n } else if (typeof specPath === 'string') {\n const lower = specPath.toLowerCase();\n preset = ALL_PRESETS.find(\n (p: Preset) =>\n (p.specUrl && lower.includes(p.specUrl.toLowerCase())) ||\n (p.id && (lower.includes(`/${p.id}/`) || lower.includes(`/${p.id}.`) || lower.includes(`/${p.id}-`) || lower.includes(`${p.id}.tech`)))\n );\n }\n\n // 2. Parse OpenAPI Specification\n let parsedSpec: NormalizedSpec;\n try {\n parsedSpec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse OpenAPI specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n // If preset or config defines additional composite macros, wire them into parsed spec\n if (preset && preset.macros && preset.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...preset.macros];\n }\n if (fileConfig.macros && fileConfig.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...fileConfig.macros];\n }\n\n // If config defines enabledOperations, filter out disabled operations (Finding 5)\n if (fileConfig.enabledOperations && Object.keys(fileConfig.enabledOperations).length > 0) {\n parsedSpec.operations = parsedSpec.operations.filter(\n (op: any) => fileConfig.enabledOperations![op.id] !== false\n );\n }\n\n // 3. Build Auth Configuration with preset-specific auth dispatching (Finding 1)\n const cliHeaders = parseHeaderFlags(options.header);\n const cliApiKey = parseApiKeyFlag(options.apiKey);\n const presetAuthConfig = preset ? buildPresetAuthConfig(preset, process.env) : {};\n\n const authConfig: AuthConfig = {\n headers: { ...presetAuthConfig.headers, ...fileConfig.auth?.headers, ...cliHeaders },\n bearerToken:\n options.bearer ||\n fileConfig.auth?.bearerToken ||\n presetAuthConfig.bearerToken ||\n process.env.API_KEY ||\n process.env.BEARER_TOKEN,\n apiKey: cliApiKey || fileConfig.auth?.apiKey || presetAuthConfig.apiKey,\n basicAuth: fileConfig.auth?.basicAuth || presetAuthConfig.basicAuth,\n securitySchemes: {\n ...presetAuthConfig.securitySchemes,\n ...fileConfig.auth?.securitySchemes,\n },\n allowedExternalHosts: fileConfig.auth?.allowedExternalHosts,\n allowCrossOriginAuth: fileConfig.auth?.allowCrossOriginAuth,\n };\n\n const transport = options.transport || fileConfig.transport || (options.port ? 'http' : 'stdio');\n const resolvedBaseUrl =\n options.baseUrl ||\n fileConfig.baseUrl ||\n process.env.BASE_URL ||\n (parsedSpec.servers.length > 0 ? parsedSpec.servers[0].url : preset?.defaultBaseUrl);\n\n let isJit: boolean | { forceJIT?: boolean; maxMountedTools?: number; hotToolKeywords?: string[] } | undefined;\n if (options.jit !== undefined) {\n if (typeof fileConfig.jit === 'object') {\n isJit = {\n forceJIT: options.jit,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n } else {\n isJit = options.jit;\n }\n } else if (fileConfig.jit !== undefined) {\n if (typeof fileConfig.jit === 'boolean') {\n isJit = fileConfig.jit;\n } else {\n isJit = {\n forceJIT: fileConfig.jit.enabled,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n }\n }\n const isDryRun = options.dryRun !== undefined ? options.dryRun : fileConfig.dryRun;\n const isTokenDiet = options.tokenDiet !== undefined ? options.tokenDiet : fileConfig.tokenDiet?.enabled !== false;\n const maxTokens = options.maxTokens ? parseInt(options.maxTokens, 10) : fileConfig.tokenDiet?.maxTokens || 2500;\n\n let hotToolKeywords: string[] | undefined;\n if (options.hotToolKeywords) {\n hotToolKeywords = options.hotToolKeywords.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (fileConfig.hotToolKeywords) {\n hotToolKeywords = fileConfig.hotToolKeywords;\n } else if (typeof fileConfig.jit === 'object' && fileConfig.jit.hotToolKeywords) {\n hotToolKeywords = fileConfig.jit.hotToolKeywords;\n }\n\n // 4. Build path-specific field masks from preset & file config (Finding 2 & 5)\n const pathFieldMasks: Record<string, string[]> = {};\n if (preset?.fieldMasks) {\n for (const fm of preset.fieldMasks) {\n pathFieldMasks[fm.path] = fm.fields;\n }\n }\n if (fileConfig.fieldMasks) {\n Object.assign(pathFieldMasks, fileConfig.fieldMasks);\n }\n\n const serverOptions = {\n spec: parsedSpec,\n baseUrl: resolvedBaseUrl,\n auth: authConfig,\n jit: isJit,\n hotToolKeywords,\n dryRun: isDryRun,\n tokenDiet: {\n enabled: isTokenDiet,\n maxTokens,\n pathFieldMasks: isTokenDiet && Object.keys(pathFieldMasks).length > 0 ? pathFieldMasks : undefined,\n convertToMarkdownTable: fileConfig.tokenDiet?.convertToMarkdownTable !== false,\n },\n serverName: parsedSpec.title,\n serverVersion: parsedSpec.version,\n };\n\n if (transport === 'http') {\n const port = options.port ? parseInt(options.port, 10) : fileConfig.port || 3000;\n const host = options.host || 'localhost';\n\n const { url } = await startHttpServer({\n ...serverOptions,\n port,\n host,\n });\n\n console.log(pc.green(`PostMCP Streamable HTTP server listening at: ${pc.bold(url)}`));\n console.log(pc.dim(` Service: ${parsedSpec.title} (v${parsedSpec.version}) | Endpoints: ${parsedSpec.operations.length}`));\n if (isDryRun) {\n console.log(pc.yellow(` Mode: DRY-RUN SIMULATION (Mutations simulated, no real side effects)`));\n }\n } else {\n // Default: stdio transport for Cursor, Claude Desktop, Antigravity\n await startStdioServer(serverOptions);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport dotenv from 'dotenv';\nimport { AuthConfig } from '@postmcp/core';\nimport type { PostMcpCliConfig } from '@postmcp/types';\n\nexport type { PostMcpCliConfig };\n\nexport function loadEnvFile(envFilePath?: string): void {\n if (envFilePath) {\n const resolved = path.resolve(envFilePath);\n if (fs.existsSync(resolved)) {\n dotenv.config({ path: resolved });\n }\n } else {\n // Default to .env in cwd if exists\n const defaultEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(defaultEnv)) {\n dotenv.config({ path: defaultEnv });\n }\n }\n}\n\nexport function loadConfigFile(configPath?: string): PostMcpCliConfig {\n let targetPath = configPath ? path.resolve(configPath) : null;\n\n if (!targetPath) {\n const candidates = ['postmcp.config.json', 'postmcp.json', '.postmcprc.json'];\n for (const c of candidates) {\n const candidatePath = path.resolve(process.cwd(), c);\n if (fs.existsSync(candidatePath)) {\n targetPath = candidatePath;\n break;\n }\n }\n }\n\n if (targetPath && fs.existsSync(targetPath)) {\n try {\n const content = fs.readFileSync(targetPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n return {};\n}\n\nexport function parseHeaderFlags(headers?: string[]): Record<string, string> {\n if (!headers || !Array.isArray(headers)) return {};\n const result: Record<string, string> = {};\n for (const h of headers) {\n const colonIdx = h.indexOf(':');\n if (colonIdx !== -1) {\n const key = h.slice(0, colonIdx).trim();\n const val = h.slice(colonIdx + 1).trim();\n if (key && val) {\n result[key] = val;\n }\n }\n }\n return result;\n}\n\nexport function parseApiKeyFlag(apiKeyStr?: string): { name: string; value: string; in: 'header' | 'query' | 'cookie' } | undefined {\n if (!apiKeyStr) return undefined;\n // Format: \"name=value\" or \"header:name=value\" or \"query:name=value\"\n let location: 'header' | 'query' | 'cookie' = 'header';\n let rest = apiKeyStr;\n\n if (apiKeyStr.startsWith('query:')) {\n location = 'query';\n rest = apiKeyStr.slice(6);\n } else if (apiKeyStr.startsWith('header:')) {\n location = 'header';\n rest = apiKeyStr.slice(7);\n } else if (apiKeyStr.startsWith('cookie:')) {\n location = 'cookie';\n rest = apiKeyStr.slice(7);\n }\n\n const eqIdx = rest.indexOf('=');\n if (eqIdx !== -1) {\n const name = rest.slice(0, eqIdx).trim();\n const value = rest.slice(eqIdx + 1).trim();\n if (name && value) {\n return { name, value, in: location };\n }\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport axios from 'axios';\nimport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset } from '@postmcp/presets';\n\nexport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset };\nexport const BUNDLED_PRESETS = PRESETS_BY_ID;\n\nexport function getPresetCacheDir(): string {\n try {\n const dir = path.join(os.homedir(), '.postmcp', 'presets');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n } catch {\n const fallbackDir = path.join(os.tmpdir(), 'postmcp-presets');\n if (!fs.existsSync(fallbackDir)) {\n try {\n fs.mkdirSync(fallbackDir, { recursive: true });\n } catch {\n // Ignore fallback dir creation errors\n }\n }\n return fallbackDir;\n }\n}\n\nexport async function resolvePresetSpec(presetIdOrAlias: string): Promise<string | object> {\n const cleanId = presetIdOrAlias.replace(/^@/, '').toLowerCase().trim();\n const preset = getPreset(cleanId);\n\n if (!preset) {\n throw new Error(`Unknown preset '@${cleanId}'. Run 'postmcp presets list' to see all available presets.`);\n }\n\n // Check local cache first\n const cacheDir = getPresetCacheDir();\n const cacheFile = path.join(cacheDir, `${cleanId}.json`);\n if (fs.existsSync(cacheFile)) {\n return cacheFile;\n }\n\n // If remote spec URL exists, try to fetch and cache it\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n try {\n fs.writeFileSync(cacheFile, res.data, 'utf-8');\n return cacheFile;\n } catch {\n return res.data;\n }\n } catch {\n // Remote fetch failed, fall through to bundledSpec\n }\n }\n\n // If bundledSpec exists, write to cache and return\n if (preset.bundledSpec) {\n try {\n fs.writeFileSync(cacheFile, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n return cacheFile;\n } catch {\n return preset.bundledSpec;\n }\n }\n\n if (preset.specUrl) {\n return preset.specUrl;\n }\n\n throw new Error(`Preset '@${cleanId}' has no specification available.`);\n}\n\nexport async function syncAllPresets(): Promise<string[]> {\n const synced: string[] = [];\n const cacheDir = getPresetCacheDir();\n\n for (const preset of ALL_PRESETS) {\n const filePath = path.join(cacheDir, `${preset.id}.json`);\n let wrote = false;\n\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n fs.writeFileSync(filePath, res.data, 'utf-8');\n wrote = true;\n } catch {\n // Fallback to bundled spec\n }\n }\n\n if (!wrote && preset.bundledSpec) {\n try {\n fs.writeFileSync(filePath, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n wrote = true;\n } catch {\n // Ignore filesystem write error\n }\n }\n\n if (wrote) {\n synced.push(preset.id);\n }\n }\n\n return synced;\n}\n","import { parseOpenAPI } from '@postmcp/core';\nimport type { InspectCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec, getPreset } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport type { InspectCommandOptions };\n\nexport function estimateSpecTokenSavings(spec: any): { rawTokens: number; optimizedTokens: number; savingsPct: number } {\n const rawTokensPerOp = spec.operations.map((op: any) => {\n const descLen = (op.description || op.summary || '').length;\n const schemaLen = JSON.stringify(op.inputSchema || {}).length;\n return Math.ceil((descLen + schemaLen + 50) / 4);\n });\n\n const totalRawToolTokens = rawTokensPerOp.reduce((a: number, b: number) => a + b, 0);\n // In JIT mode, prompt contains tool_search (~120 tokens) + max 5 mounted active tools\n const avgOpTokens = spec.operations.length > 0 ? Math.ceil(totalRawToolTokens / spec.operations.length) : 0;\n const jitPromptTokens = 120 + Math.min(spec.operations.length, 5) * Math.ceil(avgOpTokens * 0.4); // 40% with diet\n\n const raw = Math.max(totalRawToolTokens, 200);\n const optimized = Math.min(raw, jitPromptTokens);\n const savingsPct = Math.max(15, Math.round(((raw - optimized) / raw) * 100));\n\n return {\n rawTokens: raw,\n optimizedTokens: optimized,\n savingsPct,\n };\n}\n\nexport async function inspectCommand(specArg: string, options: InspectCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp inspect <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n if (preset && preset.macros && preset.macros.length > 0) {\n spec.macros = [...(spec.macros || []), ...preset.macros];\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(spec, null, 2));\n return;\n }\n\n // Token savings estimation\n const tokenMetrics = estimateSpecTokenSavings(spec);\n\n // Header Banner\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP API Inspection: ${spec.title} (v${spec.version})`)));\n if (spec.description) {\n console.log(pc.dim(spec.description.slice(0, 120) + (spec.description.length > 120 ? '...' : '')));\n }\n console.log();\n\n // 1. Overview Table\n const overviewTable = new Table({\n head: [pc.bold('Metric'), pc.bold('Value')],\n colWidths: [25, 55],\n });\n\n const totalOps = spec.operations.length;\n const methodsCount: Record<string, number> = {};\n const riskCounts = { READ_ONLY: 0, MUTATION: 0, CRITICAL: 0 };\n\n for (const op of spec.operations) {\n const m = op.method.toUpperCase();\n methodsCount[m] = (methodsCount[m] || 0) + 1;\n riskCounts[op.riskTier] = (riskCounts[op.riskTier] || 0) + 1;\n }\n\n const methodsStr = Object.entries(methodsCount)\n .map(([m, c]) => `${m}: ${c}`)\n .join(' | ');\n\n const defaultUrl = spec.servers.length > 0 ? spec.servers[0].url : 'None declared';\n const secSchemeEntries = Object.entries<any>(spec.securitySchemes || {});\n let secSchemesDisplay = 'None declared';\n if (secSchemeEntries.length > 0) {\n secSchemesDisplay = secSchemeEntries\n .map(([name, s]) => {\n if (s.type === 'http') return `${name} (HTTP ${s.scheme || 'bearer'})`;\n if (s.type === 'apiKey') return `${name} (API key in ${s.in || 'header'}: ${s.name || name})`;\n return `${name} (${s.type || 'custom'})`;\n })\n .join(', ');\n }\n const recommendedJit = totalOps > 20 ? pc.green('Yes (Dynamic JIT routing recommended)') : pc.blue('No (Static direct tools)');\n const savingsDisplay = pc.green(`~${tokenMetrics.savingsPct}% (${tokenMetrics.rawTokens.toLocaleString()} → ${tokenMetrics.optimizedTokens.toLocaleString()} tokens)`);\n\n overviewTable.push(\n ['Total Endpoints', `${totalOps} operations`],\n ['HTTP Methods', methodsStr],\n ['Base URL', defaultUrl],\n ['Security Schemes', secSchemesDisplay],\n ['JIT Router Mode', recommendedJit],\n ['Est. Token Savings', savingsDisplay],\n ['Macros / Workflows', `${spec.macros?.length || 0} composite macros`]\n );\n\n console.log(overviewTable.toString());\n console.log();\n\n // 2. Token Diet & Context Optimization Preview\n console.log(pc.bold('Token Diet & Context Optimization Preview:'));\n console.log(` ● Full Static Tool Declarations: ~${tokenMetrics.rawTokens.toLocaleString()} tokens`);\n console.log(` ● PostMCP JIT + Token Diet: ~${tokenMetrics.optimizedTokens.toLocaleString()} tokens`);\n console.log(` ● Context Window Savings: ${pc.bold(pc.green(`~${tokenMetrics.savingsPct}% saved`))}`);\n console.log();\n\n // 3. Authentication Guide\n if (secSchemeEntries.length > 0) {\n console.log(pc.bold('Authentication Guide:'));\n for (const [name, scheme] of secSchemeEntries) {\n if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'bearer') {\n console.log(` ● ${pc.cyan(name)}: HTTP Bearer Token`);\n console.log(` Header: Authorization: Bearer <token>`);\n console.log(` CLI Option: --bearer <token> (e.g. --bearer $MY_API_KEY)`);\n console.log(` Environment: BEARER_TOKEN or API_KEY`);\n } else if (scheme.type === 'apiKey') {\n const loc = scheme.in || 'header';\n const keyName = scheme.name || name;\n console.log(` ● ${pc.cyan(name)}: API Key in ${loc} (${pc.bold(keyName)})`);\n if (loc === 'header') {\n console.log(` CLI Option: --api-key \"${keyName}=<token>\" or -H \"${keyName}: <token>\"`);\n } else if (loc === 'query') {\n console.log(` CLI Option: --api-key \"query:${keyName}=<token>\"`);\n }\n console.log(` Environment: Set via custom header / config`);\n } else if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'basic') {\n console.log(` ● ${pc.cyan(name)}: HTTP Basic Auth`);\n console.log(` CLI Option: -H \"Authorization: Basic <base64>\"`);\n } else {\n console.log(` ● ${pc.cyan(name)}: ${scheme.type || 'Custom'}`);\n }\n }\n console.log();\n }\n\n // 4. Risk Tiers Breakdown\n console.log(pc.bold('Safety & Risk Tier Breakdown:'));\n console.log(` ${pc.green('● READ_ONLY')}: ${riskCounts.READ_ONLY} endpoints (Safe for autonomous exploration)`);\n console.log(` ${pc.yellow('● MUTATION')}: ${riskCounts.MUTATION} endpoints (Creates or updates data)`);\n console.log(` ${pc.red('● CRITICAL')}: ${riskCounts.CRITICAL} endpoints (Destructive actions / simulated in dry-run)`);\n console.log();\n\n // 4. Sample Endpoints List\n console.log(pc.bold(`Operations List (Showing first 10 of ${totalOps}):`));\n const opTable = new Table({\n head: [pc.bold('Tool Name (ID)'), pc.bold('Method'), pc.bold('Path'), pc.bold('Risk Tier')],\n colWidths: [22, 10, 32, 14],\n });\n\n const sampleOps = spec.operations.slice(0, 10);\n for (const op of sampleOps) {\n const tierColor =\n op.riskTier === 'READ_ONLY' ? pc.green(op.riskTier) : op.riskTier === 'CRITICAL' ? pc.red(op.riskTier) : pc.yellow(op.riskTier);\n opTable.push([op.id, op.method.toUpperCase(), op.path, tierColor]);\n }\n\n console.log(opTable.toString());\n if (totalOps > 10) {\n console.log(pc.dim(` ... and ${totalOps - 10} more endpoints.`));\n }\n console.log();\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseOpenAPI, generateProject, generateTypeScriptProject, generatePythonProject } from '@postmcp/core';\nimport type { GenerateCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { GenerateCommandOptions };\n\nexport async function generateCommand(specArg: string, options: GenerateCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp generate <spec-path-or-url-or-@preset> --target <python|typescript>'));\n process.exit(1);\n return;\n }\n\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n const rawLang = (options.lang || options.target || 'ts').toLowerCase();\n let targetLang: 'ts' | 'py';\n if (rawLang === 'ts' || rawLang === 'typescript') {\n targetLang = 'ts';\n } else if (rawLang === 'py' || rawLang === 'python') {\n targetLang = 'py';\n } else {\n console.error(pc.red(`Unsupported language '${rawLang}'. Supported languages: 'ts', 'py'.`));\n process.exit(1);\n return;\n }\n\n const outDir = path.resolve(options.out || `./${spec.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp`);\n\n console.log(pc.cyan(`Generating standalone ${pc.bold(targetLang.toUpperCase())} MCP server for '${spec.title}'...`));\n\n const project = targetLang === 'ts'\n ? generateTypeScriptProject(spec)\n : generatePythonProject(spec);\n\n // Write files to target directory\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const [relativePath, content] of Object.entries(project.files)) {\n const filePath = path.join(outDir, relativePath);\n const parentDir = path.dirname(filePath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n console.log(` ${pc.green('+')} ${relativePath}`);\n }\n\n console.log();\n console.log(pc.green(`Standalone MCP server successfully generated at:`));\n console.log(` ${pc.bold(outDir)}`);\n console.log();\n console.log(pc.dim('Next steps:'));\n if (targetLang === 'ts') {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' npm install');\n console.log(' npm run build');\n console.log(' npm start');\n } else {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' pip install -r requirements.txt');\n console.log(' python server.py');\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { parseOpenAPI } from '@postmcp/core';\nimport type { ExportCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { ExportCommandOptions };\n\nexport function getClientConfigPath(client: 'cursor' | 'claude' | 'windsurf'): string {\n const home = os.homedir();\n if (client === 'cursor') {\n return path.join(process.cwd(), '.cursor', 'mcp.json');\n }\n if (client === 'claude') {\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n if (process.platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n // Linux\n return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');\n }\n if (client === 'windsurf') {\n return path.join(home, '.codeium', 'windsurf', 'mcp_config.json');\n }\n return path.join(process.cwd(), 'mcp.json');\n}\n\nexport function buildClientConfigSnippet(\n serverKey: string,\n specPath: string,\n options: ExportCommandOptions\n): object {\n const env: Record<string, string> = {};\n if (options.bearer) {\n env['API_KEY'] = options.bearer;\n }\n if (options.baseUrl) {\n env['BASE_URL'] = options.baseUrl;\n }\n if (options.env) {\n for (const e of options.env) {\n const [k, v] = e.split('=');\n if (k && v) env[k] = v;\n }\n }\n\n return {\n mcpServers: {\n [serverKey]: {\n command: 'npx',\n args: ['-y', '@postmcp/cli', 'run', specPath],\n env: Object.keys(env).length > 0 ? env : undefined,\n },\n },\n };\n}\n\nexport async function exportCommand(specArg: string, options: ExportCommandOptions): Promise<void> {\n let specPath = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp export <spec-path-or-url-or-@preset> --target cursor|claude|windsurf|all'));\n process.exit(1);\n }\n\n let serverKey = 'api-server';\n if (specPath.startsWith('@')) {\n serverKey = specPath.replace(/^@/, '').toLowerCase();\n } else {\n try {\n const parsed = await parseOpenAPI(specPath);\n serverKey = parsed.title.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'api-server';\n } catch {\n serverKey = 'api-server';\n }\n }\n\n const selectedTarget = (options.client || options.target || 'all').toLowerCase();\n const clientsToExport: Array<'cursor' | 'claude' | 'windsurf'> =\n selectedTarget === 'all'\n ? ['cursor', 'claude', 'windsurf']\n : [selectedTarget as 'cursor' | 'claude' | 'windsurf'];\n\n console.log(pc.bold(pc.cyan(`PostMCP 1-Click Client Configuration Exporter`)));\n console.log();\n\n for (const c of clientsToExport) {\n const configPath = getClientConfigPath(c);\n const snippet = buildClientConfigSnippet(serverKey, specPath, options);\n const formattedSnippet = JSON.stringify(snippet, null, 2);\n\n console.log(pc.bold(pc.green(`▶ ${c.toUpperCase()} (${c === 'cursor' ? 'Project Local' : 'Global Client'})`)));\n console.log(pc.dim(` Config path: ${configPath}`));\n console.log();\n console.log(pc.gray(formattedSnippet));\n console.log();\n\n if (options.write) {\n try {\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, 'utf-8');\n existingConfig = JSON.parse(raw);\n }\n\n existingConfig.mcpServers = existingConfig.mcpServers || {};\n existingConfig.mcpServers[serverKey] = (snippet as any).mcpServers[serverKey];\n\n const parentDir = path.dirname(configPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), 'utf-8');\n console.log(pc.green(` Successfully merged and written to ${configPath}`));\n } catch (err: any) {\n console.error(pc.red(` Failed to write to ${configPath}: ${err.message}`));\n }\n console.log();\n }\n }\n\n if (!options.write) {\n console.log(pc.dim(`Tip: Pass '--write' to automatically install this configuration into your client settings.`));\n }\n}\n","import { ALL_PRESETS, syncAllPresets } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport async function listPresetsCommand(categoryOrQuery?: string): Promise<void> {\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP Presets Catalog (${ALL_PRESETS.length} Curated Developer APIs)`)));\n console.log(pc.dim(`Run any preset instantly using: postmcp run @<preset_id>`));\n console.log();\n\n let displayedPresets = ALL_PRESETS;\n if (categoryOrQuery) {\n const q = categoryOrQuery.toLowerCase().trim();\n displayedPresets = ALL_PRESETS.filter((p: any) => {\n return (\n p.id.toLowerCase().includes(q) ||\n p.name.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n (p.tags && p.tags.some((t: string) => t.toLowerCase().includes(q)))\n );\n });\n }\n\n const table = new Table({\n head: [pc.bold('Preset ID'), pc.bold('API Name'), pc.bold('Category'), pc.bold('Authentication'), pc.bold('Run Command')],\n colWidths: [14, 26, 22, 28, 26],\n });\n\n for (const meta of displayedPresets) {\n table.push([\n pc.bold(pc.magenta(`@${meta.id}`)),\n meta.name,\n meta.category,\n pc.dim(meta.authType),\n pc.green(`postmcp run @${meta.id}`),\n ]);\n }\n\n console.log(table.toString());\n console.log();\n console.log(pc.dim(`Total Presets: ${displayedPresets.length} of ${ALL_PRESETS.length}`));\n console.log(pc.dim(`Run 'postmcp presets sync' to update offline cached schemas from GitHub.`));\n console.log();\n}\n\nexport async function syncPresetsCommand(): Promise<void> {\n console.log(pc.cyan(`Syncing latest OpenAPI schemas for all presets...`));\n try {\n const synced = await syncAllPresets();\n console.log(pc.green(`Successfully synced ${synced.length} presets to local cache (~/.postmcp/presets/):`));\n for (const id of synced) {\n console.log(` ${pc.green('●')} @${id}`);\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to sync presets: ${err.message}`));\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { spawn, ChildProcess } from 'node:child_process';\nimport open from 'open';\nimport axios from 'axios';\nimport pc from 'picocolors';\n\nexport interface StudioCommandOptions {\n port?: string;\n noOpen?: boolean;\n dev?: boolean;\n}\n\nexport function findStudioDir(): string {\n // 1. Check workspace and local monorepo paths first\n const workspaceCandidates = [\n path.resolve(process.cwd(), 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', 'studio'),\n path.resolve(__dirname, '..', '..', '..', 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', '..', '..', 'packages', 'studio'),\n ];\n\n for (const candidate of workspaceCandidates) {\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n }\n\n // 2. Search upwards from cwd and __dirname for monorepo packages/studio\n for (const startDir of [process.cwd(), __dirname]) {\n let cur = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(cur, 'packages', 'studio');\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n }\n\n // 3. Try resolving via Node module resolution (published npx postmcp)\n try {\n const customRequire = typeof createRequire !== 'undefined' ? createRequire(__filename) : (require as any);\n const pkgPath = customRequire.resolve('@postmcp/studio/package.json');\n if (fs.existsSync(pkgPath)) {\n const resolved = path.dirname(pkgPath);\n // If resolved into .pnpm cache inside a monorepo, prefer the live monorepo packages/studio\n const monorepoCandidate = path.resolve(resolved, '../../../../packages/studio');\n if (fs.existsSync(path.join(monorepoCandidate, 'package.json'))) {\n return monorepoCandidate;\n }\n return resolved;\n }\n } catch {\n // Module resolution fallback\n }\n\n // Fallback to packages/studio in workspace\n return path.resolve(process.cwd(), 'packages', 'studio');\n}\n\nexport async function waitForServer(url: string, timeoutMs: number = 20000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await axios.get(url, { timeout: 1000, validateStatus: () => true });\n if (res.status >= 200 && res.status < 500) {\n return true;\n }\n } catch {\n // Server not ready yet\n }\n await new Promise((r) => setTimeout(r, 400));\n }\n return false;\n}\n\nexport async function studioCommand(specArg?: string, options: StudioCommandOptions = {}): Promise<void> {\n const port = options.port || '3000';\n const baseUrl = `http://localhost:${port}`;\n const targetUrl = specArg ? `${baseUrl}?spec=${encodeURIComponent(specArg)}` : baseUrl;\n const studioDir = findStudioDir();\n\n console.log();\n console.log(pc.bold(pc.cyan(`Starting PostMCP Visual Web Studio...`)));\n console.log(` Port: ${pc.bold(pc.green(port))}`);\n console.log(` Studio Dir: ${pc.dim(studioDir)}`);\n if (specArg) {\n console.log(` Initial Spec: ${pc.dim(specArg)}`);\n }\n console.log();\n\n let child: ChildProcess | null = null;\n\n if (fs.existsSync(studioDir)) {\n const srcDir = path.join(studioDir, 'src');\n const nextDir = path.join(studioDir, '.next');\n let isStale = false;\n if (fs.existsSync(srcDir) && fs.existsSync(nextDir)) {\n try {\n const nextMtime = fs.statSync(nextDir).mtimeMs;\n const pageMtime = fs.statSync(path.join(srcDir, 'app', 'page.tsx')).mtimeMs;\n if (pageMtime > nextMtime) {\n isStale = true;\n }\n } catch {}\n }\n\n const isBuilt = fs.existsSync(nextDir) && !isStale;\n const preferDev = options.dev || isStale;\n // In standalone or monorepo environments, prefer npx next or pnpm\n const isPnpm = fs.existsSync(path.join(studioDir, '..', '..', 'pnpm-lock.yaml'));\n const command = isPnpm ? 'pnpm' : 'npx';\n const args = isPnpm\n ? isBuilt && !preferDev\n ? ['start', '--port', port]\n : ['dev', '--port', port]\n : isBuilt && !preferDev\n ? ['next', 'start', '-p', port]\n : ['next', 'dev', '-p', port];\n\n try {\n child = spawn(command, args, {\n cwd: studioDir,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: port,\n NEXT_PUBLIC_INITIAL_SPEC: specArg || '',\n STUDIO_INITIAL_SPEC: specArg || '',\n POSTMCP_WORKSPACE: process.cwd(),\n WORKSPACE_CWD: process.cwd(),\n },\n });\n\n const cleanup = () => {\n if (child) {\n try {\n child.kill('SIGINT');\n } catch {\n // Ignore kill errors\n }\n }\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('exit', cleanup);\n } catch (err: any) {\n console.log(pc.yellow(` Note: Running in detached standalone mode: ${err.message}`));\n }\n }\n\n // Wait for server to become responsive\n const isReady = await waitForServer(baseUrl, 15000);\n\n if (isReady) {\n console.log(pc.green(`PostMCP Visual Web Studio ready at: ${pc.bold(targetUrl)}`));\n } else {\n console.log(pc.dim(` Studio server starting at: ${targetUrl}`));\n }\n\n if (!options.noOpen) {\n try {\n await open(targetUrl);\n console.log(pc.dim(`Opening Web Studio in your default browser...`));\n } catch {\n console.log(pc.dim(`Please open ${targetUrl} in your browser.`));\n }\n }\n\n // If running interactively, wait for child process\n if (child) {\n await new Promise<void>((resolve) => {\n child?.on('close', () => resolve());\n });\n }\n}\n"],"mappings":"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","names":["dotenv","fs","path","axios","pc","import_core","import_picocolors","pc","Table","fs","path","import_core","import_picocolors","pc","fs","path","os","import_core","import_picocolors","pc","import_cli_table3","import_picocolors","pc","Table","path","fs","import_axios","import_picocolors","axios","pc","open","resolve","import_picocolors","pc"]}
|
package/dist/bin.mjs
CHANGED
|
@@ -844,17 +844,31 @@ async function studioCommand(specArg, options = {}) {
|
|
|
844
844
|
}
|
|
845
845
|
}
|
|
846
846
|
if (child) {
|
|
847
|
-
await new Promise((
|
|
848
|
-
child?.on("close", () =>
|
|
847
|
+
await new Promise((resolve5) => {
|
|
848
|
+
child?.on("close", () => resolve5());
|
|
849
849
|
});
|
|
850
850
|
}
|
|
851
851
|
}
|
|
852
852
|
|
|
853
853
|
// src/bin.ts
|
|
854
|
+
import { readFileSync as readFileSync4 } from "fs";
|
|
855
|
+
import { resolve as resolve4 } from "path";
|
|
854
856
|
import pc7 from "picocolors";
|
|
857
|
+
function getCliVersion() {
|
|
858
|
+
if (true) {
|
|
859
|
+
return "0.1.11";
|
|
860
|
+
}
|
|
861
|
+
try {
|
|
862
|
+
const dir = typeof __dirname !== "undefined" ? __dirname : process.cwd();
|
|
863
|
+
const pkg = JSON.parse(readFileSync4(resolve4(dir, "../package.json"), "utf8"));
|
|
864
|
+
return pkg.version || "unknown";
|
|
865
|
+
} catch {
|
|
866
|
+
return "unknown";
|
|
867
|
+
}
|
|
868
|
+
}
|
|
855
869
|
function createCli() {
|
|
856
870
|
const program = new Command();
|
|
857
|
-
program.name("postmcp").description("The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.").version(
|
|
871
|
+
program.name("postmcp").description("The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.").version(getCliVersion());
|
|
858
872
|
program.command("run [spec]").description("Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec").option("-b, --base-url <url>", "Override target API base URL").option("-t, --transport <type>", "Transport type: stdio or http (default: stdio)", "stdio").option("-p, --port <number>", "Port for Streamable HTTP server").option("-H, --header <key:value...>", "Custom request headers (can be specified multiple times)", (val, prev = []) => [...prev, val]).option("--bearer <token>", "Bearer authentication token or $ENV_VAR").option("--api-key <name=value>", "API key credentials (e.g. key=val, header:key=val, query:key=val)").option("--jit", "Force Just-In-Time dynamic tool routing").option("--no-jit", "Disable JIT mode and expose all tools statically").option("--hot-tool-keywords <keywords>", "Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools").option("--dry-run", "Simulate mutation & critical requests without real API execution").option("--token-diet", "Enable Token Diet response optimization (enabled by default)").option("--no-token-diet", "Disable Token Diet payload pruning & markdown tables").option("--max-tokens <number>", "Token ceiling per tool response", "2500").option("--env-file <path>", "Custom .env file path to load").option("-c, --config <path>", "Custom postmcp.config.json path").action((spec, opts) => {
|
|
859
873
|
runCommand(spec, opts).catch((err) => {
|
|
860
874
|
console.error(pc7.red(`Fatal error: ${err.message}`));
|
package/dist/bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin.ts","../src/commands/run.ts","../src/config/loader.ts","../src/presets/index.ts","../src/commands/inspect.ts","../src/commands/generate.ts","../src/commands/export.ts","../src/commands/presets.ts","../src/commands/studio.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { inspectCommand } from './commands/inspect.js';\nimport { generateCommand } from './commands/generate.js';\nimport { exportCommand } from './commands/export.js';\nimport { listPresetsCommand, syncPresetsCommand } from './commands/presets.js';\nimport { studioCommand } from './commands/studio.js';\nimport pc from 'picocolors';\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('postmcp')\n .description('The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.')\n .version('0.1.8');\n\n // 1. Run Command\n program\n .command('run [spec]')\n .description('Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec')\n .option('-b, --base-url <url>', 'Override target API base URL')\n .option('-t, --transport <type>', 'Transport type: stdio or http (default: stdio)', 'stdio')\n .option('-p, --port <number>', 'Port for Streamable HTTP server')\n .option('-H, --header <key:value...>', 'Custom request headers (can be specified multiple times)', (val, prev: string[] = []) => [...prev, val])\n .option('--bearer <token>', 'Bearer authentication token or $ENV_VAR')\n .option('--api-key <name=value>', 'API key credentials (e.g. key=val, header:key=val, query:key=val)')\n .option('--jit', 'Force Just-In-Time dynamic tool routing')\n .option('--no-jit', 'Disable JIT mode and expose all tools statically')\n .option('--hot-tool-keywords <keywords>', 'Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools')\n .option('--dry-run', 'Simulate mutation & critical requests without real API execution')\n .option('--token-diet', 'Enable Token Diet response optimization (enabled by default)')\n .option('--no-token-diet', 'Disable Token Diet payload pruning & markdown tables')\n .option('--max-tokens <number>', 'Token ceiling per tool response', '2500')\n .option('--env-file <path>', 'Custom .env file path to load')\n .option('-c, --config <path>', 'Custom postmcp.config.json path')\n .action((spec, opts) => {\n runCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 2. Inspect Command\n program\n .command('inspect <spec>')\n .description('Inspect an OpenAPI specification: summary, methods breakdown, risk tiers, and JIT recommendation')\n .option('--json', 'Output machine-readable normalized AST JSON')\n .action((spec, opts) => {\n inspectCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 3. Generate Command\n program\n .command('generate <spec>')\n .description('Generate a complete standalone TS or PY MCP server project')\n .option('-t, --target <language>', 'Target language: ts or py (default: ts)')\n .option('-l, --lang <language>', 'Alias for --target')\n .option('-o, --out <directory>', 'Output directory for the generated project')\n .action((spec, opts) => {\n generateCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 4. Export Command\n program\n .command('export <spec>')\n .description('1-Click configuration exporter for Cursor, Claude Desktop, and Windsurf')\n .option('-t, --target <name>', 'Target client: cursor, claude, windsurf, or all')\n .option('--client <name>', 'Alias for --target')\n .option('-w, --write', 'Automatically merge and write configuration directly to the client config file on disk')\n .option('--bearer <token>', 'Bearer token for client configuration environment')\n .option('-b, --base-url <url>', 'Base URL override for client configuration environment')\n .option('-e, --env <key=val...>', 'Environment variables for client configuration', (val, prev: string[] = []) => [...prev, val])\n .action((spec, opts) => {\n const target = opts.target || opts.client || 'all';\n exportCommand(spec, { ...opts, target, client: target }).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 5. Presets Command with subcommands & default action\n const presetsCmd = program\n .command('presets')\n .description('Manage and explore bundled top 50+ API presets')\n .argument('[filter]', 'Optional search query or category filter')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('list [filter]')\n .description('List all available presets in catalog')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('sync')\n .description('Sync latest OpenAPI schemas from GitHub to local cache (~/.postmcp/presets/)')\n .action(() => {\n syncPresetsCommand().catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 6. Studio Command\n program\n .command('studio [spec]')\n .description('Launch the PostMCP Visual Web Studio')\n .option('-p, --port <port>', 'Studio port', '3000')\n .option('--dev', 'Run Next.js in Turbopack development mode')\n .option('--no-open', 'Do not automatically open browser')\n .action((spec, opts) => {\n studioCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n return program;\n}\n\nif (process.env.NODE_ENV !== 'test') {\n const cli = createCli();\n cli.parse(process.argv);\n}\n","import { parseOpenAPI, startStdioServer, startHttpServer, AuthConfig, NormalizedSpec } from '@postmcp/core';\nimport type { RunCommandOptions } from '@postmcp/types';\nimport { loadEnvFile, loadConfigFile, parseHeaderFlags, parseApiKeyFlag } from '../config/loader.js';\nimport { resolvePresetSpec, getPreset, buildPresetAuthConfig, ALL_PRESETS, Preset } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { RunCommandOptions };\n\nexport async function runCommand(specArg: string, options: RunCommandOptions): Promise<void> {\n // 1. Load environment and configuration files\n loadEnvFile(options.envFile);\n const fileConfig = loadConfigFile(options.config);\n\n let specPath: string | object | undefined = specArg || fileConfig.spec;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp run <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset: Preset | undefined = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n } else if (typeof specPath === 'string') {\n const lower = specPath.toLowerCase();\n preset = ALL_PRESETS.find(\n (p: Preset) =>\n (p.specUrl && lower.includes(p.specUrl.toLowerCase())) ||\n (p.id && (lower.includes(`/${p.id}/`) || lower.includes(`/${p.id}.`) || lower.includes(`/${p.id}-`) || lower.includes(`${p.id}.tech`)))\n );\n }\n\n // 2. Parse OpenAPI Specification\n let parsedSpec: NormalizedSpec;\n try {\n parsedSpec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse OpenAPI specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n // If preset or config defines additional composite macros, wire them into parsed spec\n if (preset && preset.macros && preset.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...preset.macros];\n }\n if (fileConfig.macros && fileConfig.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...fileConfig.macros];\n }\n\n // If config defines enabledOperations, filter out disabled operations (Finding 5)\n if (fileConfig.enabledOperations && Object.keys(fileConfig.enabledOperations).length > 0) {\n parsedSpec.operations = parsedSpec.operations.filter(\n (op: any) => fileConfig.enabledOperations![op.id] !== false\n );\n }\n\n // 3. Build Auth Configuration with preset-specific auth dispatching (Finding 1)\n const cliHeaders = parseHeaderFlags(options.header);\n const cliApiKey = parseApiKeyFlag(options.apiKey);\n const presetAuthConfig = preset ? buildPresetAuthConfig(preset, process.env) : {};\n\n const authConfig: AuthConfig = {\n headers: { ...presetAuthConfig.headers, ...fileConfig.auth?.headers, ...cliHeaders },\n bearerToken:\n options.bearer ||\n fileConfig.auth?.bearerToken ||\n presetAuthConfig.bearerToken ||\n process.env.API_KEY ||\n process.env.BEARER_TOKEN,\n apiKey: cliApiKey || fileConfig.auth?.apiKey || presetAuthConfig.apiKey,\n basicAuth: fileConfig.auth?.basicAuth || presetAuthConfig.basicAuth,\n securitySchemes: {\n ...presetAuthConfig.securitySchemes,\n ...fileConfig.auth?.securitySchemes,\n },\n allowedExternalHosts: fileConfig.auth?.allowedExternalHosts,\n allowCrossOriginAuth: fileConfig.auth?.allowCrossOriginAuth,\n };\n\n const transport = options.transport || fileConfig.transport || (options.port ? 'http' : 'stdio');\n const resolvedBaseUrl =\n options.baseUrl ||\n fileConfig.baseUrl ||\n process.env.BASE_URL ||\n (parsedSpec.servers.length > 0 ? parsedSpec.servers[0].url : preset?.defaultBaseUrl);\n\n let isJit: boolean | { forceJIT?: boolean; maxMountedTools?: number; hotToolKeywords?: string[] } | undefined;\n if (options.jit !== undefined) {\n if (typeof fileConfig.jit === 'object') {\n isJit = {\n forceJIT: options.jit,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n } else {\n isJit = options.jit;\n }\n } else if (fileConfig.jit !== undefined) {\n if (typeof fileConfig.jit === 'boolean') {\n isJit = fileConfig.jit;\n } else {\n isJit = {\n forceJIT: fileConfig.jit.enabled,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n }\n }\n const isDryRun = options.dryRun !== undefined ? options.dryRun : fileConfig.dryRun;\n const isTokenDiet = options.tokenDiet !== undefined ? options.tokenDiet : fileConfig.tokenDiet?.enabled !== false;\n const maxTokens = options.maxTokens ? parseInt(options.maxTokens, 10) : fileConfig.tokenDiet?.maxTokens || 2500;\n\n let hotToolKeywords: string[] | undefined;\n if (options.hotToolKeywords) {\n hotToolKeywords = options.hotToolKeywords.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (fileConfig.hotToolKeywords) {\n hotToolKeywords = fileConfig.hotToolKeywords;\n } else if (typeof fileConfig.jit === 'object' && fileConfig.jit.hotToolKeywords) {\n hotToolKeywords = fileConfig.jit.hotToolKeywords;\n }\n\n // 4. Build path-specific field masks from preset & file config (Finding 2 & 5)\n const pathFieldMasks: Record<string, string[]> = {};\n if (preset?.fieldMasks) {\n for (const fm of preset.fieldMasks) {\n pathFieldMasks[fm.path] = fm.fields;\n }\n }\n if (fileConfig.fieldMasks) {\n Object.assign(pathFieldMasks, fileConfig.fieldMasks);\n }\n\n const serverOptions = {\n spec: parsedSpec,\n baseUrl: resolvedBaseUrl,\n auth: authConfig,\n jit: isJit,\n hotToolKeywords,\n dryRun: isDryRun,\n tokenDiet: {\n enabled: isTokenDiet,\n maxTokens,\n pathFieldMasks: isTokenDiet && Object.keys(pathFieldMasks).length > 0 ? pathFieldMasks : undefined,\n convertToMarkdownTable: fileConfig.tokenDiet?.convertToMarkdownTable !== false,\n },\n serverName: parsedSpec.title,\n serverVersion: parsedSpec.version,\n };\n\n if (transport === 'http') {\n const port = options.port ? parseInt(options.port, 10) : fileConfig.port || 3000;\n const host = options.host || 'localhost';\n\n const { url } = await startHttpServer({\n ...serverOptions,\n port,\n host,\n });\n\n console.log(pc.green(`PostMCP Streamable HTTP server listening at: ${pc.bold(url)}`));\n console.log(pc.dim(` Service: ${parsedSpec.title} (v${parsedSpec.version}) | Endpoints: ${parsedSpec.operations.length}`));\n if (isDryRun) {\n console.log(pc.yellow(` Mode: DRY-RUN SIMULATION (Mutations simulated, no real side effects)`));\n }\n } else {\n // Default: stdio transport for Cursor, Claude Desktop, Antigravity\n await startStdioServer(serverOptions);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport dotenv from 'dotenv';\nimport { AuthConfig } from '@postmcp/core';\nimport type { PostMcpCliConfig } from '@postmcp/types';\n\nexport type { PostMcpCliConfig };\n\nexport function loadEnvFile(envFilePath?: string): void {\n if (envFilePath) {\n const resolved = path.resolve(envFilePath);\n if (fs.existsSync(resolved)) {\n dotenv.config({ path: resolved });\n }\n } else {\n // Default to .env in cwd if exists\n const defaultEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(defaultEnv)) {\n dotenv.config({ path: defaultEnv });\n }\n }\n}\n\nexport function loadConfigFile(configPath?: string): PostMcpCliConfig {\n let targetPath = configPath ? path.resolve(configPath) : null;\n\n if (!targetPath) {\n const candidates = ['postmcp.config.json', 'postmcp.json', '.postmcprc.json'];\n for (const c of candidates) {\n const candidatePath = path.resolve(process.cwd(), c);\n if (fs.existsSync(candidatePath)) {\n targetPath = candidatePath;\n break;\n }\n }\n }\n\n if (targetPath && fs.existsSync(targetPath)) {\n try {\n const content = fs.readFileSync(targetPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n return {};\n}\n\nexport function parseHeaderFlags(headers?: string[]): Record<string, string> {\n if (!headers || !Array.isArray(headers)) return {};\n const result: Record<string, string> = {};\n for (const h of headers) {\n const colonIdx = h.indexOf(':');\n if (colonIdx !== -1) {\n const key = h.slice(0, colonIdx).trim();\n const val = h.slice(colonIdx + 1).trim();\n if (key && val) {\n result[key] = val;\n }\n }\n }\n return result;\n}\n\nexport function parseApiKeyFlag(apiKeyStr?: string): { name: string; value: string; in: 'header' | 'query' | 'cookie' } | undefined {\n if (!apiKeyStr) return undefined;\n // Format: \"name=value\" or \"header:name=value\" or \"query:name=value\"\n let location: 'header' | 'query' | 'cookie' = 'header';\n let rest = apiKeyStr;\n\n if (apiKeyStr.startsWith('query:')) {\n location = 'query';\n rest = apiKeyStr.slice(6);\n } else if (apiKeyStr.startsWith('header:')) {\n location = 'header';\n rest = apiKeyStr.slice(7);\n } else if (apiKeyStr.startsWith('cookie:')) {\n location = 'cookie';\n rest = apiKeyStr.slice(7);\n }\n\n const eqIdx = rest.indexOf('=');\n if (eqIdx !== -1) {\n const name = rest.slice(0, eqIdx).trim();\n const value = rest.slice(eqIdx + 1).trim();\n if (name && value) {\n return { name, value, in: location };\n }\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport axios from 'axios';\nimport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset } from '@postmcp/presets';\n\nexport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset };\nexport const BUNDLED_PRESETS = PRESETS_BY_ID;\n\nexport function getPresetCacheDir(): string {\n try {\n const dir = path.join(os.homedir(), '.postmcp', 'presets');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n } catch {\n const fallbackDir = path.join(os.tmpdir(), 'postmcp-presets');\n if (!fs.existsSync(fallbackDir)) {\n try {\n fs.mkdirSync(fallbackDir, { recursive: true });\n } catch {\n // Ignore fallback dir creation errors\n }\n }\n return fallbackDir;\n }\n}\n\nexport async function resolvePresetSpec(presetIdOrAlias: string): Promise<string | object> {\n const cleanId = presetIdOrAlias.replace(/^@/, '').toLowerCase().trim();\n const preset = getPreset(cleanId);\n\n if (!preset) {\n throw new Error(`Unknown preset '@${cleanId}'. Run 'postmcp presets list' to see all available presets.`);\n }\n\n // Check local cache first\n const cacheDir = getPresetCacheDir();\n const cacheFile = path.join(cacheDir, `${cleanId}.json`);\n if (fs.existsSync(cacheFile)) {\n return cacheFile;\n }\n\n // If remote spec URL exists, try to fetch and cache it\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n try {\n fs.writeFileSync(cacheFile, res.data, 'utf-8');\n return cacheFile;\n } catch {\n return res.data;\n }\n } catch {\n // Remote fetch failed, fall through to bundledSpec\n }\n }\n\n // If bundledSpec exists, write to cache and return\n if (preset.bundledSpec) {\n try {\n fs.writeFileSync(cacheFile, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n return cacheFile;\n } catch {\n return preset.bundledSpec;\n }\n }\n\n if (preset.specUrl) {\n return preset.specUrl;\n }\n\n throw new Error(`Preset '@${cleanId}' has no specification available.`);\n}\n\nexport async function syncAllPresets(): Promise<string[]> {\n const synced: string[] = [];\n const cacheDir = getPresetCacheDir();\n\n for (const preset of ALL_PRESETS) {\n const filePath = path.join(cacheDir, `${preset.id}.json`);\n let wrote = false;\n\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n fs.writeFileSync(filePath, res.data, 'utf-8');\n wrote = true;\n } catch {\n // Fallback to bundled spec\n }\n }\n\n if (!wrote && preset.bundledSpec) {\n try {\n fs.writeFileSync(filePath, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n wrote = true;\n } catch {\n // Ignore filesystem write error\n }\n }\n\n if (wrote) {\n synced.push(preset.id);\n }\n }\n\n return synced;\n}\n","import { parseOpenAPI } from '@postmcp/core';\nimport type { InspectCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec, getPreset } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport type { InspectCommandOptions };\n\nexport function estimateSpecTokenSavings(spec: any): { rawTokens: number; optimizedTokens: number; savingsPct: number } {\n const rawTokensPerOp = spec.operations.map((op: any) => {\n const descLen = (op.description || op.summary || '').length;\n const schemaLen = JSON.stringify(op.inputSchema || {}).length;\n return Math.ceil((descLen + schemaLen + 50) / 4);\n });\n\n const totalRawToolTokens = rawTokensPerOp.reduce((a: number, b: number) => a + b, 0);\n // In JIT mode, prompt contains tool_search (~120 tokens) + max 5 mounted active tools\n const avgOpTokens = spec.operations.length > 0 ? Math.ceil(totalRawToolTokens / spec.operations.length) : 0;\n const jitPromptTokens = 120 + Math.min(spec.operations.length, 5) * Math.ceil(avgOpTokens * 0.4); // 40% with diet\n\n const raw = Math.max(totalRawToolTokens, 200);\n const optimized = Math.min(raw, jitPromptTokens);\n const savingsPct = Math.max(15, Math.round(((raw - optimized) / raw) * 100));\n\n return {\n rawTokens: raw,\n optimizedTokens: optimized,\n savingsPct,\n };\n}\n\nexport async function inspectCommand(specArg: string, options: InspectCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp inspect <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n if (preset && preset.macros && preset.macros.length > 0) {\n spec.macros = [...(spec.macros || []), ...preset.macros];\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(spec, null, 2));\n return;\n }\n\n // Token savings estimation\n const tokenMetrics = estimateSpecTokenSavings(spec);\n\n // Header Banner\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP API Inspection: ${spec.title} (v${spec.version})`)));\n if (spec.description) {\n console.log(pc.dim(spec.description.slice(0, 120) + (spec.description.length > 120 ? '...' : '')));\n }\n console.log();\n\n // 1. Overview Table\n const overviewTable = new Table({\n head: [pc.bold('Metric'), pc.bold('Value')],\n colWidths: [25, 55],\n });\n\n const totalOps = spec.operations.length;\n const methodsCount: Record<string, number> = {};\n const riskCounts = { READ_ONLY: 0, MUTATION: 0, CRITICAL: 0 };\n\n for (const op of spec.operations) {\n const m = op.method.toUpperCase();\n methodsCount[m] = (methodsCount[m] || 0) + 1;\n riskCounts[op.riskTier] = (riskCounts[op.riskTier] || 0) + 1;\n }\n\n const methodsStr = Object.entries(methodsCount)\n .map(([m, c]) => `${m}: ${c}`)\n .join(' | ');\n\n const defaultUrl = spec.servers.length > 0 ? spec.servers[0].url : 'None declared';\n const secSchemeEntries = Object.entries<any>(spec.securitySchemes || {});\n let secSchemesDisplay = 'None declared';\n if (secSchemeEntries.length > 0) {\n secSchemesDisplay = secSchemeEntries\n .map(([name, s]) => {\n if (s.type === 'http') return `${name} (HTTP ${s.scheme || 'bearer'})`;\n if (s.type === 'apiKey') return `${name} (API key in ${s.in || 'header'}: ${s.name || name})`;\n return `${name} (${s.type || 'custom'})`;\n })\n .join(', ');\n }\n const recommendedJit = totalOps > 20 ? pc.green('Yes (Dynamic JIT routing recommended)') : pc.blue('No (Static direct tools)');\n const savingsDisplay = pc.green(`~${tokenMetrics.savingsPct}% (${tokenMetrics.rawTokens.toLocaleString()} → ${tokenMetrics.optimizedTokens.toLocaleString()} tokens)`);\n\n overviewTable.push(\n ['Total Endpoints', `${totalOps} operations`],\n ['HTTP Methods', methodsStr],\n ['Base URL', defaultUrl],\n ['Security Schemes', secSchemesDisplay],\n ['JIT Router Mode', recommendedJit],\n ['Est. Token Savings', savingsDisplay],\n ['Macros / Workflows', `${spec.macros?.length || 0} composite macros`]\n );\n\n console.log(overviewTable.toString());\n console.log();\n\n // 2. Token Diet & Context Optimization Preview\n console.log(pc.bold('Token Diet & Context Optimization Preview:'));\n console.log(` ● Full Static Tool Declarations: ~${tokenMetrics.rawTokens.toLocaleString()} tokens`);\n console.log(` ● PostMCP JIT + Token Diet: ~${tokenMetrics.optimizedTokens.toLocaleString()} tokens`);\n console.log(` ● Context Window Savings: ${pc.bold(pc.green(`~${tokenMetrics.savingsPct}% saved`))}`);\n console.log();\n\n // 3. Authentication Guide\n if (secSchemeEntries.length > 0) {\n console.log(pc.bold('Authentication Guide:'));\n for (const [name, scheme] of secSchemeEntries) {\n if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'bearer') {\n console.log(` ● ${pc.cyan(name)}: HTTP Bearer Token`);\n console.log(` Header: Authorization: Bearer <token>`);\n console.log(` CLI Option: --bearer <token> (e.g. --bearer $MY_API_KEY)`);\n console.log(` Environment: BEARER_TOKEN or API_KEY`);\n } else if (scheme.type === 'apiKey') {\n const loc = scheme.in || 'header';\n const keyName = scheme.name || name;\n console.log(` ● ${pc.cyan(name)}: API Key in ${loc} (${pc.bold(keyName)})`);\n if (loc === 'header') {\n console.log(` CLI Option: --api-key \"${keyName}=<token>\" or -H \"${keyName}: <token>\"`);\n } else if (loc === 'query') {\n console.log(` CLI Option: --api-key \"query:${keyName}=<token>\"`);\n }\n console.log(` Environment: Set via custom header / config`);\n } else if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'basic') {\n console.log(` ● ${pc.cyan(name)}: HTTP Basic Auth`);\n console.log(` CLI Option: -H \"Authorization: Basic <base64>\"`);\n } else {\n console.log(` ● ${pc.cyan(name)}: ${scheme.type || 'Custom'}`);\n }\n }\n console.log();\n }\n\n // 4. Risk Tiers Breakdown\n console.log(pc.bold('Safety & Risk Tier Breakdown:'));\n console.log(` ${pc.green('● READ_ONLY')}: ${riskCounts.READ_ONLY} endpoints (Safe for autonomous exploration)`);\n console.log(` ${pc.yellow('● MUTATION')}: ${riskCounts.MUTATION} endpoints (Creates or updates data)`);\n console.log(` ${pc.red('● CRITICAL')}: ${riskCounts.CRITICAL} endpoints (Destructive actions / simulated in dry-run)`);\n console.log();\n\n // 4. Sample Endpoints List\n console.log(pc.bold(`Operations List (Showing first 10 of ${totalOps}):`));\n const opTable = new Table({\n head: [pc.bold('Tool Name (ID)'), pc.bold('Method'), pc.bold('Path'), pc.bold('Risk Tier')],\n colWidths: [22, 10, 32, 14],\n });\n\n const sampleOps = spec.operations.slice(0, 10);\n for (const op of sampleOps) {\n const tierColor =\n op.riskTier === 'READ_ONLY' ? pc.green(op.riskTier) : op.riskTier === 'CRITICAL' ? pc.red(op.riskTier) : pc.yellow(op.riskTier);\n opTable.push([op.id, op.method.toUpperCase(), op.path, tierColor]);\n }\n\n console.log(opTable.toString());\n if (totalOps > 10) {\n console.log(pc.dim(` ... and ${totalOps - 10} more endpoints.`));\n }\n console.log();\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseOpenAPI, generateProject, generateTypeScriptProject, generatePythonProject } from '@postmcp/core';\nimport type { GenerateCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { GenerateCommandOptions };\n\nexport async function generateCommand(specArg: string, options: GenerateCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp generate <spec-path-or-url-or-@preset> --target <python|typescript>'));\n process.exit(1);\n return;\n }\n\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n const rawLang = (options.lang || options.target || 'ts').toLowerCase();\n let targetLang: 'ts' | 'py';\n if (rawLang === 'ts' || rawLang === 'typescript') {\n targetLang = 'ts';\n } else if (rawLang === 'py' || rawLang === 'python') {\n targetLang = 'py';\n } else {\n console.error(pc.red(`Unsupported language '${rawLang}'. Supported languages: 'ts', 'py'.`));\n process.exit(1);\n return;\n }\n\n const outDir = path.resolve(options.out || `./${spec.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp`);\n\n console.log(pc.cyan(`Generating standalone ${pc.bold(targetLang.toUpperCase())} MCP server for '${spec.title}'...`));\n\n const project = targetLang === 'ts'\n ? generateTypeScriptProject(spec)\n : generatePythonProject(spec);\n\n // Write files to target directory\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const [relativePath, content] of Object.entries(project.files)) {\n const filePath = path.join(outDir, relativePath);\n const parentDir = path.dirname(filePath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n console.log(` ${pc.green('+')} ${relativePath}`);\n }\n\n console.log();\n console.log(pc.green(`Standalone MCP server successfully generated at:`));\n console.log(` ${pc.bold(outDir)}`);\n console.log();\n console.log(pc.dim('Next steps:'));\n if (targetLang === 'ts') {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' npm install');\n console.log(' npm run build');\n console.log(' npm start');\n } else {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' pip install -r requirements.txt');\n console.log(' python server.py');\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { parseOpenAPI } from '@postmcp/core';\nimport type { ExportCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { ExportCommandOptions };\n\nexport function getClientConfigPath(client: 'cursor' | 'claude' | 'windsurf'): string {\n const home = os.homedir();\n if (client === 'cursor') {\n return path.join(process.cwd(), '.cursor', 'mcp.json');\n }\n if (client === 'claude') {\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n if (process.platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n // Linux\n return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');\n }\n if (client === 'windsurf') {\n return path.join(home, '.codeium', 'windsurf', 'mcp_config.json');\n }\n return path.join(process.cwd(), 'mcp.json');\n}\n\nexport function buildClientConfigSnippet(\n serverKey: string,\n specPath: string,\n options: ExportCommandOptions\n): object {\n const env: Record<string, string> = {};\n if (options.bearer) {\n env['API_KEY'] = options.bearer;\n }\n if (options.baseUrl) {\n env['BASE_URL'] = options.baseUrl;\n }\n if (options.env) {\n for (const e of options.env) {\n const [k, v] = e.split('=');\n if (k && v) env[k] = v;\n }\n }\n\n return {\n mcpServers: {\n [serverKey]: {\n command: 'npx',\n args: ['-y', '@postmcp/cli', 'run', specPath],\n env: Object.keys(env).length > 0 ? env : undefined,\n },\n },\n };\n}\n\nexport async function exportCommand(specArg: string, options: ExportCommandOptions): Promise<void> {\n let specPath = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp export <spec-path-or-url-or-@preset> --target cursor|claude|windsurf|all'));\n process.exit(1);\n }\n\n let serverKey = 'api-server';\n if (specPath.startsWith('@')) {\n serverKey = specPath.replace(/^@/, '').toLowerCase();\n } else {\n try {\n const parsed = await parseOpenAPI(specPath);\n serverKey = parsed.title.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'api-server';\n } catch {\n serverKey = 'api-server';\n }\n }\n\n const selectedTarget = (options.client || options.target || 'all').toLowerCase();\n const clientsToExport: Array<'cursor' | 'claude' | 'windsurf'> =\n selectedTarget === 'all'\n ? ['cursor', 'claude', 'windsurf']\n : [selectedTarget as 'cursor' | 'claude' | 'windsurf'];\n\n console.log(pc.bold(pc.cyan(`PostMCP 1-Click Client Configuration Exporter`)));\n console.log();\n\n for (const c of clientsToExport) {\n const configPath = getClientConfigPath(c);\n const snippet = buildClientConfigSnippet(serverKey, specPath, options);\n const formattedSnippet = JSON.stringify(snippet, null, 2);\n\n console.log(pc.bold(pc.green(`▶ ${c.toUpperCase()} (${c === 'cursor' ? 'Project Local' : 'Global Client'})`)));\n console.log(pc.dim(` Config path: ${configPath}`));\n console.log();\n console.log(pc.gray(formattedSnippet));\n console.log();\n\n if (options.write) {\n try {\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, 'utf-8');\n existingConfig = JSON.parse(raw);\n }\n\n existingConfig.mcpServers = existingConfig.mcpServers || {};\n existingConfig.mcpServers[serverKey] = (snippet as any).mcpServers[serverKey];\n\n const parentDir = path.dirname(configPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), 'utf-8');\n console.log(pc.green(` Successfully merged and written to ${configPath}`));\n } catch (err: any) {\n console.error(pc.red(` Failed to write to ${configPath}: ${err.message}`));\n }\n console.log();\n }\n }\n\n if (!options.write) {\n console.log(pc.dim(`Tip: Pass '--write' to automatically install this configuration into your client settings.`));\n }\n}\n","import { ALL_PRESETS, syncAllPresets } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport async function listPresetsCommand(categoryOrQuery?: string): Promise<void> {\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP Presets Catalog (${ALL_PRESETS.length} Curated Developer APIs)`)));\n console.log(pc.dim(`Run any preset instantly using: postmcp run @<preset_id>`));\n console.log();\n\n let displayedPresets = ALL_PRESETS;\n if (categoryOrQuery) {\n const q = categoryOrQuery.toLowerCase().trim();\n displayedPresets = ALL_PRESETS.filter((p: any) => {\n return (\n p.id.toLowerCase().includes(q) ||\n p.name.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n (p.tags && p.tags.some((t: string) => t.toLowerCase().includes(q)))\n );\n });\n }\n\n const table = new Table({\n head: [pc.bold('Preset ID'), pc.bold('API Name'), pc.bold('Category'), pc.bold('Authentication'), pc.bold('Run Command')],\n colWidths: [14, 26, 22, 28, 26],\n });\n\n for (const meta of displayedPresets) {\n table.push([\n pc.bold(pc.magenta(`@${meta.id}`)),\n meta.name,\n meta.category,\n pc.dim(meta.authType),\n pc.green(`postmcp run @${meta.id}`),\n ]);\n }\n\n console.log(table.toString());\n console.log();\n console.log(pc.dim(`Total Presets: ${displayedPresets.length} of ${ALL_PRESETS.length}`));\n console.log(pc.dim(`Run 'postmcp presets sync' to update offline cached schemas from GitHub.`));\n console.log();\n}\n\nexport async function syncPresetsCommand(): Promise<void> {\n console.log(pc.cyan(`Syncing latest OpenAPI schemas for all presets...`));\n try {\n const synced = await syncAllPresets();\n console.log(pc.green(`Successfully synced ${synced.length} presets to local cache (~/.postmcp/presets/):`));\n for (const id of synced) {\n console.log(` ${pc.green('●')} @${id}`);\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to sync presets: ${err.message}`));\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { spawn, ChildProcess } from 'node:child_process';\nimport open from 'open';\nimport axios from 'axios';\nimport pc from 'picocolors';\n\nexport interface StudioCommandOptions {\n port?: string;\n noOpen?: boolean;\n dev?: boolean;\n}\n\nexport function findStudioDir(): string {\n // 1. Check workspace and local monorepo paths first\n const workspaceCandidates = [\n path.resolve(process.cwd(), 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', 'studio'),\n path.resolve(__dirname, '..', '..', '..', 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', '..', '..', 'packages', 'studio'),\n ];\n\n for (const candidate of workspaceCandidates) {\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n }\n\n // 2. Search upwards from cwd and __dirname for monorepo packages/studio\n for (const startDir of [process.cwd(), __dirname]) {\n let cur = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(cur, 'packages', 'studio');\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n }\n\n // 3. Try resolving via Node module resolution (published npx postmcp)\n try {\n const customRequire = typeof createRequire !== 'undefined' ? createRequire(__filename) : (require as any);\n const pkgPath = customRequire.resolve('@postmcp/studio/package.json');\n if (fs.existsSync(pkgPath)) {\n const resolved = path.dirname(pkgPath);\n // If resolved into .pnpm cache inside a monorepo, prefer the live monorepo packages/studio\n const monorepoCandidate = path.resolve(resolved, '../../../../packages/studio');\n if (fs.existsSync(path.join(monorepoCandidate, 'package.json'))) {\n return monorepoCandidate;\n }\n return resolved;\n }\n } catch {\n // Module resolution fallback\n }\n\n // Fallback to packages/studio in workspace\n return path.resolve(process.cwd(), 'packages', 'studio');\n}\n\nexport async function waitForServer(url: string, timeoutMs: number = 20000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await axios.get(url, { timeout: 1000, validateStatus: () => true });\n if (res.status >= 200 && res.status < 500) {\n return true;\n }\n } catch {\n // Server not ready yet\n }\n await new Promise((r) => setTimeout(r, 400));\n }\n return false;\n}\n\nexport async function studioCommand(specArg?: string, options: StudioCommandOptions = {}): Promise<void> {\n const port = options.port || '3000';\n const baseUrl = `http://localhost:${port}`;\n const targetUrl = specArg ? `${baseUrl}?spec=${encodeURIComponent(specArg)}` : baseUrl;\n const studioDir = findStudioDir();\n\n console.log();\n console.log(pc.bold(pc.cyan(`Starting PostMCP Visual Web Studio...`)));\n console.log(` Port: ${pc.bold(pc.green(port))}`);\n console.log(` Studio Dir: ${pc.dim(studioDir)}`);\n if (specArg) {\n console.log(` Initial Spec: ${pc.dim(specArg)}`);\n }\n console.log();\n\n let child: ChildProcess | null = null;\n\n if (fs.existsSync(studioDir)) {\n const srcDir = path.join(studioDir, 'src');\n const nextDir = path.join(studioDir, '.next');\n let isStale = false;\n if (fs.existsSync(srcDir) && fs.existsSync(nextDir)) {\n try {\n const nextMtime = fs.statSync(nextDir).mtimeMs;\n const pageMtime = fs.statSync(path.join(srcDir, 'app', 'page.tsx')).mtimeMs;\n if (pageMtime > nextMtime) {\n isStale = true;\n }\n } catch {}\n }\n\n const isBuilt = fs.existsSync(nextDir) && !isStale;\n const preferDev = options.dev || isStale;\n // In standalone or monorepo environments, prefer npx next or pnpm\n const isPnpm = fs.existsSync(path.join(studioDir, '..', '..', 'pnpm-lock.yaml'));\n const command = isPnpm ? 'pnpm' : 'npx';\n const args = isPnpm\n ? isBuilt && !preferDev\n ? ['start', '--port', port]\n : ['dev', '--port', port]\n : isBuilt && !preferDev\n ? ['next', 'start', '-p', port]\n : ['next', 'dev', '-p', port];\n\n try {\n child = spawn(command, args, {\n cwd: studioDir,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: port,\n NEXT_PUBLIC_INITIAL_SPEC: specArg || '',\n STUDIO_INITIAL_SPEC: specArg || '',\n POSTMCP_WORKSPACE: process.cwd(),\n WORKSPACE_CWD: process.cwd(),\n },\n });\n\n const cleanup = () => {\n if (child) {\n try {\n child.kill('SIGINT');\n } catch {\n // Ignore kill errors\n }\n }\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('exit', cleanup);\n } catch (err: any) {\n console.log(pc.yellow(` Note: Running in detached standalone mode: ${err.message}`));\n }\n }\n\n // Wait for server to become responsive\n const isReady = await waitForServer(baseUrl, 15000);\n\n if (isReady) {\n console.log(pc.green(`PostMCP Visual Web Studio ready at: ${pc.bold(targetUrl)}`));\n } else {\n console.log(pc.dim(` Studio server starting at: ${targetUrl}`));\n }\n\n if (!options.noOpen) {\n try {\n await open(targetUrl);\n console.log(pc.dim(`Opening Web Studio in your default browser...`));\n } catch {\n console.log(pc.dim(`Please open ${targetUrl} in your browser.`));\n }\n }\n\n // If running interactively, wait for child process\n if (child) {\n await new Promise<void>((resolve) => {\n child?.on('close', () => resolve());\n });\n }\n}\n"],"mappings":"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","names":["fs","path","parseOpenAPI","pc","parseOpenAPI","fs","path","parseOpenAPI","pc","parseOpenAPI","fs","path","os","parseOpenAPI","pc","Table","pc","path","fs","axios","pc","axios","pc","resolve","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin.ts","../src/commands/run.ts","../src/config/loader.ts","../src/presets/index.ts","../src/commands/inspect.ts","../src/commands/generate.ts","../src/commands/export.ts","../src/commands/presets.ts","../src/commands/studio.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { inspectCommand } from './commands/inspect.js';\nimport { generateCommand } from './commands/generate.js';\nimport { exportCommand } from './commands/export.js';\nimport { listPresetsCommand, syncPresetsCommand } from './commands/presets.js';\nimport { studioCommand } from './commands/studio.js';\nimport { readFileSync } from 'fs';\nimport { resolve } from 'path';\nimport pc from 'picocolors';\n\ndeclare const __POSTMCP_VERSION__: string | undefined;\n\nfunction getCliVersion(): string {\n if (typeof __POSTMCP_VERSION__ === 'string') {\n return __POSTMCP_VERSION__;\n }\n try {\n const dir = typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n const pkg = JSON.parse(readFileSync(resolve(dir, '../package.json'), 'utf8'));\n return pkg.version || 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('postmcp')\n .description('The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.')\n .version(getCliVersion());\n\n // 1. Run Command\n program\n .command('run [spec]')\n .description('Start an MCP server over stdio or Streamable HTTP from an OpenAPI spec')\n .option('-b, --base-url <url>', 'Override target API base URL')\n .option('-t, --transport <type>', 'Transport type: stdio or http (default: stdio)', 'stdio')\n .option('-p, --port <number>', 'Port for Streamable HTTP server')\n .option('-H, --header <key:value...>', 'Custom request headers (can be specified multiple times)', (val, prev: string[] = []) => [...prev, val])\n .option('--bearer <token>', 'Bearer authentication token or $ENV_VAR')\n .option('--api-key <name=value>', 'API key credentials (e.g. key=val, header:key=val, query:key=val)')\n .option('--jit', 'Force Just-In-Time dynamic tool routing')\n .option('--no-jit', 'Disable JIT mode and expose all tools statically')\n .option('--hot-tool-keywords <keywords>', 'Comma-separated keywords to prioritize for turn-1 pre-mounted hot tools')\n .option('--dry-run', 'Simulate mutation & critical requests without real API execution')\n .option('--token-diet', 'Enable Token Diet response optimization (enabled by default)')\n .option('--no-token-diet', 'Disable Token Diet payload pruning & markdown tables')\n .option('--max-tokens <number>', 'Token ceiling per tool response', '2500')\n .option('--env-file <path>', 'Custom .env file path to load')\n .option('-c, --config <path>', 'Custom postmcp.config.json path')\n .action((spec, opts) => {\n runCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 2. Inspect Command\n program\n .command('inspect <spec>')\n .description('Inspect an OpenAPI specification: summary, methods breakdown, risk tiers, and JIT recommendation')\n .option('--json', 'Output machine-readable normalized AST JSON')\n .action((spec, opts) => {\n inspectCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 3. Generate Command\n program\n .command('generate <spec>')\n .description('Generate a complete standalone TS or PY MCP server project')\n .option('-t, --target <language>', 'Target language: ts or py (default: ts)')\n .option('-l, --lang <language>', 'Alias for --target')\n .option('-o, --out <directory>', 'Output directory for the generated project')\n .action((spec, opts) => {\n generateCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 4. Export Command\n program\n .command('export <spec>')\n .description('1-Click configuration exporter for Cursor, Claude Desktop, and Windsurf')\n .option('-t, --target <name>', 'Target client: cursor, claude, windsurf, or all')\n .option('--client <name>', 'Alias for --target')\n .option('-w, --write', 'Automatically merge and write configuration directly to the client config file on disk')\n .option('--bearer <token>', 'Bearer token for client configuration environment')\n .option('-b, --base-url <url>', 'Base URL override for client configuration environment')\n .option('-e, --env <key=val...>', 'Environment variables for client configuration', (val, prev: string[] = []) => [...prev, val])\n .action((spec, opts) => {\n const target = opts.target || opts.client || 'all';\n exportCommand(spec, { ...opts, target, client: target }).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 5. Presets Command with subcommands & default action\n const presetsCmd = program\n .command('presets')\n .description('Manage and explore bundled top 50+ API presets')\n .argument('[filter]', 'Optional search query or category filter')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('list [filter]')\n .description('List all available presets in catalog')\n .action((filter) => {\n listPresetsCommand(filter).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n presetsCmd\n .command('sync')\n .description('Sync latest OpenAPI schemas from GitHub to local cache (~/.postmcp/presets/)')\n .action(() => {\n syncPresetsCommand().catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n // 6. Studio Command\n program\n .command('studio [spec]')\n .description('Launch the PostMCP Visual Web Studio')\n .option('-p, --port <port>', 'Studio port', '3000')\n .option('--dev', 'Run Next.js in Turbopack development mode')\n .option('--no-open', 'Do not automatically open browser')\n .action((spec, opts) => {\n studioCommand(spec, opts).catch((err) => {\n console.error(pc.red(`Fatal error: ${err.message}`));\n process.exit(1);\n });\n });\n\n return program;\n}\n\nif (process.env.NODE_ENV !== 'test') {\n const cli = createCli();\n cli.parse(process.argv);\n}\n","import { parseOpenAPI, startStdioServer, startHttpServer, AuthConfig, NormalizedSpec } from '@postmcp/core';\nimport type { RunCommandOptions } from '@postmcp/types';\nimport { loadEnvFile, loadConfigFile, parseHeaderFlags, parseApiKeyFlag } from '../config/loader.js';\nimport { resolvePresetSpec, getPreset, buildPresetAuthConfig, ALL_PRESETS, Preset } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { RunCommandOptions };\n\nexport async function runCommand(specArg: string, options: RunCommandOptions): Promise<void> {\n // 1. Load environment and configuration files\n loadEnvFile(options.envFile);\n const fileConfig = loadConfigFile(options.config);\n\n let specPath: string | object | undefined = specArg || fileConfig.spec;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp run <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset: Preset | undefined = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n } else if (typeof specPath === 'string') {\n const lower = specPath.toLowerCase();\n preset = ALL_PRESETS.find(\n (p: Preset) =>\n (p.specUrl && lower.includes(p.specUrl.toLowerCase())) ||\n (p.id && (lower.includes(`/${p.id}/`) || lower.includes(`/${p.id}.`) || lower.includes(`/${p.id}-`) || lower.includes(`${p.id}.tech`)))\n );\n }\n\n // 2. Parse OpenAPI Specification\n let parsedSpec: NormalizedSpec;\n try {\n parsedSpec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse OpenAPI specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n // If preset or config defines additional composite macros, wire them into parsed spec\n if (preset && preset.macros && preset.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...preset.macros];\n }\n if (fileConfig.macros && fileConfig.macros.length > 0) {\n parsedSpec.macros = [...(parsedSpec.macros || []), ...fileConfig.macros];\n }\n\n // If config defines enabledOperations, filter out disabled operations (Finding 5)\n if (fileConfig.enabledOperations && Object.keys(fileConfig.enabledOperations).length > 0) {\n parsedSpec.operations = parsedSpec.operations.filter(\n (op: any) => fileConfig.enabledOperations![op.id] !== false\n );\n }\n\n // 3. Build Auth Configuration with preset-specific auth dispatching (Finding 1)\n const cliHeaders = parseHeaderFlags(options.header);\n const cliApiKey = parseApiKeyFlag(options.apiKey);\n const presetAuthConfig = preset ? buildPresetAuthConfig(preset, process.env) : {};\n\n const authConfig: AuthConfig = {\n headers: { ...presetAuthConfig.headers, ...fileConfig.auth?.headers, ...cliHeaders },\n bearerToken:\n options.bearer ||\n fileConfig.auth?.bearerToken ||\n presetAuthConfig.bearerToken ||\n process.env.API_KEY ||\n process.env.BEARER_TOKEN,\n apiKey: cliApiKey || fileConfig.auth?.apiKey || presetAuthConfig.apiKey,\n basicAuth: fileConfig.auth?.basicAuth || presetAuthConfig.basicAuth,\n securitySchemes: {\n ...presetAuthConfig.securitySchemes,\n ...fileConfig.auth?.securitySchemes,\n },\n allowedExternalHosts: fileConfig.auth?.allowedExternalHosts,\n allowCrossOriginAuth: fileConfig.auth?.allowCrossOriginAuth,\n };\n\n const transport = options.transport || fileConfig.transport || (options.port ? 'http' : 'stdio');\n const resolvedBaseUrl =\n options.baseUrl ||\n fileConfig.baseUrl ||\n process.env.BASE_URL ||\n (parsedSpec.servers.length > 0 ? parsedSpec.servers[0].url : preset?.defaultBaseUrl);\n\n let isJit: boolean | { forceJIT?: boolean; maxMountedTools?: number; hotToolKeywords?: string[] } | undefined;\n if (options.jit !== undefined) {\n if (typeof fileConfig.jit === 'object') {\n isJit = {\n forceJIT: options.jit,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n } else {\n isJit = options.jit;\n }\n } else if (fileConfig.jit !== undefined) {\n if (typeof fileConfig.jit === 'boolean') {\n isJit = fileConfig.jit;\n } else {\n isJit = {\n forceJIT: fileConfig.jit.enabled,\n maxMountedTools: fileConfig.jit.maxMountedTools,\n hotToolKeywords: fileConfig.jit.hotToolKeywords,\n };\n }\n }\n const isDryRun = options.dryRun !== undefined ? options.dryRun : fileConfig.dryRun;\n const isTokenDiet = options.tokenDiet !== undefined ? options.tokenDiet : fileConfig.tokenDiet?.enabled !== false;\n const maxTokens = options.maxTokens ? parseInt(options.maxTokens, 10) : fileConfig.tokenDiet?.maxTokens || 2500;\n\n let hotToolKeywords: string[] | undefined;\n if (options.hotToolKeywords) {\n hotToolKeywords = options.hotToolKeywords.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (fileConfig.hotToolKeywords) {\n hotToolKeywords = fileConfig.hotToolKeywords;\n } else if (typeof fileConfig.jit === 'object' && fileConfig.jit.hotToolKeywords) {\n hotToolKeywords = fileConfig.jit.hotToolKeywords;\n }\n\n // 4. Build path-specific field masks from preset & file config (Finding 2 & 5)\n const pathFieldMasks: Record<string, string[]> = {};\n if (preset?.fieldMasks) {\n for (const fm of preset.fieldMasks) {\n pathFieldMasks[fm.path] = fm.fields;\n }\n }\n if (fileConfig.fieldMasks) {\n Object.assign(pathFieldMasks, fileConfig.fieldMasks);\n }\n\n const serverOptions = {\n spec: parsedSpec,\n baseUrl: resolvedBaseUrl,\n auth: authConfig,\n jit: isJit,\n hotToolKeywords,\n dryRun: isDryRun,\n tokenDiet: {\n enabled: isTokenDiet,\n maxTokens,\n pathFieldMasks: isTokenDiet && Object.keys(pathFieldMasks).length > 0 ? pathFieldMasks : undefined,\n convertToMarkdownTable: fileConfig.tokenDiet?.convertToMarkdownTable !== false,\n },\n serverName: parsedSpec.title,\n serverVersion: parsedSpec.version,\n };\n\n if (transport === 'http') {\n const port = options.port ? parseInt(options.port, 10) : fileConfig.port || 3000;\n const host = options.host || 'localhost';\n\n const { url } = await startHttpServer({\n ...serverOptions,\n port,\n host,\n });\n\n console.log(pc.green(`PostMCP Streamable HTTP server listening at: ${pc.bold(url)}`));\n console.log(pc.dim(` Service: ${parsedSpec.title} (v${parsedSpec.version}) | Endpoints: ${parsedSpec.operations.length}`));\n if (isDryRun) {\n console.log(pc.yellow(` Mode: DRY-RUN SIMULATION (Mutations simulated, no real side effects)`));\n }\n } else {\n // Default: stdio transport for Cursor, Claude Desktop, Antigravity\n await startStdioServer(serverOptions);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport dotenv from 'dotenv';\nimport { AuthConfig } from '@postmcp/core';\nimport type { PostMcpCliConfig } from '@postmcp/types';\n\nexport type { PostMcpCliConfig };\n\nexport function loadEnvFile(envFilePath?: string): void {\n if (envFilePath) {\n const resolved = path.resolve(envFilePath);\n if (fs.existsSync(resolved)) {\n dotenv.config({ path: resolved });\n }\n } else {\n // Default to .env in cwd if exists\n const defaultEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(defaultEnv)) {\n dotenv.config({ path: defaultEnv });\n }\n }\n}\n\nexport function loadConfigFile(configPath?: string): PostMcpCliConfig {\n let targetPath = configPath ? path.resolve(configPath) : null;\n\n if (!targetPath) {\n const candidates = ['postmcp.config.json', 'postmcp.json', '.postmcprc.json'];\n for (const c of candidates) {\n const candidatePath = path.resolve(process.cwd(), c);\n if (fs.existsSync(candidatePath)) {\n targetPath = candidatePath;\n break;\n }\n }\n }\n\n if (targetPath && fs.existsSync(targetPath)) {\n try {\n const content = fs.readFileSync(targetPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n return {};\n}\n\nexport function parseHeaderFlags(headers?: string[]): Record<string, string> {\n if (!headers || !Array.isArray(headers)) return {};\n const result: Record<string, string> = {};\n for (const h of headers) {\n const colonIdx = h.indexOf(':');\n if (colonIdx !== -1) {\n const key = h.slice(0, colonIdx).trim();\n const val = h.slice(colonIdx + 1).trim();\n if (key && val) {\n result[key] = val;\n }\n }\n }\n return result;\n}\n\nexport function parseApiKeyFlag(apiKeyStr?: string): { name: string; value: string; in: 'header' | 'query' | 'cookie' } | undefined {\n if (!apiKeyStr) return undefined;\n // Format: \"name=value\" or \"header:name=value\" or \"query:name=value\"\n let location: 'header' | 'query' | 'cookie' = 'header';\n let rest = apiKeyStr;\n\n if (apiKeyStr.startsWith('query:')) {\n location = 'query';\n rest = apiKeyStr.slice(6);\n } else if (apiKeyStr.startsWith('header:')) {\n location = 'header';\n rest = apiKeyStr.slice(7);\n } else if (apiKeyStr.startsWith('cookie:')) {\n location = 'cookie';\n rest = apiKeyStr.slice(7);\n }\n\n const eqIdx = rest.indexOf('=');\n if (eqIdx !== -1) {\n const name = rest.slice(0, eqIdx).trim();\n const value = rest.slice(eqIdx + 1).trim();\n if (name && value) {\n return { name, value, in: location };\n }\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport axios from 'axios';\nimport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset } from '@postmcp/presets';\n\nexport { ALL_PRESETS, PRESETS_BY_ID, getPreset, buildPresetAuthConfig, Preset };\nexport const BUNDLED_PRESETS = PRESETS_BY_ID;\n\nexport function getPresetCacheDir(): string {\n try {\n const dir = path.join(os.homedir(), '.postmcp', 'presets');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n } catch {\n const fallbackDir = path.join(os.tmpdir(), 'postmcp-presets');\n if (!fs.existsSync(fallbackDir)) {\n try {\n fs.mkdirSync(fallbackDir, { recursive: true });\n } catch {\n // Ignore fallback dir creation errors\n }\n }\n return fallbackDir;\n }\n}\n\nexport async function resolvePresetSpec(presetIdOrAlias: string): Promise<string | object> {\n const cleanId = presetIdOrAlias.replace(/^@/, '').toLowerCase().trim();\n const preset = getPreset(cleanId);\n\n if (!preset) {\n throw new Error(`Unknown preset '@${cleanId}'. Run 'postmcp presets list' to see all available presets.`);\n }\n\n // Check local cache first\n const cacheDir = getPresetCacheDir();\n const cacheFile = path.join(cacheDir, `${cleanId}.json`);\n if (fs.existsSync(cacheFile)) {\n return cacheFile;\n }\n\n // If remote spec URL exists, try to fetch and cache it\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n try {\n fs.writeFileSync(cacheFile, res.data, 'utf-8');\n return cacheFile;\n } catch {\n return res.data;\n }\n } catch {\n // Remote fetch failed, fall through to bundledSpec\n }\n }\n\n // If bundledSpec exists, write to cache and return\n if (preset.bundledSpec) {\n try {\n fs.writeFileSync(cacheFile, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n return cacheFile;\n } catch {\n return preset.bundledSpec;\n }\n }\n\n if (preset.specUrl) {\n return preset.specUrl;\n }\n\n throw new Error(`Preset '@${cleanId}' has no specification available.`);\n}\n\nexport async function syncAllPresets(): Promise<string[]> {\n const synced: string[] = [];\n const cacheDir = getPresetCacheDir();\n\n for (const preset of ALL_PRESETS) {\n const filePath = path.join(cacheDir, `${preset.id}.json`);\n let wrote = false;\n\n if (preset.specUrl) {\n try {\n const res = await axios.get(preset.specUrl, { timeout: 8000, responseType: 'text' });\n fs.writeFileSync(filePath, res.data, 'utf-8');\n wrote = true;\n } catch {\n // Fallback to bundled spec\n }\n }\n\n if (!wrote && preset.bundledSpec) {\n try {\n fs.writeFileSync(filePath, JSON.stringify(preset.bundledSpec, null, 2), 'utf-8');\n wrote = true;\n } catch {\n // Ignore filesystem write error\n }\n }\n\n if (wrote) {\n synced.push(preset.id);\n }\n }\n\n return synced;\n}\n","import { parseOpenAPI } from '@postmcp/core';\nimport type { InspectCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec, getPreset } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport type { InspectCommandOptions };\n\nexport function estimateSpecTokenSavings(spec: any): { rawTokens: number; optimizedTokens: number; savingsPct: number } {\n const rawTokensPerOp = spec.operations.map((op: any) => {\n const descLen = (op.description || op.summary || '').length;\n const schemaLen = JSON.stringify(op.inputSchema || {}).length;\n return Math.ceil((descLen + schemaLen + 50) / 4);\n });\n\n const totalRawToolTokens = rawTokensPerOp.reduce((a: number, b: number) => a + b, 0);\n // In JIT mode, prompt contains tool_search (~120 tokens) + max 5 mounted active tools\n const avgOpTokens = spec.operations.length > 0 ? Math.ceil(totalRawToolTokens / spec.operations.length) : 0;\n const jitPromptTokens = 120 + Math.min(spec.operations.length, 5) * Math.ceil(avgOpTokens * 0.4); // 40% with diet\n\n const raw = Math.max(totalRawToolTokens, 200);\n const optimized = Math.min(raw, jitPromptTokens);\n const savingsPct = Math.max(15, Math.round(((raw - optimized) / raw) * 100));\n\n return {\n rawTokens: raw,\n optimizedTokens: optimized,\n savingsPct,\n };\n}\n\nexport async function inspectCommand(specArg: string, options: InspectCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp inspect <spec-path-or-url-or-@preset>'));\n process.exit(1);\n return;\n }\n\n let preset = undefined;\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n preset = getPreset(specPath);\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n if (preset && preset.macros && preset.macros.length > 0) {\n spec.macros = [...(spec.macros || []), ...preset.macros];\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(spec, null, 2));\n return;\n }\n\n // Token savings estimation\n const tokenMetrics = estimateSpecTokenSavings(spec);\n\n // Header Banner\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP API Inspection: ${spec.title} (v${spec.version})`)));\n if (spec.description) {\n console.log(pc.dim(spec.description.slice(0, 120) + (spec.description.length > 120 ? '...' : '')));\n }\n console.log();\n\n // 1. Overview Table\n const overviewTable = new Table({\n head: [pc.bold('Metric'), pc.bold('Value')],\n colWidths: [25, 55],\n });\n\n const totalOps = spec.operations.length;\n const methodsCount: Record<string, number> = {};\n const riskCounts = { READ_ONLY: 0, MUTATION: 0, CRITICAL: 0 };\n\n for (const op of spec.operations) {\n const m = op.method.toUpperCase();\n methodsCount[m] = (methodsCount[m] || 0) + 1;\n riskCounts[op.riskTier] = (riskCounts[op.riskTier] || 0) + 1;\n }\n\n const methodsStr = Object.entries(methodsCount)\n .map(([m, c]) => `${m}: ${c}`)\n .join(' | ');\n\n const defaultUrl = spec.servers.length > 0 ? spec.servers[0].url : 'None declared';\n const secSchemeEntries = Object.entries<any>(spec.securitySchemes || {});\n let secSchemesDisplay = 'None declared';\n if (secSchemeEntries.length > 0) {\n secSchemesDisplay = secSchemeEntries\n .map(([name, s]) => {\n if (s.type === 'http') return `${name} (HTTP ${s.scheme || 'bearer'})`;\n if (s.type === 'apiKey') return `${name} (API key in ${s.in || 'header'}: ${s.name || name})`;\n return `${name} (${s.type || 'custom'})`;\n })\n .join(', ');\n }\n const recommendedJit = totalOps > 20 ? pc.green('Yes (Dynamic JIT routing recommended)') : pc.blue('No (Static direct tools)');\n const savingsDisplay = pc.green(`~${tokenMetrics.savingsPct}% (${tokenMetrics.rawTokens.toLocaleString()} → ${tokenMetrics.optimizedTokens.toLocaleString()} tokens)`);\n\n overviewTable.push(\n ['Total Endpoints', `${totalOps} operations`],\n ['HTTP Methods', methodsStr],\n ['Base URL', defaultUrl],\n ['Security Schemes', secSchemesDisplay],\n ['JIT Router Mode', recommendedJit],\n ['Est. Token Savings', savingsDisplay],\n ['Macros / Workflows', `${spec.macros?.length || 0} composite macros`]\n );\n\n console.log(overviewTable.toString());\n console.log();\n\n // 2. Token Diet & Context Optimization Preview\n console.log(pc.bold('Token Diet & Context Optimization Preview:'));\n console.log(` ● Full Static Tool Declarations: ~${tokenMetrics.rawTokens.toLocaleString()} tokens`);\n console.log(` ● PostMCP JIT + Token Diet: ~${tokenMetrics.optimizedTokens.toLocaleString()} tokens`);\n console.log(` ● Context Window Savings: ${pc.bold(pc.green(`~${tokenMetrics.savingsPct}% saved`))}`);\n console.log();\n\n // 3. Authentication Guide\n if (secSchemeEntries.length > 0) {\n console.log(pc.bold('Authentication Guide:'));\n for (const [name, scheme] of secSchemeEntries) {\n if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'bearer') {\n console.log(` ● ${pc.cyan(name)}: HTTP Bearer Token`);\n console.log(` Header: Authorization: Bearer <token>`);\n console.log(` CLI Option: --bearer <token> (e.g. --bearer $MY_API_KEY)`);\n console.log(` Environment: BEARER_TOKEN or API_KEY`);\n } else if (scheme.type === 'apiKey') {\n const loc = scheme.in || 'header';\n const keyName = scheme.name || name;\n console.log(` ● ${pc.cyan(name)}: API Key in ${loc} (${pc.bold(keyName)})`);\n if (loc === 'header') {\n console.log(` CLI Option: --api-key \"${keyName}=<token>\" or -H \"${keyName}: <token>\"`);\n } else if (loc === 'query') {\n console.log(` CLI Option: --api-key \"query:${keyName}=<token>\"`);\n }\n console.log(` Environment: Set via custom header / config`);\n } else if (scheme.type === 'http' && scheme.scheme?.toLowerCase() === 'basic') {\n console.log(` ● ${pc.cyan(name)}: HTTP Basic Auth`);\n console.log(` CLI Option: -H \"Authorization: Basic <base64>\"`);\n } else {\n console.log(` ● ${pc.cyan(name)}: ${scheme.type || 'Custom'}`);\n }\n }\n console.log();\n }\n\n // 4. Risk Tiers Breakdown\n console.log(pc.bold('Safety & Risk Tier Breakdown:'));\n console.log(` ${pc.green('● READ_ONLY')}: ${riskCounts.READ_ONLY} endpoints (Safe for autonomous exploration)`);\n console.log(` ${pc.yellow('● MUTATION')}: ${riskCounts.MUTATION} endpoints (Creates or updates data)`);\n console.log(` ${pc.red('● CRITICAL')}: ${riskCounts.CRITICAL} endpoints (Destructive actions / simulated in dry-run)`);\n console.log();\n\n // 4. Sample Endpoints List\n console.log(pc.bold(`Operations List (Showing first 10 of ${totalOps}):`));\n const opTable = new Table({\n head: [pc.bold('Tool Name (ID)'), pc.bold('Method'), pc.bold('Path'), pc.bold('Risk Tier')],\n colWidths: [22, 10, 32, 14],\n });\n\n const sampleOps = spec.operations.slice(0, 10);\n for (const op of sampleOps) {\n const tierColor =\n op.riskTier === 'READ_ONLY' ? pc.green(op.riskTier) : op.riskTier === 'CRITICAL' ? pc.red(op.riskTier) : pc.yellow(op.riskTier);\n opTable.push([op.id, op.method.toUpperCase(), op.path, tierColor]);\n }\n\n console.log(opTable.toString());\n if (totalOps > 10) {\n console.log(pc.dim(` ... and ${totalOps - 10} more endpoints.`));\n }\n console.log();\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseOpenAPI, generateProject, generateTypeScriptProject, generatePythonProject } from '@postmcp/core';\nimport type { GenerateCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { GenerateCommandOptions };\n\nexport async function generateCommand(specArg: string, options: GenerateCommandOptions): Promise<void> {\n let specPath: string | object = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp generate <spec-path-or-url-or-@preset> --target <python|typescript>'));\n process.exit(1);\n return;\n }\n\n if (typeof specPath === 'string' && specPath.startsWith('@')) {\n try {\n specPath = await resolvePresetSpec(specPath);\n } catch (err: any) {\n console.error(pc.red(`Error resolving preset: ${err.message}`));\n process.exit(1);\n return;\n }\n }\n\n let spec;\n try {\n spec = await parseOpenAPI(specPath);\n } catch (err: any) {\n console.error(pc.red(`Failed to parse specification: ${err.message}`));\n process.exit(1);\n return;\n }\n\n const rawLang = (options.lang || options.target || 'ts').toLowerCase();\n let targetLang: 'ts' | 'py';\n if (rawLang === 'ts' || rawLang === 'typescript') {\n targetLang = 'ts';\n } else if (rawLang === 'py' || rawLang === 'python') {\n targetLang = 'py';\n } else {\n console.error(pc.red(`Unsupported language '${rawLang}'. Supported languages: 'ts', 'py'.`));\n process.exit(1);\n return;\n }\n\n const outDir = path.resolve(options.out || `./${spec.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp`);\n\n console.log(pc.cyan(`Generating standalone ${pc.bold(targetLang.toUpperCase())} MCP server for '${spec.title}'...`));\n\n const project = targetLang === 'ts'\n ? generateTypeScriptProject(spec)\n : generatePythonProject(spec);\n\n // Write files to target directory\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const [relativePath, content] of Object.entries(project.files)) {\n const filePath = path.join(outDir, relativePath);\n const parentDir = path.dirname(filePath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n console.log(` ${pc.green('+')} ${relativePath}`);\n }\n\n console.log();\n console.log(pc.green(`Standalone MCP server successfully generated at:`));\n console.log(` ${pc.bold(outDir)}`);\n console.log();\n console.log(pc.dim('Next steps:'));\n if (targetLang === 'ts') {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' npm install');\n console.log(' npm run build');\n console.log(' npm start');\n } else {\n console.log(` cd ${path.relative(process.cwd(), outDir) || '.'}`);\n console.log(' pip install -r requirements.txt');\n console.log(' python server.py');\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { parseOpenAPI } from '@postmcp/core';\nimport type { ExportCommandOptions } from '@postmcp/types';\nimport { resolvePresetSpec } from '../presets/index.js';\nimport pc from 'picocolors';\n\nexport type { ExportCommandOptions };\n\nexport function getClientConfigPath(client: 'cursor' | 'claude' | 'windsurf'): string {\n const home = os.homedir();\n if (client === 'cursor') {\n return path.join(process.cwd(), '.cursor', 'mcp.json');\n }\n if (client === 'claude') {\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n if (process.platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');\n }\n // Linux\n return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');\n }\n if (client === 'windsurf') {\n return path.join(home, '.codeium', 'windsurf', 'mcp_config.json');\n }\n return path.join(process.cwd(), 'mcp.json');\n}\n\nexport function buildClientConfigSnippet(\n serverKey: string,\n specPath: string,\n options: ExportCommandOptions\n): object {\n const env: Record<string, string> = {};\n if (options.bearer) {\n env['API_KEY'] = options.bearer;\n }\n if (options.baseUrl) {\n env['BASE_URL'] = options.baseUrl;\n }\n if (options.env) {\n for (const e of options.env) {\n const [k, v] = e.split('=');\n if (k && v) env[k] = v;\n }\n }\n\n return {\n mcpServers: {\n [serverKey]: {\n command: 'npx',\n args: ['-y', '@postmcp/cli', 'run', specPath],\n env: Object.keys(env).length > 0 ? env : undefined,\n },\n },\n };\n}\n\nexport async function exportCommand(specArg: string, options: ExportCommandOptions): Promise<void> {\n let specPath = specArg;\n if (!specPath) {\n console.error(pc.red('Error: No OpenAPI spec provided. Usage: postmcp export <spec-path-or-url-or-@preset> --target cursor|claude|windsurf|all'));\n process.exit(1);\n }\n\n let serverKey = 'api-server';\n if (specPath.startsWith('@')) {\n serverKey = specPath.replace(/^@/, '').toLowerCase();\n } else {\n try {\n const parsed = await parseOpenAPI(specPath);\n serverKey = parsed.title.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'api-server';\n } catch {\n serverKey = 'api-server';\n }\n }\n\n const selectedTarget = (options.client || options.target || 'all').toLowerCase();\n const clientsToExport: Array<'cursor' | 'claude' | 'windsurf'> =\n selectedTarget === 'all'\n ? ['cursor', 'claude', 'windsurf']\n : [selectedTarget as 'cursor' | 'claude' | 'windsurf'];\n\n console.log(pc.bold(pc.cyan(`PostMCP 1-Click Client Configuration Exporter`)));\n console.log();\n\n for (const c of clientsToExport) {\n const configPath = getClientConfigPath(c);\n const snippet = buildClientConfigSnippet(serverKey, specPath, options);\n const formattedSnippet = JSON.stringify(snippet, null, 2);\n\n console.log(pc.bold(pc.green(`▶ ${c.toUpperCase()} (${c === 'cursor' ? 'Project Local' : 'Global Client'})`)));\n console.log(pc.dim(` Config path: ${configPath}`));\n console.log();\n console.log(pc.gray(formattedSnippet));\n console.log();\n\n if (options.write) {\n try {\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, 'utf-8');\n existingConfig = JSON.parse(raw);\n }\n\n existingConfig.mcpServers = existingConfig.mcpServers || {};\n existingConfig.mcpServers[serverKey] = (snippet as any).mcpServers[serverKey];\n\n const parentDir = path.dirname(configPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), 'utf-8');\n console.log(pc.green(` Successfully merged and written to ${configPath}`));\n } catch (err: any) {\n console.error(pc.red(` Failed to write to ${configPath}: ${err.message}`));\n }\n console.log();\n }\n }\n\n if (!options.write) {\n console.log(pc.dim(`Tip: Pass '--write' to automatically install this configuration into your client settings.`));\n }\n}\n","import { ALL_PRESETS, syncAllPresets } from '../presets/index.js';\nimport Table from 'cli-table3';\nimport pc from 'picocolors';\n\nexport async function listPresetsCommand(categoryOrQuery?: string): Promise<void> {\n console.log();\n console.log(pc.bold(pc.cyan(`PostMCP Presets Catalog (${ALL_PRESETS.length} Curated Developer APIs)`)));\n console.log(pc.dim(`Run any preset instantly using: postmcp run @<preset_id>`));\n console.log();\n\n let displayedPresets = ALL_PRESETS;\n if (categoryOrQuery) {\n const q = categoryOrQuery.toLowerCase().trim();\n displayedPresets = ALL_PRESETS.filter((p: any) => {\n return (\n p.id.toLowerCase().includes(q) ||\n p.name.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n (p.tags && p.tags.some((t: string) => t.toLowerCase().includes(q)))\n );\n });\n }\n\n const table = new Table({\n head: [pc.bold('Preset ID'), pc.bold('API Name'), pc.bold('Category'), pc.bold('Authentication'), pc.bold('Run Command')],\n colWidths: [14, 26, 22, 28, 26],\n });\n\n for (const meta of displayedPresets) {\n table.push([\n pc.bold(pc.magenta(`@${meta.id}`)),\n meta.name,\n meta.category,\n pc.dim(meta.authType),\n pc.green(`postmcp run @${meta.id}`),\n ]);\n }\n\n console.log(table.toString());\n console.log();\n console.log(pc.dim(`Total Presets: ${displayedPresets.length} of ${ALL_PRESETS.length}`));\n console.log(pc.dim(`Run 'postmcp presets sync' to update offline cached schemas from GitHub.`));\n console.log();\n}\n\nexport async function syncPresetsCommand(): Promise<void> {\n console.log(pc.cyan(`Syncing latest OpenAPI schemas for all presets...`));\n try {\n const synced = await syncAllPresets();\n console.log(pc.green(`Successfully synced ${synced.length} presets to local cache (~/.postmcp/presets/):`));\n for (const id of synced) {\n console.log(` ${pc.green('●')} @${id}`);\n }\n } catch (err: any) {\n console.error(pc.red(`Failed to sync presets: ${err.message}`));\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { spawn, ChildProcess } from 'node:child_process';\nimport open from 'open';\nimport axios from 'axios';\nimport pc from 'picocolors';\n\nexport interface StudioCommandOptions {\n port?: string;\n noOpen?: boolean;\n dev?: boolean;\n}\n\nexport function findStudioDir(): string {\n // 1. Check workspace and local monorepo paths first\n const workspaceCandidates = [\n path.resolve(process.cwd(), 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', 'studio'),\n path.resolve(__dirname, '..', '..', '..', 'packages', 'studio'),\n path.resolve(__dirname, '..', '..', '..', '..', 'packages', 'studio'),\n ];\n\n for (const candidate of workspaceCandidates) {\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n }\n\n // 2. Search upwards from cwd and __dirname for monorepo packages/studio\n for (const startDir of [process.cwd(), __dirname]) {\n let cur = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(cur, 'packages', 'studio');\n if (fs.existsSync(path.join(candidate, 'package.json'))) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(candidate, 'package.json'), 'utf-8'));\n if (pkg.name === '@postmcp/studio') {\n return candidate;\n }\n } catch {}\n }\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n }\n\n // 3. Try resolving via Node module resolution (published npx postmcp)\n try {\n const customRequire = typeof createRequire !== 'undefined' ? createRequire(__filename) : (require as any);\n const pkgPath = customRequire.resolve('@postmcp/studio/package.json');\n if (fs.existsSync(pkgPath)) {\n const resolved = path.dirname(pkgPath);\n // If resolved into .pnpm cache inside a monorepo, prefer the live monorepo packages/studio\n const monorepoCandidate = path.resolve(resolved, '../../../../packages/studio');\n if (fs.existsSync(path.join(monorepoCandidate, 'package.json'))) {\n return monorepoCandidate;\n }\n return resolved;\n }\n } catch {\n // Module resolution fallback\n }\n\n // Fallback to packages/studio in workspace\n return path.resolve(process.cwd(), 'packages', 'studio');\n}\n\nexport async function waitForServer(url: string, timeoutMs: number = 20000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await axios.get(url, { timeout: 1000, validateStatus: () => true });\n if (res.status >= 200 && res.status < 500) {\n return true;\n }\n } catch {\n // Server not ready yet\n }\n await new Promise((r) => setTimeout(r, 400));\n }\n return false;\n}\n\nexport async function studioCommand(specArg?: string, options: StudioCommandOptions = {}): Promise<void> {\n const port = options.port || '3000';\n const baseUrl = `http://localhost:${port}`;\n const targetUrl = specArg ? `${baseUrl}?spec=${encodeURIComponent(specArg)}` : baseUrl;\n const studioDir = findStudioDir();\n\n console.log();\n console.log(pc.bold(pc.cyan(`Starting PostMCP Visual Web Studio...`)));\n console.log(` Port: ${pc.bold(pc.green(port))}`);\n console.log(` Studio Dir: ${pc.dim(studioDir)}`);\n if (specArg) {\n console.log(` Initial Spec: ${pc.dim(specArg)}`);\n }\n console.log();\n\n let child: ChildProcess | null = null;\n\n if (fs.existsSync(studioDir)) {\n const srcDir = path.join(studioDir, 'src');\n const nextDir = path.join(studioDir, '.next');\n let isStale = false;\n if (fs.existsSync(srcDir) && fs.existsSync(nextDir)) {\n try {\n const nextMtime = fs.statSync(nextDir).mtimeMs;\n const pageMtime = fs.statSync(path.join(srcDir, 'app', 'page.tsx')).mtimeMs;\n if (pageMtime > nextMtime) {\n isStale = true;\n }\n } catch {}\n }\n\n const isBuilt = fs.existsSync(nextDir) && !isStale;\n const preferDev = options.dev || isStale;\n // In standalone or monorepo environments, prefer npx next or pnpm\n const isPnpm = fs.existsSync(path.join(studioDir, '..', '..', 'pnpm-lock.yaml'));\n const command = isPnpm ? 'pnpm' : 'npx';\n const args = isPnpm\n ? isBuilt && !preferDev\n ? ['start', '--port', port]\n : ['dev', '--port', port]\n : isBuilt && !preferDev\n ? ['next', 'start', '-p', port]\n : ['next', 'dev', '-p', port];\n\n try {\n child = spawn(command, args, {\n cwd: studioDir,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: port,\n NEXT_PUBLIC_INITIAL_SPEC: specArg || '',\n STUDIO_INITIAL_SPEC: specArg || '',\n POSTMCP_WORKSPACE: process.cwd(),\n WORKSPACE_CWD: process.cwd(),\n },\n });\n\n const cleanup = () => {\n if (child) {\n try {\n child.kill('SIGINT');\n } catch {\n // Ignore kill errors\n }\n }\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('exit', cleanup);\n } catch (err: any) {\n console.log(pc.yellow(` Note: Running in detached standalone mode: ${err.message}`));\n }\n }\n\n // Wait for server to become responsive\n const isReady = await waitForServer(baseUrl, 15000);\n\n if (isReady) {\n console.log(pc.green(`PostMCP Visual Web Studio ready at: ${pc.bold(targetUrl)}`));\n } else {\n console.log(pc.dim(` Studio server starting at: ${targetUrl}`));\n }\n\n if (!options.noOpen) {\n try {\n await open(targetUrl);\n console.log(pc.dim(`Opening Web Studio in your default browser...`));\n } catch {\n console.log(pc.dim(`Please open ${targetUrl} in your browser.`));\n }\n }\n\n // If running interactively, wait for child process\n if (child) {\n await new Promise<void>((resolve) => {\n child?.on('close', () => resolve());\n });\n }\n}\n"],"mappings":"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","names":["fs","path","parseOpenAPI","pc","parseOpenAPI","fs","path","parseOpenAPI","pc","parseOpenAPI","fs","path","os","parseOpenAPI","pc","Table","pc","path","fs","axios","pc","axios","pc","resolve","readFileSync","resolve","pc"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@postmcp/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "The Postman for MCP. Turn any OpenAPI spec into a context-optimized MCP server in seconds.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"picocolors": "^1.1.1",
|
|
31
31
|
"@postmcp/core": "0.1.8",
|
|
32
32
|
"@postmcp/presets": "0.1.9",
|
|
33
|
-
"@postmcp/
|
|
34
|
-
"@postmcp/
|
|
33
|
+
"@postmcp/types": "0.1.8",
|
|
34
|
+
"@postmcp/studio": "0.1.8"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.13.5",
|