Skip to main content
Glama
kindrat86

mcp-deal-flow-signal

Get Trending Startups

get_trending_startups
Read-onlyIdempotent

Discover the top 20 startups ranked by engineering acceleration across all sectors for the current reporting period.

Instructions

Return the top 20 startups ranked by engineering acceleration across all 20 sectors for the current reporting period. Each row includes commit velocity, contributor count, signal classification, and GitHub URL.

WHEN TO USE:

  • A VC, scout, or analyst asks 'who's trending this week', 'what's hot right now', 'who should I look at', or 'what to watch'.

  • You need a fresh cross-sector shortlist for a deal-flow meeting or weekly watchlist.

  • You want to surface breakout companies before they appear in Crunchbase / PitchBook / press.

DO NOT USE FOR:

  • Narrowing to one vertical — call search_startups_by_sector instead.

  • Looking up a named company — call get_startup_signal with the company name.

  • Explaining the ranking methodology — call get_methodology.

  • Discovering what sectors exist or how fresh the data is — call get_signals_summary.

BEHAVIOR:

  • Read-only, idempotent, no side effects. Safe to call repeatedly.

  • Deterministic within a 7-day window: the dataset refreshes every Monday ~09:00 UTC, so identical calls within the same week return identical results.

  • No authentication required. No rate limit enforced by this server; the upstream CDN absorbs typical agent traffic.

  • Returns exactly 20 rows when the dataset is healthy; fewer only if the upstream feed is degraded.

  • On upstream failure: returns isError: true with the HTTP status in the text block — retry once after a short delay before escalating to the user.

  • Open-world: the tracked universe (~400 companies) evolves week to week as new orgs qualify or drop out.

PARAMETERS: None.

RETURNS: { period, startups[20], citation, source }. Each startup row contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType ('breakout' | 'acceleration' | 'steady' | 'cooling'), description, githubUrl, websiteUrl (when known, ~90% coverage), linkedinUrl (when known, partial coverage), profileUrl.

TYPICAL WORKFLOW: get_trending_startups → pick a name → get_startup_signal(name) for the deep-dive → get_methodology if the user questions the ranking.

LIMITATIONS: Only covers startups with a meaningful open-source footprint. Does not include funding, revenue, headcount, or stealth companies — pair with Crunchbase for cap-table and round data. No historical series — each call is the latest weekly snapshot only.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
periodYesReporting period label, e.g. 'Q2 2026'.
startupsYesTop 20 startups ranked by engineering acceleration.
citationYesSuggested citation string for reports.
sourceYes

