list_category
Browse software tools in a specific category with pricing overview, ratings, and free plan filter. Sort by rating or starting price.
Instructions
Browse all tools in a specific software category with pricing overview. Supports sorting and free-only filtering.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | Category slug (e.g., "llm", "ai-coding", "crm") | |
| sort_by | No | Sort field: "rating" (default) or "startingPrice" | |
| free_only | No | If true, return only tools with a free plan (default: false) |
Implementation Reference
- index.js:104-116 (schema)Tool definition (name + inputSchema) for 'list_category' — defines the category, sort_by, and free_only parameters.
{ name: 'list_category', description: 'Browse all tools in a specific software category with pricing overview. Supports sorting and free-only filtering.', inputSchema: { type: 'object', properties: { category: { type: 'string', description: 'Category slug (e.g., "llm", "ai-coding", "crm")' }, sort_by: { type: 'string', description: 'Sort field: "rating" (default) or "startingPrice"' }, free_only: { type: 'boolean', description: 'If true, return only tools with a free plan (default: false)' }, }, required: ['category'], }, }, - index.js:334-354 (handler)The actual handler/function that executes the 'list_category' tool logic — filters tools by category, sorts by rating or price, supports free-only filter, and formats the output.
async function listCategory(args) { const { category, sort_by = 'rating', free_only = false } = args; const allTools = await getAllTools(); let filtered = allTools.filter(t => t.category === category || t.categoryName === category); if (filtered.length === 0) { return `No tools found for category "${category}". Use list_categories to see available category slugs.`; } if (free_only) filtered = filtered.filter(t => t.freePlan); if (sort_by === 'startingPrice') { filtered.sort((a, b) => (a.startingPrice ?? Infinity) - (b.startingPrice ?? Infinity)); } else { filtered.sort((a, b) => (b.rating ?? 0) - (a.rating ?? 0)); } const header = `Category: ${filtered[0]?.categoryName || category} (${filtered.length} tools${free_only ? ', free only' : ''}, sorted by ${sort_by})`; const lines = filtered.map((t, i) => `${i + 1}. ${t.name} | Rating: ${t.rating ?? 'N/A'}/5 | Free: ${t.freePlan ? 'Yes' : 'No'} | Price: ${formatPrice(t.startingPrice)} | ${toolURL(t.slug)}` ); return `${header}\n\n${lines.join('\n')}`; } - index.js:448-459 (registration)Dispatch switch-case that routes 'list_category' tool calls to the listCategory handler function.
async function callTool(name, args) { switch (name) { case 'search_tools': return searchTools(args); case 'get_tool': return getTool(args); case 'compare_tools': return compareTools(args); case 'list_category': return listCategory(args); case 'get_alternatives':return getAlternatives(args); case 'get_pricing': return getPricing(args); case 'get_leaderboard': return getLeaderboard(args); case 'list_categories': return listCategoriesFn(); default: throw new Error(`Unknown tool: ${name}`); }