get_npm_package_info
Retrieve npm package details like version, dependencies, and maintainers to inform dependency upgrades in Ember.js projects.
Instructions
Get comprehensive information about an npm package including latest version, description, dependencies, maintainers, and more. Essential for understanding package details before upgrading dependencies.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| packageName | Yes | Name of the npm package (e.g., 'ember-source', '@glimmer/component', 'ember-cli') |
Implementation Reference
- index.js:307-404 (handler)The primary handler function that processes the tool call, fetches NPM package data using NpmService, formats it into a comprehensive Markdown response including description, versions, dependencies, metadata, and more.async handleGetNpmPackageInfo(args) { const { packageName } = args; try { const packageInfo = await this.npmService.getPackageInfo(packageName); const formatted = this.npmService.formatPackageInfo(packageInfo); let text = `# ${formatted.name}\n\n`; text += `**Description:** ${formatted.description}\n\n`; text += `**Latest Version:** ${formatted.latestVersion}\n\n`; // Dist tags if (Object.keys(formatted.distTags).length > 0) { text += `**Distribution Tags:**\n`; for (const [tag, version] of Object.entries(formatted.distTags)) { text += ` - ${tag}: ${version}\n`; } text += `\n`; } // Metadata if (formatted.license) { text += `**License:** ${formatted.license}\n`; } if (formatted.author) { text += `**Author:** ${formatted.author}\n`; } if (formatted.homepage) { text += `**Homepage:** ${formatted.homepage}\n`; } if (formatted.repository) { text += `**Repository:** ${formatted.repository}\n`; } // Keywords if (formatted.keywords.length > 0) { text += `\n**Keywords:** ${formatted.keywords.join(', ')}\n`; } // Dependencies const depCount = Object.keys(formatted.dependencies).length; const devDepCount = Object.keys(formatted.devDependencies).length; const peerDepCount = Object.keys(formatted.peerDependencies).length; if (depCount > 0 || devDepCount > 0 || peerDepCount > 0) { text += `\n**Dependencies:**\n`; if (depCount > 0) { text += ` - ${depCount} runtime dependencies\n`; } if (peerDepCount > 0) { text += ` - ${peerDepCount} peer dependencies\n`; } if (devDepCount > 0) { text += ` - ${devDepCount} dev dependencies\n`; } } // Engines if (Object.keys(formatted.engines).length > 0) { text += `\n**Engine Requirements:**\n`; for (const [engine, version] of Object.entries(formatted.engines)) { text += ` - ${engine}: ${version}\n`; } } // Dates if (formatted.created) { text += `\n**Created:** ${new Date(formatted.created).toLocaleDateString()}\n`; } if (formatted.lastPublished) { text += `**Last Published:** ${new Date(formatted.lastPublished).toLocaleDateString()}\n`; } // Maintainers if (formatted.maintainers.length > 0) { text += `\n**Maintainers:** ${formatted.maintainers.length} maintainer(s)\n`; } return { content: [ { type: "text", text: text, }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error fetching package information: ${error.message}`, }, ], isError: true, }; } }
- index.js:135-145 (schema)Input schema defining the expected parameters for the get_npm_package_info tool: a required 'packageName' string.inputSchema: { type: "object", properties: { packageName: { type: "string", description: "Name of the npm package (e.g., 'ember-source', '@glimmer/component', 'ember-cli')", }, }, required: ["packageName"], },
- index.js:131-146 (registration)Registration of the 'get_npm_package_info' tool in the ListTools response, including name, description, and input schema.{ name: "get_npm_package_info", description: "Get comprehensive information about an npm package including latest version, description, dependencies, maintainers, and more. Essential for understanding package details before upgrading dependencies.", inputSchema: { type: "object", properties: { packageName: { type: "string", description: "Name of the npm package (e.g., 'ember-source', '@glimmer/component', 'ember-cli')", }, }, required: ["packageName"], }, },
- lib/npm-service.js:16-32 (helper)Helper method in NpmService that fetches raw package information from the NPM registry API using node-fetch.async getPackageInfo(packageName) { try { const response = await fetch(`${this.registryUrl}/${packageName}`); if (!response.ok) { if (response.status === 404) { throw new Error(`Package "${packageName}" not found on npm registry`); } throw new Error(`Failed to fetch package info: ${response.statusText}`); } const data = await response.json(); return data; } catch (error) { throw new Error(`Error fetching npm package info: ${error.message}`); } }
- lib/npm-service.js:59-82 (helper)Helper method in NpmService that processes raw NPM package data into a formatted object with extracted fields like versions, metadata, dependencies, etc., used by the main handler.formatPackageInfo(packageInfo) { const latestVersion = packageInfo['dist-tags']?.latest; const latestVersionData = latestVersion ? packageInfo.versions[latestVersion] : null; return { name: packageInfo.name, description: packageInfo.description || 'No description available', latestVersion: latestVersion || 'Unknown', distTags: packageInfo['dist-tags'] || {}, homepage: packageInfo.homepage || latestVersionData?.homepage || null, repository: packageInfo.repository?.url || latestVersionData?.repository?.url || null, license: latestVersionData?.license || 'Unknown', author: this.formatAuthor(packageInfo.author || latestVersionData?.author), maintainers: packageInfo.maintainers || [], keywords: latestVersionData?.keywords || [], dependencies: latestVersionData?.dependencies || {}, devDependencies: latestVersionData?.devDependencies || {}, peerDependencies: latestVersionData?.peerDependencies || {}, engines: latestVersionData?.engines || {}, lastPublished: packageInfo.time?.[latestVersion] || null, created: packageInfo.time?.created || null, modified: packageInfo.time?.modified || null, }; }