Skip to main content
Glama

get_readme_data

Extract and retrieve README file content from npm packages to understand package functionality, installation instructions, and usage documentation.

Instructions

Get Data from readme file of a package

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
packageNameYes
versionNo

Implementation Reference

  • Handler function that executes the tool logic: fetches NPM package data, validates it, retrieves the GitHub repository URL, fetches the README, formats text and structured output, handles errors.
    async ({ packageName, version }) => { try { const rawData = await fetchPackageData(packageName, version); const parseResult = NpmRegistryResponseSchema.safeParse(rawData); if (!parseResult.success) { throw new Error( `Invalid package data structure: ${parseResult.error.message}` ); } const data = parseResult.data; const { url: repositoryUrl } = data.repository; const readme = await fetchReadmeFromGitHub(repositoryUrl); const output = { package: data.name, version: data.version, description: data.description || "N/A", repository: repositoryUrl, readme, }; return { content: [ { type: "text", text: `Package: ${data.name}\nVersion: ${ data.version }\nDescription: ${ data.description || "N/A" }\nRepository: ${repositoryUrl}\n\nREADME:\n${readme}`, }, ], structuredContent: output, }; } catch (error) { return { content: [ { type: "text", text: `Error fetching package ${packageName}: ${ error instanceof Error ? error.message : "Unknown error" }`, }, ], isError: true, }; } }
  • Zod schema for validating NPM registry response data used in the get_readme_data handler.
    const NpmRegistryResponseSchema = z.object({ name: z.string(), version: z.string(), description: z.string().optional(), repository: z.object({ type: z.string(), url: z.string(), }), });
  • src/index.ts:196-264 (registration)
    Registration of the get_readme_data tool with server.registerTool, specifying name, metadata, input/output schemas, and handler function.
    server.registerTool( "get_readme_data", { title: "Get Package README", description: "Get README file content from a package's GitHub repository", inputSchema: { packageName: z.string(), version: z.string().optional(), }, outputSchema: { package: z.string(), version: z.string(), description: z.string(), repository: z.string(), readme: z.string(), }, }, async ({ packageName, version }) => { try { const rawData = await fetchPackageData(packageName, version); const parseResult = NpmRegistryResponseSchema.safeParse(rawData); if (!parseResult.success) { throw new Error( `Invalid package data structure: ${parseResult.error.message}` ); } const data = parseResult.data; const { url: repositoryUrl } = data.repository; const readme = await fetchReadmeFromGitHub(repositoryUrl); const output = { package: data.name, version: data.version, description: data.description || "N/A", repository: repositoryUrl, readme, }; return { content: [ { type: "text", text: `Package: ${data.name}\nVersion: ${ data.version }\nDescription: ${ data.description || "N/A" }\nRepository: ${repositoryUrl}\n\nREADME:\n${readme}`, }, ], structuredContent: output, }; } catch (error) { return { content: [ { type: "text", text: `Error fetching package ${packageName}: ${ error instanceof Error ? error.message : "Unknown error" }`, }, ], isError: true, }; } } );
  • Helper function to fetch README.md content from the package's GitHub repository, supporting main/master branches and default fallback.
    async function fetchReadmeFromGitHub(repositoryUrl: string): Promise<string> { const githubUrl = new URL(repositoryUrl.replace("git+", "")); const repositoryPath = githubUrl.pathname.substring(1).replace(".git", ""); // Try branches in order: main, master, default const branches = ["main", "master"]; for (const branch of branches) { const readmeUrl = `https://raw.githubusercontent.com/${repositoryPath}/refs/heads/${branch}/README.md`; const readmeResponse = await fetch(readmeUrl); if (readmeResponse.ok) { return await readmeResponse.text(); } } // If both branches fail, try without branch specification (will return default branch) const defaultReadmeUrl = `https://raw.githubusercontent.com/${repositoryPath}/README.md`; const defaultResponse = await fetch(defaultReadmeUrl); if (defaultResponse.ok) { return await defaultResponse.text(); } throw new Error("README not found in main, master, or default branch"); }
  • Helper function to fetch package metadata from NPM registry for a given package name and optional version.
    async function fetchPackageData( packageName: string, version?: string ): Promise<any> { const versionPath = version || "latest"; const encodedPackageName = encodeURIComponent(packageName); const response = await fetch( `https://registry.npmjs.org/${encodedPackageName}/${versionPath}` ); if (!response.ok) { throw new Error( `Failed to fetch package ${packageName}: ${response.statusText}` ); } return await response.json(); }

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