@oneshot-agent/mcp-server 0.35.0 → 0.37.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/README.md CHANGED
@@ -102,7 +102,7 @@ Read tools (inbox, SMS inbox, notifications, balance, browser profiles) return p
102
102
  ## Remote (hosted)
103
103
 
104
104
  Clients that run in someone else's cloud (Grok Bot, hosted runners) cannot spawn this
105
- server and must not hold a wallet key. For them, OneShot hosts the same 81 tools over
105
+ server and must not hold a wallet key. For them, OneShot hosts the same 117 tools over
106
106
  Streamable HTTP at **`https://win.oneshotagent.com/mcp`**, authenticated with an
107
107
  **agent access token** and billed to the agent's credit balance:
108
108
 
@@ -169,26 +169,26 @@ Soul Hunt is a separate service (`api.soulhunt.ai`) from the main OneShot API; t
169
169
  | Tool | Description |
170
170
  |------|-------------|
171
171
  | `oneshot_research` | Deep web research with sources |
172
- | `oneshot_people_search` | Search for people by title, company, etc. |
173
- | `oneshot_enrich_profile` | Enrich person profile from LinkedIn/email |
174
- | `oneshot_find_email` | Find someone's email address |
175
- | `oneshot_verify_email` | Verify email deliverability |
176
- | `oneshot_company_search` | Search for companies by industry, size, location, etc. |
177
- | `oneshot_enrich_company` | Enrich a company from domain, name, LinkedIn, or ticker |
178
- | `oneshot_local_search` | Discover local businesses (restaurants, contractors, practices) by category × location |
179
- | `oneshot_local_resolve` | Business name + address → website domain, phone, status, confidence |
180
- | `oneshot_gov_solicitations` | Federal Sources Sought / Presolicitation notices by NAICS with the contracting officer's contact |
172
+ | `oneshot_person_find` | Search for people by title, company, etc. |
173
+ | `oneshot_person_profile` | Enrich person profile from LinkedIn/email |
174
+ | `oneshot_person_email` | Find someone's email address |
175
+ | `oneshot_person_email_status` | Verify email deliverability |
176
+ | `oneshot_company_find` | Search for companies by industry, size, location, etc. |
177
+ | `oneshot_company_profile` | Enrich a company from domain, name, LinkedIn, or ticker |
178
+ | `oneshot_business_find` | Discover local businesses (restaurants, contractors, practices) by category × location |
179
+ | `oneshot_business_resolve` | Business name + address → website domain, phone, status, confidence |
180
+ | `oneshot_record_solicitations_find` | Federal Sources Sought / Presolicitation notices by NAICS with the contracting officer's contact |
181
181
 
182
182
  ### Person Intelligence
183
183
 
184
184
  | Tool | Description |
185
185
  |------|-------------|
186
- | `oneshot_deep_research_person` | Full dossier on a person |
187
- | `oneshot_social_profiles` | Find all social accounts for a person |
188
- | `oneshot_article_search` | Find articles about a person |
189
- | `oneshot_person_newsfeed` | Recent social posts with engagement |
186
+ | `oneshot_person_dossier` | A person’s profile, known social accounts, articles, posts and written summary |
187
+ | `oneshot_person_social_accounts` | Find all social accounts for a person |
188
+ | `oneshot_person_articles` | Find articles about a person |
189
+ | `oneshot_person_posts` | Recent social posts with engagement |
190
190
  | `oneshot_person_interests` | Analyze interests across categories |
191
- | `oneshot_person_interactions` | Map followers, following, replies |
191
+ | `oneshot_person_followers` | Map followers, following, replies |
192
192
 
193
193
  ### Web
194
194
 
@@ -216,7 +216,7 @@ Soul Hunt is a separate service (`api.soulhunt.ai`) from the main OneShot API; t
216
216
 
217
217
  | Tool | Description |
218
218
  |------|-------------|
219
- | `oneshot_compute` | Create an autonomous goal (objective + budget); the orchestrator plans and executes |
219
+ | `oneshot_compute` | Create an autonomous goal (objective + budget); OneShot plans and runs the steps |
220
220
  | `oneshot_compute_status` | Get a compute goal's status and budget |
221
221
  | `oneshot_compute_tasks` | List tasks planned/executed under a goal |
222
222
  | `oneshot_compute_cancel` | Cancel a goal and refund remaining budget |
@@ -298,7 +298,7 @@ Use oneshot_research:
298
298
  ### Search for People
299
299
 
300
300
  ```
301
- Use oneshot_people_search:
301
+ Use oneshot_person_find:
302
302
  - job_titles: ["CTO", "VP Engineering"]
303
303
  - companies: ["Stripe", "Square"]
304
304
  - location: ["San Francisco"]
@@ -308,7 +308,7 @@ Use oneshot_people_search:
308
308
  ### Find Someone's Email
309
309
 
310
310
  ```
311
- Use oneshot_find_email:
311
+ Use oneshot_person_email:
312
312
  - first_name: "John"
313
313
  - last_name: "Smith"
314
314
  - company_domain: "example.com"
@@ -350,7 +350,7 @@ Send USDC to your agent's wallet address on Base. The server runs on Base Mainne
350
350
 
351
351
  ## LinkedIn connection recovery
352
352
 
353
- If the active account list is empty or an account is `deleted_upstream` or
353
+ If the active account list is empty or an account is `connection_deleted` or
354
354
  `revoked`, ask the human to use `oneshot_linkedin_connect` and authorize fresh
