prospectapis-mcp 0.3.0 → 0.4.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 +12 -0
- package/README.md +7 -2
- package/package.json +1 -1
- package/src/tools.js +155 -4
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.4.0] - 2026-10-25
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `email_verify_stats` and `email_outcomes_report`: your verification mix, and bounced or delivered reports (a charged valid you report bounced within 30 days is credited back).
|
|
14
|
+
- `email_verify_job_create`, `email_verify_job_get`, `email_verify_job_results`, `email_verify_job_stop`: bulk verification jobs of up to 50,000 addresses with free retries for slow servers, list sampling (`sample`) and list monitoring (`monitor_days`).
|
|
15
|
+
- `email_find`: a person's work address from name and domain, $0.02 only when found.
|
|
16
|
+
- `email_domain_check`: what DNS and our recent checks know about a domain, free.
|
|
17
|
+
- `email_verify_calibration`: measured bounce rate per score band, free.
|
|
18
|
+
- `email_clean_list`: sort up to 1,000 addresses into keep, review and remove with quick checks.
|
|
19
|
+
- `email_verify` takes `depth: "quick"` ($0.001 per address, no mail server contacted). Twenty-five tools.
|
|
20
|
+
|
|
9
21
|
## [0.3.0] - 2026-10-25
|
|
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
|
|
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 twenty-five 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, find and bulk-check email addresses, report what bounced, 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
|
|
|
@@ -15,6 +15,11 @@ Website: https://prospectapis.com/mcp
|
|
|
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
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 |
|
|
18
|
+
| `email_verify_stats` | `GET /v1/email/verify/stats` | free |
|
|
19
|
+
| `email_outcomes_report` | `POST /v1/email/outcomes` | free; 1 to 100 outcomes a call |
|
|
20
|
+
| `email_verify_job_create` | `POST /v1/email/verify/jobs` | free to start; $0.004 per `valid` or `invalid` result as it is checked; up to 50,000 addresses |
|
|
21
|
+
| `email_verify_job_get` | `GET /v1/email/verify/jobs/:id` | free |
|
|
22
|
+
| `email_verify_job_results` | `GET /v1/email/verify/jobs/:id/results` | free; 1,000 a page |
|
|
18
23
|
| `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 |
|
|
19
24
|
| `account_balance` | `GET /v1/account` | free |
|
|
20
25
|
| `feedback_send` | `POST /v1/feedback` | free; reports a bug, wrong field or missing capability to the team (10 an hour per key) |
|
|
@@ -31,7 +36,7 @@ Website: https://prospectapis.com/mcp
|
|
|
31
36
|
`outreach`). It returns a `research_id` at once; a brief takes 20 to 90 seconds.
|
|
32
37
|
|
|
33
38
|
`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
|
|
39
|
+
`catch-all` or `unknown`), `reason`, `reason_text`, `score` (0 to 100), `recommendation` (`send`, `send_with_caution`, `retry_later` or `do_not_send`), `charged`, `flags`, `smtp_code` and `catch_all_tier`. If the balance covers only
|
|
35
40
|
some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits` and are not charged.
|
|
36
41
|
|
|
37
42
|
## Configure
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prospectapis-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.ProspectAPIs/prospectapis-mcp",
|
|
5
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",
|
package/src/tools.js
CHANGED
|
@@ -134,17 +134,168 @@ export const TOOLS = [
|
|
|
134
134
|
body: true,
|
|
135
135
|
description:
|
|
136
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 `
|
|
137
|
+
"`reason`, `reason_text`, `score` (0 to 100), `recommendation` (send, send_with_caution, retry_later or do_not_send), `charged`, `flags`, `smtp_code`, `catch_all_tier`, `did_you_mean` (a likely domain typo), `mail_provider` and `checked_at`. Costs $0.004 per valid or invalid result, drawn from your " +
|
|
138
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."
|
|
139
|
+
"some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free. " +
|
|
140
|
+
"`depth: \"quick\"` never contacts the mail server: syntax, disposable and free lists, DNS, parked and new-domain flags " +
|
|
141
|
+
"and a recently measured catch-all verdict, at $0.001 per address whatever the status; an address that needs a mailbox " +
|
|
142
|
+
"check comes back `unknown` with reason `not_probed`.",
|
|
140
143
|
shape: {
|
|
144
|
+
depth: z.enum(["full", "quick"]).optional().describe("full (default) checks the mailbox; quick is DNS and lists only, $0.001 per address."),
|
|
141
145
|
emails: z
|
|
142
|
-
.array(z.
|
|
146
|
+
.array(z.union([
|
|
147
|
+
z.string().min(3).max(254),
|
|
148
|
+
z.object({ email: z.string().min(3).max(254), first_name: z.string().max(80).optional(), last_name: z.string().max(80).optional() }),
|
|
149
|
+
]))
|
|
143
150
|
.min(1)
|
|
144
151
|
.max(25)
|
|
145
|
-
.describe("The addresses to check, 1 to 25 per call."),
|
|
152
|
+
.describe("The addresses to check, 1 to 25 per call. An item may be {email, first_name, last_name} to also check the address against the person's name."),
|
|
146
153
|
},
|
|
147
154
|
},
|
|
155
|
+
{
|
|
156
|
+
name: "email_domain_check",
|
|
157
|
+
method: "GET",
|
|
158
|
+
path: "/v1/email/domain/{domain}",
|
|
159
|
+
title: "Check Email Domain",
|
|
160
|
+
idempotent: true,
|
|
161
|
+
write: false,
|
|
162
|
+
description:
|
|
163
|
+
"What is known about one email domain without contacting its mail server: `exists`, `accepts_mail`, `null_mx`, `mx` hosts, " +
|
|
164
|
+
"`mail_provider`, `spf`, `dmarc`, `disposable`, `free_provider`, `parked`, `domain_age_days`, `new_domain`, `did_you_mean`, " +
|
|
165
|
+
"and `catch_all` (true or false only when our own check measured it recently, else null) with `catch_all_checked_at`. " +
|
|
166
|
+
"Free, up to 300 lookups an hour per account.",
|
|
167
|
+
shape: { domain: z.string().min(3).max(253).describe("A domain name such as example.com.") },
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "email_find",
|
|
171
|
+
method: "POST",
|
|
172
|
+
path: "/v1/email/find",
|
|
173
|
+
title: "Find Email Address",
|
|
174
|
+
write: true,
|
|
175
|
+
body: true,
|
|
176
|
+
description:
|
|
177
|
+
"Find a person's work email from `first_name`, `last_name` and company `domain`. The common patterns are checked in order " +
|
|
178
|
+
"against the mail server, most common first. Returns `status` (found, catch_all, unknown, not_found), `email`, `pattern`, " +
|
|
179
|
+
"`score`, `recommendation` and the addresses `checked`. Costs $0.02 only when an address is found; on a catch-all domain " +
|
|
180
|
+
"it returns the most likely address as `best_guess`, free.",
|
|
181
|
+
shape: {
|
|
182
|
+
first_name: z.string().min(1).max(80).describe("The person's first name."),
|
|
183
|
+
last_name: z.string().max(80).optional().describe("The person's last name."),
|
|
184
|
+
domain: z.string().min(3).max(253).describe("The company's email domain, such as example.com."),
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "email_verify_calibration",
|
|
189
|
+
method: "GET",
|
|
190
|
+
path: "/v1/email/verify/calibration",
|
|
191
|
+
title: "Email Score Calibration",
|
|
192
|
+
idempotent: true,
|
|
193
|
+
write: false,
|
|
194
|
+
description:
|
|
195
|
+
"What each verification score band has meant in practice: the measured bounce rate per band from delivery outcomes " +
|
|
196
|
+
"customers reported over the last 90 days. A band with fewer than 30 reports shows a null rate. Free.",
|
|
197
|
+
shape: {},
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "email_clean_list",
|
|
201
|
+
method: "POST",
|
|
202
|
+
path: "/v1/email/clean",
|
|
203
|
+
title: "Clean Email List",
|
|
204
|
+
write: true,
|
|
205
|
+
body: true,
|
|
206
|
+
description:
|
|
207
|
+
"Clean a list of up to 1,000 addresses in one call with quick checks (no mail server is contacted): returns `keep`, " +
|
|
208
|
+
"`review` (role, free, parked, new or typo addresses, with a reason) and `remove` (cannot receive mail), plus `counts`. " +
|
|
209
|
+
"$0.001 per well-formed address. Run email_verify on the kept addresses you will actually send to.",
|
|
210
|
+
shape: {
|
|
211
|
+
emails: z.array(z.string().min(3).max(254)).min(1).max(1000).describe("The addresses to clean, 1 to 1,000."),
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "email_verify_stats",
|
|
216
|
+
method: "GET",
|
|
217
|
+
path: "/v1/email/verify/stats",
|
|
218
|
+
title: "Email Verification Stats",
|
|
219
|
+
write: false,
|
|
220
|
+
description:
|
|
221
|
+
"Your own email verification mix over the last `days` (1 to 90, default 30): `total`, `by_status` (valid, invalid, " +
|
|
222
|
+
"catch-all, unknown), `charged`, `served_from_cache`, `catch_all_share` and `unknown_share`. Free.",
|
|
223
|
+
shape: {
|
|
224
|
+
days: z.number().int().min(1).max(90).optional().describe("Window in days, 1 to 90 (default 30)."),
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "email_outcomes_report",
|
|
229
|
+
method: "POST",
|
|
230
|
+
path: "/v1/email/outcomes",
|
|
231
|
+
title: "Report Email Outcomes",
|
|
232
|
+
write: true,
|
|
233
|
+
body: true,
|
|
234
|
+
description:
|
|
235
|
+
"Report what happened when you sent: `bounced` or `delivered`, 1 to 100 addresses per call. A bounce you report makes " +
|
|
236
|
+
"your later email_verify checks of that address come back invalid (reason `reported_bounce`); a delivered report on a " +
|
|
237
|
+
"catch-all address raises its score. Returns `stored`. Free.",
|
|
238
|
+
shape: {
|
|
239
|
+
outcomes: z
|
|
240
|
+
.array(z.object({ email: z.string().min(3).max(254), outcome: z.enum(["bounced", "delivered"]) }))
|
|
241
|
+
.min(1)
|
|
242
|
+
.max(100)
|
|
243
|
+
.describe("Each address and what happened when you sent to it."),
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: "email_verify_job_create",
|
|
248
|
+
method: "POST",
|
|
249
|
+
path: "/v1/email/verify/jobs",
|
|
250
|
+
title: "Start Email Verification Job",
|
|
251
|
+
write: true,
|
|
252
|
+
body: true,
|
|
253
|
+
description:
|
|
254
|
+
"Check up to 50,000 addresses in the background. Returns 202 with a job `id`; poll email_verify_job_get. A slow or " +
|
|
255
|
+
"greylisting server is retried about 5, 15 and 30 minutes later, free. Each valid or invalid result costs $0.004 as " +
|
|
256
|
+
"it is checked; catch-all and unknown are free. An optional https `callback_url` gets one signed POST when the job " +
|
|
257
|
+
"completes (verify with the returned `secret`). At most 5 jobs run at once per account.",
|
|
258
|
+
shape: {
|
|
259
|
+
sample: z.number().int().min(10).max(50000).optional().describe("Check only a random sample of this many addresses; the job then reports estimated shares for the whole list."),
|
|
260
|
+
monitor_days: z.number().int().min(7).max(90).optional().describe("Check the whole list again this many days after each run, billing each definite result again; the callback reports what changed."),
|
|
261
|
+
emails: z.array(z.string().min(1).max(254)).min(1).max(50000).describe("The addresses, 1 to 50,000."),
|
|
262
|
+
callback_url: z.string().url().max(2048).optional().describe("An https URL to POST to when the job completes."),
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: "email_verify_job_get",
|
|
267
|
+
method: "GET",
|
|
268
|
+
path: "/v1/email/verify/jobs/:id",
|
|
269
|
+
title: "Get Email Verification Job",
|
|
270
|
+
write: false,
|
|
271
|
+
description: "A job's `status` (queued, running, completed), `total`, `done`, `charged_count` and `amount_usd`. Free.",
|
|
272
|
+
shape: { id: z.string().uuid().describe("The job `id` from email_verify_job_create.") },
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: "email_verify_job_results",
|
|
276
|
+
method: "GET",
|
|
277
|
+
path: "/v1/email/verify/jobs/:id/results",
|
|
278
|
+
title: "Get Email Verification Job Results",
|
|
279
|
+
write: false,
|
|
280
|
+
description:
|
|
281
|
+
"A job's results in input order, up to 1,000 a page (`limit`), from `cursor`; `next_cursor` is null on the last page. " +
|
|
282
|
+
"An address not yet checked shows status `pending`. Free.",
|
|
283
|
+
shape: {
|
|
284
|
+
id: z.string().uuid().describe("The job `id`."),
|
|
285
|
+
cursor: z.number().int().min(0).optional().describe("Start at this position (0-based)."),
|
|
286
|
+
limit: z.number().int().min(1).max(1000).optional().describe("Results per page, 1 to 1,000 (default 1,000)."),
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: "email_verify_job_stop",
|
|
291
|
+
method: "POST",
|
|
292
|
+
path: "/v1/email/verify/jobs/{id}/stop",
|
|
293
|
+
title: "Stop Verification Job",
|
|
294
|
+
body: true,
|
|
295
|
+
write: true,
|
|
296
|
+
description: "Turn off a job's monitoring (its regular re-checks); a job still running is cancelled, and what it already checked stays readable. Free.",
|
|
297
|
+
shape: { id: z.string().uuid().describe("The job id.") },
|
|
298
|
+
},
|
|
148
299
|
{
|
|
149
300
|
name: "watchlist_create",
|
|
150
301
|
method: "POST",
|