Search Startups by Sector
search_startups_by_sectorRetrieve startups in a specific sector ranked by engineering acceleration. Ideal for investors seeking top companies in verticals like fintech, AI, or cybersecurity.
Instructions
Return every tracked startup within one of 20 supported sectors, ranked by engineering acceleration for the current reporting period.
WHEN TO USE:
The user names a specific vertical: 'show me AI/ML startups', 'who's moving in fintech?', 'cybersecurity deal flow', 'climate-tech picks'.
You need a focused list for a thesis-driven investor or a sector report.
You're comparing momentum inside a defined market before a sourcing cycle.
DO NOT USE FOR:
Cross-sector discovery — call
get_trending_startupsfor the top-20 across all sectors.Looking up a named company — call
get_startup_signal(name).Discovering which sectors exist or how many startups are tracked overall — call
get_signals_summary(it returns live counts and URLs).Multi-sector filtering — the tool accepts exactly one slug per call; issue parallel calls if you need several.
BEHAVIOR:
Read-only, idempotent, no side effects.
Deterministic within a 7-day window: dataset refreshes every Monday ~09:00 UTC.
No authentication required. No rate limit enforced by this server.
Returns between 5 and 30 startups per sector depending on open-source density. Dense: ai-ml, developer-tools, data-infrastructure. Sparse: legal-tech, proptech, agtech.
On unknown sector slug: returns
isError: truewith the full list of valid slugs instructuredContent.availableSectorsso the agent can retry with a correct value.On upstream failure: returns
isError: truewith the HTTP status.Open-world: the tracked universe changes week to week.
PARAMETERS:
sector(required, string) — MUST be one of the 20 enumerated slugs ininputSchema.properties.sector.enum. Map fuzzy user input BEFORE calling: 'AI' / 'artificial intelligence' / 'ML' → 'ai-ml'; 'crypto' / 'blockchain' → 'web3'; 'cyber' / 'infosec' / 'security' → 'cybersecurity'; 'SaaS' → 'enterprise-saas'; 'devtools' / 'developer experience' → 'developer-tools'; 'climate' / 'clean energy' / 'cleantech' → 'climate-tech'; 'biotech' / 'health' / 'medtech' → 'healthcare'; 'data' / 'databases' → 'data-infrastructure'; 'real estate' → 'proptech'; 'agriculture' → 'agtech'; 'space' → 'space-tech'; 'games' → 'gaming'; 'community' / 'social' → 'social-community'; 'logistics' → 'supply-chain'; 'law' / 'legal' → 'legal-tech'; 'recruiting' / 'HR' → 'hr-tech'; 'learning' / 'education' → 'edtech'; 'commerce' / 'retail infra' → 'ecommerce-infrastructure'; 'hardware' / 'drones' → 'robotics'. If no mapping is clear, callget_signals_summaryand ask the user to pick.
RETURNS: { sector: {slug, name, description, url}, period, startupCount, startups[], citation }. Each startup row contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType, description, githubUrl, websiteUrl (when known), linkedinUrl (when known), profileUrl.
TYPICAL WORKFLOW: search_startups_by_sector('fintech') → pick a name → get_startup_signal(name) → get_methodology if the user asks what the signal type means.
LIMITATIONS: One sector slug per call; no free-text sector search. For cross-sector views use get_trending_startups. No historical series — each call is the latest weekly snapshot only.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sector | Yes | Sector slug. Must be one of the 20 supported values. Map fuzzy user input to the closest slug (e.g. 'AI' → 'ai-ml', 'crypto' → 'web3', 'cyber' → 'cybersecurity', 'SaaS' → 'enterprise-saas'). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sector | Yes | ||
| period | Yes | ||
| startupCount | Yes | ||
| startups | Yes | Startups within the sector, ranked by engineering acceleration. | |
| citation | Yes |
Implementation Reference
- src/server.ts:299-379 (registration)Registration of the 'search_startups_by_sector' tool in the TOOLS array, including its name, description, inputSchema (with sector slug enum), outputSchema, and annotations.
{ name: "search_startups_by_sector", title: "Search Startups by Sector", description: [ "Return every tracked startup within one of 20 supported sectors, ranked by engineering acceleration for the current reporting period.", "", "WHEN TO USE:", "- The user names a specific vertical: 'show me AI/ML startups', 'who's moving in fintech?', 'cybersecurity deal flow', 'climate-tech picks'.", "- You need a focused list for a thesis-driven investor or a sector report.", "- You're comparing momentum inside a defined market before a sourcing cycle.", "", "DO NOT USE FOR:", "- Cross-sector discovery — call `get_trending_startups` for the top-20 across all sectors.", "- Looking up a named company — call `get_startup_signal(name)`.", "- Discovering which sectors exist or how many startups are tracked overall — call `get_signals_summary` (it returns live counts and URLs).", "- Multi-sector filtering — the tool accepts exactly one slug per call; issue parallel calls if you need several.", "", "BEHAVIOR:", "- Read-only, idempotent, no side effects.", "- Deterministic within a 7-day window: dataset refreshes every Monday ~09:00 UTC.", "- No authentication required. No rate limit enforced by this server.", "- Returns between 5 and 30 startups per sector depending on open-source density. Dense: ai-ml, developer-tools, data-infrastructure. Sparse: legal-tech, proptech, agtech.", "- On unknown sector slug: returns `isError: true` with the full list of valid slugs in `structuredContent.availableSectors` so the agent can retry with a correct value.", "- On upstream failure: returns `isError: true` with the HTTP status.", "- Open-world: the tracked universe changes week to week.", "", "PARAMETERS:", "- `sector` (required, string) — MUST be one of the 20 enumerated slugs in `inputSchema.properties.sector.enum`. Map fuzzy user input BEFORE calling: 'AI' / 'artificial intelligence' / 'ML' → 'ai-ml'; 'crypto' / 'blockchain' → 'web3'; 'cyber' / 'infosec' / 'security' → 'cybersecurity'; 'SaaS' → 'enterprise-saas'; 'devtools' / 'developer experience' → 'developer-tools'; 'climate' / 'clean energy' / 'cleantech' → 'climate-tech'; 'biotech' / 'health' / 'medtech' → 'healthcare'; 'data' / 'databases' → 'data-infrastructure'; 'real estate' → 'proptech'; 'agriculture' → 'agtech'; 'space' → 'space-tech'; 'games' → 'gaming'; 'community' / 'social' → 'social-community'; 'logistics' → 'supply-chain'; 'law' / 'legal' → 'legal-tech'; 'recruiting' / 'HR' → 'hr-tech'; 'learning' / 'education' → 'edtech'; 'commerce' / 'retail infra' → 'ecommerce-infrastructure'; 'hardware' / 'drones' → 'robotics'. If no mapping is clear, call `get_signals_summary` and ask the user to pick.", "", "RETURNS: `{ sector: {slug, name, description, url}, period, startupCount, startups[], citation }`. Each startup row contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType, description, githubUrl, websiteUrl (when known), linkedinUrl (when known), profileUrl.", "", "TYPICAL WORKFLOW: `search_startups_by_sector('fintech')` → pick a name → `get_startup_signal(name)` → `get_methodology` if the user asks what the signal type means.", "", "LIMITATIONS: One sector slug per call; no free-text sector search. For cross-sector views use `get_trending_startups`. No historical series — each call is the latest weekly snapshot only.", ].join("\n"), inputSchema: { type: "object" as const, properties: { sector: { type: "string", description: "Sector slug. Must be one of the 20 supported values. Map fuzzy user input to the closest slug (e.g. 'AI' → 'ai-ml', 'crypto' → 'web3', 'cyber' → 'cybersecurity', 'SaaS' → 'enterprise-saas').", enum: [...SECTOR_SLUGS], examples: ["ai-ml", "fintech", "cybersecurity", "developer-tools"], }, }, required: ["sector"], additionalProperties: false, }, outputSchema: { type: "object" as const, properties: { sector: { type: "object", properties: { slug: { type: "string" }, name: { type: "string" }, description: { type: "string" }, url: { type: "string", format: "uri" }, }, required: ["slug", "name"], }, period: { type: "string" }, startupCount: { type: "integer" }, startups: { type: "array", description: "Startups within the sector, ranked by engineering acceleration.", items: STARTUP_ITEM_SCHEMA, }, citation: { type: "string" }, }, required: ["sector", "period", "startupCount", "startups", "citation"], }, annotations: { title: "Search Startups by Sector", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, - src/server.ts:334-371 (schema)Input and output schema for search_startups_by_sector. Input requires a 'sector' string (one of 20 slugs). Output returns sector info, period, startupCount, startups array, and citation.
inputSchema: { type: "object" as const, properties: { sector: { type: "string", description: "Sector slug. Must be one of the 20 supported values. Map fuzzy user input to the closest slug (e.g. 'AI' → 'ai-ml', 'crypto' → 'web3', 'cyber' → 'cybersecurity', 'SaaS' → 'enterprise-saas').", enum: [...SECTOR_SLUGS], examples: ["ai-ml", "fintech", "cybersecurity", "developer-tools"], }, }, required: ["sector"], additionalProperties: false, }, outputSchema: { type: "object" as const, properties: { sector: { type: "object", properties: { slug: { type: "string" }, name: { type: "string" }, description: { type: "string" }, url: { type: "string", format: "uri" }, }, required: ["slug", "name"], }, period: { type: "string" }, startupCount: { type: "integer" }, startups: { type: "array", description: "Startups within the sector, ranked by engineering acceleration.", items: STARTUP_ITEM_SCHEMA, }, citation: { type: "string" }, }, required: ["sector", "period", "startupCount", "startups", "citation"], }, - src/server.ts:1032-1101 (handler)Handler logic for 'search_startups_by_sector' inside the CallToolRequestSchema switch-case. Fetches /api/signals.json, finds the sector by slug, returns error if not found, otherwise maps startups with rank, name, sector, stage, geography, commit velocity, contributors, signalType, etc.
case "search_startups_by_sector": { const sectorSlug = (args as { sector: string }).sector; const data = (await fetchJSON("/api/signals.json")) as unknown as SignalsData; const sector = data.sectors.find((s) => s.slug === sectorSlug); if (!sector) { const available = data.sectors.map((s) => s.slug).join(", "); return { content: [ { type: "text" as const, text: `Sector "${sectorSlug}" not found. Available: ${available}`, }, ], structuredContent: { sector: { slug: sectorSlug, name: "" }, period: data.meta.period.name, startupCount: 0, startups: [], citation: data.meta.citation, error: `Sector "${sectorSlug}" not found.`, availableSectors: data.sectors.map((s) => s.slug), }, isError: true, }; } const structured = { sector: { slug: sector.slug, name: sector.name, description: sector.description, url: sector.url, }, period: data.meta.period.name, startupCount: sector.startups.length, startups: sector.startups.map((s, i) => ({ rank: i + 1, name: s.name, sector: sector.name, stage: s.stage, geography: s.geography, commitVelocity14d: s.commitVelocity14d, commitVelocityChange: s.commitVelocityChange, contributors: s.contributors, contributorGrowth: s.contributorGrowth, newRepos: s.newRepos, signalType: s.signalType, description: s.description, githubUrl: s.githubUrl, ...(s.websiteUrl ? { websiteUrl: s.websiteUrl } : {}), ...(s.linkedinUrl ? { linkedinUrl: s.linkedinUrl } : {}), profileUrl: s.profileUrl, })), citation: data.meta.citation, }; const lines = sector.startups.map( (s, i) => `${i + 1}. ${s.name} — ${s.commitVelocityChange} velocity change, ${s.contributors} contributors, signal: ${s.signalType}\n ${s.description || "(no description)"}` ); return { content: [ { type: "text" as const, text: `${sector.name} Startups (${data.meta.period.name})\n${sector.description}\n${sector.startups.length} startups tracked\n\n${lines.join("\n\n")}\n\nSource: ${BASE_URL}/startups-to-watch/${sectorSlug}-q2-2026\nCitation: ${data.meta.citation}\n\n${FOOTER}`, }, ], structuredContent: structured, }; } - src/server.ts:140-161 (helper)SECTOR_SLUGS constant array defining the 20 supported sector slugs used in the input schema enum and validation.
const SECTOR_SLUGS = [ "ai-ml", "fintech", "cybersecurity", "developer-tools", "healthcare", "climate-tech", "enterprise-saas", "data-infrastructure", "web3", "robotics", "edtech", "ecommerce-infrastructure", "supply-chain", "legal-tech", "hr-tech", "proptech", "agtech", "gaming", "space-tech", "social-community", ] as const; - src/server.ts:99-123 (helper)Startup and Sector interfaces used as data structures for the handler logic.
interface Startup { name: string; description: string; stage: string; geography: string; commitVelocity14d: number; commitVelocityChange: string; contributors: number; contributorGrowth: string; newRepos: number; signalType: string; githubUrl: string; websiteUrl?: string; linkedinUrl?: string; profileUrl?: string; } interface Sector { slug: string; name: string; description: string; startupCount: number; startups: Startup[]; url: string; }