list_community_builds
Browse community-shared PC builds from meupc.net with titles, prices, and component lists. Filter by sorting options to find configurations that match your needs.
Instructions
Builds de PC compartilhadas pela comunidade do meupc.net, com título, preço e componentes
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordenação das builds ('melhores-recentes', 'melhores', 'novas') | melhores-recentes |
| page | No | Número da página |
Implementation Reference
- src/tools/list-community-builds.ts:14-61 (handler)The main handler function listCommunityBuilds that fetches and parses community PC builds from meupc.net. It takes sort and page parameters, scrapes the webpage for build cards, extracts title, author, price, likes, and components, then returns the results as JSON.export async function listCommunityBuilds(params: ListCommunityBuildsParams): Promise<string> { const { sort, page } = params; const url = `/builds-comunidade?ordem=${sort}&page=${page}`; const $ = await fetchPage(url); const results: BuildSummary[] = []; $("article.card.is-fullheight").each((_, el) => { const $card = $(el); const titleEl = $card.find(".card-content h3.title a"); const title = titleEl.text().trim(); if (!title) return; const buildUrl = titleEl.attr("href") ?? ""; // Autor const author = $card.find(".card-content p.by a.has-text-weight-semibold").text().trim() || null; // Preço total const priceText = $card.find(".card-content a.preco").text().trim(); const totalPrice = parsePrice(priceText); // Curtidas const likesAttr = $card.find("footer a.js-like-button").attr("data-total-likes"); const likesText = $card.find("footer span.js-like-total").text().trim(); const likes = likesAttr ? parseInt(likesAttr, 10) : (likesText ? parseInt(likesText, 10) : null); // Componentes principais (lista no card) const components: string[] = []; $card.find(".card-content div.content.is-small ul li").each((_, li) => { const comp = $(li).text().trim(); if (comp) components.push(comp); }); results.push({ title, author, totalPrice, likes: isNaN(likes as number) ? null : likes, url: absoluteUrl(buildUrl), components, }); }); return JSON.stringify(results, null, 2); }
- Zod schema definition for listCommunityBuildsSchema that validates input parameters: sort (enum with 'melhores-recentes', 'melhores', 'novas') and page (positive integer), plus the inferred TypeScript type ListCommunityBuildsParams.export const listCommunityBuildsSchema = z.object({ sort: z.enum(SORT_OPTIONS).default("melhores-recentes").describe("Ordenação das builds ('melhores-recentes', 'melhores', 'novas')"), page: z.number().int().positive().default(1).describe("Número da página"), }); export type ListCommunityBuildsParams = z.infer<typeof listCommunityBuildsSchema>;
- src/index.ts:52-59 (registration)Tool registration in the MCP server - registers 'list_community_builds' tool with its description, schema, and async handler that calls listCommunityBuilds function.server.tool( "list_community_builds", "Builds de PC compartilhadas pela comunidade do meupc.net, com título, preço e componentes", listCommunityBuildsSchema.shape, async (params) => ({ content: [{ type: "text", text: await listCommunityBuilds(params) }], }) );
- Import statements and constant definitions including fetchPage, absoluteUrl, parsePrice helpers from scraper.js and the SORT_OPTIONS constant used for validation.import { z } from "zod"; import { fetchPage, absoluteUrl, parsePrice } from "../scraper.js"; import type { BuildSummary } from "../types.js"; const SORT_OPTIONS = ["melhores-recentes", "melhores", "novas"] as const;