mcporter/examples/context7-headlines.ts
2025-11-05 09:55:19 +00:00

73 lines
2.1 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Example: fetch the README for a React-adjacent package from Context7
* and print only the markdown headlines.
*/
import { createRuntime, createServerProxy, type CallResult } from "../src/index.js";
async function main(): Promise<void> {
const apiKey = process.env.CONTEXT7_API_KEY;
const context7Definition = {
name: "context7",
description: "Context7 documentation MCP",
command: {
kind: "http" as const,
url: new URL("https://mcp.context7.com/mcp"),
headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,
},
};
// Inline definitions can also live in config/mcporter.json if you prefer shared config.
const mcpRuntime = await createRuntime({ servers: [context7Definition] });
try {
const context7 = createServerProxy(mcpRuntime, "context7") as Record<string, unknown>;
const resolveLibraryId = context7.resolveLibraryId as (
args: unknown,
) => Promise<CallResult>;
const getLibraryDocs = context7.getLibraryDocs as (
args: unknown,
) => Promise<CallResult>;
const resolved = await resolveLibraryId("react");
const contextId = extractContext7LibraryId(resolved);
if (!contextId) {
throw new Error("Unable to resolve React documentation ID from Context7.");
}
const docs = await getLibraryDocs(contextId);
const markdown = docs.markdown() ?? docs.text() ?? "";
const headlines = markdown
.split("\n")
.filter((line) => /^#+\s/.test(line))
.join("\n");
console.log("# Headlines for React");
console.log(headlines || "(no headlines found)");
} finally {
await mcpRuntime.close();
}
}
main().catch((error) => {
console.error(error);
process.exit(1);
});
function extractContext7LibraryId(result: CallResult): string | null {
const json = result.json<
{ candidates?: Array<{ context7CompatibleLibraryID?: string }> } | undefined
>();
if (json && json.candidates) {
for (const candidate of json.candidates) {
if (candidate?.context7CompatibleLibraryID) {
return candidate.context7CompatibleLibraryID;
}
}
}
const textMatch = result.text()?.match(/Context7-compatible library ID:\s*([^\s]+)/);
return textMatch?.[1] ?? null;
}