355
355
  grants. An existing account with `reconnect_required` must be reconnected through
356
356
  the owning application. Reconnect and revoke are deliberately not agent tools.
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ async function main() {
50
50
  const agent = await initAgent();
51
51
  const server = new Server({
52
52
  name: "oneshot-mcp",
53
- version: "0.35.0", // keep in sync with package.json; guarded by version.test.ts
53
+ version: "0.37.0", // keep in sync with package.json; guarded by version.test.ts
54
54
  }, {
55
55
  capabilities: {
56
56
  tools: {},
@@ -1,3 +1,4 @@
1
+ import { LOOKUP_MANIFEST, ROUTE_MANIFEST } from "./lookup-manifest.generated.js";
1
2
  /** Retrieval only. */
2
3
  const read = (title, openWorld) => ({ title, readOnlyHint: true, destructiveHint: false, openWorldHint: openWorld });
3
4
  /** Changes something. `destructive` only for delete / overwrite / revoke. */
@@ -24,22 +25,22 @@ export const TOOL_ANNOTATIONS = {
24
25
  oneshot_voice_inbound_disable: write("Stop answering calls", OPEN),
25
26
  oneshot_voice_inbound_calls: read("List answered calls", OWN),
26
27
  oneshot_research: read("Deep research", OPEN),
27
- oneshot_people_search: read("Find people", OPEN),
28
- oneshot_enrich_profile: read("Look up a person's profile", OPEN),
29
- oneshot_find_email: read("Find a work email", OPEN),
30
- oneshot_verify_email: read("Verify an email address", OPEN),
28
+ oneshot_person_find: read("Find people", OPEN),
29
+ oneshot_person_profile: read("Look up a person's profile", OPEN),
30
+ oneshot_person_email: read("Find a work email", OPEN),
31
+ oneshot_person_email_status: read("Verify an email address", OPEN),
31
32
  oneshot_web_search: read("Web search", OPEN),
32
- oneshot_deep_research_person: read("Research a person", OPEN),
33
- oneshot_social_profiles: read("Find social profiles", OPEN),
34
- oneshot_article_search: read("Find articles about a person", OPEN),
35
- oneshot_person_newsfeed: read("Get a person's recent posts", OPEN),
33
+ oneshot_person_dossier: read("Research a person", OPEN),
34
+ oneshot_person_social_accounts: read("Find social profiles", OPEN),
35
+ oneshot_person_articles: read("Find articles about a person", OPEN),
36
+ oneshot_person_posts: read("Get a person's recent posts", OPEN),
36
37
  oneshot_person_interests: read("Summarize a person's interests", OPEN),
37
- oneshot_person_interactions: read("Find a person's interactions", OPEN),
38
- oneshot_company_search: read("Find companies", OPEN),
39
- oneshot_enrich_company: read("Look up a company", OPEN),
40
- oneshot_local_search: read("Find local businesses", OPEN),
41
- oneshot_local_resolve: read("Look up a local business", OPEN),
42
- oneshot_gov_solicitations: read("Find government contracts", OPEN),
38
+ oneshot_person_followers: read("Find a person's interactions", OPEN),
39
+ oneshot_company_find: read("Find companies", OPEN),
40
+ oneshot_company_profile: read("Look up a company", OPEN),
41
+ oneshot_business_find: read("Find local businesses", OPEN),
42
+ oneshot_business_resolve: read("Look up a local business", OPEN),
43
+ oneshot_record_solicitations_find: read("Find government contracts", OPEN),
43
44
  oneshot_commerce_search: read("Search products", OPEN),
44
45
  oneshot_commerce_buy: write("Buy a product", OPEN),
45
46
  oneshot_compute: write("Start a goal", OPEN),
@@ -87,4 +88,15 @@ export const TOOL_ANNOTATIONS = {
87
88
  oneshot_approval_list: read("List approvals", OWN),
88
89
  oneshot_approval_cancel: write("Cancel an approval", OWN, DESTRUCTIVE),
89
90
  oneshot_action_policy: read("Show approval rules", OWN),
91
+ // The lookup tools come from the generated manifest: paid retrieval over public or third-party data (#1445).
92
+ ...Object.fromEntries(LOOKUP_MANIFEST.map((entry) => [`oneshot_${entry.name}`, read(entry.title, OPEN)])),
93
+ // The declared routes come from the same manifest (#1580). A read of the agent's own data is closed-world; a paid
94
+ // read (Changes, Benchmark) reaches recorded third-party data; a write changes something, and a DELETE removes it.
95
+ ...Object.fromEntries(ROUTE_MANIFEST.map((entry) => {
96
+ const own = !entry.paid;
97
+ return [
98
+ `oneshot_${entry.name}`,
99
+ entry.readOnly ? read(entry.title, own ? OWN : OPEN) : write(entry.title, own ? OWN : OPEN, entry.method === "DELETE"),
100
+ ];
101
+ })),
90
102
  };
@@ -27,7 +27,7 @@ export const browserTool = {
27
27
  },
28
28
  max_steps: {
29
29
  type: "number",
30
- description: "Step-derived budget allowance (25-100, default: 50)",
30
+ description: "Maximum browser steps (25-100, default 50). More steps cost more.",
31
31
  },
32
32
  },
33
33
  required: ["task"],
@@ -1,6 +1,6 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import type { OneShot } from "@oneshot-agent/sdk";
3
- export declare const companySearchTool: Tool;
4
- export declare const enrichCompanyTool: Tool;
5
- export declare function handleCompanySearch(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").CompanySearchResult>;
6
- export declare function handleEnrichCompany(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").EnrichCompanyResult>;
3
+ export declare const companyFindTool: Tool;
4
+ export declare const companyProfileTool: Tool;
5
+ export declare function handleCompanyFind(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").CompanyFindResult>;
6
+ export declare function handleCompanyProfile(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").CompanyProfileResult>;
@@ -1,5 +1,5 @@
1
- export const companySearchTool = {
2
- name: "oneshot_company_search",
1
+ export const companyFindTool = {
2
+ name: "oneshot_company_find",
3
3
  description: "Search for companies by name, domain, industry, location, size, funding stage, or tags. Paid tool.",
4
4
  inputSchema: {
5
5
  type: "object",
@@ -17,8 +17,8 @@ export const companySearchTool = {
17
17
  },
18
18
  },
19
19
  };
20
- export const enrichCompanyTool = {
21
- name: "oneshot_enrich_company",
20
+ export const companyProfileTool = {
21
+ name: "oneshot_company_profile",
22
22
  description: "Enrich a company from its domain, name, LinkedIn URL, or stock ticker. At least one identifier is required. Paid tool.",
23
23
  inputSchema: {
24
24
  type: "object",
@@ -30,8 +30,8 @@ export const enrichCompanyTool = {
30
30
  },
31
31
  },
32
32
  };
33
- export async function handleCompanySearch(agent, args) {
34
- return agent.companySearch({
33
+ export async function handleCompanyFind(agent, args) {
34
+ return agent.companyFind({
35
35
  name: args.name,
36
36
  domain: args.domain,
37
37
  industry: args.industry,
@@ -44,8 +44,8 @@ export async function handleCompanySearch(agent, args) {
44
44
  limit: args.limit,
45
45
  });
46
46
  }
47
- export async function handleEnrichCompany(agent, args) {
48
- return agent.enrichCompany({
47
+ export async function handleCompanyProfile(agent, args) {
48
+ return agent.companyProfile({
49
49
  domain: args.domain,
50
50
  name: args.name,
51
51
  linkedin_url: args.linkedin_url,
@@ -12,9 +12,10 @@ export declare function handleCompute(agent: OneShot, args: Record<string, unkno
12
12
  export declare function handleComputeStatus(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").ComputeGoalStatus>;
13
13
  export declare function handleComputeTasks(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").ComputeOutputContent | import("@oneshot-agent/sdk").ComputeTask[]>;
14
14
  export declare function handleComputeCancel(agent: OneShot, args: Record<string, unknown>): Promise<{
15
- goal_id: string;
15
+ goal_id?: string;
16
16
  status: string;
17
- remaining_budget: string;
17
+ remaining_budget?: string;
18
+ message?: string;
18
19
  }>;
19
20
  export declare function handleComputeRespond(agent: OneShot, args: Record<string, unknown>): Promise<{
20
21
  task_id: string;
@@ -1,12 +1,12 @@
1
1
  export const computeTool = {
2
2
  name: "oneshot_compute",
3
- description: "Create an autonomous compute goal: hand the orchestrator a natural-language objective and a budget, and it plans and executes multi-step work across OneShot tools. Returns a goal id to poll. Paid tool (quote-to-pay against the budget).",
3
+ description: "Create an autonomous compute goal: give OneShot an objective and a budget; it plans and runs the steps across OneShot tools. Returns a goal id to poll. Paid tool (quote-to-pay against the budget).",
4
4
  inputSchema: {
5
5
  type: "object",
6
6
  properties: {
7
7
  objective: {
8
8
  type: "string",
9
- description: "Natural-language objective for the orchestrator to accomplish",
9
+ description: "Natural-language objective for OneShot to accomplish",
10
10
  },
11
11
  budget_usdc: {
12
12
  type: "number",
@@ -60,7 +60,7 @@ export const computeStatusTool = {
60
60
  };
61
61
  export const computeTasksTool = {
62
62
  name: "oneshot_compute_tasks",
63
- description: "List the tasks the orchestrator has planned/executed under a compute goal. Each task lists the `outputs` it produced by key; pass one as `output_key` to read that output's content instead of the task list. Free.",
63
+ description: "List the tasks OneShot has planned and run under a compute goal. Each task lists the `outputs` it produced by key; pass one as `output_key` to read that output's content instead of the task list. Free.",
64
64
  inputSchema: {
65
65
  type: "object",
66
66
  properties: {
@@ -121,7 +121,7 @@ export const computeResumeTool = {
121
121
  };
122
122
  export const computeFundTool = {
123
123
  name: "oneshot_compute_fund",
124
- description: "Top up the USDC budget of a recurring compute goal that is running low or has hit its cap. Quote-to-pay: moves USDC into the goal. Paid tool.",
124
+ description: "Top up the USDC budget of a compute goal that is running low or has hit its cap. A recurring goal can be funded while it runs or is paused; a goal (one-off or recurring) that ended because it ran out of budget (end_reason budget_exhausted) is revived by funding it: it goes back to active with its tasks, workspace and history. Goals that ended any other way, or whose deadline has passed, cannot be funded. Quote-to-pay: moves USDC into the goal. Paid tool.",
125
125
  inputSchema: {
126
126
  type: "object",
127
127
  properties: {
@@ -1,6 +1,6 @@
1
1
  export const listDomainsTool = {
2
2
  name: "oneshot_list_domains",
3
- description: "List the agent's sending domains. Each has default_from (canonical default sender, e.g. agent@domain — billed like any address on its first send), mailbox_mode (relay|mailbox), addresses[] (mailboxes already provisioned — {address, status, warmup_state}; empty means none yet), pool_status (rotation eligibility: active|paused|removed), warmup_state (reputation health: warming|warmed|degraded), pause_reason (warming|low_reputation|manual|null), warmup_score, and daily send limits. mailbox_mode is a property of the domain, fixed when it was set up: on a 'mailbox' domain EVERY address not already active in addresses[] bills the one-time mailbox_provisioning_fee on its first send, the canonical default_from included — omitting mailbox_mode when you quote does not make the send relay. 'relay' domains never charge it. A domain can be paused AND warming — reputation pauses auto-recover once warmed; manual pauses need a resume. Free.",
3
+ description: "List the agent's sending domains. Each has default_from (canonical default sender, e.g. agent@domain — billed like any address on its first send), mailbox_mode (relay|mailbox), addresses[] (mailboxes already provisioned — {address, status, warmup_state}; empty means none yet), pool_status (rotation eligibility: active|paused|removed), warmup_state (reputation health: warming|warmed|degraded), pause_reason (warming|low_reputation|manual|null), warmup_score, and daily send limits. mailbox_mode is a property of the domain, fixed when it was set up: on a 'mailbox' domain EVERY address not already active in addresses[] bills the one-time mailbox_provisioning_fee on its first send, the canonical default_from included. 'relay' domains never charge it. A domain can be paused AND warming — reputation pauses auto-recover once warmed; manual pauses need a resume. Free.",
4
4
  inputSchema: { type: "object", properties: {} },
5
5
  };
6
6
  export const pauseDomainTool = {
@@ -1,7 +1,7 @@
1
1
  export const emailTool = {
2
2
  name: "oneshot_email",
3
3
  description: "Send an email. Supports HTML body, attachments, and threaded replies (set reply_to_email_id to an inbound email id from oneshot_inbox_list/oneshot_inbox_get). Paid tool — quote provided before payment.\n\n" +
4
- "Sending requires a domain the agent owns. A fresh account has none — call oneshot_list_domains first to see what's already owned. If there is no usable domain, pass from_domain with a new domain to register it. A call with a new from_domain only quotes — nothing is charged — and returns status 'confirmation_required' with the exact cost (registrar price + a service fee, plus a mailbox fee if mailbox_mode is 'mailbox') and a quote_id. Tell the user that exact computed number, never a guessed or approximate one, and only once they say to proceed, call this again with the same arguments and confirm_new_domain set to that quote_id: that registers the domain, charges exactly the quoted total (the stored quote is used, there is no re-quote), and sends the email in one call. The workspace balance must cover it, or the call fails with insufficient_credits.",
4
+ "Sending requires a domain the agent owns. A fresh account has none — call oneshot_list_domains first to see what's already owned. If there is no usable domain, pass from_domain with a new domain to register it. A call with a new from_domain only quotes — nothing is charged — and returns status 'confirmation_required' with the exact cost (domain registration plus fees) and a quote_id. Tell the user that exact computed number, never a guessed or approximate one, and only once they say to proceed, call this again with the same arguments and confirm_new_domain set to that quote_id: that registers the domain, charges exactly the quoted total, and sends the email in one call. The workspace balance must cover it, or the call fails with insufficient_credits.",
5
5
  inputSchema: {
6
6
  type: "object",
7
7
  properties: {
@@ -36,7 +36,7 @@ export const emailTool = {
36
36
  mailbox_mode: {
37
37
  type: "string",
38
38
  enum: ["relay", "mailbox"],
39
- description: "How this domain sends (optional). 'relay' = header send, no per-address mailbox, no mailbox fee. 'mailbox' = a real dedicated mailbox per address (better deliverability + per-address warmup); each new address adds a one-time mailbox_provisioning_fee to the quote. Only honored while a domain is unprovisioned (brand new, or owned with provisioning_status 'unprovisioned') — an already-provisioned domain keeps the mode it was created with, which means OMITTING this does not make a send relay and does not avoid the fee. On a domain already in mailbox mode every address that isn't active yet bills the fee on its first send, the default agent@ included; from_mailbox does not change that. Use oneshot_list_domains to see each domain's mailbox_mode before quoting.",
39
+ description: "How this domain sends (optional). 'relay' = no dedicated mailbox, no mailbox fee. 'mailbox' = a real dedicated mailbox per address (better deliverability + per-address warmup); each new address adds a one-time mailbox_provisioning_fee to the quote. Only honored while a domain is unprovisioned (brand new, or owned with provisioning_status 'unprovisioned') — an already-provisioned domain keeps the mode it was created with, which means OMITTING this does not make a send relay and does not avoid the fee. On a domain already in mailbox mode every address that isn't active yet bills the fee on its first send, the default agent@ included; from_mailbox does not change that. Use oneshot_list_domains to see each domain's mailbox_mode before quoting.",
40
40
  },
41
41
  attachments: {
42
42
  type: "array",
@@ -1,8 +1,8 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import type { OneShot } from "@oneshot-agent/sdk";
3
- export declare const enrichProfileTool: Tool;
4
- export declare const findEmailTool: Tool;
5
- export declare const verifyEmailTool: Tool;
6
- export declare function handleEnrichProfile(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").EnrichProfileResult>;
7
- export declare function handleFindEmail(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").FindEmailResult>;
8
- export declare function handleVerifyEmail(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").VerifyEmailResult>;
3
+ export declare const personProfileTool: Tool;
4
+ export declare const personEmailTool: Tool;
5
+ export declare const personEmailStatusTool: Tool;
6
+ export declare function handlePersonProfile(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").PersonProfileResult>;
7
+ export declare function handlePersonEmail(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").PersonEmailResult>;
8
+ export declare function handlePersonEmailStatus(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").PersonEmailStatusResult>;
@@ -1,5 +1,5 @@
1
- export const enrichProfileTool = {
2
- name: "oneshot_enrich_profile",
1
+ export const personProfileTool = {
2
+ name: "oneshot_person_profile",
3
3
  description: "Enrich a person's profile from LinkedIn URL, email, or name. Returns job title, company, social links, etc. Paid tool.",
4
4
  inputSchema: {
5
5
  type: "object",
@@ -23,8 +23,8 @@ export const enrichProfileTool = {
23
23
  },
24
24
  },
25
25
  };
26
- export const findEmailTool = {
27
- name: "oneshot_find_email",
26
+ export const personEmailTool = {
27
+ name: "oneshot_person_email",
28
28
  description: "Find email address for a person at a company. Paid tool.",
29
29
  inputSchema: {
30
30
  type: "object",
@@ -49,8 +49,8 @@ export const findEmailTool = {
49
49
  required: ["company_domain"],
50
50
  },
51
51
  };
52
- export const verifyEmailTool = {
53
- name: "oneshot_verify_email",
52
+ export const personEmailStatusTool = {
53
+ name: "oneshot_person_email_status",
54
54
  description: "Verify if an email address is valid and deliverable. Paid tool.",
55
55
  inputSchema: {
56
56
  type: "object",
@@ -63,24 +63,24 @@ export const verifyEmailTool = {
63
63
  required: ["email"],
64
64
  },
65
65
  };
66
- export async function handleEnrichProfile(agent, args) {
67
- return agent.enrichProfile({
66
+ export async function handlePersonProfile(agent, args) {
67
+ return agent.personProfile({
68
68
  linkedin_url: args.linkedin_url,
69
69
  email: args.email,
70
70
  name: args.name,
71
71
  company_domain: args.company_domain,
72
72
  });
73
73
  }
74
- export async function handleFindEmail(agent, args) {
75
- return agent.findEmail({
74
+ export async function handlePersonEmail(agent, args) {
75
+ return agent.personEmail({
76
76
  full_name: args.full_name,
77
77
  first_name: args.first_name,
78
78
  last_name: args.last_name,
79
79
  company_domain: args.company_domain,
80
80
  });
81
81
  }
82
- export async function handleVerifyEmail(agent, args) {
83
- return agent.verifyEmail({
82
+ export async function handlePersonEmailStatus(agent, args) {
83
+ return agent.personEmailStatus({
84
84
  email: args.email,
85
85
  });
86
86
  }
@@ -1,4 +1,4 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import type { OneShot } from "@oneshot-agent/sdk";
3
- export declare const govSolicitationsTool: Tool;
4
- export declare function handleGovSolicitations(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").GovSolicitationsResult>;
3
+ export declare const recordSolicitationsFindTool: Tool;
4
+ export declare function handleRecordSolicitationsFind(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").RecordSolicitationsFindResult>;
package/dist/tools/gov.js CHANGED
@@ -1,5 +1,5 @@
1
- export const govSolicitationsTool = {
2
- name: "oneshot_gov_solicitations",
1
+ export const recordSolicitationsFindTool = {
2
+ name: "oneshot_record_solicitations_find",
3
3
  description: "Federal contract opportunities (SAM.gov) by NAICS code — Sources Sought and Presolicitation notices with the contracting officer's published name and email, agency, response deadline, set-aside, and description. Use for government buyers instead of people_search. Flat price per search. Paid tool.",
4
4
  inputSchema: {
5
5
  type: "object",
@@ -19,8 +19,8 @@ export const govSolicitationsTool = {
19
19
  required: ["naics"],
20
20
  },
21
21
  };
22
- export async function handleGovSolicitations(agent, args) {
23
- return agent.govSolicitations({
22
+ export async function handleRecordSolicitationsFind(agent, args) {
23
+ return agent.recordSolicitationsFind({
24
24
  naics: args.naics,
25
25
  notice_types: args.notice_types,
26
26
  since_days: args.since_days,
@@ -3,9 +3,9 @@ import { voiceTool, handleVoice } from "./voice.js";
3
3
  import { voiceNumberProvisionTool, voiceNumbersTool, voiceInboundSetTool, voiceInboundDisableTool, voiceInboundCallsTool, handleVoiceNumberProvision, handleVoiceNumbers, handleVoiceInboundSet, handleVoiceInboundDisable, handleVoiceInboundCalls, } from "./voice-inbound.js";
4
4
  import { smsTool, handleSms } from "./sms.js";
5
5
  import { researchTool, handleResearch } from "./research.js";
6
- import { peopleSearchTool, handlePeopleSearch } from "./people.js";
6
+ import { personFindTool, handlePersonFind } from "./people.js";
7
7
  import { commerceSearchTool, commerceBuyTool, handleCommerceSearch, handleCommerceBuy } from "./commerce.js";
8
- import { enrichProfileTool, findEmailTool, verifyEmailTool, handleEnrichProfile, handleFindEmail, handleVerifyEmail } from "./enrichment.js";
8
+ import { personProfileTool, personEmailTool, personEmailStatusTool, handlePersonProfile, handlePersonEmail, handlePersonEmailStatus } from "./enrichment.js";
9
9
  import { inboxListTool, inboxGetTool, handleInboxList, handleInboxGet } from "./inbox.js";
10
10
  import { smsInboxListTool, smsInboxGetTool, handleSmsInboxList, handleSmsInboxGet } from "./sms-inbox.js";
11
11
  import { notificationsTool, markReadTool, handleNotifications, handleMarkRead } from "./notifications.js";
@@ -15,15 +15,16 @@ import { buildTool, updateBuildTool, handleBuild, handleUpdateBuild } from "./bu
15
15
  import { browserTool, browserCreateProfileTool, browserListProfilesTool, browserDeleteProfileTool, handleBrowser, handleBrowserCreateProfile, handleBrowserListProfiles, handleBrowserDeleteProfile } from "./browser.js";
16
16
  import { webSearchTool, handleWebSearch } from "./search.js";
17
17
  import { webReadTool, handleWebRead } from "./web-read.js";
18
- import { deepResearchPersonTool, socialProfilesTool, articleSearchTool, personNewsfeedTool, personInterestsTool, personInteractionsTool, handleDeepResearchPerson, handleSocialProfiles, handleArticleSearch, handlePersonNewsfeed, handlePersonInterests, handlePersonInteractions } from "./nyne.js";
19
- import { companySearchTool, enrichCompanyTool, handleCompanySearch, handleEnrichCompany } from "./company.js";
20
- import { localSearchTool, localResolveTool, handleLocalSearch, handleLocalResolve } from "./local.js";
21
- import { govSolicitationsTool, handleGovSolicitations } from "./gov.js";
18
+ import { personDossierTool, personSocialAccountsTool, personArticlesTool, personPostsTool, personInterestsTool, personFollowersTool, handlePersonDossier, handlePersonSocialAccounts, handlePersonArticles, handlePersonPosts, handlePersonInterests, handlePersonFollowers } from "./nyne.js";
19
+ import { companyFindTool, companyProfileTool, handleCompanyFind, handleCompanyProfile } from "./company.js";
20
+ import { businessFindTool, businessResolveTool, handleBusinessFind, handleBusinessResolve } from "./local.js";
21
+ import { recordSolicitationsFindTool, handleRecordSolicitationsFind } from "./gov.js";
22
22
  import { linkedinConnectTool, linkedinAccountsTool, linkedinSyncTool, linkedinConversationsTool, linkedinMessagesTool, linkedinReplyTool, linkedinViewProfileTool, linkedinReactTool, linkedinInviteTool, linkedinWithdrawInvitationTool, linkedinMessageTool, linkedinInvitationTool, linkedinInvitationsTool, handleLinkedinConnect, handleLinkedinAccounts, handleLinkedinSync, handleLinkedinConversations, handleLinkedinMessages, handleLinkedinReply, handleLinkedinViewProfile, handleLinkedinReact, handleLinkedinInvite, handleLinkedinWithdrawInvitation, handleLinkedinMessage, handleLinkedinInvitation, handleLinkedinInvitations, } from "./linkedin.js";
23
23
  import { computeTool, computeStatusTool, computeTasksTool, computeCancelTool, computeRespondTool, computePauseTool, computeResumeTool, computeFundTool, handleCompute, handleComputeStatus, handleComputeTasks, handleComputeCancel, handleComputeRespond, handleComputePause, handleComputeResume, handleComputeFund } from "./compute.js";
24
24
  import { listDomainsTool, pauseDomainTool, resumeDomainTool, handleListDomains, handlePauseDomain, handleResumeDomain } from "./domains.js";
25
25
  import { huntListTool, huntStatusTool, huntPredictTool, huntCollectionTool, huntLeaderboardTool, handleHuntList, handleHuntStatus, handleHuntPredict, handleHuntCollection, handleHuntLeaderboard } from "./hunt.js";
26
26
  import { TOOL_ANNOTATIONS } from "./annotations.js";
27
+ import { lookupToolDefinitions, lookupHandlers, routeToolDefinitions, routeHandlers } from "./lookup.js";
27
28
  import { spendBreakdownTool, rocsTool, rocsByGoalTool, receiptsListTool, tagReceiptValueTool, handleSpendBreakdown, handleRocs, handleRocsByGoal, handleReceiptsList, handleTagReceiptValue } from "./analytics.js";
28
29
  const toolDefinitions = [
29
30
  emailTool,
@@ -39,22 +40,22 @@ const toolDefinitions = [
39
40
  voiceInboundDisableTool,
40
41
  voiceInboundCallsTool,
41
42
  researchTool,
42
- peopleSearchTool,
43
- enrichProfileTool,
44
- findEmailTool,
45
- verifyEmailTool,
43
+ personFindTool,
44
+ personProfileTool,
45
+ personEmailTool,
46
+ personEmailStatusTool,
46
47
  webSearchTool,
47
- deepResearchPersonTool,
48
- socialProfilesTool,
49
- articleSearchTool,
50
- personNewsfeedTool,
48
+ personDossierTool,
49
+ personSocialAccountsTool,
50
+ personArticlesTool,
51
+ personPostsTool,
51
52
  personInterestsTool,
52
- personInteractionsTool,
53
- companySearchTool,
54
- enrichCompanyTool,
55
- localSearchTool,
56
- localResolveTool,
57
- govSolicitationsTool,
53
+ personFollowersTool,
54
+ companyFindTool,
55
+ companyProfileTool,
56
+ businessFindTool,
57
+ businessResolveTool,
58
+ recordSolicitationsFindTool,
58
59
  commerceSearchTool,
59
60
  commerceBuyTool,
60
61
  computeTool,
@@ -104,6 +105,8 @@ const toolDefinitions = [
104
105
  approvalListTool,
105
106
  approvalCancelTool,
106
107
  actionPolicyGetTool,
108
+ ...lookupToolDefinitions,
109
+ ...routeToolDefinitions,
107
110
  ];
108
111
  // Every tool carries a human title and the three MCP hints clients rely on
109
112
  // (ChatGPT confirms any tool that is not read-only). See annotations.ts.
@@ -127,22 +130,22 @@ const handlers = {
127
130
  "oneshot_voice_inbound_disable": handleVoiceInboundDisable,
128
131
  "oneshot_voice_inbound_calls": handleVoiceInboundCalls,
129
132
  "oneshot_research": handleResearch,
130
- "oneshot_people_search": handlePeopleSearch,
131
- "oneshot_enrich_profile": handleEnrichProfile,
132
- "oneshot_find_email": handleFindEmail,
133
- "oneshot_verify_email": handleVerifyEmail,
133
+ "oneshot_person_find": handlePersonFind,
134
+ "oneshot_person_profile": handlePersonProfile,
135
+ "oneshot_person_email": handlePersonEmail,
136
+ "oneshot_person_email_status": handlePersonEmailStatus,
134
137
  "oneshot_web_search": handleWebSearch,
135
- "oneshot_deep_research_person": handleDeepResearchPerson,
136
- "oneshot_social_profiles": handleSocialProfiles,
137
- "oneshot_article_search": handleArticleSearch,
138
- "oneshot_person_newsfeed": handlePersonNewsfeed,
138
+ "oneshot_person_dossier": handlePersonDossier,
139
+ "oneshot_person_social_accounts": handlePersonSocialAccounts,
140
+ "oneshot_person_articles": handlePersonArticles,
141
+ "oneshot_person_posts": handlePersonPosts,
139
142
  "oneshot_person_interests": handlePersonInterests,
140
- "oneshot_person_interactions": handlePersonInteractions,
141
- "oneshot_company_search": handleCompanySearch,
142
- "oneshot_enrich_company": handleEnrichCompany,
143
- "oneshot_local_search": handleLocalSearch,
144
- "oneshot_local_resolve": handleLocalResolve,
145
- "oneshot_gov_solicitations": handleGovSolicitations,
143
+ "oneshot_person_followers": handlePersonFollowers,
144
+ "oneshot_company_find": handleCompanyFind,
145
+ "oneshot_company_profile": handleCompanyProfile,
146
+ "oneshot_business_find": handleBusinessFind,
147
+ "oneshot_business_resolve": handleBusinessResolve,
148
+ "oneshot_record_solicitations_find": handleRecordSolicitationsFind,
146
149
  "oneshot_commerce_search": handleCommerceSearch,
147
150
  "oneshot_commerce_buy": handleCommerceBuy,
148
151
  "oneshot_compute": handleCompute,
@@ -195,6 +198,8 @@ const handlers = {
195
198
  "oneshot_approval_list": handleApprovalList,
196
199
  "oneshot_approval_cancel": handleApprovalCancel,
197
200
  "oneshot_action_policy": handleActionPolicyGet,
201
+ ...lookupHandlers,
202
+ ...routeHandlers,
198
203
  };
199
204
  export async function handleToolCall(agent, toolName, args) {
200
205
  const handler = handlers[toolName];
@@ -7,7 +7,7 @@
7
7
  const GRANT_ACTIONS = ["read", "reply", "view_profile", "react", "invite", "comment"];
8
8
  export const linkedinConnectTool = {
9
9
  name: "oneshot_linkedin_connect",
10
- description: "Create a hosted LinkedIn login link for a human to connect THEIR OWN LinkedIn account to this agent, granting specific actions (read, reply, view_profile, react, invite). Returns intent_id + url (show the url to the human; it expires in 30 minutes; never embed it in an iframe). Poll oneshot_linkedin_accounts with the intent_id afterwards. Free tool. If no active account exists, or status is deleted_upstream/revoked, ask the human to connect again with oneshot_linkedin_connect and choose grants anew. reconnect_required applies only to an existing connection; reconnect is managed by the owning application.",
10
+ description: "Create a hosted LinkedIn login link for a human to connect THEIR OWN LinkedIn account to this agent, granting specific actions (read, reply, view_profile, react, invite). Returns intent_id + url (show the url to the human; it expires in 30 minutes; never embed it in an iframe). Poll oneshot_linkedin_accounts with the intent_id afterwards. Free tool. If no active account exists, or status is connection_deleted/revoked, ask the human to connect again with oneshot_linkedin_connect and choose grants anew. reconnect_required applies only to an existing connection; reconnect is managed by the owning application.",
11
11
  inputSchema: {
12
12
  type: "object",
13
13
  properties: {
@@ -20,7 +20,7 @@ export const linkedinConnectTool = {
20
20
  };
21
21
  export const linkedinAccountsTool = {
22
22
  name: "oneshot_linkedin_accounts",
23
- description: "List the LinkedIn accounts connected to this agent (status, granted actions, sync coverage), or, with intent_id, check a pending connection from oneshot_linkedin_connect (pending → completed with the account, or failed with a reason). Free tool. If no active account exists, or status is deleted_upstream/revoked, ask the human to connect again with oneshot_linkedin_connect and choose grants anew. reconnect_required applies only to an existing connection; reconnect is managed by the owning application.",
23
+ description: "List the LinkedIn accounts connected to this agent (status, granted actions, sync coverage), or, with intent_id, check a pending connection from oneshot_linkedin_connect (pending → completed with the account, or failed with a reason). Free tool. If no active account exists, or status is connection_deleted/revoked, ask the human to connect again with oneshot_linkedin_connect and choose grants anew. reconnect_required applies only to an existing connection; reconnect is managed by the owning application.",
24
24
  inputSchema: {
25
25
  type: "object",
26
26
  properties: {
@@ -37,7 +37,7 @@ export const linkedinSyncTool = {
37
37
  type: "object",
38
38
  properties: {
39
39
  account_id: { type: "string", description: "Connected LinkedIn account id (required)" },
40
- mode: { type: "string", enum: ["continue", "restart", "history"], description: "continue = resume the paused cursor (default); restart = discard paused cursors; history = also re-request the provider's history back-fill" },
40
+ mode: { type: "string", enum: ["continue", "restart", "history"], description: "continue = resume the paused cursor (default); restart = discard paused cursors; history = also re-import older messages" },
41
41
  max_pages: { type: "number", description: "Pages of 250 messages this run may fetch (1-10, default 10)" },
42
42
  memo: { type: "string", description: "Why this sync is running (audit trail)" },
43
43
  },
@@ -73,14 +73,14 @@ export const linkedinMessagesTool = {
73
73
  changed_since: { type: "string", description: "ISO time: only messages updated after this" },
74
74
  cursor: { type: "string", description: "next_cursor from the previous page" },
75
75
  limit: { type: "number", description: "1-100, default 50" },
76
- include_deleted: { type: "boolean", description: "Include messages deleted upstream (default false)" },
76
+ include_deleted: { type: "boolean", description: "Include messages deleted on LinkedIn (default false)" },
77
77
  },
78
78
  required: ["account_id"],
79
79
  },
80
80
  };
81
81
  export const linkedinReplyTool = {
82
82
  name: "oneshot_linkedin_reply",
83
- description: "Send a reply in an existing LinkedIn conversation through a connected account that granted 'reply'. The human's account sends it; a message LinkedIn accepted cannot be recalled. Per-account daily cap (default 50) shared by every caller; sends are paced. An Idempotency-Key is generated automatically so a retry never double-sends. Outcome (sent / failed / ambiguous-under-reconciliation) is in the returned job result. Paid tool (flat price per message).",
83
+ description: "Send a reply in an existing LinkedIn conversation through a connected account that granted 'reply'. The human's account sends it; a message LinkedIn accepted cannot be recalled. Per-account daily cap (default 50) shared by every caller; sends are paced. An Idempotency-Key is generated automatically so a retry never double-sends. Outcome (sent, failed or unconfirmed) is in the job result. Paid tool (flat price per message).",
84
84
  inputSchema: {
85
85
  type: "object",
86
86
  properties: {
@@ -100,8 +100,9 @@ export const linkedinViewProfileTool = {
100
100
  type: "object",
101
101
  properties: {
102
102
  account_id: { type: "string", description: "Connected LinkedIn account id (required)" },
103
- identifier: { type: "string", description: "Public identifier, provider id, or a linkedin.com/in/<slug> URL (required)" },
103
+ identifier: { type: "string", description: "Profile slug, profile id or linkedin.com/in/<slug> URL (required)" },
104
104
  notify: { type: "boolean", description: "Default false. true = the profile owner sees the view." },
105
+ sections: { type: "array", items: { type: "string", enum: ["experience"] }, description: "Optional extra sections. 'experience' adds profile.experience (company, title, start, end, current, location) and profile.experience_complete (false = LinkedIn held the section back or an entry was dropped, so an empty list is not proof of no jobs). Omitted: both are null." },
105
106
  memo: { type: "string", description: "Why (audit trail)" },
106
107
  idempotency_key: { type: "string", description: "Optional caller-supplied key; reuse it to safely retry the same view without paying or notifying twice" },
107
108
  },
@@ -183,6 +184,7 @@ export async function handleLinkedinViewProfile(agent, args) {
183
184
  accountId: args.account_id,
184
185
  identifier: args.identifier,
185
186
  notify: args.notify,
187
+ sections: args.sections,
186
188
  memo: args.memo,
187
189
  idempotencyKey: args.idempotency_key,
188
190
  });
@@ -1,6 +1,6 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import type { OneShot } from "@oneshot-agent/sdk";
3
- export declare const localSearchTool: Tool;
4
- export declare const localResolveTool: Tool;
5
- export declare function handleLocalSearch(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").LocalSearchResult>;
6
- export declare function handleLocalResolve(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").LocalResolveResult>;
3
+ export declare const businessFindTool: Tool;
4
+ export declare const businessResolveTool: Tool;
5
+ export declare function handleBusinessFind(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").BusinessFindResult>;
6
+ export declare function handleBusinessResolve(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").BusinessResolveResult>;