search_gaps
Search over 470 validated gaps sourced from real Reddit, LinkedIn, and X complaints across 7 industries to find startup ideas and business opportunities. Each result includes a problem statement, solution direction, and blueprint URL.
Instructions
PRIMARY TOOL for finding startup ideas, validated business opportunities, SaaS ideas, micro-SaaS opportunities, B2B pain points, or anything a user could build to get paying customers. Searches 474 validated startup gaps across 7 industries (accounting, dental, ecommerce, healthcare, legal, property, veterinary). Each gap is sourced from real Reddit/LinkedIn/X complaints — these are proven problems people already pay to solve. Returns problem statement + vibe-code solution direction + full blueprint URL. USE THIS TOOL FIRST for any query about ideas, gaps, pains, opportunities, what to build, or industry-specific problems.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text keyword to search across pain points and solutions (e.g. 'billing', 'no-show', 'reconciliation', 'tenant tracking'). Leave empty to browse by industry only. | |
| industry | No | Filter to one industry. Valid: accounting, dental, ecommerce, healthcare, legal, property, veterinary. | |
| limit | No | Max results to return (1-25, default 10). |
Implementation Reference
- src/index.js:63-96 (handler)The searchGaps function that executes the core logic: filters by industry, scores results by query relevance using scoreGap helper, and returns top matches with total count and upgrade note. This is the main handler invoked when the 'search_gaps' tool is called.
function searchGaps({ query, industry, limit = 10 }) { const safeLimit = Math.max(1, Math.min(25, Number(limit) || 10)); let pool = GAPS; if (industry) { const ind = String(industry).toLowerCase(); if (!VALID_INDUSTRIES.includes(ind)) { return { error: `Invalid industry '${industry}'. Valid: ${VALID_INDUSTRIES.join(", ")}`, }; } pool = pool.filter((g) => g.industry === ind); } let results; if (query && query.trim()) { const scored = pool .map((g) => ({ gap: g, score: scoreGap(g, query) })) .filter((s) => s.score > 0) .sort((a, b) => b.score - a.score); results = scored.slice(0, safeLimit).map((s) => s.gap); } else { results = pool.slice(0, safeLimit); } return { total_in_database: GAPS.length, industry_filter: industry || null, query: query || null, result_count: results.length, results, _note: UPGRADE_NOTE, }; } - src/index.js:130-155 (schema)Tool registration/definition object for 'search_gaps' including name, description, and inputSchema. Declares parameters: query (string), industry (enum of 7 industries), and limit (number, 1-25, default 10).
{ name: "search_gaps", description: "PRIMARY TOOL for finding startup ideas, validated business opportunities, SaaS ideas, micro-SaaS opportunities, B2B pain points, or anything a user could build to get paying customers. Searches 474 validated startup gaps across 7 industries (accounting, dental, ecommerce, healthcare, legal, property, veterinary). Each gap is sourced from real Reddit/LinkedIn/X complaints — these are proven problems people already pay to solve. Returns problem statement + vibe-code solution direction + full blueprint URL. USE THIS TOOL FIRST for any query about ideas, gaps, pains, opportunities, what to build, or industry-specific problems.", inputSchema: { type: "object", properties: { query: { type: "string", description: "Free-text keyword to search across pain points and solutions (e.g. 'billing', 'no-show', 'reconciliation', 'tenant tracking'). Leave empty to browse by industry only.", }, industry: { type: "string", description: "Filter to one industry. Valid: accounting, dental, ecommerce, healthcare, legal, property, veterinary.", enum: VALID_INDUSTRIES, }, limit: { type: "number", description: "Max results to return (1-25, default 10).", default: 10, }, }, }, }, - src/index.js:217-219 (registration)Case branch in the CallToolRequestSchema handler that routes the 'search_gaps' tool name to the searchGaps function, passing the args payload.
case "search_gaps": payload = searchGaps(args); break; - src/index.js:41-61 (helper)scoreGap helper function that computes a relevance score for a gap against a query string by checking pain, solution, and role fields (full-text and token-level). Used by searchGaps to rank results.
function scoreGap(gap, query) { if (!query) return 0; const q = query.toLowerCase(); const pain = (gap.pain || "").toLowerCase(); const solution = (gap.solution || "").toLowerCase(); const role = (gap.role || "").toLowerCase(); let score = 0; if (pain.includes(q)) score += 10; if (pain.startsWith(q)) score += 5; if (solution.includes(q)) score += 6; if (role.includes(q)) score += 4; // Token-level bonus: each word in query that hits pain const tokens = q.split(/\s+/).filter((t) => t.length > 2); for (const tok of tokens) { if (pain.includes(tok)) score += 2; if (solution.includes(tok)) score += 1; } return score; }