@fundzwatch/mcp-server 1.0.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,23 +4,25 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
5
  [![Node](https://img.shields.io/node/v/@fundzwatch/mcp-server.svg)](https://www.npmjs.com/package/@fundzwatch/mcp-server)
6
6
 
7
- Real-time business event intelligence for AI agents via [Model Context Protocol](https://modelcontextprotocol.io).
7
+ ### Listed on
8
8
 
9
- Get AI-scored sales leads, funding rounds, acquisitions, executive hires, and market intelligence directly in Claude, Cursor, Windsurf, or any MCP-compatible client.
9
+ [![npm](https://img.shields.io/badge/npm-@fundzwatch/mcp--server-red?logo=npm)](https://www.npmjs.com/package/@fundzwatch/mcp-server)
10
+ [![Smithery](https://img.shields.io/badge/Smithery-live-brightgreen)](https://smithery.ai/servers/fundzwatch/fundzwatch-mcp)
11
+ [![Cline Marketplace](https://img.shields.io/badge/Cline_Marketplace-submitted-yellow)](https://cline.bot)
12
+ [![awesome-mcp-servers](https://img.shields.io/badge/awesome--mcp--servers-listed-brightgreen)](https://github.com/punkpeye/awesome-mcp-servers)
13
+ [![Glama](https://img.shields.io/badge/Glama-claimed-brightgreen)](https://glama.ai/mcp/servers/Fund-z/fundzwatch-mcp)
10
14
 
11
- ## Quick Start
15
+ The free AI-agent gateway to **[FundzWatch](https://fundzwatch.ai)** answer sections — real-time business-event intelligence via the [Model Context Protocol](https://modelcontextprotocol.io).
12
16
 
13
- ### 1. Get a Free API Key
17
+ Give Claude, Cursor, Windsurf, Cline, or any MCP client live access to verified funding rounds, executive moves, UCC refinancing windows, Form 5500 benefit-plan signals, and AI-scored leads matched to your ICP.
14
18
 
15
- Sign up at [fundzwatch.ai/onboarding](https://fundzwatch.ai/onboarding) (no credit card required).
19
+ **7 of the 14 tools work with no API key** — point your agent at the server and it returns live, daily-rescored "answer section" data on the first run. Add a free key to unlock AI-scored leads, watchlists, and the full event feeds.
16
20
 
17
- ### 2. Add to Claude Desktop
21
+ ## Quick Start
18
22
 
19
- Edit your Claude Desktop config:
23
+ ### Option A — `npx` (Claude Desktop, Cursor, Windsurf, Cline)
20
24
 
21
- - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
22
- - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
23
- - **Linux:** `~/.config/Claude/claude_desktop_config.json`
25
+ No install needed. Add this to your client's MCP config:
24
26
 
25
27
  ```json
26
28
  {
@@ -36,61 +38,79 @@ Edit your Claude Desktop config:
36
38
  }
37
39
  ```
38
40
 
39
- ### 3. Start Asking
40
-
41
- - "Find me companies that just raised Series B in healthtech"
42
- - "Show me the largest funding rounds this week"
43
- - "Get my AI-scored leads with a score above 70"
44
- - "What's happening in the market today?"
45
- - "Track stripe.com and github.com on my watchlist"
41
+ Config file locations for Claude Desktop:
42
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
43
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
44
+ - **Linux:** `~/.config/Claude/claude_desktop_config.json`
46
45
 
47
- ## Available Tools
46
+ > The `env` block is **optional**. Omit it entirely and the 7 key-less tools still return live data. Get a free key (no credit card) at **[fundzwatch.ai/onboarding](https://fundzwatch.ai/onboarding)** to add AI-scored leads, watchlists, and full event feeds.
48
47
 
49
- | Tool | Description |
50
- |------|-------------|
51
- | `get_scored_leads` | AI-scored leads matched to your ICP with buyer intent, buying stage, and outreach recommendations |
52
- | `get_events` | Real-time business events: funding, acquisitions, hiring, contracts, product launches |
53
- | `get_market_pulse` | Market activity overview with totals, trends, and largest rounds |
54
- | `get_market_brief` | AI-generated strategic intelligence brief |
55
- | `manage_watchlist` | Add, remove, or list tracked companies |
56
- | `get_watchlist_events` | Events for your tracked companies |
57
- | `get_usage` | Check API usage and limits |
48
+ For Cursor / Windsurf / Cline, use the same block under their MCP settings (the inner `"fundzwatch": { ... }` object).
58
49
 
59
- ## Use with Cursor / Windsurf
50
+ ### Option B Smithery (hosted, one-click)
60
51
 
61
- Add to your MCP settings:
52
+ FundzWatch is live on Smithery: **[smithery.ai/servers/fundzwatch/fundzwatch-mcp](https://smithery.ai/servers/fundzwatch/fundzwatch-mcp)**
62
53
 
63
- ```json
64
- {
65
- "fundzwatch": {
66
- "command": "npx",
67
- "args": ["-y", "@fundzwatch/mcp-server"],
68
- "env": {
69
- "FUNDZWATCH_API_KEY": "fundz_test_your_key_here"
70
- }
71
- }
72
- }
54
+ ```bash
55
+ npx -y @smithery/cli install @fundzwatch/mcp-server --client claude
73
56
  ```
74
57
 
75
- ## Pricing
58
+ ### Then just ask
59
+
60
+ - "Which companies raised in the last year **and** are hiring right now?" *(no key)*
61
+ - "Show me UCC liens lapsing in the next 12 months in California." *(no key)*
62
+ - "Find recently funded companies with a Form 5500 plan and a named carrier." *(no key)*
63
+ - "Get my AI-scored leads with buyer-intent above 70." *(key)*
64
+ - "Track stripe.com and github.com and alert me on new events." *(key)*
65
+
66
+ ## Tools (14)
67
+
68
+ ### Key-less — no API key required
69
+
70
+ Live teasers off the Fundz answer sections (top results + cohort size, re-scored daily). California + Colorado UCC coverage.
76
71
 
77
- | Tier | Price | API Calls/mo | AI Score Calls/mo |
78
- |------|-------|-------------|-------------------|
79
- | Sandbox | Free | 500 | 50 |
80
- | Growth | $199/mo | 10,000 | 500 |
81
- | Scale | $599/mo | 100,000 | 5,000 |
82
- | Enterprise | Custom | Unlimited | Unlimited |
72
+ | Tool | What it answers |
73
+ |------|-----------------|
74
+ | `get_funded_and_hiring` | Companies funded in the last 12 months **and** actively hiring — the strongest buying window, scored daily. |
75
+ | `get_refinancing_windows` | Companies whose UCC-1 liens lapse within 12 months (Renewal Radar) — dated refinancing windows. |
76
+ | `get_stacked_borrowers` | Companies with active secured debt from 2+ distinct lenders — second-position / consolidation targets. |
77
+ | `get_benefit_plans_in_play` | Recently funded companies with a DOL Form 5500 plan: renewal timing, headcount-vs-plan gap, incumbent carrier. |
78
+ | `get_money_in_motion` | Companies with a recent exec move **and** recent funding — the wealth-advisor "money in motion" moment. |
79
+ | `get_lender_directory` | Directory of 8,600+ UCC secured parties ranked by filing volume, with lapsing-soon exposure. |
80
+ | `get_broker_directory` | Directory of 65,000+ benefits brokers (Form 5500 Schedule A), ranked by filings carried, with commission volume. |
81
+
82
+ ### Keyed — require `FUNDZWATCH_API_KEY`
83
+
84
+ | Tool | What it answers |
85
+ |------|-----------------|
86
+ | `get_scored_leads` | AI-scored sales leads matched to your ICP, with buyer intent, buying stage, and recommended outreach. |
87
+ | `get_events` | Real-time business events: funding, acquisitions, exec hires, government contracts, product launches. |
88
+ | `get_market_pulse` | Market activity overview: funding totals, acquisitions, exec moves, contracts, launches (7d / 30d). |
89
+ | `get_market_brief` | Today's AI-generated strategic intelligence brief on the most important market movements. |
90
+ | `manage_watchlist` | Add, remove, or list tracked companies; tracked companies generate new-event alerts. |
91
+ | `get_watchlist_events` | Recent events for the companies on your watchlist. |
92
+ | `get_usage` | Check your API usage, limits, and current tier. |
83
93
 
84
94
  ## What is FundzWatch?
85
95
 
86
- [FundzWatch.ai](https://fundzwatch.ai) provides real-time business event intelligence for AI agents and sales teams:
96
+ [FundzWatch.ai](https://fundzwatch.ai) is the AI-agent front door to Fundz's verified business-event intelligence funding rounds, acquisitions, executive moves, government contracts, hiring signals, UCC liens, and DOL Form 5500 benefit-plan filings, fused into cross-dataset "answer sections" that no single-source lookup reproduces. Everything is re-scored daily.
97
+
98
+ - **Key-less answer sections** — point an agent at the server and get live data on day one, no signup.
99
+ - **AI-scored leads** — companies scored against your ICP with buyer-intent and outreach guidance (free key).
100
+ - **Cross-dataset cohorts** — funded-and-hiring, money-in-motion, refinancing windows, benefit-plans-in-play.
101
+ - **Who-finances-whom** — lender (8,600+) and broker (65,000+) directories from UCC and Form 5500.
102
+
103
+ Free API key (no credit card): **[fundzwatch.ai/onboarding](https://fundzwatch.ai/onboarding)**.
104
+
105
+ The full scored feeds, ICP filters, contact data, and daily alerts live in the Fundz app — **[app.fundz.net](https://app.fundz.net)**, Strategic plan ($149/mo).
106
+
107
+ Built by [Fundz](https://fundz.net) — millions of business events analyzed since 2017.
87
108
 
88
- - **AI-Scored Leads**: Companies scored daily against your ICP using Claude AI, with buyer intent signals, buying stage analysis, and outreach recommendations
89
- - **Event Feeds**: Real-time funding rounds, acquisitions, executive moves, government contracts, and product launches
90
- - **Predictive Intelligence**: ML models predicting which companies are likely to make moves (82% accuracy)
91
- - **Market Briefs**: AI-generated daily strategic intelligence briefings
109
+ ## Tutorials
92
110
 
93
- Built by [Fundz](https://fundz.net), tracking 50M+ business events since 2017.
111
+ - [Build an AI SDR Agent with CrewAI + FundzWatch](https://github.com/Fund-z/fundzwatch-python/blob/main/tutorials/build-ai-sdr-crewai.md)
112
+ - [Real-Time Funding Alerts with LangChain + FundzWatch](https://github.com/Fund-z/fundzwatch-python/blob/main/tutorials/langchain-funding-alerts.md)
113
+ - [Turn Claude into Your Business Intelligence Analyst with MCP](https://github.com/Fund-z/fundzwatch-python/blob/main/tutorials/mcp-claude-business-intelligence.md)
94
114
 
95
115
  ## License
96
116
 
package/dist/index.js CHANGED
@@ -5,6 +5,11 @@ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
5
5
  const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
6
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
7
7
  const API_BASE = "https://api.fundz.net/v1/watch";
8
+ // Answer-section feeds (Renewal Radar, Stacked Borrowers, Benefit Plans,
9
+ // Funded & Hiring, Lender Directory) are public teaser endpoints — no key
10
+ // needed. Anonymous callers get the top 5 of each scored cohort plus the
11
+ // full cohort size; the complete feeds live in the Fundz app (Strategic).
12
+ const PUBLIC_API_BASE = "https://api.fundz.net/v1";
8
13
  function getApiKey() {
9
14
  const key = process.env.FUNDZWATCH_API_KEY;
10
15
  if (!key) {
@@ -21,7 +26,7 @@ async function apiRequest(method, path, params) {
21
26
  headers: {
22
27
  Authorization: `Bearer ${apiKey}`,
23
28
  "Content-Type": "application/json",
24
- "User-Agent": "fundzwatch-mcp/1.0.1",
29
+ "User-Agent": "fundzwatch-mcp/1.1.0",
25
30
  },
26
31
  };
27
32
  if (method === "GET" && params) {
@@ -41,11 +46,44 @@ async function apiRequest(method, path, params) {
41
46
  }
42
47
  return response.json();
43
48
  }
49
+ // Public (key-less) GET against the answer-section teaser endpoints.
50
+ async function publicRequest(path, params) {
51
+ const url = new URL(`${PUBLIC_API_BASE}${path}`);
52
+ if (params) {
53
+ Object.entries(params).forEach(([key, value]) => {
54
+ if (value !== undefined && value !== null)
55
+ url.searchParams.append(key, String(value));
56
+ });
57
+ }
58
+ const response = await fetch(url.toString(), {
59
+ headers: { "User-Agent": "fundzwatch-mcp/1.1.0" },
60
+ });
61
+ if (!response.ok) {
62
+ throw new Error(`API error ${response.status}: ${response.statusText}`);
63
+ }
64
+ return response.json();
65
+ }
44
66
  function textResult(text) {
45
67
  return { content: [{ type: "text", text }] };
46
68
  }
69
+ // Shared formatter for the section feeds: rows differ per section, so print
70
+ // whatever evidence fields are present, then the cohort size + upgrade path.
71
+ function formatSectionFeed(label, rows, summary, limited, appUrl, lineFor) {
72
+ if (!rows.length)
73
+ return `No companies in ${label} right now. The cohort refreshes daily.`;
74
+ const lines = rows.map((r, i) => {
75
+ const org = r.organization || {};
76
+ const loc = [org.city, org.state].filter(Boolean).join(", ");
77
+ return `${i + 1}. **${org.name}**${loc ? ` (${loc})` : ""} — Score ${Math.round(r.score)}${r.is_new ? " · NEW this week" : ""}\n ${lineFor(r)}`;
78
+ });
79
+ let text = `${label} — ${summary.total} companies, ${summary.new_this_week} new this week (refreshed ${summary.last_refreshed_on}):\n\n${lines.join("\n")}`;
80
+ if (limited) {
81
+ text += `\n\nThis is the free preview (top ${rows.length} of ${summary.total}). The full scored feed with filters, contacts, and daily alerts is in the Fundz app (Strategic plan): ${appUrl}`;
82
+ }
83
+ return text;
84
+ }
47
85
  // ─── Server Setup ───────────────────────────────────────────────────────
48
- const server = new index_js_1.Server({ name: "fundzwatch", version: "1.0.1" }, { capabilities: { tools: {} } });
86
+ const server = new index_js_1.Server({ name: "fundzwatch", version: "1.2.1" }, { capabilities: { tools: {} } });
49
87
  // ─── List Tools ─────────────────────────────────────────────────────────
50
88
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
51
89
  tools: [
@@ -137,6 +175,103 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
137
175
  description: "Check your FundzWatch API usage: calls made, limits, current tier.",
138
176
  inputSchema: { type: "object", properties: {} },
139
177
  },
178
+ {
179
+ name: "get_funded_and_hiring",
180
+ description: "Companies with a verified funding round in the last 12 months AND live hiring " +
181
+ "evidence (open ATS roles, executive hires, hiring signals) — the strongest buying " +
182
+ "window, score-ranked and refreshed daily. No API key required.",
183
+ inputSchema: {
184
+ type: "object",
185
+ properties: {
186
+ q: { type: "string", description: "Company name search" },
187
+ state: { type: "string", description: "2-letter US state filter (e.g. 'CA')" },
188
+ },
189
+ },
190
+ },
191
+ {
192
+ name: "get_refinancing_windows",
193
+ description: "Companies whose active UCC-1 liens lapse within 12 months (Renewal Radar). " +
194
+ "UCC liens expire after 5 years — the incumbent lender must re-file or lose priority, " +
195
+ "so each approaching lapse is a refinancing window with a date on it. For lenders, " +
196
+ "MCA/ISO, and equipment finance. California + Colorado coverage (CO refreshed daily). No API key required.",
197
+ inputSchema: {
198
+ type: "object",
199
+ properties: {
200
+ q: { type: "string", description: "Company name search" },
201
+ state: { type: "string", description: "2-letter US state filter" },
202
+ },
203
+ },
204
+ },
205
+ {
206
+ name: "get_stacked_borrowers",
207
+ description: "Companies with active secured debt (UCC-1) from 2+ distinct lenders and a filing in " +
208
+ "the last 24 months — proven appetite for layered financing; second-position and " +
209
+ "refi/consolidation targets. California + Colorado coverage (CO refreshed daily). No API key required.",
210
+ inputSchema: {
211
+ type: "object",
212
+ properties: {
213
+ q: { type: "string", description: "Company name search" },
214
+ state: { type: "string", description: "2-letter US state filter" },
215
+ },
216
+ },
217
+ },
218
+ {
219
+ name: "get_benefit_plans_in_play",
220
+ description: "Recently funded companies (≤24 months) with a DOL Form 5500 benefit-plan filing on " +
221
+ "record: plan renewal timing, participant count vs current headcount ('outgrowing " +
222
+ "their plan'), and the incumbent insurance carrier from Schedule A. For benefits " +
223
+ "brokers, retirement-plan advisors, PEOs, HR-tech sellers. No API key required.",
224
+ inputSchema: {
225
+ type: "object",
226
+ properties: {
227
+ q: { type: "string", description: "Company name search" },
228
+ state: { type: "string", description: "2-letter US state filter" },
229
+ },
230
+ },
231
+ },
232
+ {
233
+ name: "get_lender_directory",
234
+ description: "Who finances whom: directory of 8,600+ UCC secured parties (lenders) ranked by " +
235
+ "filing volume, with active-lien counts and lapsing-soon exposure per lender. " +
236
+ "California + Colorado coverage (CO refreshed daily). No API key required.",
237
+ inputSchema: {
238
+ type: "object",
239
+ properties: {
240
+ q: { type: "string", description: "Lender name search (e.g. 'Wells Fargo')" },
241
+ page: { type: "number", description: "Page (50/page). Default: 1" },
242
+ },
243
+ },
244
+ },
245
+ {
246
+ name: "get_money_in_motion",
247
+ description: "Companies with an executive-move announcement in the last 180 days AND a verified " +
248
+ "funding round in the last 24 months — the wealth advisor's 'money in motion' moment: " +
249
+ "a new comp package (often equity), an old 401(k) to roll over, benefits about to be " +
250
+ "re-evaluated. Score-ranked, refreshed daily. For RIAs, wealth managers, retirement-plan " +
251
+ "advisors, executive-benefits sellers. No API key required.",
252
+ inputSchema: {
253
+ type: "object",
254
+ properties: {
255
+ q: { type: "string", description: "Company name search" },
256
+ state: { type: "string", description: "2-letter US state filter (e.g. 'CA')" },
257
+ },
258
+ },
259
+ },
260
+ {
261
+ name: "get_broker_directory",
262
+ description: "Who broker-of-records whom: directory of 65,000+ benefits brokers from DOL Form 5500 " +
263
+ "Schedule A Part 1, ranked by filings carried, with sponsor counts and commission " +
264
+ "volume per broker. For carriers, broker M&A, benefits-tech sellers, and brokers " +
265
+ "scouting competitors. No API key required.",
266
+ inputSchema: {
267
+ type: "object",
268
+ properties: {
269
+ q: { type: "string", description: "Broker name search (e.g. 'Lockton')" },
270
+ state: { type: "string", description: "2-letter US state filter" },
271
+ page: { type: "number", description: "Page (50/page). Default: 1" },
272
+ },
273
+ },
274
+ },
140
275
  ],
141
276
  }));
142
277
  // ─── Handle Tool Calls ──────────────────────────────────────────────────
@@ -272,6 +407,78 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
272
407
  (data.last_api_call ? `Last API Call: ${data.last_api_call}` : "");
273
408
  return textResult(text);
274
409
  }
410
+ case "get_funded_and_hiring": {
411
+ const data = await publicRequest("/funded_hiring", { q: args.q, state: args.state });
412
+ return textResult(formatSectionFeed("Funded & Hiring Now", data.funded_hiring || [], data.summary, !!data.meta?.free_tier_limited, "https://app.fundz.net/funded-and-hiring", (r) => {
413
+ const f = r.latest_funding || {};
414
+ const bits = [
415
+ f.series ? `${f.series} (${f.event_date})` : `Funded ${f.event_date || ""}`,
416
+ r.open_postings_90d ? `${r.open_postings_90d} open roles` : null,
417
+ r.exec_hires_90d ? `${r.exec_hires_90d} exec hires` : null,
418
+ ].filter(Boolean);
419
+ return bits.join(" · ");
420
+ }));
421
+ }
422
+ case "get_refinancing_windows": {
423
+ const data = await publicRequest("/renewal_radar", { q: args.q, state: args.state });
424
+ return textResult(formatSectionFeed("Renewal Radar (UCC refinancing windows)", data.renewal_radar || [], data.summary, !!data.meta?.free_tier_limited, "https://app.fundz.net/lender-intelligence", (r) => [
425
+ r.soonest_lapse_date ? `Lien lapses ${r.soonest_lapse_date}` : null,
426
+ r.top_lender ? `incumbent: ${r.top_lender}` : null,
427
+ r.active_liens ? `${r.active_liens} active liens` : null,
428
+ r.lender_count > 1 ? `${r.lender_count} lenders` : null,
429
+ ].filter(Boolean).join(" · ")));
430
+ }
431
+ case "get_stacked_borrowers": {
432
+ const data = await publicRequest("/stacked_borrowers", { q: args.q, state: args.state });
433
+ return textResult(formatSectionFeed("Stacked Borrowers", data.stacked_borrowers || [], data.summary, !!data.meta?.free_tier_limited, "https://app.fundz.net/lender-intelligence", (r) => [
434
+ r.lender_count ? `${r.lender_count} distinct lenders` : null,
435
+ r.active_liens ? `${r.active_liens} active liens` : null,
436
+ r.latest_lender ? `latest: ${r.latest_lender} (${r.latest_filing_date})` : null,
437
+ r.soonest_lapse_date ? `soonest lapse ${r.soonest_lapse_date}` : null,
438
+ ].filter(Boolean).join(" · ")));
439
+ }
440
+ case "get_benefit_plans_in_play": {
441
+ const data = await publicRequest("/benefit_plans", { q: args.q, state: args.state });
442
+ return textResult(formatSectionFeed("Benefit Plans in Play", data.benefit_plans || [], data.summary, !!data.meta?.free_tier_limited, "https://app.fundz.net/benefits-intelligence", (r) => [
443
+ r.next_renewal_on ? `plan renewal ${r.next_renewal_on}` : null,
444
+ r.top_carrier ? `incumbent: ${r.top_carrier}` : null,
445
+ r.participant_count ? `${r.participant_count} plan participants` : null,
446
+ r.employees ? `~${r.employees} employees now` : null,
447
+ r.latest_funding?.event_date ? `funded ${r.latest_funding.event_date}` : null,
448
+ ].filter(Boolean).join(" · ")));
449
+ }
450
+ case "get_lender_directory": {
451
+ const data = await publicRequest("/lenders", { q: args.q, page: args.page });
452
+ const lenders = data.lenders || [];
453
+ if (!lenders.length)
454
+ return textResult("No lenders match that search.");
455
+ const lines = lenders.slice(0, 25).map((l, i) => `${i + 1}. **${l.name}** — ${l.filings} filings (${l.active_filings} active, ${l.lapsing_12mo} lapsing ≤12mo)` +
456
+ (l.latest_filing_date ? ` · latest ${l.latest_filing_date}` : ""));
457
+ return textResult(`Lender Directory — ${data.meta.total_count} secured parties (${data.meta.coverage}):\n\n${lines.join("\n")}\n\n` +
458
+ `Borrower lists per lender live in the Fundz app: https://app.fundz.net/lender-intelligence`);
459
+ }
460
+ case "get_money_in_motion": {
461
+ const data = await publicRequest("/money_in_motion", { q: args.q, state: args.state });
462
+ return textResult(formatSectionFeed("Money in Motion", data.money_in_motion || [], data.summary, !!data.meta?.free_tier_limited, "https://app.fundz.net/benefits-intelligence", (r) => [
463
+ r.latest_move_headline ? `${r.latest_move_headline} (${r.latest_move_on})` : null,
464
+ r.latest_funding?.event_date ? `funded ${r.latest_funding.event_date}` : null,
465
+ r.move_count_180d > 1 ? `${r.move_count_180d} exec moves ≤180d` : null,
466
+ r.has_pension_plan ? "retirement plan on record" : null,
467
+ ].filter(Boolean).join(" · ")));
468
+ }
469
+ case "get_broker_directory": {
470
+ const data = await publicRequest("/brokers", { q: args.q, state: args.state, page: args.page });
471
+ const brokers = data.brokers || [];
472
+ if (!brokers.length)
473
+ return textResult("No brokers match that search.");
474
+ const fmtUsd = (n) => (n >= 1_000_000 ? `$${(n / 1_000_000).toFixed(1)}M` : `$${Math.round(n / 1000)}K`);
475
+ const lines = brokers.slice(0, 25).map((b, i) => `${i + 1}. **${b.name}**${b.city ? ` (${b.city}, ${b.state})` : ""} — ${b.filings} filings, ` +
476
+ `${b.sponsors} sponsors` +
477
+ (b.commission_usd ? ` · ${fmtUsd(b.commission_usd)} commissions` : "") +
478
+ (b.latest_form_year ? ` · thru ${b.latest_form_year}` : ""));
479
+ return textResult(`Broker Directory — ${data.meta.total_count} brokers of record (${data.meta.coverage}):\n\n${lines.join("\n")}\n\n` +
480
+ `Client lists per broker live in the Fundz app: https://app.fundz.net/benefits-intelligence`);
481
+ }
275
482
  default:
276
483
  return textResult(`Unknown tool: ${name}`);
277
484
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/glama.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://glama.ai/mcp/schemas/server.json",
3
+ "maintainers": [
4
+ "persaples"
5
+ ]
6
+ }
package/manifest.json ADDED
@@ -0,0 +1,313 @@
1
+ {
2
+ "manifest_version": "0.2",
3
+ "name": "fundzwatch-mcp",
4
+ "display_name": "FundzWatch",
5
+ "version": "1.2.1",
6
+ "description": "Real-time business event intelligence for AI agents \u2014 AI-scored leads, funding events, refinancing windows (UCC), stacked borrowers, benefit-plan renewals, and watchlists from FundzWatch.ai",
7
+ "long_description": "FundzWatch gives AI agents real-time access to verified business events: funding rounds, executive moves, acquisitions, and AI-scored leads matched to your ideal customer profile. NEW: five no-key-required answer sections \u2014 Funded & Hiring Now, UCC Refinancing Windows (Renewal Radar), Stacked Borrowers, Benefit Plans in Play (Form 5500), and a who-finances-whom Lender Directory \u2014 cross-dataset cohorts no single-source lookup can reproduce, re-scored daily. Manage watchlists and pull daily market briefs. Get a free API key (no credit card) at https://fundzwatch.ai/onboarding.",
8
+ "author": {
9
+ "name": "Fundz Inc.",
10
+ "email": "john@fundz.net",
11
+ "url": "https://fundzwatch.ai"
12
+ },
13
+ "homepage": "https://fundzwatch.ai",
14
+ "documentation": "https://fundzwatch.ai/docs",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/Fund-z/fundzwatch-mcp"
18
+ },
19
+ "license": "MIT",
20
+ "keywords": [
21
+ "business-events",
22
+ "funding",
23
+ "lead-generation",
24
+ "sales-intelligence",
25
+ "market-intelligence"
26
+ ],
27
+ "server": {
28
+ "type": "node",
29
+ "entry_point": "dist/index.js",
30
+ "mcp_config": {
31
+ "command": "node",
32
+ "args": [
33
+ "${__dirname}/dist/index.js"
34
+ ],
35
+ "env": {
36
+ "FUNDZWATCH_API_KEY": "${user_config.api_key}"
37
+ }
38
+ }
39
+ },
40
+ "user_config": {
41
+ "api_key": {
42
+ "type": "string",
43
+ "title": "FundzWatch API Key",
44
+ "description": "Your FundzWatch API key. Get a free key (no credit card) at https://fundzwatch.ai/onboarding",
45
+ "sensitive": true,
46
+ "required": true
47
+ }
48
+ },
49
+ "tools": [
50
+ {
51
+ "name": "get_scored_leads",
52
+ "description": "AI-scored sales leads based on your ICP with buyer intent, buying stage, and recommended outreach strategy",
53
+ "inputSchema": {
54
+ "type": "object",
55
+ "properties": {
56
+ "min_score": {
57
+ "type": "number",
58
+ "description": "Minimum buyer intent score (0-100). Default: 0"
59
+ },
60
+ "max_results": {
61
+ "type": "number",
62
+ "description": "Max leads to return (1-50). Default: 25"
63
+ },
64
+ "buying_stages": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "string"
68
+ },
69
+ "description": "Filter by buying stage: 'Active Evaluation', 'Decision', 'Research', 'Awareness'"
70
+ },
71
+ "industries": {
72
+ "type": "array",
73
+ "items": {
74
+ "type": "string"
75
+ },
76
+ "description": "Filter by industry (e.g., ['SaaS', 'HealthTech', 'FinTech'])"
77
+ }
78
+ }
79
+ }
80
+ },
81
+ {
82
+ "name": "get_events",
83
+ "description": "Real-time business events: funding rounds, acquisitions, executive hires, government contracts, product launches",
84
+ "inputSchema": {
85
+ "type": "object",
86
+ "properties": {
87
+ "types": {
88
+ "type": "string",
89
+ "description": "Comma-separated: funding, acquisition, hiring, contract, product_launch. Default: all"
90
+ },
91
+ "days": {
92
+ "type": "number",
93
+ "description": "Look back days (1-90). Default: 7"
94
+ },
95
+ "limit": {
96
+ "type": "number",
97
+ "description": "Max events (1-200). Default: 50"
98
+ },
99
+ "industries": {
100
+ "type": "string",
101
+ "description": "Comma-separated industries"
102
+ },
103
+ "locations": {
104
+ "type": "string",
105
+ "description": "Comma-separated locations"
106
+ }
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "name": "get_market_pulse",
112
+ "description": "Real-time market activity overview: funding totals, acquisitions, exec moves for the past 7 and 30 days",
113
+ "inputSchema": {
114
+ "type": "object",
115
+ "properties": {}
116
+ }
117
+ },
118
+ {
119
+ "name": "get_market_brief",
120
+ "description": "Today's AI-generated strategic intelligence brief on market movements, patterns, and opportunities",
121
+ "inputSchema": {
122
+ "type": "object",
123
+ "properties": {}
124
+ }
125
+ },
126
+ {
127
+ "name": "manage_watchlist",
128
+ "description": "Add, remove, or list companies on your watchlist; tracked companies generate alerts on new events",
129
+ "inputSchema": {
130
+ "type": "object",
131
+ "properties": {
132
+ "action": {
133
+ "type": "string",
134
+ "enum": [
135
+ "list",
136
+ "add",
137
+ "remove"
138
+ ],
139
+ "description": "Action: 'list' to view, 'add' to track, 'remove' to untrack"
140
+ },
141
+ "domains": {
142
+ "type": "array",
143
+ "items": {
144
+ "type": "string"
145
+ },
146
+ "description": "Company domains for add/remove (e.g., ['stripe.com', 'github.com'])"
147
+ }
148
+ },
149
+ "required": [
150
+ "action"
151
+ ]
152
+ }
153
+ },
154
+ {
155
+ "name": "get_watchlist_events",
156
+ "description": "Recent events for companies on your watchlist: funding, acquisitions, exec hires, contracts",
157
+ "inputSchema": {
158
+ "type": "object",
159
+ "properties": {
160
+ "days": {
161
+ "type": "number",
162
+ "description": "Look back days (1-90). Default: 7"
163
+ },
164
+ "types": {
165
+ "type": "string",
166
+ "description": "Comma-separated event types"
167
+ }
168
+ }
169
+ }
170
+ },
171
+ {
172
+ "name": "get_usage",
173
+ "description": "Check your FundzWatch API usage: calls made, limits, current tier",
174
+ "inputSchema": {
175
+ "type": "object",
176
+ "properties": {}
177
+ }
178
+ },
179
+ {
180
+ "name": "get_funded_and_hiring",
181
+ "description": "Companies funded in the last 12 months AND actively hiring (open roles, exec hires, hiring signals) \u2014 score-ranked daily. No API key required.",
182
+ "inputSchema": {
183
+ "type": "object",
184
+ "properties": {
185
+ "q": {
186
+ "type": "string",
187
+ "description": "Company name search"
188
+ },
189
+ "state": {
190
+ "type": "string",
191
+ "description": "2-letter US state filter (e.g. 'CA')"
192
+ }
193
+ }
194
+ }
195
+ },
196
+ {
197
+ "name": "get_refinancing_windows",
198
+ "description": "Companies whose active UCC-1 liens lapse within 12 months \u2014 each approaching lapse is a refinancing window with a date on it. For lenders, MCA/ISO, equipment finance. No API key required.",
199
+ "inputSchema": {
200
+ "type": "object",
201
+ "properties": {
202
+ "q": {
203
+ "type": "string",
204
+ "description": "Company name search"
205
+ },
206
+ "state": {
207
+ "type": "string",
208
+ "description": "2-letter US state filter (e.g. 'CA')"
209
+ }
210
+ }
211
+ }
212
+ },
213
+ {
214
+ "name": "get_stacked_borrowers",
215
+ "description": "Companies with active secured debt from 2+ distinct lenders (UCC) \u2014 second-position and consolidation targets. No API key required.",
216
+ "inputSchema": {
217
+ "type": "object",
218
+ "properties": {
219
+ "q": {
220
+ "type": "string",
221
+ "description": "Company name search"
222
+ },
223
+ "state": {
224
+ "type": "string",
225
+ "description": "2-letter US state filter (e.g. 'CA')"
226
+ }
227
+ }
228
+ }
229
+ },
230
+ {
231
+ "name": "get_benefit_plans_in_play",
232
+ "description": "Recently funded companies with a Form 5500 benefit plan on record \u2014 renewal timing, headcount-vs-plan gap, incumbent carrier. No API key required.",
233
+ "inputSchema": {
234
+ "type": "object",
235
+ "properties": {
236
+ "q": {
237
+ "type": "string",
238
+ "description": "Company name search"
239
+ },
240
+ "state": {
241
+ "type": "string",
242
+ "description": "2-letter US state filter (e.g. 'CA')"
243
+ }
244
+ }
245
+ }
246
+ },
247
+ {
248
+ "name": "get_lender_directory",
249
+ "description": "Directory of 8,600+ UCC secured parties ranked by filing volume, with lapsing-soon exposure per lender. No API key required.",
250
+ "inputSchema": {
251
+ "type": "object",
252
+ "properties": {
253
+ "q": {
254
+ "type": "string",
255
+ "description": "Lender name search"
256
+ },
257
+ "page": {
258
+ "type": "number",
259
+ "description": "Page (50/page)"
260
+ }
261
+ }
262
+ }
263
+ },
264
+ {
265
+ "name": "get_money_in_motion",
266
+ "description": "Companies with an executive-move announcement in the last 180 days AND a verified funding round in the last 24 months \u2014 the wealth advisor's 'money in motion' moment: a new comp package (often equity), an old 401(k) to roll over, benefits about to be re-evaluated. Score-ranked, refreshed daily. For RIAs, wealth managers, retirement-plan advisors, executive-benefits sellers. No API key required.",
267
+ "inputSchema": {
268
+ "type": "object",
269
+ "properties": {
270
+ "q": {
271
+ "type": "string",
272
+ "description": "Company name search"
273
+ },
274
+ "state": {
275
+ "type": "string",
276
+ "description": "2-letter US state filter (e.g. 'CA')"
277
+ }
278
+ }
279
+ }
280
+ },
281
+ {
282
+ "name": "get_broker_directory",
283
+ "description": "Who broker-of-records whom: directory of 65,000+ benefits brokers from DOL Form 5500 Schedule A Part 1, ranked by filings carried, with sponsor counts and commission volume per broker. For carriers, broker M&A, benefits-tech sellers, and brokers scouting competitors. No API key required.",
284
+ "inputSchema": {
285
+ "type": "object",
286
+ "properties": {
287
+ "q": {
288
+ "type": "string",
289
+ "description": "Broker name search (e.g. 'Lockton')"
290
+ },
291
+ "state": {
292
+ "type": "string",
293
+ "description": "2-letter US state filter"
294
+ },
295
+ "page": {
296
+ "type": "number",
297
+ "description": "Page (50/page). Default: 1"
298
+ }
299
+ }
300
+ }
301
+ }
302
+ ],
303
+ "compatibility": {
304
+ "platforms": [
305
+ "darwin",
306
+ "linux",
307
+ "win32"
308
+ ],
309
+ "runtimes": {
310
+ "node": ">=18"
311
+ }
312
+ }
313
+ }
package/package.json CHANGED
@@ -1,11 +1,21 @@
1
1
  {
2
2
  "name": "@fundzwatch/mcp-server",
3
- "version": "1.0.2",
4
- "description": "MCP server for FundzWatch.ai — Real-time business event intelligence for AI agents",
3
+ "version": "1.2.1",
4
+ "mcpName": "io.github.fund-z/fundzwatch",
5
+ "description": "MCP server for FundzWatch.ai \u2014 real-time business-event intelligence for AI agents: 14 tools (7 key-less) covering AI-scored leads, funding & exec moves, UCC refinancing windows, and Form 5500 benefit-plan signals",
5
6
  "main": "dist/index.js",
6
7
  "bin": {
7
8
  "fundzwatch-mcp": "./dist/index.js"
8
9
  },
10
+ "files": [
11
+ "dist",
12
+ "manifest.json",
13
+ "server.json",
14
+ "smithery.yaml",
15
+ "glama.json",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
9
19
  "scripts": {
10
20
  "build": "tsc && node -e \"const fs=require('fs');const f='dist/index.js';const c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!')){fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c);}\" && chmod +x dist/index.js",
11
21
  "dev": "ts-node src/index.ts",
@@ -25,7 +35,11 @@
25
35
  "license": "MIT",
26
36
  "repository": {
27
37
  "type": "git",
28
- "url": "https://github.com/fundz/fundzwatch-mcp"
38
+ "url": "https://github.com/Fund-z/fundzwatch-mcp"
39
+ },
40
+ "homepage": "https://fundzwatch.ai",
41
+ "bugs": {
42
+ "url": "https://github.com/Fund-z/fundzwatch-mcp/issues"
29
43
  },
30
44
  "dependencies": {
31
45
  "@modelcontextprotocol/sdk": "^1.12.0",
@@ -39,4 +53,4 @@
39
53
  "engines": {
40
54
  "node": ">=18.0.0"
41
55
  }
42
- }
56
+ }
package/server.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.fund-z/fundzwatch",
4
+ "description": "Real-time business-event intelligence for AI agents: AI-scored leads, funding & exec moves, UCC refinancing windows, and Form 5500 benefit-plan signals. 7 tools need no key.",
5
+ "version": "1.2.1",
6
+ "repository": {
7
+ "url": "https://github.com/Fund-z/fundzwatch-mcp",
8
+ "source": "github"
9
+ },
10
+ "websiteUrl": "https://fundzwatch.ai",
11
+ "packages": [
12
+ {
13
+ "registryType": "npm",
14
+ "registryBaseUrl": "https://registry.npmjs.org",
15
+ "identifier": "@fundzwatch/mcp-server",
16
+ "version": "1.2.1",
17
+ "transport": {
18
+ "type": "stdio"
19
+ },
20
+ "environmentVariables": [
21
+ {
22
+ "name": "FUNDZWATCH_API_KEY",
23
+ "description": "FundzWatch API key (optional — 7 tools work without it). Free key at https://fundzwatch.ai/onboarding",
24
+ "isRequired": false,
25
+ "isSecret": true
26
+ }
27
+ ]
28
+ }
29
+ ]
30
+ }
package/smithery.yaml ADDED
@@ -0,0 +1,23 @@
1
+ # Smithery configuration — lets smithery.ai index, configure, and launch this
2
+ # MCP server. https://smithery.ai/docs/build/project-config
3
+ startCommand:
4
+ type: stdio
5
+ configSchema:
6
+ type: object
7
+ required:
8
+ - fundzwatchApiKey
9
+ properties:
10
+ fundzwatchApiKey:
11
+ type: string
12
+ title: FundzWatch API Key
13
+ description: >-
14
+ Your FundzWatch API key. Get a free key (no credit card) at
15
+ https://fundzwatch.ai/onboarding
16
+ commandFunction: |-
17
+ (config) => ({
18
+ command: 'npx',
19
+ args: ['-y', '@fundzwatch/mcp-server'],
20
+ env: { FUNDZWATCH_API_KEY: config.fundzwatchApiKey }
21
+ })
22
+ exampleConfig:
23
+ fundzwatchApiKey: fundz_test_your_key_here
package/src/index.ts DELETED
@@ -1,342 +0,0 @@
1
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import {
4
- CallToolRequestSchema,
5
- ListToolsRequestSchema,
6
- } from "@modelcontextprotocol/sdk/types.js";
7
-
8
- const API_BASE = "https://api.fundz.net/v1/watch";
9
-
10
- function getApiKey(): string {
11
- const key = process.env.FUNDZWATCH_API_KEY;
12
- if (!key) {
13
- throw new Error(
14
- "FUNDZWATCH_API_KEY environment variable is required. " +
15
- "Get a free key at https://fundzwatch.ai/onboarding"
16
- );
17
- }
18
- return key;
19
- }
20
-
21
- async function apiRequest(
22
- method: string,
23
- path: string,
24
- params?: Record<string, any>
25
- ): Promise<any> {
26
- const apiKey = getApiKey();
27
- const url = new URL(`${API_BASE}${path}`);
28
-
29
- const options: RequestInit = {
30
- method,
31
- headers: {
32
- Authorization: `Bearer ${apiKey}`,
33
- "Content-Type": "application/json",
34
- "User-Agent": "fundzwatch-mcp/1.0.1",
35
- },
36
- };
37
-
38
- if (method === "GET" && params) {
39
- Object.entries(params).forEach(([key, value]) => {
40
- if (value !== undefined && value !== null) {
41
- url.searchParams.append(key, String(value));
42
- }
43
- });
44
- } else if (method !== "GET" && params) {
45
- options.body = JSON.stringify(params);
46
- }
47
-
48
- const response = await fetch(url.toString(), options);
49
-
50
- if (!response.ok) {
51
- const errBody: any = await response.json().catch(() => ({ message: response.statusText }));
52
- throw new Error(`API error ${response.status}: ${errBody.message || errBody.error || response.statusText}`);
53
- }
54
-
55
- return response.json();
56
- }
57
-
58
- function textResult(text: string) {
59
- return { content: [{ type: "text" as const, text }] };
60
- }
61
-
62
- // ─── Server Setup ───────────────────────────────────────────────────────
63
-
64
- const server = new Server(
65
- { name: "fundzwatch", version: "1.0.1" },
66
- { capabilities: { tools: {} } }
67
- );
68
-
69
- // ─── List Tools ─────────────────────────────────────────────────────────
70
-
71
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
72
- tools: [
73
- {
74
- name: "get_scored_leads",
75
- description:
76
- "Get AI-scored sales leads based on your ICP (Ideal Customer Profile). " +
77
- "Returns companies with recent business events scored by AI for buyer intent, " +
78
- "buying stage, and recommended outreach strategy.",
79
- inputSchema: {
80
- type: "object" as const,
81
- properties: {
82
- min_score: { type: "number", description: "Minimum buyer intent score (0-100). Default: 0" },
83
- max_results: { type: "number", description: "Max leads to return (1-50). Default: 25" },
84
- buying_stages: {
85
- type: "array",
86
- items: { type: "string" },
87
- description: "Filter by buying stage: 'Active Evaluation', 'Decision', 'Research', 'Awareness'",
88
- },
89
- industries: {
90
- type: "array",
91
- items: { type: "string" },
92
- description: "Filter by industry (e.g., ['SaaS', 'HealthTech', 'FinTech'])",
93
- },
94
- },
95
- },
96
- },
97
- {
98
- name: "get_events",
99
- description:
100
- "Get real-time business events: funding rounds, acquisitions, executive hires, " +
101
- "government contracts, and product launches. Filter by type, industry, and location.",
102
- inputSchema: {
103
- type: "object" as const,
104
- properties: {
105
- types: { type: "string", description: "Comma-separated: funding, acquisition, hiring, contract, product_launch. Default: all" },
106
- days: { type: "number", description: "Look back days (1-90). Default: 7" },
107
- limit: { type: "number", description: "Max events (1-200). Default: 50" },
108
- industries: { type: "string", description: "Comma-separated industries" },
109
- locations: { type: "string", description: "Comma-separated locations" },
110
- },
111
- },
112
- },
113
- {
114
- name: "get_market_pulse",
115
- description:
116
- "Get real-time market activity overview: funding totals, acquisition counts, " +
117
- "executive moves, contracts, and product launches for the past 7 and 30 days.",
118
- inputSchema: { type: "object" as const, properties: {} },
119
- },
120
- {
121
- name: "get_market_brief",
122
- description:
123
- "Get today's AI-generated strategic intelligence brief with narrative analysis " +
124
- "of the most important market movements, patterns, and opportunities.",
125
- inputSchema: { type: "object" as const, properties: {} },
126
- },
127
- {
128
- name: "manage_watchlist",
129
- description:
130
- "Add, remove, or list companies on your watchlist. Tracked companies generate " +
131
- "alerts when they have new events.",
132
- inputSchema: {
133
- type: "object" as const,
134
- properties: {
135
- action: {
136
- type: "string",
137
- enum: ["list", "add", "remove"],
138
- description: "Action: 'list' to view, 'add' to track, 'remove' to untrack",
139
- },
140
- domains: {
141
- type: "array",
142
- items: { type: "string" },
143
- description: "Company domains for add/remove (e.g., ['stripe.com', 'github.com'])",
144
- },
145
- },
146
- required: ["action"],
147
- },
148
- },
149
- {
150
- name: "get_watchlist_events",
151
- description:
152
- "Get recent events for companies on your watchlist: funding, acquisitions, " +
153
- "executive hires, contracts.",
154
- inputSchema: {
155
- type: "object" as const,
156
- properties: {
157
- days: { type: "number", description: "Look back days (1-90). Default: 7" },
158
- types: { type: "string", description: "Comma-separated event types" },
159
- },
160
- },
161
- },
162
- {
163
- name: "get_usage",
164
- description: "Check your FundzWatch API usage: calls made, limits, current tier.",
165
- inputSchema: { type: "object" as const, properties: {} },
166
- },
167
- ],
168
- }));
169
-
170
- // ─── Handle Tool Calls ──────────────────────────────────────────────────
171
-
172
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
173
- const { name, arguments: args = {} } = request.params;
174
-
175
- try {
176
- switch (name) {
177
- case "get_scored_leads": {
178
- const data = await apiRequest("POST", "/signals", {
179
- min_score: (args as any).min_score ?? 0,
180
- max_results: (args as any).max_results ?? 25,
181
- buying_stages: (args as any).buying_stages,
182
- industries: (args as any).industries,
183
- });
184
- const leads = data.signals || [];
185
- if (leads.length === 0) {
186
- return textResult("No scored leads found for your current ICP. Leads are generated daily by the AI scoring engine.");
187
- }
188
- const summary = leads
189
- .map(
190
- (lead: any, i: number) =>
191
- `${i + 1}. **${lead.company_name}** (Score: ${lead.score}/100)\n` +
192
- ` Stage: ${lead.buying_stage} | Priority: ${lead.priority}\n` +
193
- ` Pain Point: ${lead.pain_point}\n` +
194
- ` Outreach: ${lead.outreach_angle}\n` +
195
- ` Action: ${lead.recommended_action}\n` +
196
- (lead.domain ? ` Domain: ${lead.domain}\n` : "") +
197
- (lead.industries?.length ? ` Industries: ${lead.industries.join(", ")}\n` : "")
198
- )
199
- .join("\n");
200
- return textResult(`Found ${data.signals_found} scored leads (showing ${leads.length}):\n\n${summary}`);
201
- }
202
-
203
- case "get_events": {
204
- const data = await apiRequest("GET", "/events", {
205
- types: (args as any).types,
206
- days: (args as any).days,
207
- limit: (args as any).limit,
208
- industries: (args as any).industries,
209
- locations: (args as any).locations,
210
- });
211
- const events = data.events || [];
212
- if (events.length === 0) {
213
- return textResult("No events found matching your filters.");
214
- }
215
- const summary = events
216
- .map((e: any, i: number) => {
217
- let detail = `${i + 1}. [${e.type.toUpperCase()}] ${e.title}`;
218
- if (e.amount) detail += ` ($${(e.amount / 1_000_000).toFixed(1)}M)`;
219
- if (e.series) detail += ` - ${e.series}`;
220
- if (e.date) detail += ` | ${e.date}`;
221
- return detail;
222
- })
223
- .join("\n");
224
- return textResult(`${data.total} events found (showing ${events.length}):\n\n${summary}`);
225
- }
226
-
227
- case "get_market_pulse": {
228
- const data = await apiRequest("GET", "/market/pulse");
229
- const p = data.pulse;
230
- const text =
231
- `Market Pulse (as of ${p.generated_at}):\n\n` +
232
- `Funding: ${p.funding.count_7d} rounds this week (${p.funding.count_30d} this month), ` +
233
- `$${(p.funding.total_raised_7d / 1_000_000).toFixed(0)}M raised this week\n` +
234
- `Acquisitions: ${p.acquisitions.count_7d} this week (${p.acquisitions.count_30d} this month)\n` +
235
- `Executive Moves: ${p.executive_moves.count_7d} this week (${p.executive_moves.count_30d} this month)\n` +
236
- `Contracts: ${p.contracts.count_7d} this week (${p.contracts.count_30d} this month)\n` +
237
- `Product Launches: ${p.product_launches.count_7d} this week (${p.product_launches.count_30d} this month)\n\n` +
238
- `Largest Rounds This Week:\n` +
239
- (p.funding.largest_round || [])
240
- .map((r: any, i: number) => ` ${i + 1}. ${r.title} - $${(r.amount / 1_000_000).toFixed(1)}M`)
241
- .join("\n");
242
- return textResult(text);
243
- }
244
-
245
- case "get_market_brief": {
246
- const data = await apiRequest("GET", "/market/brief");
247
- const brief = data.brief;
248
- return textResult(
249
- `Strategic Intelligence Brief (${brief.date}):\n\n${brief.text}\n\n` +
250
- `Companies mentioned: ${(brief.companies || []).join(", ")}`
251
- );
252
- }
253
-
254
- case "manage_watchlist": {
255
- const action = (args as any).action;
256
- const domains = (args as any).domains;
257
-
258
- if (action === "list") {
259
- const data = await apiRequest("GET", "/watchlist");
260
- const companies = data.companies || [];
261
- if (companies.length === 0) {
262
- return textResult("Your watchlist is empty. Add companies with the 'add' action.");
263
- }
264
- const list = companies
265
- .map((c: any) => `- ${c.name || c.domain} (${c.domain})${c.matched ? "" : " [pending match]"}`)
266
- .join("\n");
267
- return textResult(`Watchlist (${data.total}/${data.limit} slots used):\n\n${list}`);
268
- }
269
-
270
- if (!domains || domains.length === 0) {
271
- return textResult("Please provide domains to add or remove.");
272
- }
273
-
274
- if (action === "add") {
275
- const data = await apiRequest("POST", "/watchlist", { domains });
276
- return textResult(
277
- `Added ${data.added} companies. Already tracked: ${data.already_tracked}. ` +
278
- `Not found: ${data.not_found}. Total tracked: ${data.total_tracked}.`
279
- );
280
- }
281
-
282
- if (action === "remove") {
283
- const data = await apiRequest("DELETE", "/watchlist", { domains });
284
- return textResult(`Removed ${data.removed} companies. Total tracked: ${data.total_tracked}.`);
285
- }
286
-
287
- return textResult("Invalid action. Use 'list', 'add', or 'remove'.");
288
- }
289
-
290
- case "get_watchlist_events": {
291
- const data = await apiRequest("GET", "/watchlist/events", {
292
- days: (args as any).days,
293
- types: (args as any).types,
294
- });
295
- const events = data.events || [];
296
- if (events.length === 0) {
297
- return textResult(
298
- `No events found for your ${data.tracked_companies} tracked companies in the last ${data.period_days} days.`
299
- );
300
- }
301
- const summary = events
302
- .map((e: any, i: number) => {
303
- let detail = `${i + 1}. [${e.type.toUpperCase()}] ${e.company_name}: ${e.title}`;
304
- if (e.amount) detail += ` ($${(e.amount / 1_000_000).toFixed(1)}M)`;
305
- if (e.date) detail += ` | ${e.date}`;
306
- return detail;
307
- })
308
- .join("\n");
309
- return textResult(`${data.total} events for ${data.tracked_companies} tracked companies:\n\n${summary}`);
310
- }
311
-
312
- case "get_usage": {
313
- const data = await apiRequest("GET", "/usage");
314
- const text =
315
- `FundzWatch Usage (${data.current_period}):\n\n` +
316
- `Tier: ${data.tier}\n` +
317
- `API Calls: ${data.api_calls_used} / ${data.limits.api_calls_monthly}\n` +
318
- `AI Score Calls: ${data.ai_score_calls_used} / ${data.limits.ai_score_calls_monthly}\n` +
319
- (data.last_api_call ? `Last API Call: ${data.last_api_call}` : "");
320
- return textResult(text);
321
- }
322
-
323
- default:
324
- return textResult(`Unknown tool: ${name}`);
325
- }
326
- } catch (err: any) {
327
- return textResult(`Error: ${err.message}`);
328
- }
329
- });
330
-
331
- // ─── Start Server ───────────────────────────────────────────────────────
332
-
333
- async function main() {
334
- const transport = new StdioServerTransport();
335
- await server.connect(transport);
336
- console.error("FundzWatch MCP server running on stdio");
337
- }
338
-
339
- main().catch((error) => {
340
- console.error("Fatal error:", error);
341
- process.exit(1);
342
- });
package/tsconfig.json DELETED
@@ -1,19 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "commonjs",
5
- "lib": ["ES2022"],
6
- "outDir": "./dist",
7
- "rootDir": "./src",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- "declaration": true,
14
- "declarationMap": true,
15
- "sourceMap": true
16
- },
17
- "include": ["src/**/*"],
18
- "exclude": ["node_modules", "dist"]
19
- }