🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

frontrun-mcp-server

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

frontrun-mcp-server - npm Package Compare versions

Comparing version
2.6.1
to
2.7.0
+31
-11
index.js

@@ -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.',

{
"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",