Skip to main content
Glama

search_packages

Find npm packages by keyword to identify relevant dependencies and libraries for your JavaScript projects.

Instructions

Search npm registry for packages by keyword

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Implementation Reference

  • Handler function for search_packages tool: fetches from npm search API, validates with PackageSearchSchema, formats and returns search results.
    async ({ query, limit = 20 }) => { try { const encodedQuery = encodeURIComponent(query); const response = await fetch( `https://registry.npmjs.org/-/v1/search?text=${encodedQuery}&size=${limit}` ); if (!response.ok) { throw new Error(`Failed to search packages: ${response.statusText}`); } const rawData = await response.json(); const parseResult = PackageSearchSchema.safeParse(rawData); if (!parseResult.success) { throw new Error( `Invalid search results structure: ${parseResult.error.message}` ); } const data = parseResult.data; const packages = data.objects.map((obj) => obj.package); const formattedResults = packages .map( (pkg) => `Name: ${pkg.name}\nVersion: ${pkg.version}\nDescription: ${ pkg.description || "N/A" }\n${pkg.author ? `Author: ${pkg.author.name || "N/A"}\n` : ""}${ pkg.links?.npm ? `NPM: ${pkg.links.npm}\n` : "" }---` ) .join("\n\n"); const output = { total: data.total, results: packages.map((pkg) => ({ name: pkg.name, version: pkg.version, description: pkg.description, author: pkg.author?.name, npmUrl: pkg.links?.npm, })), }; return { content: [ { type: "text", text: `Found ${data.total} packages (showing ${packages.length}):\n\n${formattedResults}`, }, ], structuredContent: output, }; } catch (error) { return { content: [ { type: "text", text: `Error searching packages: ${ error instanceof Error ? error.message : "Unknown error" }`, }, ], isError: true, }; } }
  • Zod schema used to validate the npm package search API response.
    const PackageSearchSchema = z.object({ objects: z.array( z.object({ package: z.object({ name: z.string(), version: z.string(), description: z.string().optional(), keywords: z.array(z.string()).optional(), author: z .object({ name: z.string().optional(), email: z.string().optional(), }) .optional(), links: z .object({ npm: z.string().optional(), homepage: z.string().optional(), repository: z.string().optional(), }) .optional(), }), }) ), total: z.number(), });
  • src/index.ts:266-357 (registration)
    Registration of the search_packages tool with server.registerTool, including input/output schemas and handler reference.
    // Tool: Search packages server.registerTool( "search_packages", { title: "Search npm Packages", description: "Search npm registry for packages by keyword", inputSchema: { query: z.string(), limit: z.number().optional(), }, outputSchema: { total: z.number(), results: z.array( z.object({ name: z.string(), version: z.string(), description: z.string().optional(), author: z.string().optional(), npmUrl: z.string().optional(), }) ), }, }, async ({ query, limit = 20 }) => { try { const encodedQuery = encodeURIComponent(query); const response = await fetch( `https://registry.npmjs.org/-/v1/search?text=${encodedQuery}&size=${limit}` ); if (!response.ok) { throw new Error(`Failed to search packages: ${response.statusText}`); } const rawData = await response.json(); const parseResult = PackageSearchSchema.safeParse(rawData); if (!parseResult.success) { throw new Error( `Invalid search results structure: ${parseResult.error.message}` ); } const data = parseResult.data; const packages = data.objects.map((obj) => obj.package); const formattedResults = packages .map( (pkg) => `Name: ${pkg.name}\nVersion: ${pkg.version}\nDescription: ${ pkg.description || "N/A" }\n${pkg.author ? `Author: ${pkg.author.name || "N/A"}\n` : ""}${ pkg.links?.npm ? `NPM: ${pkg.links.npm}\n` : "" }---` ) .join("\n\n"); const output = { total: data.total, results: packages.map((pkg) => ({ name: pkg.name, version: pkg.version, description: pkg.description, author: pkg.author?.name, npmUrl: pkg.links?.npm, })), }; return { content: [ { type: "text", text: `Found ${data.total} packages (showing ${packages.length}):\n\n${formattedResults}`, }, ], structuredContent: output, }; } catch (error) { return { content: [ { type: "text", text: `Error searching packages: ${ error instanceof Error ? error.message : "Unknown error" }`, }, ], isError: true, }; } } );
  • Inline inputSchema and outputSchema for the search_packages tool registration.
    { title: "Search npm Packages", description: "Search npm registry for packages by keyword", inputSchema: { query: z.string(), limit: z.number().optional(), }, outputSchema: { total: z.number(), results: z.array( z.object({ name: z.string(), version: z.string(), description: z.string().optional(), author: z.string().optional(), npmUrl: z.string().optional(), }) ), },

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JuanSebastianGB/npm-context-agent-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server