@oneshot-agent/mcp-server 0.35.0 → 0.36.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
 
@@ -175,9 +175,9 @@ Soul Hunt is a separate service (`api.soulhunt.ai`) from the main OneShot API; t
175
175
  | `oneshot_verify_email` | Verify email deliverability |
176
176
  | `oneshot_company_search` | Search for companies by industry, size, location, etc. |
177
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 |
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
 
@@ -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 |
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.36.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. */
@@ -37,9 +38,9 @@ export const TOOL_ANNOTATIONS = {
37
38
  oneshot_person_interactions: read("Find a person's interactions", OPEN),
38
39
  oneshot_company_search: read("Find companies", OPEN),
39
40
  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),
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"],
@@ -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,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,
@@ -17,13 +17,14 @@ import { webSearchTool, handleWebSearch } from "./search.js";
17
17
  import { webReadTool, handleWebRead } from "./web-read.js";
18
18
  import { deepResearchPersonTool, socialProfilesTool, articleSearchTool, personNewsfeedTool, personInterestsTool, personInteractionsTool, handleDeepResearchPerson, handleSocialProfiles, handleArticleSearch, handlePersonNewsfeed, handlePersonInterests, handlePersonInteractions } from "./nyne.js";
19
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";
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,
@@ -52,9 +53,9 @@ const toolDefinitions = [
52
53
  personInteractionsTool,
53
54
  companySearchTool,
54
55
  enrichCompanyTool,
55
- localSearchTool,
56
- localResolveTool,
57
- govSolicitationsTool,
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.
@@ -140,9 +143,9 @@ const handlers = {
140
143
  "oneshot_person_interactions": handlePersonInteractions,
141
144
  "oneshot_company_search": handleCompanySearch,
142
145
  "oneshot_enrich_company": handleEnrichCompany,
143
- "oneshot_local_search": handleLocalSearch,
144
- "oneshot_local_resolve": handleLocalResolve,
145
- "oneshot_gov_solicitations": handleGovSolicitations,
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];
@@ -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>;
@@ -1,5 +1,5 @@
1
- export const localSearchTool = {
2
- name: "oneshot_local_search",
1
+ export const businessFindTool = {
2
+ name: "oneshot_business_find",
3
3
  description: "Discover local main-street businesses (restaurants, contractors, dental practices, auto shops) by category or keywords in a location. Use this instead of people_search for independent local businesses. Flat price per search. Paid tool.",
4
4
  inputSchema: {
5
5
  type: "object",
@@ -18,8 +18,8 @@ export const localSearchTool = {
18
18
  anyOf: [{ required: ["category"] }, { required: ["keywords"] }],
19
19
  },
20
20
  };
21
- export const localResolveTool = {
22
- name: "oneshot_local_resolve",
21
+ export const businessResolveTool = {
22
+ name: "oneshot_business_resolve",
23
23
  description: "Resolve a local business name plus one locating field (address, city, postal code, or phone) to its website domain, phone, category, and operating status with a match confidence. A miss returns found=false, not an error. Paid tool.",
24
24
  inputSchema: {
25
25
  type: "object",
@@ -35,8 +35,8 @@ export const localResolveTool = {
35
35
  anyOf: [{ required: ["address"] }, { required: ["city"] }, { required: ["postal_code"] }, { required: ["phone"] }],
36
36
  },
37
37
  };
38
- export async function handleLocalSearch(agent, args) {
39
- return agent.localSearch({
38
+ export async function handleBusinessFind(agent, args) {
39
+ return agent.businessFind({
40
40
  category: args.category,
41
41
  keywords: args.keywords,
42
42
  location: args.location,
@@ -48,8 +48,8 @@ export async function handleLocalSearch(agent, args) {
48
48
  limit: args.limit,
49
49
  });
50
50
  }
51
- export async function handleLocalResolve(agent, args) {
52
- return agent.localResolve({
51
+ export async function handleBusinessResolve(agent, args) {
52
+ return agent.businessResolve({
53
53
  name: args.name,
54
54
  address: args.address,
55
55
  city: args.city,
@@ -0,0 +1,34 @@
1
+ export interface LookupManifestEntry {
2
+ /** The lookup tool's name; the MCP tool is `oneshot_<name>`. */
3
+ name: string;
4
+ /** What is passed to `agent.tool()`. */
5
+ path: string;
6
+ title: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: Record<string, object>;
11
+ required: string[];
12
+ };
13
+ example: Record<string, unknown>;
14
+ }
15
+ export declare const LOOKUP_MANIFEST: readonly LookupManifestEntry[];
16
+ /** A declared route with no hand-written MCP tool (#1580): `oneshot_<name>`, called by `agent.route(method, path, input)`. */
17
+ export interface RouteManifestEntry {
18
+ name: string;
19
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
20
+ /** The route path; `{param}` is an input that is put into the path. */
21
+ path: string;
22
+ /** A paid route: quote-to-pay, then the call. Otherwise a signed free call. */
23
+ paid: boolean;
24
+ readOnly: boolean;
25
+ title: string;
26
+ description: string;
27
+ inputSchema: {
28
+ type: "object";
29
+ properties: Record<string, object>;
30
+ required: string[];
31
+ };
32
+ example: Record<string, unknown>;
33
+ }
34
+ export declare const ROUTE_MANIFEST: readonly RouteManifestEntry[];