@oneshot-agent/mcp-server 0.34.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 +5 -5
- package/dist/index.js +1 -1
- package/dist/tools/annotations.js +15 -3
- package/dist/tools/browser.js +1 -1
- package/dist/tools/compute.d.ts +4 -3
- package/dist/tools/compute.js +9 -5
- package/dist/tools/domains.js +1 -1
- package/dist/tools/email.js +2 -2
- package/dist/tools/gov.d.ts +2 -2
- package/dist/tools/gov.js +4 -4
- package/dist/tools/index.js +13 -8
- package/dist/tools/linkedin.js +6 -4
- package/dist/tools/local.d.ts +4 -4
- package/dist/tools/local.js +8 -8
- package/dist/tools/lookup-manifest.generated.d.ts +34 -0
- package/dist/tools/lookup-manifest.generated.js +1339 -0
- package/dist/tools/lookup.d.ts +29 -0
- package/dist/tools/lookup.js +44 -0
- package/dist/tools/people.js +3 -3
- package/package.json +2 -2
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
|
|
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
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
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);
|
|
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.
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
};
|
package/dist/tools/browser.js
CHANGED
|
@@ -27,7 +27,7 @@ export const browserTool = {
|
|
|
27
27
|
},
|
|
28
28
|
max_steps: {
|
|
29
29
|
type: "number",
|
|
30
|
-
description: "
|
|
30
|
+
description: "Maximum browser steps (25-100, default 50). More steps cost more.",
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
required: ["task"],
|
package/dist/tools/compute.d.ts
CHANGED
|
@@ -10,11 +10,12 @@ export declare const computeResumeTool: Tool;
|
|
|
10
10
|
export declare const computeFundTool: Tool;
|
|
11
11
|
export declare function handleCompute(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").ComputeGoalResult>;
|
|
12
12
|
export declare function handleComputeStatus(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").ComputeGoalStatus>;
|
|
13
|
-
export declare function handleComputeTasks(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").ComputeTask[]>;
|
|
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
|
|
15
|
+
goal_id?: string;
|
|
16
16
|
status: string;
|
|
17
|
-
remaining_budget
|
|
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;
|
package/dist/tools/compute.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export const computeTool = {
|
|
2
2
|
name: "oneshot_compute",
|
|
3
|
-
description: "Create an autonomous compute goal:
|
|
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
|
|
9
|
+
description: "Natural-language objective for OneShot to accomplish",
|
|
10
10
|
},
|
|
11
11
|
budget_usdc: {
|
|
12
12
|
type: "number",
|
|
@@ -49,7 +49,7 @@ export const computeTool = {
|
|
|
49
49
|
};
|
|
50
50
|
export const computeStatusTool = {
|
|
51
51
|
name: "oneshot_compute_status",
|
|
52
|
-
description: "Get the current status of a compute goal (state, budget remaining, progress)
|
|
52
|
+
description: "Get the current status of a compute goal (state, budget remaining, progress) and, once it has finished, its answer in `result`. Free.",
|
|
53
53
|
inputSchema: {
|
|
54
54
|
type: "object",
|
|
55
55
|
properties: {
|
|
@@ -60,11 +60,12 @@ export const computeStatusTool = {
|
|
|
60
60
|
};
|
|
61
61
|
export const computeTasksTool = {
|
|
62
62
|
name: "oneshot_compute_tasks",
|
|
63
|
-
description: "List the tasks
|
|
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: {
|
|
67
67
|
goal_id: { type: "string", description: "Compute goal id" },
|
|
68
|
+
output_key: { type: "string", description: "Optional. A key from a task's `outputs` (for example artifacts/<task_id>/result.txt): returns that output with its content." },
|
|
68
69
|
},
|
|
69
70
|
required: ["goal_id"],
|
|
70
71
|
},
|
|
@@ -120,7 +121,7 @@ export const computeResumeTool = {
|
|
|
120
121
|
};
|
|
121
122
|
export const computeFundTool = {
|
|
122
123
|
name: "oneshot_compute_fund",
|
|
123
|
-
description: "Top up the USDC budget of a
|
|
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.",
|
|
124
125
|
inputSchema: {
|
|
125
126
|
type: "object",
|
|
126
127
|
properties: {
|
|
@@ -146,6 +147,9 @@ export async function handleComputeStatus(agent, args) {
|
|
|
146
147
|
return agent.getComputeGoal(args.goal_id);
|
|
147
148
|
}
|
|
148
149
|
export async function handleComputeTasks(agent, args) {
|
|
150
|
+
if (typeof args.output_key === "string" && args.output_key) {
|
|
151
|
+
return agent.getComputeOutput(args.goal_id, args.output_key);
|
|
152
|
+
}
|
|
149
153
|
return agent.getComputeTasks(args.goal_id);
|
|
150
154
|
}
|
|
151
155
|
export async function handleComputeCancel(agent, args) {
|
package/dist/tools/domains.js
CHANGED
|
@@ -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
|
|
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 = {
|
package/dist/tools/email.js
CHANGED
|
@@ -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 (
|
|
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' =
|
|
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",
|
package/dist/tools/gov.d.ts
CHANGED
|
@@ -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
|
|
4
|
-
export declare function
|
|
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
|
|
2
|
-
name: "
|
|
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
|
|
23
|
-
return agent.
|
|
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,
|
package/dist/tools/index.js
CHANGED
|
@@ -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 {
|
|
21
|
-
import {
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
"
|
|
144
|
-
"
|
|
145
|
-
"
|
|
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];
|
package/dist/tools/linkedin.js
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
|
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: "
|
|
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
|
});
|
package/dist/tools/local.d.ts
CHANGED
|
@@ -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
|
|
4
|
-
export declare const
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
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>;
|
package/dist/tools/local.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const
|
|
2
|
-
name: "
|
|
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
|
|
22
|
-
name: "
|
|
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
|
|
39
|
-
return agent.
|
|
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
|
|
52
|
-
return agent.
|
|
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[];
|