prospectapis-mcp 0.4.2 → 0.8.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,63 @@ All notable changes to `prospectapis-mcp` are documented here. The format follow
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.0] - 2026-10-31
10
+
11
+ ### Added
12
+
13
+ - `post_resharers` (`GET /v1/posts/resharers`, $0.012 per live read): read who reshared a public post, each resharer
14
+ enriched, with the reshare type (`repost` for a plain reshare or `repost_with_thoughts` for a quote) and the added
15
+ `commentary` text of a with-thoughts reshare (roadmap PA-3.2). No competitor exposes reshare-with-commentary intent.
16
+ Whether a call is billed is gated server-side by the `people_reads` go-live switch, default off. The underlying read
17
+ ships UNVERIFIED (its reshares recipe is pending a live capture), so the tool answers temporarily unavailable until an
18
+ operator enables it on the server.
19
+
20
+ ## [0.7.0] - 2026-10-31
21
+
22
+ ### Added
23
+
24
+ - Twelve tools for the people/post WRITE product and the messaging reads (roadmap PA-3.4, task #46, backlog #18), each
25
+ acting on your own connected account. Writes, one published price PER route, metered, no floor, no seat:
26
+ `message_send` (`POST /v1/messages`, $0.03), `person_invite` (`POST /v1/people/invite`, $0.03), `invite_withdraw`
27
+ (`POST /v1/people/invite/withdraw`, $0.01), `person_follow` (`POST /v1/people/follow`, $0.01), `person_visit`
28
+ (`POST /v1/people/visit`, $0.01), `post_create` (`POST /v1/posts`, $0.05), `post_react` (`POST /v1/posts/react`,
29
+ $0.005), `post_comment` (`POST /v1/posts/comment`, $0.02), `post_repost` (`POST /v1/posts/repost`, $0.01) and
30
+ `post_quote` (`POST /v1/posts/quote`, $0.02). Messaging reads at $0.01 per read: `messages_list` (`GET /v1/messages`)
31
+ and `message_thread` (`GET /v1/messages/thread`). Whether a call is billed is gated server-side by each family's
32
+ go-live switch; until it is on, the routes answer as before and are free. Connecting your own account stays free.
33
+
34
+ ## [0.6.0] - 2026-10-31
35
+
36
+ ### Added
37
+
38
+ - Two tools for the cited company profile endpoint (roadmap PA-2.1a): `company_get` (`GET /v1/companies/:domain`,
39
+ $0.02 per company returned; a building 202 or an unknown 404 is free) and `company_funding`
40
+ (`GET /v1/companies/:domain/funding`, $0.009 per funding record returned). Billing of the profile is gated
41
+ server-side by the company go-live switch.
42
+
43
+ ## [0.5.0] - 2026-10-31
44
+
45
+ ### Added
46
+
47
+ - Five live-read tools for the people and page reads (roadmap PA-3.2), one published price of $0.012 per live read,
48
+ each fetching the person or page fresh at request time: `people_profile` (`GET /v1/people/profile`), `people_search`
49
+ (`POST /v1/people/search`), `people_posts` (`GET /v1/people/posts`), `post_engagers` (`GET /v1/posts/engagers`) and
50
+ `page_followers` (`GET /v1/pages/followers`). All read-only and billed per call (not idempotent, like the funding
51
+ reads). Whether a call is billed is gated server-side by the API's go-live switch; until it is on, the reads answer
52
+ as before and are free.
53
+
54
+ ## [0.4.3] - 2026-10-31
55
+
56
+ ### Changed
57
+
58
+ - Tool descriptions, the server instructions, the playbooks and the README state the lower API prices (roadmap PA-C.1):
59
+ `funding_search` and `funding_get` $0.009 per record returned, `email_verify` and verification jobs $0.003 per valid
60
+ or invalid result, `email_find` $0.009 per found address, a watchlist delivery $0.009. No change to tools, inputs or
61
+ outputs.
62
+ - `funding_search`/`funding_get` describe the headquarters as `location` (the place as the source states it, often a
63
+ city) alongside `country` (the country name) and `country_code`, and the `country` filter matches a name or ISO code
64
+ against the country and any other text against the stated place. Reflects the API's country/location split.
65
+
9
66
  ## [0.4.2] - 2026-10-29
10
67
 
11
68
  ### Changed
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 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.
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 45 tools over the ProspectAPIs API: search and watch funding rounds, read cited company profiles, verify, find and bulk-check email addresses, order a cited research brief, read people and pages live, and act through your own connected account (message, invite, follow, post, react, comment and more). Every account starts with a free $1 balance and no card: records cost $0.009, an email check $0.003, a brief $0.15, a live read $0.012 and an action from $0.005, 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,17 +10,37 @@ 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; no match is free |
14
- | `funding_get` | `GET /v1/funding/:id` | $0.02 when found; a missing id is free |
13
+ | `funding_search` | `GET /v1/funding` | $0.009 per record returned; no match is free |
14
+ | `funding_get` | `GET /v1/funding/:id` | $0.009 when found; a missing id is free |
15
+ | `company_get` | `GET /v1/companies/:domain` | $0.02 per company returned; a building (202) or unknown (404) domain is free |
16
+ | `company_funding` | `GET /v1/companies/:domain/funding` | $0.009 per record returned; a company with no rounds is free |
15
17
  | `research_submit` | `POST /v1/research` | one research at `research_price_usd` (see `account_balance`), charged only when the brief completes; refunded on failure |
16
18
  | `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 |
19
+ | `email_verify` | `POST /v1/email/verify` | $0.003 per `valid` or `invalid` result; `catch-all` and `unknown` are free; 1 to 25 addresses a call |
18
20
  | `email_verify_stats` | `GET /v1/email/verify/stats` | free |
19
21
  | `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 |
22
+ | `email_verify_job_create` | `POST /v1/email/verify/jobs` | free to start; $0.003 per `valid` or `invalid` result as it is checked; up to 50,000 addresses |
21
23
  | `email_verify_job_get` | `GET /v1/email/verify/jobs/:id` | free |
22
24
  | `email_verify_job_results` | `GET /v1/email/verify/jobs/:id/results` | free; 1,000 a page |
23
25
  | `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 |
26
+ | `people_profile` | `GET /v1/people/profile` | $0.012 per live read; a profile that cannot be read is free |
27
+ | `people_search` | `POST /v1/people/search` | $0.012 per live read; up to 1,000 results a query |
28
+ | `people_posts` | `GET /v1/people/posts` | $0.012 per live read |
29
+ | `post_engagers` | `GET /v1/posts/engagers` | $0.012 per live read |
30
+ | `post_resharers` | `GET /v1/posts/resharers` | $0.012 per live read; names the reshare type and the with-thoughts commentary |
31
+ | `page_followers` | `GET /v1/pages/followers` | $0.012 per live read; your connected account must administer the page |
32
+ | `message_send` | `POST /v1/messages` | $0.03 per action; on your connected account |
33
+ | `person_invite` | `POST /v1/people/invite` | $0.03 per action |
34
+ | `invite_withdraw` | `POST /v1/people/invite/withdraw` | $0.01 per action |
35
+ | `person_follow` | `POST /v1/people/follow` | $0.01 per action |
36
+ | `person_visit` | `POST /v1/people/visit` | $0.01 per action |
37
+ | `post_create` | `POST /v1/posts` | $0.05 per action |
38
+ | `post_react` | `POST /v1/posts/react` | $0.005 per action |
39
+ | `post_comment` | `POST /v1/posts/comment` | $0.02 per action |
40
+ | `post_repost` | `POST /v1/posts/repost` | $0.01 per action |
41
+ | `post_quote` | `POST /v1/posts/quote` | $0.02 per action |
42
+ | `messages_list` | `GET /v1/messages` | $0.01 per read; your connected-account conversations |
43
+ | `message_thread` | `GET /v1/messages/thread` | $0.01 per read |
24
44
  | `account_balance` | `GET /v1/account` | free |
25
45
  | `feedback_send` | `POST /v1/feedback` | free; reports a bug, wrong field or missing capability to the team (10 an hour per key) |
26
46
  | `pricing_get` | `GET /pricing` | free, no key needed; the live price list |
@@ -66,7 +86,7 @@ Claude Code: `claude mcp add prospectapis -e PROSPECTAPIS_API_KEY=pa_live_... --
66
86
 
67
87
  **Where does the funding data come from?** Records carry the public announcement URL when there is one.
68
88
 
69
- **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.
89
+ **What is free?** A $1 balance when you sign up (about 111 funding records, 333 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.
70
90
 
71
91
  **Which clients work?** Claude Code, Claude Desktop, Cursor and any client that reads an mcpServers config, through `npx -y prospectapis-mcp`.
72
92
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prospectapis-mcp",
3
- "version": "0.4.2",
3
+ "version": "0.8.0",
4
4
  "mcpName": "com.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/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, drawn from your balance (a new account starts
24
- with $1, about 50 records), so know what is left before you pull pages.
23
+ 1. \`account_balance\` first. Each funding record returned costs $0.009, drawn from your balance (a new account starts
24
+ with $1, about 111 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.
package/src/server.js CHANGED
@@ -19,8 +19,8 @@ export const TOP_UP_URL = "https://prospectapis.com/dashboard/billing?utm_source
19
19
 
20
20
  export const INSTRUCTIONS =
21
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 " +
22
+ "(no card, no monthly reset), and each paid call draws from it at its own price. funding_search and funding_get cost $0.009 per record returned; " +
23
+ "a search that matches nothing costs nothing. email_verify checks 1 to 25 addresses for $0.003 per valid or invalid result; catch-all and " +
24
24
  "unknown results are free. account_balance, pricing_get and api_version are free. " +
25
25
  "Use filters (dates, round, amount, domain, investor, country) to keep result sets small, and call account_balance before a large paged search. " +
26
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. " +
package/src/tools.js CHANGED
@@ -48,8 +48,9 @@ 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, drawn from your balance (every account starts with a free $1); a search that matches nothing is free. " +
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`.",
51
+ "Search funding rounds (venture rounds, debt, grants, IPOs), newest announcement first. Costs $0.009 per record returned, drawn from your balance (every account starts with a free $1); a search that matches nothing is free. " +
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
+ "Each record gives the headquarters as `location` (the place as the source states it, often a city) and `country` (the country name), plus `country_code` (the ISO 3166-1 alpha-2 code).",
53
54
  shape: {
54
55
  since: DATE.describe("Earliest announcement date, inclusive (YYYY-MM-DD)."),
55
56
  until: DATE.describe("Latest announcement date, inclusive (YYYY-MM-DD)."),
@@ -62,7 +63,7 @@ export const TOOLS = [
62
63
  company: z.string().min(1).max(100).optional().describe("Company name contains this text (case-insensitive)."),
63
64
  domain: z.string().min(3).max(253).optional().describe("Exact company domain, for example `example.com`."),
64
65
  investor: z.string().min(1).max(100).optional().describe("Exact investor name, case-insensitive."),
65
- country: z.string().min(1).max(60).optional().describe("Headquarters country as a name or ISO code, such as US, United States or DE. Other text, such as a city, matches the stated location."),
66
+ country: z.string().min(1).max(60).optional().describe("Headquarters country as a name or ISO code, such as US, United States or DE. Other text, such as a city, matches the stated place (the record's `location`)."),
66
67
  limit: z.number().int().min(1).max(100).optional().describe("Records per page, 1 to 100 (default 25). Each record returned is billed."),
67
68
  cursor: z.string().max(200).optional().describe("Opaque cursor from the previous page's `next_cursor`."),
68
69
  },
@@ -73,11 +74,49 @@ export const TOOLS = [
73
74
  path: "/v1/funding/{id}",
74
75
  title: "Get Funding Round",
75
76
  write: false,
76
- description: "Read one funding record by id. Costs $0.02 when found; a missing id is free.",
77
+ description: "Read one funding record by id. Costs $0.009 when found; a missing id is free.",
77
78
  shape: {
78
79
  id: z.string().uuid().describe("The funding record id from a `funding_search` result."),
79
80
  },
80
81
  },
82
+ {
83
+ name: "company_get",
84
+ method: "GET",
85
+ path: "/v1/companies/{domain}",
86
+ title: "Get Company Profile",
87
+ write: false,
88
+ description:
89
+ "Read one cited company profile by domain: name, description, HQ, founded year, industry, employee band, social " +
90
+ "links, a funding rollup (the amount raised across the rounds we hold, not lifetime total raised) and a careers " +
91
+ "link, with a source URL on every field and each marked `stated` (a page " +
92
+ "states it) or `inferred` (classified from a page); a field no source supports is null, never guessed. Costs " +
93
+ "$0.02 per company returned, drawn from your balance. A domain not built yet returns 202 `building` (retry in " +
94
+ "about 30 seconds), and a domain that does not resolve to a company returns 404; both are free.",
95
+ shape: {
96
+ domain: z.string().min(3).max(253).describe("The company's domain, for example `acme.com`."),
97
+ },
98
+ },
99
+ {
100
+ name: "company_funding",
101
+ method: "GET",
102
+ path: "/v1/companies/{domain}/funding",
103
+ title: "Get Company Funding Rounds",
104
+ write: false,
105
+ format: { min_amount_usd: formatAmount, max_amount_usd: formatAmount },
106
+ description:
107
+ "The funding rounds for one company domain, newest announcement first: the same records as funding_search filtered " +
108
+ "to this domain. Costs $0.009 per record returned; a company with no rounds is free. Page with `cursor`.",
109
+ shape: {
110
+ domain: z.string().min(3).max(253).describe("The company's domain, for example `acme.com`."),
111
+ since: DATE.describe("Earliest announcement date, inclusive (YYYY-MM-DD)."),
112
+ until: DATE.describe("Latest announcement date, inclusive (YYYY-MM-DD)."),
113
+ round: z.string().optional().describe("Comma-separated round stages, for example `seed,series_a`."),
114
+ min_amount_usd: AMOUNT.describe("Smallest round size in USD."),
115
+ max_amount_usd: AMOUNT.describe("Largest round size in USD."),
116
+ limit: z.number().int().min(1).max(100).optional().describe("Records per page, 1 to 100 (default 25). Each record returned is billed."),
117
+ cursor: z.string().max(200).optional().describe("Opaque cursor from the previous page's `next_cursor`."),
118
+ },
119
+ },
81
120
  {
82
121
  name: "research_submit",
83
122
  method: "POST",
@@ -134,7 +173,7 @@ export const TOOLS = [
134
173
  body: true,
135
174
  description:
136
175
  "Check whether 1 to 25 email addresses can receive mail. Each result has `status` (valid, invalid, catch-all or unknown), " +
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 " +
176
+ "`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.003 per valid or invalid result, drawn from your " +
138
177
  "balance; catch-all and unknown results are free (pricing_get lists which statuses are charged). When the balance covers only " +
139
178
  "some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free. " +
140
179
  "`depth: \"quick\"` never contacts the mail server: syntax, disposable and free lists, DNS, parked and new-domain flags " +
@@ -176,7 +215,7 @@ export const TOOLS = [
176
215
  description:
177
216
  "Find a person's work email from `first_name`, `last_name` and company `domain`. The common patterns are checked in order " +
178
217
  "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 " +
218
+ "`score`, `recommendation` and the addresses `checked`. Costs $0.009 only when an address is found; on a catch-all domain " +
180
219
  "it returns the most likely address as `best_guess`, free.",
181
220
  shape: {
182
221
  first_name: z.string().min(1).max(80).describe("The person's first name."),
@@ -252,7 +291,7 @@ export const TOOLS = [
252
291
  body: true,
253
292
  description:
254
293
  "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 " +
294
+ "greylisting server is retried about 5, 15 and 30 minutes later, free. Each valid or invalid result costs $0.003 as " +
256
295
  "it is checked; catch-all and unknown are free. An optional https `callback_url` gets one signed POST when the job " +
257
296
  "completes (verify with the returned `secret`). At most 5 jobs run at once per account.",
258
297
  shape: {
@@ -306,7 +345,7 @@ export const TOOLS = [
306
345
  description:
307
346
  "Save a funding-signal alert: a set of funding_search filters plus an https webhook. Each NEW funding event that " +
308
347
  "matches is POSTed to the webhook, signed with the returned `secret` (header Prospect-Signature: t=..,v1=HMAC-SHA256). " +
309
- "Creating is free; each delivered event costs one record ($0.02), charged only when the webhook " +
348
+ "Creating is free; each delivered event costs one record ($0.009), charged only when the webhook " +
310
349
  "answers 2xx. The `secret` is shown once. Max 20 active per account.",
311
350
  shape: {
312
351
  name: z.string().min(1).max(100).describe("A label, such as 'Series A robotics'."),
@@ -374,6 +413,306 @@ export const TOOLS = [
374
413
  description: "Delete a funding-signal alert and its delivery history. Free.",
375
414
  shape: { id: z.string().uuid().describe("The watchlist id.") },
376
415
  },
416
+ {
417
+ name: "people_profile",
418
+ method: "GET",
419
+ path: "/v1/people/profile",
420
+ title: "Read Person Profile",
421
+ write: false,
422
+ description:
423
+ "Read one person's public professional profile, fetched FRESH at request time (never from a stored cache). " +
424
+ "Costs $0.012 per live read, drawn from your balance; a profile that cannot be read is free. Pass a public " +
425
+ "identifier or profile address as `profile_ref`.",
426
+ shape: {
427
+ profile_ref: z.string().min(1).max(300).describe("A person's public identifier or profile address."),
428
+ },
429
+ },
430
+ {
431
+ name: "people_search",
432
+ method: "POST",
433
+ path: "/v1/people/search",
434
+ title: "Search People",
435
+ write: false,
436
+ body: true,
437
+ description:
438
+ "Search people by keywords and filters, read FRESH at request time. Returns the first 1,000 results per query; " +
439
+ "page with `start`. Costs $0.012 per live read. Give `keywords` or at least one filter.",
440
+ shape: {
441
+ keywords: z.string().min(1).max(500).optional().describe("Free-text keywords."),
442
+ filters: z
443
+ .object({
444
+ network: z.string().optional(),
445
+ current_company: z.string().optional(),
446
+ past_company: z.string().optional(),
447
+ location: z.string().optional(),
448
+ industry: z.string().optional(),
449
+ school: z.string().optional(),
450
+ profile_language: z.string().optional(),
451
+ connection_of: z.string().optional(),
452
+ service_category: z.string().optional(),
453
+ first_name: z.string().optional(),
454
+ last_name: z.string().optional(),
455
+ title: z.string().optional(),
456
+ company: z.string().optional(),
457
+ school_name: z.string().optional(),
458
+ })
459
+ .partial()
460
+ .optional()
461
+ .describe("Named filters: network, current_company, past_company, location, industry, school, profile_language, connection_of, service_category, first_name, last_name, title, company, school_name."),
462
+ start: z.number().int().min(0).max(999).optional().describe("Zero-based offset into the first 1,000 results."),
463
+ count: z.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50."),
464
+ },
465
+ },
466
+ {
467
+ name: "people_posts",
468
+ method: "GET",
469
+ path: "/v1/people/posts",
470
+ title: "Read Person Posts",
471
+ write: false,
472
+ description:
473
+ "Read a person's recent public posts, FRESH at request time. Costs $0.012 per live read. Page with `cursor` " +
474
+ "(pass back the returned cursor) or `start`.",
475
+ shape: {
476
+ person_ref: z.string().min(1).max(4000).describe("The person reference from a profile or search result."),
477
+ start: z.number().int().min(0).max(10000).optional().describe("Zero-based offset."),
478
+ count: z.number().int().min(1).max(50).optional().describe("Posts per page, 1 to 50."),
479
+ cursor: z.string().max(4000).optional().describe("Opaque cursor from the previous page."),
480
+ },
481
+ },
482
+ {
483
+ name: "post_engagers",
484
+ method: "GET",
485
+ path: "/v1/posts/engagers",
486
+ title: "Read Post Engagers",
487
+ write: false,
488
+ description:
489
+ "Read who reacted to or commented on a public post, FRESH at request time. Costs $0.012 per live read. Set " +
490
+ "`kind` to reactions or comments and give one of post_id, share_id or post_url.",
491
+ shape: {
492
+ kind: z.enum(["reactions", "comments"]).describe("reactions (who reacted) or comments (who commented)."),
493
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
494
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
495
+ post_url: z.string().min(1).max(2048).optional().describe("The public post URL."),
496
+ start: z.number().int().min(0).max(100000).optional().describe("Reactions only: zero-based offset."),
497
+ count: z.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50."),
498
+ cursor: z.string().max(4000).optional().describe("Comments only: opaque cursor from the previous page."),
499
+ },
500
+ },
501
+ {
502
+ name: "post_resharers",
503
+ method: "GET",
504
+ path: "/v1/posts/resharers",
505
+ title: "Read Post Resharers",
506
+ write: false,
507
+ description:
508
+ "Read who reshared a public post, FRESH at request time, with each resharer enriched. Costs $0.012 per live " +
509
+ "read. Each result carries reshare_type (repost or repost_with_thoughts) and, for a with-thoughts reshare, the " +
510
+ "added commentary text. Give one of post_id, share_id or post_url.",
511
+ shape: {
512
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
513
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
514
+ post_url: z.string().min(1).max(2048).optional().describe("The public post URL."),
515
+ start: z.number().int().min(0).max(100000).optional().describe("Zero-based offset."),
516
+ count: z.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50."),
517
+ },
518
+ },
519
+ {
520
+ name: "page_followers",
521
+ method: "GET",
522
+ path: "/v1/pages/followers",
523
+ title: "Read Page Followers",
524
+ write: false,
525
+ description:
526
+ "Read the followers of a page your connected account administers, FRESH at request time. Costs $0.012 per live " +
527
+ "read. Give `page`, or the `cursor` of the previous page. Requires a connected account (people_search aside, " +
528
+ "this read runs on your own account).",
529
+ shape: {
530
+ page: z.string().min(1).max(300).optional().describe("The page identifier or address."),
531
+ count: z.number().int().min(1).max(20).optional().describe("Followers per page, 1 to 20."),
532
+ cursor: z.string().max(4000).optional().describe("Opaque cursor from the previous page."),
533
+ },
534
+ },
535
+ {
536
+ name: "message_send",
537
+ method: "POST",
538
+ path: "/v1/messages",
539
+ title: "Send Direct Message",
540
+ write: true,
541
+ body: true,
542
+ description:
543
+ "Send a direct message from YOUR connected account. Costs $0.03 per action, drawn from your balance; billing " +
544
+ "turns on with the write go-live switch (free until then). Requires a connected account (accounts_connect).",
545
+ shape: {
546
+ person_ref: z.string().min(1).max(4000).describe("The person reference from a profile or search result."),
547
+ text: z.string().min(1).max(8000).describe("The message text."),
548
+ },
549
+ },
550
+ {
551
+ name: "person_invite",
552
+ method: "POST",
553
+ path: "/v1/people/invite",
554
+ title: "Send Connection Invite",
555
+ write: true,
556
+ body: true,
557
+ description: "Send a connection invite from your connected account. Costs $0.03 per action. Requires a connected account.",
558
+ shape: {
559
+ person_ref: z.string().min(1).max(4000).describe("The person reference from a profile or search result."),
560
+ },
561
+ },
562
+ {
563
+ name: "invite_withdraw",
564
+ method: "POST",
565
+ path: "/v1/people/invite/withdraw",
566
+ title: "Withdraw Connection Invite",
567
+ write: true,
568
+ body: true,
569
+ description: "Withdraw a connection invite you sent. Costs $0.01 per action. Requires a connected account.",
570
+ shape: {
571
+ person_ref: z.string().min(1).max(4000).describe("The person reference the invite was sent to."),
572
+ },
573
+ },
574
+ {
575
+ name: "person_follow",
576
+ method: "POST",
577
+ path: "/v1/people/follow",
578
+ title: "Follow or Unfollow a Person",
579
+ write: true,
580
+ body: true,
581
+ description: "Follow a person, or unfollow with `unfollow: true`. Costs $0.01 per action. Requires a connected account.",
582
+ shape: {
583
+ person_ref: z.string().min(1).max(4000).describe("The person reference from a profile or search result."),
584
+ unfollow: z.boolean().optional().describe("true to unfollow instead of follow."),
585
+ },
586
+ },
587
+ {
588
+ name: "person_visit",
589
+ method: "POST",
590
+ path: "/v1/people/visit",
591
+ title: "Visit a Profile",
592
+ write: true,
593
+ body: true,
594
+ description:
595
+ "Visit a profile from your connected account (the 'viewed you' signal). Costs $0.01 per action. Give person_ref " +
596
+ "or profile_ref. Requires a connected account.",
597
+ shape: {
598
+ person_ref: z.string().min(1).max(4000).optional().describe("The person reference from a profile or search result."),
599
+ profile_ref: z.string().min(1).max(300).optional().describe("A person's public identifier or profile address."),
600
+ },
601
+ },
602
+ {
603
+ name: "post_create",
604
+ method: "POST",
605
+ path: "/v1/posts",
606
+ title: "Create a Post",
607
+ write: true,
608
+ body: true,
609
+ description: "Create a post (share) from your connected account. Costs $0.05 per action. Requires a connected account.",
610
+ shape: {
611
+ text: z.string().min(1).max(3000).describe("The post text."),
612
+ visibility: z.enum(["anyone", "connections"]).optional().describe("Who can see it; defaults to anyone."),
613
+ },
614
+ },
615
+ {
616
+ name: "post_react",
617
+ method: "POST",
618
+ path: "/v1/posts/react",
619
+ title: "React to a Post",
620
+ write: true,
621
+ body: true,
622
+ description:
623
+ "React to a post, or remove your reaction with `remove: true`. Costs $0.005 per action. Give one of post_id, " +
624
+ "share_id or post_url. Requires a connected account.",
625
+ shape: {
626
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
627
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
628
+ post_url: z.string().min(1).max(2000).optional().describe("The public post URL."),
629
+ reaction: z.enum(["like", "celebrate", "support", "love", "insightful", "funny"]).optional().describe("The reaction; defaults to like."),
630
+ remove: z.boolean().optional().describe("true to remove your reaction instead."),
631
+ },
632
+ },
633
+ {
634
+ name: "post_comment",
635
+ method: "POST",
636
+ path: "/v1/posts/comment",
637
+ title: "Comment on a Post",
638
+ write: true,
639
+ body: true,
640
+ description:
641
+ "Comment on a post, or reply to a comment with `parent_comment`. Costs $0.02 per action. Give one of post_id, " +
642
+ "share_id or post_url. Requires a connected account.",
643
+ shape: {
644
+ text: z.string().min(1).max(3000).describe("The comment text."),
645
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
646
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
647
+ post_url: z.string().min(1).max(2000).optional().describe("The public post URL."),
648
+ parent_comment: z.string().min(1).max(4000).optional().describe("A comment reference to reply under."),
649
+ },
650
+ },
651
+ {
652
+ name: "post_repost",
653
+ method: "POST",
654
+ path: "/v1/posts/repost",
655
+ title: "Repost a Post",
656
+ write: true,
657
+ body: true,
658
+ description:
659
+ "Repost a post (instant repost, no commentary). Costs $0.01 per action. Give one of post_id, share_id or " +
660
+ "post_url. Requires a connected account.",
661
+ shape: {
662
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
663
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
664
+ post_url: z.string().min(1).max(2000).optional().describe("The public post URL."),
665
+ },
666
+ },
667
+ {
668
+ name: "post_quote",
669
+ method: "POST",
670
+ path: "/v1/posts/quote",
671
+ title: "Quote a Post",
672
+ write: true,
673
+ body: true,
674
+ description:
675
+ "Quote a post with your own thoughts (repost with commentary). Costs $0.02 per action. Give one of post_id, " +
676
+ "share_id or post_url. Requires a connected account.",
677
+ shape: {
678
+ text: z.string().min(1).max(3000).describe("Your commentary."),
679
+ post_id: z.string().min(1).max(4000).optional().describe("The post id."),
680
+ share_id: z.string().min(1).max(4000).optional().describe("The share id."),
681
+ post_url: z.string().min(1).max(2000).optional().describe("The public post URL."),
682
+ visibility: z.enum(["anyone", "connections"]).optional().describe("Who can see it; defaults to anyone."),
683
+ },
684
+ },
685
+ {
686
+ name: "messages_list",
687
+ method: "GET",
688
+ path: "/v1/messages",
689
+ title: "List Conversations",
690
+ write: false,
691
+ description:
692
+ "Read your connected account's recent conversations, incremental by `since`/`cursor`. Costs $0.01 per read; " +
693
+ "billing turns on with the messaging go-live switch (free until then). Requires a connected account.",
694
+ shape: {
695
+ since: z.string().min(1).max(4000).optional().describe("Read only what changed after this value from a previous read."),
696
+ cursor: z.string().min(1).max(4000).optional().describe("Opaque cursor from the previous page."),
697
+ count: z.number().int().min(1).max(20).optional().describe("Conversations per page, 1 to 20."),
698
+ },
699
+ },
700
+ {
701
+ name: "message_thread",
702
+ method: "GET",
703
+ path: "/v1/messages/thread",
704
+ title: "Read a Conversation Thread",
705
+ write: false,
706
+ description:
707
+ "Read the messages of one conversation thread, incremental by `since`/`cursor`. Costs $0.01 per read. Pass the " +
708
+ "`thread_id` from messages_list. Requires a connected account.",
709
+ shape: {
710
+ thread_id: z.string().min(1).max(4000).describe("The thread id from messages_list."),
711
+ since: z.string().min(1).max(4000).optional().describe("Read only what changed after this value from a previous read."),
712
+ cursor: z.string().min(1).max(4000).optional().describe("Opaque cursor from the previous page."),
713
+ count: z.number().int().min(1).max(50).optional().describe("Messages per page, 1 to 50."),
714
+ },
715
+ },
377
716
  {
378
717
  name: "account_balance",
379
718
  method: "GET",