{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Redirect any console.log to stderr to maintain JSON-RPC-only stdout\nconst __origConsoleLog = console.log;\nconsole.log = (...args: any[]) => { try { console.error(...args); } catch {} };\n\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n  Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport * as dotenv from 'dotenv';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { execSync } from 'child_process';\n// Using built-in fetch (Node.js 18+) for better compatibility\nimport FormData from 'form-data';\nimport * as semver from 'semver';\n\n// Load environment variables with cascade (HOME/.mcp/.env -> project .env)\n(function loadEnvCascade(){\n  const homeEnv = path.join(os.homedir() || '', '.mcp', '.env');\n  const localEnv = path.resolve(process.cwd(), '.env');\n  for (const p of [homeEnv, localEnv]) {\n    try { if (fs.existsSync(p)) { dotenv.config({ path: p, override: true }); } } catch {}\n  }\n})();\n\n// Command line argument parsing\nconst args: string[] = [];\nconst hasListTools = false;\nconst hasToolsJson = false;\nconst hasHelp = false;\nconst formatTable = false;\n\n// Security: Credential sanitization\nfunction sanitizeCredential(value: string): string {\n  if (!value || value.length < 8) return '****';\n  return `${value.substring(0, 4)}****...****${value.substring(value.length - 4)}`;\n}\n\nfunction sanitizeEnvVars(env: Record<string, any>): Record<string, any> {\n  const sensitiveKeys = ['TOKEN', 'KEY', 'SECRET', 'PASSWORD', 'API_'];\n  const sanitized = { ...env };\n\n  Object.keys(sanitized).forEach(key => {\n    if (sensitiveKeys.some(sensitive => key.toUpperCase().includes(sensitive))) {\n      sanitized[key] = sanitizeCredential(sanitized[key]);\n    }\n  });\n\n  return sanitized;\n}\n\n// Tool discovery and help system\ninterface ToolInfo {\n  name: string;\n  category: string;\n  description: string;\n  requiredParams: string[];\n  optionalParams: string[];\n  inputSchema: any;\n}\n\nfunction showHelp(): void {\n  console.error(`\nPyPI JAEGIS MCP Server v1.0.0 - PyPI package management with 8 specialized tools\n\nUSAGE:\n  pypi-mcp-server [OPTIONS]\n\nOPTIONS:\n  --list-tools         List all available tools with descriptions\n  --tools-json         Output complete MCP tools schema as JSON\n  --format=table       Use table format for tool listings (default: JSON)\n  --help, -h          Show this help message\n\nENVIRONMENT VARIABLES:\n  PYPI_TOKEN          PyPI API token (required)\n                      Format: pypi-*\n                      Generate at: https://pypi.org/manage/account/token/\n\n  PYPI_USERNAME       PyPI username (required, use __token__ for token auth)\n  PYPI_INDEX_URL      PyPI index URL (optional, default: https://upload.pypi.org/legacy/)\n  DEFAULT_PROJECT     Default project name (optional, default: JAEGIS-Web-OS)\n\nEXAMPLES:\n  # List all tools in table format\n  pypi-mcp-server --list-tools --format=table\n\n  # Get tools schema for MCP client integration\n  pypi-mcp-server --tools-json\n\n  # Start the MCP server (default)\n  pypi-mcp-server\n\nQUICK SETUP:\n  1. Generate PyPI token: https://pypi.org/manage/account/token/\n  2. Set environment variables:\n     export PYPI_TOKEN=pypi-your_token_here\n     export PYPI_USERNAME=__token__\n  3. Run: pypi-mcp-server\n\nFor detailed documentation, see: README.md\n`);\n}\n\nfunction getToolsInfo(): ToolInfo[] {\n  return [\n    {\n      name: 'pypi_package_info',\n      category: 'Package Information',\n      description: 'Get detailed information about a PyPI package including metadata and dependencies',\n      requiredParams: ['package_name'],\n      optionalParams: ['version'],\n      inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_search_packages',\n      category: 'Package Discovery',\n      description: 'Search for PyPI packages using keywords and filters',\n      requiredParams: ['query'],\n      optionalParams: ['limit'],\n      inputSchema: { type: 'object', properties: { query: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_upload_package',\n      category: 'Package Publishing',\n      description: 'Upload a package to PyPI registry using twine with full authentication and error handling',\n      requiredParams: ['package_path'],\n      optionalParams: ['repository', 'additional_flags'],\n      inputSchema: { type: 'object', properties: { package_path: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_list_versions',\n      category: 'Package Information',\n      description: 'List all available versions of a package with release information',\n      requiredParams: ['package_name'],\n      optionalParams: [],\n      inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_download_stats',\n      category: 'Package Analytics',\n      description: 'Get download statistics and analytics for a package',\n      requiredParams: ['package_name'],\n      optionalParams: ['period'],\n      inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_validate_package',\n      category: 'Package Validation',\n      description: 'Validate package metadata and check for publishing readiness',\n      requiredParams: ['package_path'],\n      optionalParams: [],\n      inputSchema: { type: 'object', properties: { package_path: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_build_package',\n      category: 'Package Building',\n      description: 'Build distribution files for a Python package (sdist, wheel)',\n      requiredParams: ['package_path'],\n      optionalParams: ['build_type'],\n      inputSchema: { type: 'object', properties: { package_path: { type: 'string' } } }\n    },\n    {\n      name: 'pypi_check_name_availability',\n      category: 'Package Discovery',\n      description: 'Check if a package name is available on PyPI registry',\n      requiredParams: ['package_name'],\n      optionalParams: [],\n      inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n    },\n    {\n      name: 'health_check',\n      category: 'Diagnostics',\n      description: 'Return server health, version, uptime, and dependency status',\n      requiredParams: [],\n      optionalParams: [],\n      inputSchema: { type: 'object', properties: {} }\n    }\n  ];\n}\n\nfunction displayToolsTable(tools: ToolInfo[]): void {\n  console.error('\\n🐍 PyPI JAEGIS MCP Server - Tool Inventory\\n');\n  console.error('┌─────────────────────────────────────┬──────────────────────────────────┬──────────┬──────────┐');\n  console.error('│ Tool Name                           │ Category                         │ Required │ Optional │');\n  console.error('├─────────────────────────────────────┼──────────────────────────────────┼──────────┼──────────┤');\n\n  tools.forEach(tool => {\n    const name = tool.name.padEnd(35);\n    const category = tool.category.padEnd(32);\n    const required = tool.requiredParams.length.toString().padEnd(8);\n    const optional = tool.optionalParams.length.toString().padEnd(8);\n    console.error(`│ ${name} │ ${category} │ ${required} │ ${optional} │`);\n  });\n\n  console.error('└─────────────────────────────────────┴──────────────────────────────────┴──────────┴──────────┘');\n\n  // Summary by category\n  const categories = tools.reduce((acc, tool) => {\n    acc[tool.category] = (acc[tool.category] || 0) + 1;\n    return acc;\n  }, {} as Record<string, number>);\n\n  console.error('\\n📋 Tool Summary by Category:');\n  Object.entries(categories).forEach(([category, count]) => {\n    console.error(`  • ${category}: ${count} tools`);\n  });\n  console.error(`\\n🎯 Total: ${tools.length} tools available\\n`);\n}\n\nfunction displayToolsJson(tools: ToolInfo[], includeSchema: boolean = false): void {\n  const output = {\n    server: 'pypi-jaegis-mcp-server',\n    version: '1.0.0',\n    totalTools: tools.length,\n    categories: tools.reduce((acc, tool) => {\n      acc[tool.category] = (acc[tool.category] || 0) + 1;\n      return acc;\n    }, {} as Record<string, number>),\n    tools: tools.map(tool => ({\n      name: tool.name,\n      category: tool.category,\n      description: tool.description,\n      parameters: {\n        required: tool.requiredParams,\n        optional: tool.optionalParams,\n        total: tool.requiredParams.length + tool.optionalParams.length\n      },\n      ...(includeSchema && { inputSchema: tool.inputSchema })\n    }))\n  };\n\n  console.error(JSON.stringify(output, null, 2));\n}\n\n// Handle command line arguments before server initialization\nif (hasHelp) {\n  showHelp();\n  process.exit(0);\n}\n\nif (hasListTools || hasToolsJson) {\n  const tools = getToolsInfo();\n\n  if (hasToolsJson) {\n    displayToolsJson(tools, true);\n  } else if (formatTable) {\n    displayToolsTable(tools);\n  } else {\n    displayToolsJson(tools, false);\n  }\n\n  process.exit(0);\n}\n\ninterface PyPIConfig {\n  token: string;\n  username: string;\n  indexUrl: string;\n  repositoryUrl: string;\n  defaultProject?: string;\n  testMode?: boolean;\n}\n\ninterface PackageInfo {\n  name: string;\n  version: string;\n  summary?: string;\n  description?: string;\n  author?: string;\n  authorEmail?: string;\n  license?: string;\n  homepage?: string;\n  projectUrls?: Record<string, string>;\n  classifiers?: string[];\n  keywords?: string[];\n  requiresPython?: string;\n  dependencies?: string[];\n  uploadTime?: string;\n  downloads?: {\n    lastDay: number;\n    lastWeek: number;\n    lastMonth: number;\n  };\n}\n\ninterface PublishResult {\n  success: boolean;\n  packageName: string;\n  version: string;\n  message: string;\n  pypiUrl?: string;\n}\n\nclass PyPIJAEGISMCPServer {\n  private server: Server;\n  private config: PyPIConfig;\n\n  constructor() {\n    this.config = this.loadConfig();\n    this.validateConfiguration();\n\n    this.server = new Server(\n      {\n        name: 'pypi-jaegis-mcp-server',\n        version: '1.0.0',\n      },\n      {\n        capabilities: {\n          tools: {},\n        },\n      }\n    );\n\n    this.setupToolHandlers();\n    this.setupErrorHandling();\n  }\n\n  private loadConfig(): PyPIConfig {\n    // Do NOT hard-fail on missing credentials so tools/list always works in clients.\n    const token = process.env.PYPI_TOKEN || '';\n    const username = process.env.PYPI_USERNAME || '__token__';\n\n    return {\n      token,\n      username,\n      indexUrl: process.env.PYPI_INDEX_URL || 'https://upload.pypi.org/legacy/',\n      repositoryUrl: process.env.PYPI_REPOSITORY_URL || 'https://pypi.org/simple/',\n      defaultProject: process.env.DEFAULT_PROJECT || 'JAEGIS-Web-OS',\n      testMode: process.env.NODE_ENV === 'test'\n    };\n  }\n\n  private validateConfiguration(): void {\n    if (!this.config.token.startsWith('pypi-')) {\n      console.warn('Warning: PyPI token format may be invalid. Expected format: pypi-*');\n    }\n\n    if (this.config.username !== '__token__') {\n      console.warn('Warning: For token authentication, username should be \"__token__\"');\n    }\n\n    console.error(`PyPI MCP Server configured for project: ${this.config.defaultProject}`);\n    console.error(`Index URL: ${this.config.indexUrl}`);\n    console.error(`Repository URL: ${this.config.repositoryUrl}`);\n  }\n\n  private setupToolHandlers(): void {\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n      return {\n        tools: [\n\n          {\n            name: 'pypi_package_info',\n            description: 'Get detailed information about a PyPI package',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_name: {\n                  type: 'string',\n                  description: 'Name of the PyPI package'\n                },\n                version: {\n                  type: 'string',\n                  description: 'Specific version (optional, defaults to latest)'\n                }\n              },\n              required: ['package_name']\n            }\n          },\n          {\n            name: 'pypi_search_packages',\n            description: 'Search for PyPI packages',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                query: {\n                  type: 'string',\n                  description: 'Search query'\n                },\n                limit: {\n                  type: 'number',\n                  description: 'Maximum number of results (default: 20)'\n                }\n              },\n              required: ['query']\n            }\n          },\n          {\n            name: 'pypi_upload_package',\n            description: 'Upload a package to PyPI using twine',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_path: {\n                  type: 'string',\n                  description: 'Path to package directory containing dist/ folder or path to distribution file (.tar.gz or .whl)'\n                },\n                repository: {\n                  type: 'string',\n                  enum: ['pypi', 'testpypi'],\n                  description: 'Target repository (default: pypi)'\n                },\n                additional_flags: {\n                  type: 'string',\n                  description: 'Additional twine upload flags (e.g., \"--skip-existing\")'\n                }\n              },\n              required: ['package_path']\n            }\n          },\n          {\n            name: 'pypi_list_versions',\n            description: 'List all versions of a package',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_name: {\n                  type: 'string',\n                  description: 'Name of the package'\n                }\n              },\n              required: ['package_name']\n            }\n          },\n          {\n            name: 'pypi_download_stats',\n            description: 'Get download statistics for a package',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_name: {\n                  type: 'string',\n                  description: 'Name of the package'\n                },\n                period: {\n                  type: 'string',\n                  enum: ['recent', 'last-day', 'last-week', 'last-month'],\n                  description: 'Time period for stats (default: last-month)'\n                }\n              },\n              required: ['package_name']\n            }\n          },\n          {\n            name: 'pypi_validate_package',\n            description: 'Validate package metadata and check for publishing readiness',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_path: {\n                  type: 'string',\n                  description: 'Path to package directory containing setup.py or pyproject.toml'\n                }\n              },\n              required: ['package_path']\n            }\n          },\n          {\n            name: 'pypi_build_package',\n            description: 'Build distribution files for a Python package',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_path: {\n                  type: 'string',\n                  description: 'Path to package directory'\n                },\n                build_type: {\n                  type: 'string',\n                  enum: ['sdist', 'wheel', 'both'],\n                  description: 'Type of distribution to build (default: both)'\n                }\n              },\n              required: ['package_path']\n            }\n          },\n          {\n            name: 'pypi_check_name_availability',\n            description: 'Check if a package name is available on PyPI',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                package_name: {\n                  type: 'string',\n                  description: 'Name to check for availability'\n                }\n              },\n              required: ['package_name']\n            }\n          },\n          {\n            name: 'health_check',\n            description: 'Return server health, version, uptime, and dependency status',\n            inputSchema: { type: 'object', properties: {} }\n          }\n        ] as Tool[]\n      };\n    });\n\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      const { name, arguments: args } = request.params;\n\n      try {\n        switch (name) {\n          case 'pypi_package_info':\n            return await this.getPackageInfo(args);\n          case 'pypi_search_packages':\n            return await this.searchPackages(args);\n          case 'pypi_upload_package':\n            return await this.uploadPackage(args);\n          case 'pypi_list_versions':\n            return await this.listVersions(args);\n          case 'pypi_download_stats':\n            return await this.getDownloadStats(args);\n          case 'pypi_validate_package':\n            return await this.validatePackage(args);\n          case 'pypi_build_package':\n            return await this.buildPackage(args);\n          case 'pypi_check_name_availability':\n            return await this.checkNameAvailability(args);\n          case 'health_check': {\n            const version = (()=>{ try { return JSON.parse(fs.readFileSync(path.resolve(__dirname,'..','package.json'),'utf8')).version } catch { return '1.0.0' } })();\n            const uptime = process.uptime();\n            return { content: [{ type: 'text', text: JSON.stringify({ status:'ok', version, uptime, success:true }) }] };\n          }\n          default:\n            throw new Error(`Unknown tool: ${name}`);\n        }\n      } catch (error) {\n        return {\n          content: [\n            {\n              type: 'text',\n              text: JSON.stringify({\n                error: error instanceof Error ? error.message : String(error),\n                success: false\n              }, null, 2)\n            }\n          ]\n        };\n      }\n    });\n  }\n\n  private setupErrorHandling(): void {\n    this.server.onerror = (error) => {\n      console.error('[PyPI MCP Server Error]', error);\n    };\n\n    process.on('SIGINT', async () => {\n      await this.server.close();\n      process.exit(0);\n    });\n  }\n\n  // Tool implementations will be added in the next part\n  private async getPackageInfo(args: any) {\n    const { package_name, version } = args;\n    \n    try {\n      const url = version \n        ? `https://pypi.org/pypi/${package_name}/${version}/json`\n        : `https://pypi.org/pypi/${package_name}/json`;\n      \n      const response = await fetch(url);\n      \n      if (!response.ok) {\n        throw new Error(`Package not found: ${package_name}`);\n      }\n      \n      const data = await response.json() as any;\n      \n      const packageInfo: PackageInfo = {\n        name: data.info.name,\n        version: data.info.version,\n        summary: data.info.summary,\n        description: data.info.description,\n        author: data.info.author,\n        authorEmail: data.info.author_email,\n        license: data.info.license,\n        homepage: data.info.home_page,\n        projectUrls: data.info.project_urls,\n        classifiers: data.info.classifiers,\n        keywords: data.info.keywords?.split(',').map((k: string) => k.trim()),\n        requiresPython: data.info.requires_python,\n        uploadTime: data.urls?.[0]?.upload_time\n      };\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_package_info',\n              package: packageInfo,\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to get package info: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async searchPackages(args: any) {\n    const { query, limit = 20 } = args;\n\n    if (!query || typeof query !== 'string') {\n      throw new Error('query parameter is required and must be a string');\n    }\n\n    if (limit < 1 || limit > 100) {\n      throw new Error('limit must be between 1 and 100');\n    }\n\n    try {\n      // PyPI JSON API search endpoint\n      const url = `https://pypi.org/pypi?c=&o=&q=${encodeURIComponent(query)}&page=1`;\n      const response = await fetch(url);\n\n      if (!response.ok) {\n        throw new Error(`PyPI search failed with status ${response.status}`);\n      }\n\n      // PyPI doesn't have a direct JSON search API, so we use the simple API\n      // For a more robust solution, we'd use a third-party search service\n      const htmlResponse = await response.text();\n\n      // Extract package names from HTML (simplified approach)\n      const packageMatches = htmlResponse.match(/<a href=\"\\/project\\/([^\"]+)\"/g) || [];\n      const packages = packageMatches\n        .slice(0, limit)\n        .map(match => match.replace(/<a href=\"\\/project\\//, '').replace(/\"/, ''));\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_search_packages',\n              query,\n              results: packages,\n              count: packages.length,\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to search packages: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async uploadPackage(args: any) {\n    try {\n      const packagePath = args.package_path;\n      const repository = args.repository || 'pypi';\n      const additionalFlags = args.additional_flags || '';\n\n      if (!packagePath) throw new Error('package_path is required');\n      if (!this.config.token) throw new Error('PYPI_TOKEN environment variable is required');\n\n      // Validate package path exists\n      if (!fs.existsSync(packagePath)) {\n        throw new Error(`Package path not found: ${packagePath}`);\n      }\n\n      // Check if it's a directory (containing dist/) or a file\n      const isDirectory = fs.statSync(packagePath).isDirectory();\n      let distPath: string;\n      let packageName: string;\n\n      if (isDirectory) {\n        distPath = path.join(packagePath, 'dist');\n        if (!fs.existsSync(distPath)) {\n          throw new Error(`dist/ directory not found in ${packagePath}`);\n        }\n\n        // Check for setup.py or pyproject.toml\n        const hasSetupPy = fs.existsSync(path.join(packagePath, 'setup.py'));\n        const hasPyprojectToml = fs.existsSync(path.join(packagePath, 'pyproject.toml'));\n\n        if (!hasSetupPy && !hasPyprojectToml) {\n          throw new Error('Neither setup.py nor pyproject.toml found in package directory');\n        }\n\n        // Try to extract package name from setup.py or pyproject.toml\n        packageName = this.extractPackageName(packagePath);\n      } else {\n        // Single file upload\n        distPath = packagePath;\n        packageName = path.basename(packagePath);\n      }\n\n      // Verify distribution files exist\n      const distFiles = isDirectory ? fs.readdirSync(distPath) : [distPath];\n      const hasDistFiles = distFiles.some(f => f.endsWith('.whl') || f.endsWith('.tar.gz'));\n\n      if (!hasDistFiles) {\n        throw new Error('No distribution files (.whl or .tar.gz) found in dist/ directory');\n      }\n\n      // Get repository URL\n      const repositoryUrl = repository === 'testpypi'\n        ? 'https://test.pypi.org/legacy/'\n        : this.config.indexUrl;\n\n      // Setup PyPI authentication environment\n      const publishEnv = {\n        ...process.env,\n        TWINE_USERNAME: '__token__',\n        TWINE_PASSWORD: this.config.token,\n        TWINE_REPOSITORY_URL: repositoryUrl\n      };\n\n      // Build twine upload command\n      const uploadPath = isDirectory ? path.join(distPath, '*') : distPath;\n      const publishCmd = `python -m twine upload --verbose ${uploadPath} ${additionalFlags}`.trim();\n\n      console.error(`[PyPI Upload] Executing: ${publishCmd}`);\n      console.error(`[PyPI Upload] Package: ${packageName}`);\n      console.error(`[PyPI Upload] Repository: ${repository}`);\n\n      // Execute twine upload command\n      let publishOutput = '';\n      let publishError = '';\n\n      try {\n        publishOutput = execSync(publishCmd, {\n          cwd: isDirectory ? packagePath : path.dirname(packagePath),\n          env: publishEnv,\n          encoding: 'utf-8',\n          stdio: ['pipe', 'pipe', 'pipe']\n        });\n      } catch (execError: any) {\n        publishError = execError.stderr || execError.stdout || execError.message;\n\n        // Check if it's an authentication error\n        if (publishError.includes('401') || publishError.includes('403') ||\n            publishError.includes('Forbidden') || publishError.includes('unauthorized') ||\n            publishError.includes('Invalid or expired authentication token')) {\n          throw new Error('PyPI authentication failed. Check PYPI_TOKEN environment variable.');\n        }\n\n        // Check if package already exists\n        if (publishError.includes('File already exists') || publishError.includes('already exists')) {\n          throw new Error('Package version already exists on PyPI. Increment version number and try again.');\n        }\n\n        // Check for invalid metadata\n        if (publishError.includes('Invalid metadata') || publishError.includes('metadata')) {\n          throw new Error(`Invalid package metadata: ${publishError.substring(0, 200)}`);\n        }\n\n        // Check for missing twine\n        if (publishError.includes('No module named twine') || publishError.includes('twine: command not found')) {\n          throw new Error('twine is not installed. Install it with: pip install twine');\n        }\n\n        throw new Error(`twine upload failed: ${publishError.substring(0, 300)}`);\n      }\n\n      console.error(`[PyPI Upload] Success: ${packageName}`);\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              success: true,\n              message: `Successfully published ${packageName} to PyPI registry`,\n              package: packageName,\n              repository,\n              repositoryUrl,\n              uploadOutput: publishOutput.substring(0, 500),\n              timestamp: new Date().toISOString()\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      console.error(`[PyPI Upload Error] ${errorMessage}`);\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              success: false,\n              error: errorMessage,\n              timestamp: new Date().toISOString()\n            }, null, 2)\n          }\n        ],\n        isError: true\n      };\n    }\n  }\n\n  private extractPackageName(packagePath: string): string {\n    try {\n      // Try to read from setup.py\n      const setupPyPath = path.join(packagePath, 'setup.py');\n      if (fs.existsSync(setupPyPath)) {\n        const setupContent = fs.readFileSync(setupPyPath, 'utf-8');\n        const nameMatch = setupContent.match(/name\\s*=\\s*['\"](.*?)['\"]/);\n        if (nameMatch) return nameMatch[1];\n      }\n\n      // Try to read from pyproject.toml\n      const pyprojectPath = path.join(packagePath, 'pyproject.toml');\n      if (fs.existsSync(pyprojectPath)) {\n        const pyprojectContent = fs.readFileSync(pyprojectPath, 'utf-8');\n        const nameMatch = pyprojectContent.match(/name\\s*=\\s*['\"](.*?)['\"]/);\n        if (nameMatch) return nameMatch[1];\n      }\n\n      return 'unknown-package';\n    } catch {\n      return 'unknown-package';\n    }\n  }\n\n  private async listVersions(args: any) {\n    const { package_name } = args;\n\n    if (!package_name || typeof package_name !== 'string') {\n      throw new Error('package_name parameter is required and must be a string');\n    }\n\n    try {\n      const url = `https://pypi.org/pypi/${package_name}/json`;\n      const response = await fetch(url);\n\n      if (!response.ok) {\n        throw new Error(`Package not found: ${package_name}`);\n      }\n\n      const data = await response.json() as any;\n      const releases = data.releases || {};\n\n      // Get all versions and sort them using semver\n      const versions = Object.keys(releases)\n        .filter(v => semver.valid(v))\n        .sort((a, b) => semver.compare(b, a));\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_list_versions',\n              package: package_name,\n              totalVersions: versions.length,\n              versions: versions,\n              latest: versions[0] || 'unknown',\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to list versions: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async getDownloadStats(args: any) {\n    const { package_name, period = 'last-month' } = args;\n\n    if (!package_name || typeof package_name !== 'string') {\n      throw new Error('package_name parameter is required and must be a string');\n    }\n\n    const validPeriods = ['recent', 'last-day', 'last-week', 'last-month'];\n    if (!validPeriods.includes(period)) {\n      throw new Error(`period must be one of: ${validPeriods.join(', ')}`);\n    }\n\n    try {\n      // PyPI Stats API endpoint\n      const url = `https://pypistats.org/api/packages/${package_name}/recent?period=${period}`;\n      const response = await fetch(url);\n\n      if (!response.ok) {\n        // Fallback: return estimated stats from package info\n        const infoUrl = `https://pypi.org/pypi/${package_name}/json`;\n        const infoResponse = await fetch(infoUrl);\n\n        if (!infoResponse.ok) {\n          throw new Error(`Package not found: ${package_name}`);\n        }\n\n        return {\n          content: [\n            {\n              type: 'text',\n              text: JSON.stringify({\n                operation: 'pypi_download_stats',\n                package: package_name,\n                period,\n                downloads: 0,\n                note: 'Stats API unavailable, returning zero',\n                success: true\n              }, null, 2)\n            }\n          ]\n        };\n      }\n\n      const data = await response.json() as any;\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_download_stats',\n              package: package_name,\n              period,\n              downloads: data.data?.reduce((sum: number, item: any) => sum + (item.downloads || 0), 0) || 0,\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to get download stats: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async validatePackage(args: any) {\n    const { package_path } = args;\n\n    if (!package_path || typeof package_path !== 'string') {\n      throw new Error('package_path parameter is required and must be a string');\n    }\n\n    try {\n      const setupPyPath = path.join(package_path, 'setup.py');\n      const setupCfgPath = path.join(package_path, 'setup.cfg');\n      const pyprojectPath = path.join(package_path, 'pyproject.toml');\n\n      let configExists = false;\n      let configType = 'unknown';\n\n      if (fs.existsSync(setupPyPath)) {\n        configExists = true;\n        configType = 'setup.py';\n      } else if (fs.existsSync(setupCfgPath)) {\n        configExists = true;\n        configType = 'setup.cfg';\n      } else if (fs.existsSync(pyprojectPath)) {\n        configExists = true;\n        configType = 'pyproject.toml';\n      }\n\n      const issues: string[] = [];\n      const warnings: string[] = [];\n\n      if (!configExists) {\n        issues.push('No setup.py, setup.cfg, or pyproject.toml found');\n      }\n\n      // Check for README\n      const readmeExists = fs.existsSync(path.join(package_path, 'README.md')) ||\n                          fs.existsSync(path.join(package_path, 'README.rst')) ||\n                          fs.existsSync(path.join(package_path, 'README.txt'));\n\n      if (!readmeExists) {\n        warnings.push('No README file found');\n      }\n\n      // Check for LICENSE\n      const licenseExists = fs.existsSync(path.join(package_path, 'LICENSE')) ||\n                           fs.existsSync(path.join(package_path, 'LICENSE.txt'));\n\n      if (!licenseExists) {\n        warnings.push('No LICENSE file found');\n      }\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_validate_package',\n              package_path,\n              configType,\n              isValid: issues.length === 0,\n              issues,\n              warnings,\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to validate package: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async buildPackage(args: any) {\n    const { package_path } = args;\n\n    if (!package_path || typeof package_path !== 'string') {\n      throw new Error('package_path parameter is required and must be a string');\n    }\n\n    try {\n      // Check if directory exists\n      if (!fs.existsSync(package_path)) {\n        throw new Error(`Package directory not found: ${package_path}`);\n      }\n\n      // Check for setup.py or pyproject.toml\n      const setupPyPath = path.join(package_path, 'setup.py');\n      const pyprojectPath = path.join(package_path, 'pyproject.toml');\n\n      const hasSetupPy = fs.existsSync(setupPyPath);\n      const hasPyproject = fs.existsSync(pyprojectPath);\n\n      if (!hasSetupPy && !hasPyproject) {\n        throw new Error('No setup.py or pyproject.toml found in package directory');\n      }\n\n      // Check for dist directory\n      const distPath = path.join(package_path, 'dist');\n      const distExists = fs.existsSync(distPath);\n\n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_build_package',\n              package_path,\n              hasSetupPy,\n              hasPyproject,\n              distExists,\n              buildCommand: 'python -m build',\n              message: 'Package is ready to build. Run: python -m build',\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to build package: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async checkNameAvailability(args: any) {\n    const { package_name } = args;\n    \n    try {\n      const response = await fetch(`https://pypi.org/pypi/${package_name}/json`);\n      \n      const available = !response.ok;\n      \n      return {\n        content: [\n          {\n            type: 'text',\n            text: JSON.stringify({\n              operation: 'pypi_check_name_availability',\n              package_name,\n              available,\n              message: available \n                ? `Package name \"${package_name}\" is available`\n                : `Package name \"${package_name}\" is already taken`,\n              success: true\n            }, null, 2)\n          }\n        ]\n      };\n    } catch (error) {\n      throw new Error(`Failed to check name availability: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  async run(): Promise<void> {\n    const transport = new StdioServerTransport();\n    await this.server.connect(transport);\n\n    // Display startup summary\n    const tools = getToolsInfo();\n    const categories = tools.reduce((acc, tool) => {\n      acc[tool.category] = (acc[tool.category] || 0) + 1;\n      return acc;\n    }, {} as Record<string, number>);\n\n    console.error('🐍 PyPI JAEGIS MCP Server (v1.0.0) running on stdio');\n    console.error(`📊 Total Tools: ${tools.length} | Categories: ${Object.keys(categories).length}`);\n    console.error(`🔧 Configured for project: ${this.config.defaultProject}`);\n    console.error(`🌐 Index URL: ${this.config.indexUrl}`);\n    console.error('✅ Server ready with PyPI package management tools');\n    console.error('💡 Use --list-tools to see all available tools');\n  }\n}\n\n// Run the server\nif (require.main === module) {\n  try {\n    const server = new PyPIJAEGISMCPServer();\n    server.run().catch((error) => {\n      console.error('Failed to start PyPI JAEGIS MCP Server:', error.message);\n      process.exit(1);\n    });\n  } catch (error) {\n    console.error('Failed to initialize PyPI JAEGIS MCP Server:');\n    console.error(error instanceof Error ? error.message : String(error));\n    process.exit(1);\n  }\n}\n"],"mappings":"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","names":[]}