Get Startup Signal Profile
get_startup_signalRetrieve a startup's engineering acceleration profile including commit velocity, contributor growth, new repos, signal classification, sector, stage, and geography. Ideal for vetting a named company before writing a deal memo.
Instructions
Return the full engineering-acceleration profile for a single tracked startup: commit velocity, velocity change, contributor count and growth, new-repo count, signal classification, sector, stage, geography, and GitHub URL.
WHEN TO USE:
The user names a specific company: 'tell me about Roboflow', 'what's Supabase's signal?', 'is Modular trending?', 'lookup SkyPilot'.
Preparing a deal memo, one-pager, or investor update about a named startup.
Verifying whether a startup is in the tracked universe before writing analysis.
DO NOT USE FOR:
Discovering unknown companies or fuzzy exploration ('any good AI startups?') — call
get_trending_startupsorsearch_startups_by_sectorfirst, then drill in here.Listing candidates in a sector — call
search_startups_by_sector.Explaining what the signalType means — call
get_methodology.
BEHAVIOR:
Read-only, idempotent, no side effects.
Deterministic within a 7-day window: dataset refreshes every Monday ~09:00 UTC.
No authentication required.
Matching is case-insensitive and normalization-tolerant: whitespace, punctuation, and capitalization are stripped before comparison. 'Sky Pilot', 'skypilot', and 'SkyPilot' all resolve to the same entry. Accepts either the display name or the GitHub org slug.
On no match: returns
structuredContent: { found: false, suggestion: ... }. This is an EXPECTED outcome (the startup is not in the tracked universe), NOT an error — do not retry, do not flag as failure. Instead surface the suggestion to the user and offer to runget_trending_startupsorsearch_startups_by_sector.On upstream failure: returns
isError: truewith HTTP status.Open-world: only ~400 companies are tracked. This tool cannot add new ones — direct the user to the website submission form if needed.
PARAMETERS:
name(required, string, 1–100 chars) — Startup display name OR GitHub org name. Case-insensitive; punctuation and whitespace are ignored during matching.
RETURNS: { found: boolean, startup?: {...}, suggestion?: string, citation }. When found=true, startup contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType, description, githubUrl, profileUrl. When found=false, suggestion explains how to discover the correct name.
TYPICAL WORKFLOW: get_trending_startups or search_startups_by_sector (discover) → pick a name → get_startup_signal(name) (deep-dive) → get_methodology (explain signal classification in the response).
LIMITATIONS: Only returns data for currently-tracked startups. No historical series — each call is the latest weekly snapshot only. No relationship data (investors, cap table, team) — pair with Crunchbase for those facets.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Startup name or GitHub org name. Case-insensitive; punctuation and whitespace are ignored during matching. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| found | Yes | ||
| startup | No | A single startup ranked by engineering acceleration, as derived from public GitHub activity. | |
| suggestion | No | When found=false, a hint on how to discover the correct name or alternative tools to call. | |
| citation | No |
Implementation Reference
- src/server.ts:381-450 (registration)Tool registration for 'get_startup_signal' in the TOOLS array (lines 381-450). Defines name, title, description, input/output schemas, and annotations.
name: "get_startup_signal", title: "Get Startup Signal Profile", description: [ "Return the full engineering-acceleration profile for a single tracked startup: commit velocity, velocity change, contributor count and growth, new-repo count, signal classification, sector, stage, geography, and GitHub URL.", "", "WHEN TO USE:", "- The user names a specific company: 'tell me about Roboflow', 'what's Supabase's signal?', 'is Modular trending?', 'lookup SkyPilot'.", "- Preparing a deal memo, one-pager, or investor update about a named startup.", "- Verifying whether a startup is in the tracked universe before writing analysis.", "", "DO NOT USE FOR:", "- Discovering unknown companies or fuzzy exploration ('any good AI startups?') — call `get_trending_startups` or `search_startups_by_sector` first, then drill in here.", "- Listing candidates in a sector — call `search_startups_by_sector`.", "- Explaining what the signalType means — call `get_methodology`.", "", "BEHAVIOR:", "- Read-only, idempotent, no side effects.", "- Deterministic within a 7-day window: dataset refreshes every Monday ~09:00 UTC.", "- No authentication required.", "- Matching is case-insensitive and normalization-tolerant: whitespace, punctuation, and capitalization are stripped before comparison. 'Sky Pilot', 'skypilot', and 'SkyPilot' all resolve to the same entry. Accepts either the display name or the GitHub org slug.", "- On no match: returns `structuredContent: { found: false, suggestion: ... }`. This is an EXPECTED outcome (the startup is not in the tracked universe), NOT an error — do not retry, do not flag as failure. Instead surface the suggestion to the user and offer to run `get_trending_startups` or `search_startups_by_sector`.", "- On upstream failure: returns `isError: true` with HTTP status.", "- Open-world: only ~400 companies are tracked. This tool cannot add new ones — direct the user to the website submission form if needed.", "", "PARAMETERS:", "- `name` (required, string, 1–100 chars) — Startup display name OR GitHub org name. Case-insensitive; punctuation and whitespace are ignored during matching.", "", "RETURNS: `{ found: boolean, startup?: {...}, suggestion?: string, citation }`. When `found=true`, `startup` contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType, description, githubUrl, profileUrl. When `found=false`, `suggestion` explains how to discover the correct name.", "", "TYPICAL WORKFLOW: `get_trending_startups` or `search_startups_by_sector` (discover) → pick a name → `get_startup_signal(name)` (deep-dive) → `get_methodology` (explain signal classification in the response).", "", "LIMITATIONS: Only returns data for currently-tracked startups. No historical series — each call is the latest weekly snapshot only. No relationship data (investors, cap table, team) — pair with Crunchbase for those facets.", ].join("\n"), inputSchema: { type: "object" as const, properties: { name: { type: "string", description: "Startup name or GitHub org name. Case-insensitive; punctuation and whitespace are ignored during matching.", minLength: 1, maxLength: 100, examples: ["roboflow", "SkyPilot", "Supabase", "Hugging Face"], }, }, required: ["name"], additionalProperties: false, }, outputSchema: { type: "object" as const, properties: { found: { type: "boolean" }, startup: STARTUP_ITEM_SCHEMA, suggestion: { type: "string", description: "When found=false, a hint on how to discover the correct name or alternative tools to call.", }, citation: { type: "string" }, }, required: ["found"], }, annotations: { title: "Get Startup Signal Profile", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, - src/server.ts:414-428 (schema)Input schema requires a 'name' string (1-100 chars); output schema returns 'found' boolean, optional 'startup' object, optional 'suggestion' string, and 'citation'.
inputSchema: { type: "object" as const, properties: { name: { type: "string", description: "Startup name or GitHub org name. Case-insensitive; punctuation and whitespace are ignored during matching.", minLength: 1, maxLength: 100, examples: ["roboflow", "SkyPilot", "Supabase", "Hugging Face"], }, }, required: ["name"], additionalProperties: false, }, - src/server.ts:1103-1201 (handler)Handler implementation for 'get_startup_signal': normalizes the input name to a slug, fetches /api/signals.json, matches across all sectors using case-insensitive normalized comparison, and returns the startup profile or a 'not found' response with a suggestion.
case "get_startup_signal": { const inputName = (args as { name: string }).name; const slug = inputName .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-|-$/g, ""); const data = (await fetchJSON("/api/signals.json")) as unknown as SignalsData; let found: Startup | null = null; let foundSector = ""; for (const sector of data.sectors) { const match = sector.startups.find( (s) => s.name .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-|-$/g, "") === slug ); if (match) { found = match; foundSector = sector.name; break; } } if (!found) { return { content: [ { type: "text" as const, text: `Startup "${inputName}" not found. Try the GitHub org name exactly as it appears, or use get_trending_startups / search_startups_by_sector to browse.`, }, ], structuredContent: { found: false, suggestion: "Try the exact GitHub org name, or call get_trending_startups / search_startups_by_sector to browse the tracked universe.", citation: data.meta.citation, }, }; } return { content: [ { type: "text" as const, text: [ `${found.name} — Engineering Signal Profile`, ``, `Sector: ${foundSector}`, `Stage: ${found.stage}`, `Geography: ${found.geography}`, `Commit Velocity (14d): ${found.commitVelocity14d}`, `Velocity Change: ${found.commitVelocityChange}`, `Contributors: ${found.contributors}`, `Contributor Growth: ${found.contributorGrowth}`, `New Repos (30d): ${found.newRepos}`, `Signal Type: ${found.signalType}`, `GitHub: ${found.githubUrl}`, found.websiteUrl ? `Website: ${found.websiteUrl}` : null, found.linkedinUrl ? `LinkedIn: ${found.linkedinUrl}` : null, found.profileUrl ? `Profile: ${found.profileUrl}` : null, ``, found.description || "", ``, `Source: ${BASE_URL}`, `Citation: ${data.meta.citation}`, ``, FOOTER, ] .filter(Boolean) .join("\n"), }, ], structuredContent: { found: true, startup: { rank: 1, name: found.name, sector: foundSector, stage: found.stage, geography: found.geography, commitVelocity14d: found.commitVelocity14d, commitVelocityChange: found.commitVelocityChange, contributors: found.contributors, contributorGrowth: found.contributorGrowth, newRepos: found.newRepos, signalType: found.signalType, description: found.description, githubUrl: found.githubUrl, ...(found.websiteUrl ? { websiteUrl: found.websiteUrl } : {}), ...(found.linkedinUrl ? { linkedinUrl: found.linkedinUrl } : {}), profileUrl: found.profileUrl, }, citation: data.meta.citation, }, }; }