frontrun-mcp-server
Advanced tools
+31
-11
@@ -430,3 +430,3 @@ #!/usr/bin/env node | ||
| 'frontrun_new_follows', | ||
| 'Detect new follows across tracked accounts. Returns temporal diffs - who each tracked account recently followed and when. 16 credits.', | ||
| 'Detect new follows across tracked accounts. Returns temporal diffs - who each tracked account recently followed and when (detected_at per follow). By default returns company-grade signal: follows classified as non-companies are hidden (hidden_non_companies reports the count) and classification labels are attached. Set raw=true for the unfiltered feed. Accounts added very recently appear under "baselining" and are live-checked against X for follows made since they were added. 16 credits.', | ||
| { | ||
@@ -436,5 +436,6 @@ since: z.string().optional().describe('Time window: "24h", "7d", "30d", or ISO date. Default: "24h"'), | ||
| username: z.string().optional().describe('Filter to a specific tracked account'), | ||
| classify: z.boolean().optional().describe('Include AI classification for each new follow'), | ||
| raw: z.boolean().optional().describe('Return the unfiltered follow feed (default hides non-companies)'), | ||
| include_baseline: z.boolean().optional().describe('Include the initial indexed follow lists of accounts still establishing a baseline'), | ||
| }, | ||
| async ({ since, hours, username, classify }) => { | ||
| async ({ since, hours, username, raw, include_baseline }) => { | ||
| const params = {}; | ||
@@ -444,3 +445,4 @@ if (since) params.since = since; | ||
| if (username) params.username = username; | ||
| if (classify) params.classify = 'true'; | ||
| if (raw) params.raw = 'true'; | ||
| if (include_baseline) params.include_baseline = 'true'; | ||
| return result(await apiCall('GET', `/follows/new${buildQS(params)}`)); | ||
@@ -518,10 +520,15 @@ } | ||
| 'frontrun_search', | ||
| 'Search discovered entities by sector, keyword, or entity type across your tracked universe. 4 credits.', | ||
| 'Keyword search over Frontrun-discovered companies. 4 credits. Use scope "catalog" (recommended for discovery) to search the ENTIRE global catalog of ~16k companies surfaced by all tracked investors - companies describe themselves in plain words, so exact terms like "post-training", "fine-tune", "RL environments" often find what semantic thesis search misses. scope "tracked" (default) searches only entities in YOUR tracked accounts\' follow graph. For "companies under N followers" questions this is ONE call: scope "catalog" + sector or keyword + max_followers=N - counts come back live-verified against X (followers_live: true), so do NOT re-check sizes with per-company calls; follow up with frontrun_founders_batch for all result handles at once. PRESENTATION: always show catalog results as a markdown table - Company (linked to x.com/username) | Description | Followers | Founders (@handles linked) | Website. Never a prose list. For broad thesis work, run BOTH frontrun_thesis_search and this tool with 2-4 keyword variants, then merge.', | ||
| { | ||
| sector: z.string().optional().describe('Filter by sector: "DeFi", "AI", "Infrastructure", "Gaming", "Payments", etc.'), | ||
| keyword: z.string().optional().describe('Search keyword (matches username, sector, bio)'), | ||
| sector: z.string().optional().describe('Filter by sector: "DeFi", "AI", "Robotics", "Infrastructure", "Payments", etc.'), | ||
| keyword: z.string().optional().describe('Search keyword (matched against company name and bio/description)'), | ||
| entity_type: z.string().optional().describe('Filter: "company", "project", "person", "fund", "vc"'), | ||
| scope: z.enum(['catalog', 'tracked']).optional().describe('"catalog" = the full global company catalog (recommended for discovery); "tracked" = only your own follow graph (default, legacy)'), | ||
| max_followers: z.number().optional().describe('Catalog scope only: only companies at or under this follower count, live-verified against X'), | ||
| min_followers: z.number().optional().describe('Catalog scope only: only companies at or above this follower count, live-verified against X'), | ||
| verify_followers: z.boolean().optional().describe('Set false to skip live verification of follower bounds (faster, counts may be stale). Default: true when a bound is set'), | ||
| include_founders: z.boolean().optional().describe('Catalog scope only: include each company\'s founders (name, role, X handle) in the same response. 100 credits per company with founders found'), | ||
| limit: z.number().optional().describe('Max results (max 200). Default: 50'), | ||
| }, | ||
| async ({ sector, keyword, entity_type, limit }) => { | ||
| async ({ sector, keyword, entity_type, scope, max_followers, min_followers, verify_followers, include_founders, limit }) => { | ||
| const params = {}; | ||
@@ -531,2 +538,7 @@ if (sector) params.sector = sector; | ||
| if (entity_type) params.entity_type = entity_type; | ||
| if (scope) params.scope = scope; | ||
| if (max_followers != null) params.max_followers = max_followers; | ||
| if (min_followers != null) params.min_followers = min_followers; | ||
| if (verify_followers === false) params.verify_followers = 'false'; | ||
| if (include_founders) params.include_founders = 'true'; | ||
| if (limit) params.limit = limit; | ||
@@ -539,8 +551,9 @@ return result(await apiCall('GET', `/search${buildQS(params)}`)); | ||
| 'frontrun_thesis_search', | ||
| 'Semantic thesis search over your database (companies surfaced by the investors you track). Describe an investment thesis in plain language (e.g. "information markets - platforms where people trade on what they know") and get companies whose descriptions match the meaning, not just the exact words. Ranked by similarity. 40 credits.', | ||
| 'Thesis search over Frontrun-discovered companies: describe an investment thesis in plain language and get matching companies. Searches BOTH by meaning (embeddings) and by vocabulary (catalog keyword sweep), merged server-side - pass 3-8 domain keywords for much better coverage (companies self-describe in their field\'s insider jargon; e.g. an AI-training thesis benefits from keywords like "post-training", "evals"; a payments thesis from "payment rails", "x402"). Each result says which route found it (found_by) and which keywords matched. 40 credits. IMPORTANT: followers_count null means UNKNOWN, not zero - treat unknown as possibly-small when filtering. Negation ("NOT exchanges") is unsupported - retrieve broadly, filter yourself.', | ||
| { | ||
| q: z.string().describe('Investment thesis in plain language (min 10 characters)'), | ||
| keywords: z.array(z.string()).optional().describe('3-8 short keyword phrases in the field\'s own vocabulary; dramatically improves recall over meaning-only search'), | ||
| limit: z.number().optional().describe('Max results (max 50). Default: 25'), | ||
| }, | ||
| async ({ q, limit }) => result(await apiCall('GET', `/search/thesis${buildQS({ q, limit })}`)) | ||
| async ({ q, keywords, limit }) => result(await apiCall('GET', `/search/thesis${buildQS({ q, limit, deep: 'true', keywords: keywords && keywords.length ? keywords.join(',') : undefined })}`)) | ||
| ); | ||
@@ -678,3 +691,3 @@ | ||
| 'frontrun_company_founders', | ||
| 'Founder intelligence: identifies founders via social graph analysis and enriches with LinkedIn data. Returns name, role, background, previous companies. 100 credits.', | ||
| 'Founder intelligence for ONE company (for several companies, call frontrun_founders_batch instead). Identifies founders via social graph analysis and enriches with LinkedIn data. Each founder\'s "handle" field is their X handle - present it as @handle. Returns name, role, background, previous companies. 100 credits.', | ||
| { handle: z.string().describe('Twitter/X handle of the company (without @)') }, | ||
@@ -685,2 +698,9 @@ async ({ handle }) => result(await apiCall('GET', `/company/${encodeURIComponent(handle)}/founders`)) | ||
| server.tool( | ||
| 'frontrun_founders_batch', | ||
| 'Founder lookup for up to 10 companies in ONE call - always prefer this over calling frontrun_company_founders once per company. Serves verified cached founder data in about a second. Each founder\'s "handle" field is their X handle - present it as @handle. Companies returned with resolution_status "resolving" have live discovery running in the background: retry just those via frontrun_company_founders in about a minute. 100 credits per company with founders found; misses are free.', | ||
| { handles: z.array(z.string()).describe('Company X handles (without @), max 10') }, | ||
| async ({ handles }) => result(await apiCall('POST', '/founders/batch', { handles })) | ||
| ); | ||
| server.tool( | ||
| 'frontrun_company_signals', | ||
@@ -687,0 +707,0 @@ 'Social signal analysis: buzz score, sentiment, notable mentions, and which of your tracked VCs follow this entity. 16 credits.', |
+1
-1
| { | ||
| "name": "frontrun-mcp-server", | ||
| "mcpName": "io.github.jongall45/frontrun-mcp-server", | ||
| "version": "2.6.1", | ||
| "version": "2.7.0", | ||
| "description": "Frontrun MCP Server - VC follow signal intelligence, company research, and deal discovery for AI agents. 35 tools.", | ||
@@ -6,0 +6,0 @@ "type": "module", |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
48949
9.68%768
3.5%10
25%