prospectapis-mcp 0.2.5 → 0.3.0

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/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ All notable changes to `prospectapis-mcp` are documented here. The format follow
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2026-10-25
10
+
11
+ ### Added
12
+
13
+ - `email_verify` (`POST /v1/email/verify`): check 1 to 25 email addresses for deliverability. Each result carries `status` (valid, invalid, catch-all or unknown), `reason`, `charged`, `flags`, `smtp_code` and `catch_all_tier`. A valid or invalid result costs $0.004; catch-all and unknown results are free. When the balance covers only some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free. Fifteen tools.
14
+
15
+ ### Changed
16
+
17
+ - Pricing: every account starts with a free $1 balance (no card, no monthly reset) that each paid call draws from at its own price. The 100 free funding records a month are gone, so tool descriptions, the server instructions, the playbooks and the README no longer promise them. Watchlist deliveries cost $0.02 per delivered record from the balance.
18
+ - `pricing_get` and `account_balance` descriptions name the new fields (the signup balance, the email verification price and which statuses are charged).
19
+ - The 402 hint reads "out of credits for this call".
20
+
9
21
  ## [0.2.5] - 2026-10-20
10
22
 
11
23
  ### Added
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # prospectapis-mcp
2
2
 
3
- prospectapis-mcp is the MCP server for ProspectAPIs (https://prospectapis.com), for sales and prospecting teams and the AI agents they run in Claude Code, Claude Desktop, Cursor and other MCP clients. It gives your agent fourteen tools over the ProspectAPIs API: search funding rounds by date, round, amount, company, investor and country, get new matching rounds pushed to your webhook, and order a cited research brief on any company or person. Funding records carry the public announcement URL when there is one. Records cost $0.02 each after 100 free a month, a completed brief costs $0.15, and there are no seats, no subscription and no card to sign up. It needs Node.js 22 or later.
3
+ prospectapis-mcp is the MCP server for ProspectAPIs (https://prospectapis.com), for sales and prospecting teams and the AI agents they run in Claude Code, Claude Desktop, Cursor and other MCP clients. It gives your agent fifteen tools over the ProspectAPIs API: search funding rounds by date, round, amount, company, investor and country, get new matching rounds pushed to your webhook, verify email addresses, and order a cited research brief on any company or person. Funding records carry the public announcement URL when there is one. Every account starts with a free $1 balance and no card: records cost $0.02, an email check $0.004 and a completed brief $0.15, with no seats and no subscription. It needs Node.js 22 or later.
4
4
 
5
5
  Install (Claude Code): `claude mcp add prospectapis -e PROSPECTAPIS_API_KEY=pa_live_... -- npx -y prospectapis-mcp`
6
6
 
@@ -10,10 +10,11 @@ Website: https://prospectapis.com/mcp
10
10
 
11
11
  | Tool | Endpoint | Cost |
12
12
  |---|---|---|
13
- | `funding_search` | `GET /v1/funding` | $0.02 per record returned, after 100 free records a month; no match is free |
13
+ | `funding_search` | `GET /v1/funding` | $0.02 per record returned; no match is free |
14
14
  | `funding_get` | `GET /v1/funding/:id` | $0.02 when found; a missing id is free |
15
15
  | `research_submit` | `POST /v1/research` | one research at `research_price_usd` (see `account_balance`), charged only when the brief completes; refunded on failure |
16
16
  | `research_get` | `GET /v1/research/:id` | free; poll until `status` is `completed` or `failed` |
17
+ | `email_verify` | `POST /v1/email/verify` | $0.004 per `valid` or `invalid` result; `catch-all` and `unknown` are free; 1 to 25 addresses a call |
17
18
  | `watchlist_create`, `watchlist_list`, `watchlist_get`, `watchlist_deliveries`, `watchlist_test`, `watchlist_delete` | `/v1/watchlists` | free to manage; a delivered event costs one record, only when your webhook answers 2xx |
18
19
  | `account_balance` | `GET /v1/account` | free |
19
20
  | `feedback_send` | `POST /v1/feedback` | free; reports a bug, wrong field or missing capability to the team (10 an hour per key) |
@@ -29,6 +30,10 @@ Website: https://prospectapis.com/mcp
29
30
  `context` (your own product, at most 1,000 characters) and `purpose` (`account_research`, `pre_call` or
30
31
  `outreach`). It returns a `research_id` at once; a brief takes 20 to 90 seconds.
31
32
 
33
+ `email_verify` takes `emails`, a list of 1 to 25 addresses. Each result has `status` (`valid`, `invalid`,
34
+ `catch-all` or `unknown`), `reason`, `charged`, `flags`, `smtp_code` and `catch_all_tier`. If the balance covers only
35
+ some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits` and are not charged.
36
+
32
37
  ## Configure
33
38
 
34
39
  | Variable | Required | Default |
@@ -56,7 +61,7 @@ Claude Code: `claude mcp add prospectapis -e PROSPECTAPIS_API_KEY=pa_live_... --
56
61
 
57
62
  **Where does the funding data come from?** Records carry the public announcement URL when there is one.
58
63
 
59
- **What is free?** 100 funding records a month, any search that matches nothing, watchlist management, and the balance, pricing and version tools.
64
+ **What is free?** A $1 balance when you sign up (about 50 funding records, 250 email checks or 6 research briefs), any search that matches nothing, catch-all and unknown email results, watchlist management, and the balance, pricing and version tools.
60
65
 
61
66
  **Which clients work?** Claude Code, Claude Desktop, Cursor and any client that reads an mcpServers config, through `npx -y prospectapis-mcp`.
62
67
 
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "prospectapis-mcp",
3
- "version": "0.2.5",
3
+ "version": "0.3.0",
4
4
  "mcpName": "io.github.ProspectAPIs/prospectapis-mcp",
5
- "description": "MCP server for ProspectAPIs: search funding rounds, run paid prospect research briefs, manage funding watchlists, read your balance and the live price list.",
5
+ "description": "MCP server for ProspectAPIs: search funding rounds, verify email addresses, run paid prospect research briefs, manage funding watchlists, read your balance and the live price list.",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "prospectapis-mcp": "src/index.js"
package/src/playbooks.js CHANGED
@@ -20,8 +20,8 @@ const NEWLY_FUNDED = `# Newly funded prospects
20
20
 
21
21
  Build a short list of companies that just raised, worth reaching out to while the round is fresh.
22
22
 
23
- 1. \`account_balance\` first. Each funding record returned costs $0.02 after 100 free a month, so know what is left
24
- before you pull pages.
23
+ 1. \`account_balance\` first. Each funding record returned costs $0.02, drawn from your balance (a new account starts
24
+ with $1, about 50 records), so know what is left before you pull pages.
25
25
  2. \`funding_search\` with a tight window and the filters that describe the buyer: \`since\` (for example the last 30
26
26
  days), \`round\` (such as \`seed,series_a\`), \`country\`, and \`min_amount_usd\` or \`max_amount_usd\`. Start with
27
27
  \`limit\` 10 to 25. A search that matches nothing costs nothing, so narrow before you widen.
@@ -45,7 +45,7 @@ A cited brief on one company or person before a call or a first email.
45
45
  2. It returns \`research_id\` at once. The brief takes 20 to 90 seconds: call \`research_get\` with that id every 10 to 15
46
46
  seconds until \`status\` is \`completed\` or \`failed\`. Polling is free.
47
47
  3. A brief is charged only when it completes, at the \`research_price_usd\` that \`account_balance\` reports, and refunded
48
- in full if it fails. Free records do not apply to research.
48
+ in full if it fails.
49
49
  4. Every field in \`result\` is \`{value, sources, confidence}\`. Quote the sources with the claims you use, and say when
50
50
  a field came back empty rather than filling the gap.
51
51
  `;
package/src/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // MCP server wiring: one registered tool per catalog entry, each a single
2
- // authenticated request (a GET, or a POST with a JSON body for research_submit)
2
+ // authenticated request (a GET, or a POST with a JSON body for research_submit and email_verify)
3
3
  // against the ProspectAPIs REST API. Exported as a factory
4
4
  // (createServer) so tests inject a fake fetch and a host could inject auth.
5
5
 
@@ -15,11 +15,13 @@ export const { version: VERSION } = createRequire(import.meta.url)("../package.j
15
15
  export const DEFAULT_BASE_URL = "https://api.prospectapis.com";
16
16
  export const DEFAULT_TIMEOUT_MS = 30000;
17
17
  export const SIGNUP_URL = "https://prospectapis.com/signup?utm_source=mcp";
18
- export const TOP_UP_URL = "https://prospectapis.com/dashboard/credits?utm_source=mcp";
18
+ export const TOP_UP_URL = "https://prospectapis.com/dashboard/billing?utm_source=mcp";
19
19
 
20
20
  export const INSTRUCTIONS =
21
- "ProspectAPIs MCP server: funding rounds data and prospect research briefs. funding_search and funding_get cost $0.02 per record returned, " +
22
- "after 100 free records per calendar month; a search that matches nothing costs nothing. account_balance, pricing_get and api_version are free. " +
21
+ "ProspectAPIs MCP server: funding rounds data, email verification and prospect research briefs. Every account starts with a free $1 balance " +
22
+ "(no card, no monthly reset), and each paid call draws from it at its own price. funding_search and funding_get cost $0.02 per record returned; " +
23
+ "a search that matches nothing costs nothing. email_verify checks 1 to 25 addresses for $0.004 per valid or invalid result; catch-all and " +
24
+ "unknown results are free. account_balance, pricing_get and api_version are free. " +
23
25
  "Use filters (dates, round, amount, domain, investor, country) to keep result sets small, and call account_balance before a large paged search. " +
24
26
  "research_submit starts a cited brief on one prospect and returns a research_id; poll research_get (free) until it is completed or failed. " +
25
27
  "A research is charged only when it completes, at the research_price_usd account_balance reports. " +
@@ -28,8 +30,7 @@ export const INSTRUCTIONS =
28
30
 
29
31
  export function hintFor(status) {
30
32
  if (status === 401) return " (missing or invalid API key: set PROSPECTAPIS_API_KEY to a key from the dashboard)";
31
- // research never draws on free records, so the hint does not promise any (PR #23 review, L4)
32
- if (status === 402) return ` (not enough credit for this call; the body says what it costs: top up at ${TOP_UP_URL})`;
33
+ if (status === 402) return ` (out of credits for this call; the body says what it costs: top up at ${TOP_UP_URL})`;
33
34
  if (status === 400) return " (an argument was rejected: the body says which one)";
34
35
  if (status === 404) return " (not found: the id may be wrong, or the record is not published)";
35
36
  if (status === 429) return " (rate limited: wait a few seconds and retry)";
package/src/tools.js CHANGED
@@ -6,9 +6,9 @@
6
6
  // except `{name}` placeholders in `path`, which are interpolated into the
7
7
  // URL and removed from the query string;
8
8
  // - `body: true` sends the arguments as a JSON body instead of a query
9
- // string (research_submit, a POST);
9
+ // string (research_submit and email_verify, POSTs);
10
10
  // - `write: true` marks a tool that changes state or spends credits
11
- // (research_submit starts a paid job); the server turns `write` into MCP's
11
+ // (research_submit starts a paid job, email_verify spends credits); the server turns `write` into MCP's
12
12
  // readOnlyHint, so every other tool is read-only;
13
13
  // - `auth: false` marks the tools the API serves without a key (pricing_get, api_version);
14
14
  // - `title` is the human name a client shows instead of the raw tool name;
@@ -48,7 +48,7 @@ export const TOOLS = [
48
48
  write: false,
49
49
  format: { min_amount_usd: formatAmount, max_amount_usd: formatAmount },
50
50
  description:
51
- "Search funding rounds (venture rounds, debt, grants, IPOs), newest announcement first. Costs $0.02 per record returned, after 100 free records a month; a search that matches nothing is free. " +
51
+ "Search funding rounds (venture rounds, debt, grants, IPOs), newest announcement first. Costs $0.02 per record returned, drawn from your balance (every account starts with a free $1); a search that matches nothing is free. " +
52
52
  "Page with `cursor`: pass back `next_cursor` exactly as returned; a null `next_cursor` means there are no more matches. Narrow with filters before raising `limit`.",
53
53
  shape: {
54
54
  since: DATE.describe("Earliest announcement date, inclusive (YYYY-MM-DD)."),
@@ -73,7 +73,7 @@ export const TOOLS = [
73
73
  path: "/v1/funding/{id}",
74
74
  title: "Get Funding Round",
75
75
  write: false,
76
- description: "Read one funding record by id. Costs $0.02 when found (free records are used first); a missing id is free.",
76
+ description: "Read one funding record by id. Costs $0.02 when found; a missing id is free.",
77
77
  shape: {
78
78
  id: z.string().uuid().describe("The funding record id from a `funding_search` result."),
79
79
  },
@@ -92,7 +92,7 @@ export const TOOLS = [
92
92
  "a work email, or linkedin_url), or person_name together with company_name. Returns `research_id` at once; the brief takes 20 to 90 seconds, " +
93
93
  "so poll research_get every 10 to 15 seconds until `status` is `completed` or `failed`. " +
94
94
  "Costs one research at the price account_balance reports as `research_price_usd`, held when you submit, charged only when the brief " +
95
- "completes and refunded in full if it fails. Free records do not apply.",
95
+ "completes and refunded in full if it fails.",
96
96
  shape: {
97
97
  domain: z.string().min(3).max(253).optional().describe("The company's domain, for example `acme.com`."),
98
98
  website_url: URL_ARG.optional().describe("Any http(s) URL on the company's website."),
@@ -125,6 +125,26 @@ export const TOOLS = [
125
125
  id: z.string().uuid().describe("The `research_id` from research_submit."),
126
126
  },
127
127
  },
128
+ {
129
+ name: "email_verify",
130
+ method: "POST",
131
+ path: "/v1/email/verify",
132
+ title: "Verify Email Addresses",
133
+ write: true,
134
+ body: true,
135
+ description:
136
+ "Check whether 1 to 25 email addresses can receive mail. Each result has `status` (valid, invalid, catch-all or unknown), " +
137
+ "`reason`, `charged`, `flags`, `smtp_code` and `catch_all_tier`. Costs $0.004 per valid or invalid result, drawn from your " +
138
+ "balance; catch-all and unknown results are free (pricing_get lists which statuses are charged). When the balance covers only " +
139
+ "some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free.",
140
+ shape: {
141
+ emails: z
142
+ .array(z.string().min(3).max(254))
143
+ .min(1)
144
+ .max(25)
145
+ .describe("The addresses to check, 1 to 25 per call."),
146
+ },
147
+ },
128
148
  {
129
149
  name: "watchlist_create",
130
150
  method: "POST",
@@ -135,7 +155,7 @@ export const TOOLS = [
135
155
  description:
136
156
  "Save a funding-signal alert: a set of funding_search filters plus an https webhook. Each NEW funding event that " +
137
157
  "matches is POSTed to the webhook, signed with the returned `secret` (header Prospect-Signature: t=..,v1=HMAC-SHA256). " +
138
- "Creating is free; each delivered event costs one record ($0.02, free records first), charged only when the webhook " +
158
+ "Creating is free; each delivered event costs one record ($0.02), charged only when the webhook " +
139
159
  "answers 2xx. The `secret` is shown once. Max 20 active per account.",
140
160
  shape: {
141
161
  name: z.string().min(1).max(100).describe("A label, such as 'Series A robotics'."),
@@ -210,7 +230,7 @@ export const TOOLS = [
210
230
  title: "Get Account Balance",
211
231
  idempotent: true,
212
232
  write: false,
213
- description: "Your credit balance and the free records left this month. Free. Check it before a large paged search.",
233
+ description: "Your credit balance and the prices you pay (record, research, email verification). Free. Check it before a large paged search.",
214
234
  shape: {},
215
235
  },
216
236
  {
@@ -241,8 +261,9 @@ export const TOOLS = [
241
261
  write: false,
242
262
  auth: false,
243
263
  description:
244
- "The live price list: funding records (price per record and free records a month), research (whether it is " +
245
- "available and its price per brief) and watchlist deliveries. Free, needs no key. Use it to quote a cost before a large call.",
264
+ "The live price list: the balance a new account starts with, funding records (price per record), research (whether it is " +
265
+ "available and its price per brief), email verification (price per check, which statuses are charged and which are free) " +
266
+ "and watchlist deliveries. Free, needs no key. Use it to quote a cost before a large call.",
246
267
  shape: {},
247
268
  },
248
269
  {