Implementation Reference

  • src/server.ts:232-298 (registration)
    Tool registration for 'get_trending_startups' — defines name, description, input/output schemas, and annotations. Listed in the TOOLS array which is served via ListToolsRequestSchema handler.
    const TOOLS = [
      {
        name: "get_trending_startups",
        title: "Get Trending Startups",
        description: [
          "Return the top 20 startups ranked by engineering acceleration across all 20 sectors for the current reporting period. Each row includes commit velocity, contributor count, signal classification, and GitHub URL.",
          "",
          "WHEN TO USE:",
          "- A VC, scout, or analyst asks 'who's trending this week', 'what's hot right now', 'who should I look at', or 'what to watch'.",
          "- You need a fresh cross-sector shortlist for a deal-flow meeting or weekly watchlist.",
          "- You want to surface breakout companies before they appear in Crunchbase / PitchBook / press.",
          "",
          "DO NOT USE FOR:",
          "- Narrowing to one vertical — call `search_startups_by_sector` instead.",
          "- Looking up a named company — call `get_startup_signal` with the company name.",
          "- Explaining the ranking methodology — call `get_methodology`.",
          "- Discovering what sectors exist or how fresh the data is — call `get_signals_summary`.",
          "",
          "BEHAVIOR:",
          "- Read-only, idempotent, no side effects. Safe to call repeatedly.",
          "- Deterministic within a 7-day window: the dataset refreshes every Monday ~09:00 UTC, so identical calls within the same week return identical results.",
          "- No authentication required. No rate limit enforced by this server; the upstream CDN absorbs typical agent traffic.",
          "- Returns exactly 20 rows when the dataset is healthy; fewer only if the upstream feed is degraded.",
          "- On upstream failure: returns `isError: true` with the HTTP status in the text block — retry once after a short delay before escalating to the user.",
          "- Open-world: the tracked universe (~400 companies) evolves week to week as new orgs qualify or drop out.",
          "",
          "PARAMETERS: None.",
          "",
          "RETURNS: `{ period, startups[20], citation, source }`. Each startup row contains rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType ('breakout' | 'acceleration' | 'steady' | 'cooling'), description, githubUrl, websiteUrl (when known, ~90% coverage), linkedinUrl (when known, partial coverage), profileUrl.",
          "",
          "TYPICAL WORKFLOW: `get_trending_startups` → pick a name → `get_startup_signal(name)` for the deep-dive → `get_methodology` if the user questions the ranking.",
          "",
          "LIMITATIONS: Only covers startups with a meaningful open-source footprint. Does not include funding, revenue, headcount, or stealth companies — pair with Crunchbase for cap-table and round data. No historical series — each call is the latest weekly snapshot only.",
        ].join("\n"),
        inputSchema: {
          type: "object" as const,
          properties: {},
          additionalProperties: false,
        },
        outputSchema: {
          type: "object" as const,
          properties: {
            period: {
              type: "string",
              description: "Reporting period label, e.g. 'Q2 2026'.",
            },
            startups: {
              type: "array",
              description: "Top 20 startups ranked by engineering acceleration.",
              items: STARTUP_ITEM_SCHEMA,
            },
            citation: {
              type: "string",
              description: "Suggested citation string for reports.",
            },
            source: { type: "string", format: "uri" },
          },
          required: ["period", "startups", "citation", "source"],
        },
        annotations: {
          title: "Get Trending Startups",
          readOnlyHint: true,
          destructiveHint: false,
          idempotentHint: true,
          openWorldHint: true,
        },
      },
  • Handler implementation for 'get_trending_startups' — fetches /api/signals.json, slices top 20 trending startups, maps sector names, and returns both text and structured content (rank, name, sector, stage, geography, commitVelocity14d, commitVelocityChange, contributors, contributorGrowth, newRepos, signalType, description, githubUrl, websiteUrl, linkedinUrl, profileUrl, citation, source).
    case "get_trending_startups": {
      const data = (await fetchJSON("/api/signals.json")) as unknown as SignalsData;
      const trending = data.trending.slice(0, 20);
      const sectorByStartup = new Map<string, string>();
      for (const sector of data.sectors) {
        for (const s of sector.startups) {
          sectorByStartup.set(s.name, sector.name);
        }
      }
    
      const structured = {
        period: data.meta.period.name,
        startups: trending.map((s, i) => ({
          rank: i + 1,
          name: s.name,
          sector: sectorByStartup.get(s.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,
        source: BASE_URL,
      };
    
      const lines = trending.map(
        (s, i) =>
          `${i + 1}. ${s.name} — ${s.commitVelocityChange} velocity change, ${s.contributors} contributors, signal: ${s.signalType}`
      );
      return {
        content: [
          {
            type: "text" as const,
            text: `Top 20 Trending Startups (${data.meta.period.name})\n\n${lines.join("\n")}\n\nSource: ${BASE_URL}\nData: ${BASE_URL}/api/signals.json\nCitation: ${data.meta.citation}\n\n${FOOTER}`,
          },
        ],
        structuredContent: structured,
      };
    }
  • STARTUP_ITEM_SCHEMA — reusable JSON schema for startup objects used in the output schema of get_trending_startups (and other tools). Defines properties like rank, name, sector, stage, commitVelocity14d, commitVelocityChange, signalType, etc.
    const STARTUP_ITEM_SCHEMA = {
      type: "object" as const,
      description:
        "A single startup ranked by engineering acceleration, as derived from public GitHub activity.",
      properties: {
        rank: { type: "integer", description: "1-indexed rank within this result set." },
        name: { type: "string", description: "Startup or GitHub org name." },
        sector: { type: "string", description: "Sector the startup is classified into." },
        stage: {
          type: "string",
          description: "Funding stage if known (e.g. 'Seed', 'Series A', 'Unknown').",
        },
        geography: { type: "string", description: "Headquarters region if known." },
        commitVelocity14d: {
          type: "number",
          description: "Commits across tracked repos in the trailing 14 days.",
        },
        commitVelocityChange: {
          type: "string",
          description:
            "Percentage change in commit velocity vs. the prior 14-day window, e.g. '+142%'.",
        },
        contributors: {
          type: "integer",
          description: "Distinct contributors active in the last 30 days.",
        },
        contributorGrowth: {
          type: "string",
          description: "Percentage change in contributor count vs. the prior 30-day window.",
        },
        newRepos: {
          type: "integer",
          description: "New public repositories created in the last 30 days.",
        },
        signalType: {
          type: "string",
          description:
            "Classification label. Common values: 'breakout' (sudden surge), 'acceleration' (sustained growth), 'steady' (healthy baseline), 'cooling' (declining).",
        },
        description: { type: "string", description: "One-line summary of the startup." },
        githubUrl: { type: "string", format: "uri", description: "Primary GitHub org URL." },
        websiteUrl: {
          type: "string",
          format: "uri",
          description:
            "Official company homepage, harvested from the GitHub org `blog` field when the org exposes one. Absent for roughly 10% of records where the org has no `blog` value.",
        },
        linkedinUrl: {
          type: "string",
          format: "uri",
          description:
            "LinkedIn company page URL, when known. Populated opportunistically — often absent.",
        },
        profileUrl: {
          type: "string",
          format: "uri",
          description: "Public profile page on gitdealflow.com, when available.",
        },
      },
      required: [
        "rank",
        "name",
        "commitVelocityChange",
        "contributors",
        "signalType",
        "githubUrl",
      ],
    };
  • SignalsData interface — TypeScript type for the fetched signals data, including the 'trending' array that get_trending_startups reads from.
    interface SignalsData {
      meta: { period: { name: string }; citation: string };
      trending: Startup[];
      sectors: Sector[];
    }
  • fetchJSON helper — generic async function used by the get_trending_startups handler to fetch JSON from the BASE_URL API.
    async function fetchJSON(path: string): Promise<Record<string, unknown>> {
      const res = await fetch(`${BASE_URL}${path}`, {
        headers: { "User-Agent": UA },
      });
      if (!res.ok) throw new Error(`HTTP ${res.status} from ${path}`);
      return res.json() as Promise<Record<string, unknown>>;
    }
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, idempotentHint, etc.), the description adds deterministic behavior within 7-day window, refresh schedule, authentication/rate limit info, exact row count conditions, error handling, and universe evolution. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-organized with clear sections. Every sentence provides useful information. Front-loaded with core purpose. No redundancy despite comprehensive coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, behavior, output format (with schema reference), typical workflow, and limitations. No gaps; all aspects needed for correct invocation are addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description explicitly states 'PARAMETERS: None', which suffices. With zero parameters, baseline is 4; no additional value needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool returns top 20 startups ranked by engineering acceleration across all sectors for the current period. Distinguishes from siblings by specifying what it does not cover and naming alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'WHEN TO USE' and 'DO NOT USE FOR' sections with specific user intents and named sibling tools (e.g., search_startups_by_sector, get_startup_signal). Comprehensive guidance on when to invoke this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kindrat86/mcp-deal-flow-signal'

If you have feedback or need assistance with the MCP directory API, please join our Discord server