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
| Name | Required | Description | Default |
|---|---|---|---|
| packageName | Yes | ||
| version | No |
Implementation Reference
- src/index.ts:213-263 (handler)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, }; } }
- src/index.ts:11-19 (schema)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, }; } } );
- src/index.ts:132-157 (helper)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"); }
- src/index.ts:160-177 (helper)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(); }