@oneshot-agent/mcp-server 0.50.0 → 0.51.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
@@ -84,7 +84,7 @@ Every tool is named `oneshot_<name>`. Below are the names.
84
84
  | [Think](https://docs.oneshotagent.com/api-reference/research) | `research` `predict` `solve` |
85
85
  | [Web and buying](https://docs.oneshotagent.com/api-reference/web-search) | `web_search` `web_read` `browser` `product_find` `commerce_buy` |
86
86
  | [Physical mail](https://docs.oneshotagent.com/api-reference/physical-mail/overview) | `physical_mail_upload` `physical_mail_validate_address` `physical_mail_preview` `physical_mail_quote` `physical_mail_approve` `physical_mail_send` `physical_mail_recover` `physical_mail_order` `physical_mail_cancel` |
87
- | [Connected systems](https://docs.oneshotagent.com/api-reference/connections/overview) | `connections_list` `ledger_invoices` `ledger_invoice_lines` `ledger_bills` `ledger_reports` `ledger_bank_transactions` `crm_accounts` `crm_contacts` `crm_opportunities` `tax_rates` `tax_calculate` `shipping_shipments` `shipping_tracking` `shipping_rates` `procurement_transactions` `procurement_bills` `procurement_suppliers` `meetings_list` `meetings_get` |
87
+ | [Connected systems](https://docs.oneshotagent.com/api-reference/connections/overview) | `connections_list` `ledger_invoices` `ledger_invoice_lines` `ledger_bills` `ledger_reports` `ledger_bank_transactions` `crm_accounts` `crm_contacts` `crm_opportunities` `crm_tickets` `crm_activity` `tax_rates` `tax_calculate` `shipping_shipments` `shipping_tracking` `shipping_rates` `procurement_transactions` `procurement_bills` `procurement_suppliers` `meetings_list` `meetings_get` `field_service_clients` `field_service_jobs` `field_service_quotes` `field_service_invoices` |
88
88
  | [LinkedIn](https://docs.oneshotagent.com/api-reference/linkedin/overview) | `linkedin_connect` `linkedin_accounts` `linkedin_invite` `linkedin_message` `linkedin_reply` and more |
89
89
  | [Build](https://docs.oneshotagent.com/api-reference/build/create) | `build` `update_build` |
90
90
  | [Goals](https://docs.oneshotagent.com/api-reference/compute/create) | `compute` `compute_status` `compute_tasks` `compute_respond` `compute_pause` `compute_resume` `compute_fund` `compute_cancel` |
@@ -110,9 +110,10 @@ wallet. The server signs it for you. A read with no proof and no valid token is
110
110
  ## Tool notes
111
111
 
112
112
  - **Email.** Omit `from_domain` and `from_mailbox` and the send rotates across
113
- your warmed domains. `from_mailbox` needs `from_domain`. A new `from_domain`
114
- only quotes; nothing is charged until you confirm. `mailbox_mode` applies only
115
- when a domain is first set up. [Details](https://docs.oneshotagent.com/api-reference/email/send).
113
+ your domains, each from its main address. `from_mailbox` needs `from_domain`
114
+ and must be one of the domain's addresses. A new `from_domain` or address only
115
+ quotes its setup; nothing is charged or sent. The owner picks the domain's mode
116
+ and addresses when buying it. [Details](https://docs.oneshotagent.com/api-reference/email/send).
116
117
  - **Phone lookup** is off by default on `person_find`, `person_profile` and
117
118
  `person_dossier`. `include_phone: true` is charged for each person you ask for
118
119
  (the search limit, default 100), or once for a profile or dossier, found or not.
@@ -149,7 +150,7 @@ wallet. The server signs it for you. A read with no proof and no valid token is
149
150
 
150
151
  ## Tool discovery
151
152
 
152
- The MCP catalog contains 233 tools. `oneshot_discover_tools` is a free, read-only
153
+ The MCP catalog contains 243 tools. `oneshot_discover_tools` is a free, read-only
153
154
  search over the tools your token can call. Call it with no arguments for category
154
155
  counts, `{ "query": "send a printed letter" }` to search, or `{ "category": "email" }`
155
156
  to browse. Results contain public tool names, purposes and required inputs.
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.50.0", // keep in sync with package.json; guarded by version.test.ts
53
+ version: "0.51.0", // keep in sync with package.json; guarded by version.test.ts
54
54
  }, {
55
55
  capabilities: {
56
56
  tools: {},
@@ -3,14 +3,16 @@ import { LOOKUP_MANIFEST, ROUTE_MANIFEST } from "./lookup-manifest.generated.js"
3
3
  const read = (title, openWorld) => ({ title, readOnlyHint: true, destructiveHint: false, openWorldHint: openWorld });
4
4
  /** Changes something. `destructive` for delete / overwrite / revoke and for irreversible sends and transactions. */
5
5
  const write = (title, openWorld, destructive = false) => ({ title, readOnlyHint: false, destructiveHint: destructive, openWorldHint: openWorld });
6
+ /** Declared routes that cannot be taken back or overwrite settings (a watch's cap and webhook), so destructive. */
7
+ const IRREVERSIBLE_ROUTES = new Set(["physical_mail_approve", "physical_mail_cancel", "identity_start", "watch_update"]);
6
8
  /**
7
- * Declared routes that cannot be taken back, so destructive. Approving a mail quote posts a letter and
8
- * starting an identity check sends a person a link: both reach outside the account, so open-world too.
9
+ * Free declared routes that still reach outside the account, so open-world: approving a mail quote posts a
10
+ * letter, an identity check sends a person a link, a watch follows third-party data and may call a webhook,
11
+ * and a browser account connection signs in to another site.
9
12
  */
10
- const IRREVERSIBLE_ROUTES = new Set(["physical_mail_approve", "physical_mail_cancel", "identity_start"]);
11
- const OUTBOUND_ROUTES = new Set(["physical_mail_approve", "identity_start"]);
13
+ const OUTBOUND_ROUTES = new Set(["physical_mail_approve", "identity_start", "watch", "watch_update", "browser_connect_account"]);
12
14
  /** The connected-system reads (#2403): paid, but each reads the caller's own connected business system, so closed-world. */
13
- const CONNECTED_SYSTEM_READ = /^\/v1\/tools\/(ledger|crm|shipping|tax|procurement|meetings|mailbox|files)\//;
15
+ const CONNECTED_SYSTEM_READ = /^\/v1\/tools\/(ledger|crm|shipping|tax|procurement|meetings|mailbox|files|field_service)\//;
14
16
  const OPEN = true;
15
17
  const OWN = false;
16
18
  const DESTRUCTIVE = true;
@@ -21,7 +23,7 @@ export const TOOL_ANNOTATIONS = {
21
23
  oneshot_predict: read("Predict", OWN),
22
24
  oneshot_hunt_list: read("List Soul Hunts", OPEN),
23
25
  oneshot_hunt_status: read("Get Soul Hunt Status", OPEN),
24
- oneshot_hunt_predict: write("Predict Soul Hunt", OPEN),
26
+ oneshot_hunt_predict: write("Predict Soul Hunt", OPEN, DESTRUCTIVE), // a submitted prediction cannot be withdrawn
25
27
  oneshot_hunt_collection: read("List Collected Souls", OWN),
26
28
  oneshot_hunt_leaderboard: read("Soul Hunt Leaderboard", OPEN),
27
29
  oneshot_email: write("Send email", OPEN, DESTRUCTIVE),
@@ -67,7 +69,7 @@ export const TOOL_ANNOTATIONS = {
67
69
  oneshot_compute_pause: write("Pause a goal", OWN),
68
70
  oneshot_compute_resume: write("Resume a goal", OWN),
69
71
  oneshot_compute_fund: write("Add budget to a goal", OWN, DESTRUCTIVE),
70
- oneshot_build: write("Build a website", OPEN),
72
+ oneshot_build: write("Build a website", OPEN, DESTRUCTIVE), // publishes a live site and is paid
71
73
  oneshot_update_build: write("Update a website", OPEN, DESTRUCTIVE), // overwrites the live site
72
74
  oneshot_browser: write("Browse and act on a website", OPEN),
73
75
  oneshot_browser_create_profile: write("Create a browser profile", OWN),
@@ -1,10 +1,12 @@
1
1
  const KNOWN_GOAL_TOOL = { type: "string", description: 'A OneShot tool name, e.g. "email", "voice", "commerce_buy"' };
2
+ const SCOPE_DRIVERS = { type: "object", additionalProperties: { anyOf: [{ type: "number" }, { type: "boolean" }, { type: "string" }] }, description: 'Request sizes, never prices: recipients, segments, max_duration_minutes, max_steps (e.g. {"max_steps":25}), include_phone and limit, or letter kind/pages/color/double_sided; Predict/Solve size and time_limit_s. Omitted fields use tool defaults.' };
2
3
  const SCOPE_USE = {
3
4
  type: "object",
4
5
  properties: {
5
6
  tool: KNOWN_GOAL_TOOL,
6
7
  qty: { type: "integer", minimum: 1, description: "How many times inside one unit" },
7
8
  max_attempts: { type: "integer", minimum: 1, description: "Attempts each use may take" },
9
+ drivers: SCOPE_DRIVERS,
8
10
  target: { type: "string", description: 'Whom or what the use is pointed at, e.g. "the carrier\'s billing desk"' },
9
11
  persistence: {
10
12
  type: "object",
@@ -116,6 +118,45 @@ export const computeTool = {
116
118
  required: ["kind", "finished_states"],
117
119
  additionalProperties: false,
118
120
  },
121
+ {
122
+ type: "object",
123
+ description: "A named verifier accepts proof the agent submits (a document, photo, link or fields read from a document). The verifier needs an email or a phone number. With fields, a field the proof does not show, or one outside its bounds, is reported back without asking the verifier. One-off goals only.",
124
+ properties: {
125
+ kind: { const: "evidence" },
126
+ verifier: {
127
+ type: "object",
128
+ properties: {
129
+ name: { type: "string" },
130
+ email: { type: "string" },
131
+ phone: { type: "string", description: "E.164, such as +14155550100" },
132
+ timezone: { type: "string", description: 'IANA zone, e.g. "America/Chicago", for texts' },
133
+ },
134
+ required: ["name"],
135
+ additionalProperties: false,
136
+ },
137
+ accepts: { type: "string", description: "What proof is acceptable, in plain words; the verifier is shown it" },
138
+ fields: {
139
+ type: "array",
140
+ maxItems: 20,
141
+ items: {
142
+ type: "object",
143
+ properties: {
144
+ name: { type: "string" },
145
+ description: { type: "string" },
146
+ type: { type: "string", enum: ["string", "number", "boolean"] },
147
+ equals: { type: ["string", "number", "boolean"] },
148
+ one_of: { type: "array", items: { type: "string" } },
149
+ at_least: { type: "number" },
150
+ at_most: { type: "number" },
151
+ },
152
+ required: ["name", "description", "type"],
153
+ additionalProperties: false,
154
+ },
155
+ },
156
+ },
157
+ required: ["kind", "verifier", "accepts"],
158
+ additionalProperties: false,
159
+ },
119
160
  ],
120
161
  },
121
162
  egress_allowlist: {
@@ -151,7 +192,7 @@ export const computeTool = {
151
192
  type: "object",
152
193
  description: "Tool uses outside any unit: setting up, reporting",
153
194
  properties: {
154
- uses: { type: "array", maxItems: 50, items: { type: "object", properties: { tool: KNOWN_GOAL_TOOL, qty: { type: "integer", minimum: 1 }, max_attempts: { type: "integer", minimum: 1 } }, required: ["tool", "qty", "max_attempts"] } },
195
+ uses: { type: "array", maxItems: 50, items: { type: "object", properties: { tool: KNOWN_GOAL_TOOL, qty: { type: "integer", minimum: 1 }, max_attempts: { type: "integer", minimum: 1 }, drivers: SCOPE_DRIVERS }, required: ["tool", "qty", "max_attempts"] } },
155
196
  step_allowance: { type: "integer", minimum: 0 },
156
197
  },
157
198
  required: ["uses", "step_allowance"],
@@ -171,7 +212,7 @@ export const computeTool = {
171
212
  properties: {
172
213
  name: { type: "string" },
173
214
  reason: { type: "string", enum: ["connection", "quoted_tool"] },
174
- assumption: { type: "string", description: 'What the price assumes, e.g. "5 minutes" for a call or "20 steps" for a browser run' },
215
+ assumption: { type: "string", description: "What remains unknown until a live quote, capped by the remaining goal budget" },
175
216
  },
176
217
  required: ["name", "reason"],
177
218
  },
@@ -236,7 +277,7 @@ export const computeRespondTool = {
236
277
  };
237
278
  export const computePauseTool = {
238
279
  name: "oneshot_compute_pause",
239
- description: "Pause a recurring compute goal. Its plan and progress are kept — the goal stops taking scheduled runs until resumed. Only recurring (scheduled) goals can be paused. Free.",
280
+ description: "Pause a compute goal. A recurring goal stops taking scheduled runs until resumed; any other goal keeps its sessions, cases and reserved budget and continues where it was when resumed. Free.",
240
281
  inputSchema: {
241
282
  type: "object",
242
283
  properties: {
@@ -248,7 +289,7 @@ export const computePauseTool = {
248
289
  };
249
290
  export const computeResumeTool = {
250
291
  name: "oneshot_compute_resume",
251
- description: "Resume a paused recurring compute goal. Picks up on the existing plan at the next scheduled run — nothing is lost. Free.",
292
+ description: "Resume a paused compute goal. A recurring goal picks up at its next scheduled run; any other goal continues now where it was. Nothing is lost. Free.",
252
293
  inputSchema: {
253
294
  type: "object",
254
295
  properties: {
@@ -3,7 +3,7 @@ import type { OneShot } from "@oneshot-agent/sdk";
3
3
  /**
4
4
  * The agent's connections (#2403). Hand-written because `GET /v1/connections` is not a declared route: the
5
5
  * connected-system read tools (`oneshot_ledger_*`, `oneshot_crm_*`, `oneshot_shipping_*`, `oneshot_tax_*`,
6
- * `oneshot_procurement_*`, `oneshot_meetings_*`) are generated from their routes and each tells the model to call this one first.
6
+ * `oneshot_procurement_*`, `oneshot_meetings_*`, `oneshot_field_service_*`) are generated from their routes and each tells the model to call this one first.
7
7
  * Connecting and revoking stay in the console.
8
8
  */
9
9
  export declare const connectionsListTool: Tool;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The agent's connections (#2403). Hand-written because `GET /v1/connections` is not a declared route: the
3
3
  * connected-system read tools (`oneshot_ledger_*`, `oneshot_crm_*`, `oneshot_shipping_*`, `oneshot_tax_*`,
4
- * `oneshot_procurement_*`, `oneshot_meetings_*`) are generated from their routes and each tells the model to call this one first.
4
+ * `oneshot_procurement_*`, `oneshot_meetings_*`, `oneshot_field_service_*`) are generated from their routes and each tells the model to call this one first.
5
5
  * Connecting and revoking stay in the console.
6
6
  */
7
7
  export const connectionsListTool = {
@@ -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. '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 (the main address, e.g. agent@domain; rotation and goals send from it), mailbox_mode (relay|mailbox), addresses[] (the addresses the domain sends and receives at: {address, status, warmup_state}), pool_status (rotation eligibility: active|paused|removed), warmup_state (reputation health: warming|warmed|degraded|not_warmed), pause_reason (warming|low_reputation|manual|null), warmup_score, and daily send limits. mailbox_mode is fixed when the domain is bought. relay: addresses send and receive with no hosted inbox; never warmed (not_warmed), they rotate at once on a daily limit that rises with the domain's age. mailbox: each address is a hosted inbox, warmed before it rotates. The owner adds addresses with the domain purchase; a send never creates one. 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, or one this agent sent). 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 (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.",
4
+ "Sending requires an owned, verified domain, and a domain sends only from its own addresses. Call oneshot_list_domains first. A send never sets up a domain or an address: a new from_domain, or a from_mailbox the domain does not have, returns status confirmation_required with a separate setup quote, and no agent domain at all returns setup_required with requirements. Nothing is charged or sent. Show setup.total_cost and setup.billing to the owner, who buys through POST /v1/domains/buy or the account console. Models and goals cannot buy setup. Send again once setup is done.",
5
5
  inputSchema: {
6
6
  type: "object",
7
7
  properties: {
@@ -23,21 +23,16 @@ export const emailTool = {
23
23
  },
24
24
  from_domain: {
25
25
  type: "string",
26
- description: "Domain to send from. If you already own it, pass it to pin that domain. If you don't, pass a new domain here to register it — a call with a new from_domain only quotes (status 'confirmation_required' with a quote_id, nothing charged); repeat the call with confirm_new_domain set to that quote_id to register it, charge exactly the quoted registration + service fee (and a mailbox fee if mailbox_mode is 'mailbox'), and send. Only confirm once the user has seen that amount and asked to proceed. Omit both from_domain and from_mailbox to rotate across your warmed domains — the chosen address comes back on the result. Call oneshot_list_domains first to see what you already own.",
26
+ description: "Pin an owned sending domain, or choose a new name to quote separate account setup. The owner must buy setup and wait for verification before sending. Omit both from_domain and from_mailbox to rotate across eligible owned domains, each sending from its main address.",
27
27
  },
28
28
  from_mailbox: {
29
29
  type: "string",
30
- description: "Sender mailbox / local-part (optional, defaults to 'agent', i.e. agent@from_domain). Requires from_domain to be set — pinning from_mailbox alone is rejected, since there is no domain to attach it to. You can use any local-part — a new address is auto-provisioned on first use (starts unwarmed, warms over time). The FIRST send from any address — including the default 'agent@' — adds a one-time mailbox_provisioning_fee to the quote; it's free only once that address is already provisioned (active). See the domains list for each domain's default_from and existing addresses.",
30
+ description: "Sender local-part on from_domain (optional, defaults to the domain's main address, its default_from). Requires from_domain. Must be one of the domain's addresses (see oneshot_list_domains); another returns the setup quote that adds it, and no email is sent.",
31
31
  },
32
32
  from_name: {
33
33
  type: "string",
34
34
  description: "Display name shown to the recipient (optional), e.g. 'Jane Doe' renders as 'Jane Doe <jane@domain>'",
35
35
  },
36
- mailbox_mode: {
37
- type: "string",
38
- enum: ["relay", "mailbox"],
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
- },
41
36
  attachments: {
42
37
  type: "array",
43
38
  items: {
@@ -55,10 +50,6 @@ export const emailTool = {
55
50
  type: "string",
56
51
  description: "Only when retrying a call the action policy held: the approval_id from the approval_required error, once a human approved it. The call then runs once.",
57
52
  },
58
- confirm_new_domain: {
59
- type: "string",
60
- description: "The quote_id from a 'confirmation_required' result, and nothing else. A call with a from_domain you don't own yet always stops before charging and returns that result with the exact total. Only after showing that total to the user and getting their go-ahead, call this again with the same arguments and confirm_new_domain set to the quote_id: the domain is registered, exactly that quote's total is charged, and the email is sent in that one call. Passing true never charges; it only quotes again. A wrong, expired or already-used quote id is rejected by the server without charge: drop it and call again without confirm_new_domain for a fresh quote.",
61
- },
62
53
  },
63
54
  required: ["body"],
64
55
  },
@@ -72,10 +63,7 @@ export async function handleEmail(agent, args) {
72
63
  from_domain: args.from_domain,
73
64
  from_mailbox: args.from_mailbox,
74
65
  from_name: args.from_name,
75
- mailbox_mode: args.mailbox_mode,
76
66
  attachments: args.attachments,
77
67
  approvalId: args.approval_id,
78
- // Only the quote id confirms; `true` or anything else is not a confirmation.
79
- confirmNewDomain: typeof args.confirm_new_domain === "string" ? args.confirm_new_domain : undefined,
80
68
  });
81
69
  }
@@ -287,6 +287,12 @@ export function structuredToolError(error) {
287
287
  };
288
288
  case "PaymentError":
289
289
  return { error: "payment_failed", message: e.message, reason: e.reason };
290
+ case "SettlementAmbiguousError":
291
+ return {
292
+ error: "settlement_ambiguous",
293
+ message: e.message,
294
+ ...(typeof e.settlementId === "string" ? { settlement_id: e.settlementId } : {}),
295
+ };
290
296
  case "ToolError": {
291
297
  // Every 4xx the SDK doesn't recognize as one of the typed errors above
292
298
  // (budget/credits/payment) lands here as a plain ToolError, and its
@@ -219,7 +219,7 @@ export async function handleLinkedinWithdrawInvitation(agent, args) {
219
219
  }
220
220
  export const linkedinMessageTool = {
221
221
  name: "oneshot_linkedin_message",
222
- description: "Message a first-degree LinkedIn connection through a connected account that granted 'reply': into the 1:1 conversation the account already has with them, or a new one. Use it once an invitation is accepted, or for a connection the account has never messaged. Returns conversation_id. The human's account sends it; a message LinkedIn accepted cannot be recalled. Shares the reply daily cap (default 50); sends are paced. A failed send with not_connected (invite them first) or rate_limited means defer, not give up. An Idempotency-Key is generated automatically so a retry never double-sends. Paid tool.",
222
+ description: "Message a first-degree LinkedIn connection through a connected account that granted 'reply': into the 1:1 conversation the account already has with them, or a new one. Use it once an invitation is accepted, or for a connection the account has never messaged. Returns conversation_id. The human's account sends it; a message LinkedIn accepted cannot be recalled. Shares the reply daily cap (default 50); sends are paced. A failed send with recipient_not_connected means invite them first, not give up. An Idempotency-Key is generated automatically so a retry never double-sends. Paid tool.",
223
223
  inputSchema: {
224
224
  type: "object",
225
225
  properties: {
@@ -2512,6 +2512,29 @@ export const LOOKUP_MANIFEST = [
2512
2512
  "census_tract": "48201532800"
2513
2513
  }
2514
2514
  },
2515
+ {
2516
+ "name": "organism_resolve",
2517
+ "path": "resolve/organism",
2518
+ "title": "Organism Identity",
2519
+ "description": "Resolves a scientific name, common name or recorded misspelling, or an NCBI Taxonomy ID, to the matching organisms in the Taxonomy database of the US National Center for Biotechnology Information: taxonomy ID, scientific name, common name, rank, division, the lineage from the root down and whether the ID sent is still current. NCBI's Disclaimer (https://www.ncbi.nlm.nih.gov/home/about/policies/#disclaimer) and Copyright notice (https://www.ncbi.nlm.nih.gov/home/about/policies/#copyright) apply to these records: the US Government does not warrant or assume any legal liability or responsibility for their accuracy, completeness or usefulness, and NCBI does not endorse or recommend any commercial products, processes or services. Give exactly one of `name` or `taxonomy_id`. `name` matches every name the source keeps for an organism, including common names and the misspellings it records, so `Home sapiens` resolves to Homo sapiens. The whole name must match; it is not a word search. A name shared by more than one organism (mouse is both the species Mus musculus and the genus Mus) returns each, up to 10, in the source's order, with `ambiguous` true. A retired taxonomy ID returns the record it was merged into, with `active` false. An unknown name or taxonomy ID returns an empty matches list. The NCBI Taxonomy ID is the `taxon_id` input of Gene Resolve.",
2520
+ "inputSchema": {
2521
+ "type": "object",
2522
+ "properties": {
2523
+ "name": {
2524
+ "type": "string",
2525
+ "description": "A scientific name (Homo sapiens), common name (human) or misspelling the source records; give exactly one of name or taxonomy_id. 2 to 200 characters. No double quotes, brackets or control characters."
2526
+ },
2527
+ "taxonomy_id": {
2528
+ "type": "integer",
2529
+ "description": "An NCBI Taxonomy ID, for example 9606; give exactly one of name or taxonomy_id. From 1 to 999999999."
2530
+ }
2531
+ },
2532
+ "required": []
2533
+ },
2534
+ "example": {
2535
+ "name": "Escherichia coli"
2536
+ }
2537
+ },
2515
2538
  {
2516
2539
  "name": "place_resolve",
2517
2540
  "path": "resolve/place",
@@ -4098,7 +4121,7 @@ export const ROUTE_MANIFEST = [
4098
4121
  "paid": true,
4099
4122
  "readOnly": true,
4100
4123
  "title": "CRM accounts",
4101
- "description": "Read accounts from a connected Salesforce or HubSpot account. Read-only. Nothing fetched is stored. Contacts include personal data, returned inline only. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4124
+ "description": "Read accounts from a connected Salesforce, HubSpot or Affinity account. Read-only. Nothing fetched is stored. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4102
4125
  "inputSchema": {
4103
4126
  "type": "object",
4104
4127
  "properties": {
@@ -4132,6 +4155,70 @@ export const ROUTE_MANIFEST = [
4132
4155
  "limit": 25
4133
4156
  }
4134
4157
  },
4158
+ {
4159
+ "name": "crm_activity",
4160
+ "method": "POST",
4161
+ "path": "/v1/tools/crm/activity",
4162
+ "paid": true,
4163
+ "readOnly": true,
4164
+ "title": "CRM activity",
4165
+ "description": "Read what already happened on a connected HubSpot account, contact, opportunity or ticket: emails, calls, meetings, notes and tasks, each with a short summary of its body. Read-only. Nothing fetched is stored; bodies are customer content. Salesforce does not serve this read yet. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4166
+ "inputSchema": {
4167
+ "type": "object",
4168
+ "properties": {
4169
+ "connection_id": {
4170
+ "type": "string",
4171
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4172
+ },
4173
+ "record": {
4174
+ "type": "object",
4175
+ "properties": {
4176
+ "type": {
4177
+ "type": "string",
4178
+ "enum": [
4179
+ "account",
4180
+ "contact",
4181
+ "opportunity",
4182
+ "ticket"
4183
+ ]
4184
+ },
4185
+ "id": {
4186
+ "type": "string"
4187
+ }
4188
+ },
4189
+ "required": [
4190
+ "type",
4191
+ "id"
4192
+ ],
4193
+ "additionalProperties": false
4194
+ },
4195
+ "since": {
4196
+ "type": "string",
4197
+ "description": "Activity on or after this ISO date (YYYY-MM-DD, UTC)"
4198
+ },
4199
+ "limit": {
4200
+ "type": "number",
4201
+ "description": "Records per page (1 to 100, default 25)"
4202
+ },
4203
+ "cursor": {
4204
+ "type": "string",
4205
+ "description": "The next_cursor of the previous page; keep the same filters"
4206
+ }
4207
+ },
4208
+ "required": [
4209
+ "connection_id",
4210
+ "record"
4211
+ ]
4212
+ },
4213
+ "example": {
4214
+ "connection_id": "5f4a3b2c-1d0e-4f9a-8b7c-6d5e4f3a2b1c",
4215
+ "record": {
4216
+ "type": "contact",
4217
+ "id": "101"
4218
+ },
4219
+ "limit": 25
4220
+ }
4221
+ },
4135
4222
  {
4136
4223
  "name": "crm_contacts",
4137
4224
  "method": "POST",
@@ -4139,7 +4226,7 @@ export const ROUTE_MANIFEST = [
4139
4226
  "paid": true,
4140
4227
  "readOnly": true,
4141
4228
  "title": "CRM contacts",
4142
- "description": "Read contacts from a connected Salesforce or HubSpot account. Read-only. Nothing fetched is stored. Contacts include personal data, returned inline only. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4229
+ "description": "Read contacts from a connected Salesforce, HubSpot, Follow Up Boss or Affinity account. Read-only. Nothing fetched is stored. Contacts include personal data, returned inline only. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4143
4230
  "inputSchema": {
4144
4231
  "type": "object",
4145
4232
  "properties": {
@@ -4184,7 +4271,7 @@ export const ROUTE_MANIFEST = [
4184
4271
  "paid": true,
4185
4272
  "readOnly": true,
4186
4273
  "title": "CRM opportunities",
4187
- "description": "Read opportunities from a connected Salesforce or HubSpot account. Read-only. Nothing fetched is stored. Contacts include personal data, returned inline only. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4274
+ "description": "Read opportunities from a connected Salesforce, HubSpot, Follow Up Boss or Affinity account. Read-only. Nothing fetched is stored. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4188
4275
  "inputSchema": {
4189
4276
  "type": "object",
4190
4277
  "properties": {
@@ -4232,6 +4319,64 @@ export const ROUTE_MANIFEST = [
4232
4319
  "limit": 25
4233
4320
  }
4234
4321
  },
4322
+ {
4323
+ "name": "crm_tickets",
4324
+ "method": "POST",
4325
+ "path": "/v1/tools/crm/tickets",
4326
+ "paid": true,
4327
+ "readOnly": true,
4328
+ "title": "CRM tickets",
4329
+ "description": "Read support tickets from a connected HubSpot account, with their contact and company. Read-only. Nothing fetched is stored. Other CRM systems do not serve this read. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4330
+ "inputSchema": {
4331
+ "type": "object",
4332
+ "properties": {
4333
+ "connection_id": {
4334
+ "type": "string",
4335
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4336
+ },
4337
+ "query": {
4338
+ "type": "string",
4339
+ "description": "Subject contains this text, case insensitive. A filtered page can be empty; continue while next_cursor is present."
4340
+ },
4341
+ "updated_since": {
4342
+ "type": "string",
4343
+ "description": "Updated on or after this ISO date (YYYY-MM-DD, UTC)"
4344
+ },
4345
+ "limit": {
4346
+ "type": "number",
4347
+ "description": "Records per page (1 to 100, default 25)"
4348
+ },
4349
+ "cursor": {
4350
+ "type": "string",
4351
+ "description": "The next_cursor of the previous page; keep the same filters"
4352
+ },
4353
+ "status": {
4354
+ "type": "string",
4355
+ "enum": [
4356
+ "open",
4357
+ "closed",
4358
+ "all"
4359
+ ],
4360
+ "description": "Ticket status (default all)"
4361
+ },
4362
+ "contact_id": {
4363
+ "type": "string",
4364
+ "description": "Only tickets associated with this contact id"
4365
+ },
4366
+ "company_id": {
4367
+ "type": "string",
4368
+ "description": "Only tickets associated with this company (account) id"
4369
+ }
4370
+ },
4371
+ "required": [
4372
+ "connection_id"
4373
+ ]
4374
+ },
4375
+ "example": {
4376
+ "connection_id": "5f4a3b2c-1d0e-4f9a-8b7c-6d5e4f3a2b1c",
4377
+ "limit": 25
4378
+ }
4379
+ },
4235
4380
  {
4236
4381
  "name": "watch_delete",
4237
4382
  "method": "DELETE",
@@ -4280,6 +4425,261 @@ export const ROUTE_MANIFEST = [
4280
4425
  "domain": "mail.example.com"
4281
4426
  }
4282
4427
  },
4428
+ {
4429
+ "name": "company_export_restrictions",
4430
+ "method": "POST",
4431
+ "path": "/v1/tools/lookup/company-export-restrictions",
4432
+ "paid": true,
4433
+ "readOnly": true,
4434
+ "title": "Export Restrictions",
4435
+ "description": "Search US export-control lists by counterparty name and aliases, optionally narrowed by address country. Returns scored matches, the matched name, list, licence requirement and policy, and the published entry fields. For example, “Is Huawei Technologies on an export-control list?” or “Check export restrictions and licence requirements; company_sanctions checks the Treasury SDN list.” No match means no entry on these lists scored at or above min_score; it does not clear the party. Commerce Entity, Denied Persons, Unverified and Military End User lists; State Department ITAR debarred and nonproliferation sanctions, as published in the Consolidated Screening List. The source refreshes daily at 5:00 AM Eastern. Entries include organisations and individuals. Treasury lists are excluded. This is a screening aid; the official Federal Register publication governs.",
4436
+ "inputSchema": {
4437
+ "type": "object",
4438
+ "properties": {
4439
+ "name": {
4440
+ "type": "string",
4441
+ "minLength": 2,
4442
+ "maxLength": 200,
4443
+ "description": "Counterparty name, 2 to 200 characters"
4444
+ },
4445
+ "country": {
4446
+ "type": "string",
4447
+ "pattern": "^[A-Za-z]{2}$",
4448
+ "description": "Optional two-letter country code; narrows matches by address country"
4449
+ },
4450
+ "min_score": {
4451
+ "type": "number",
4452
+ "minimum": 0.5,
4453
+ "maximum": 1,
4454
+ "default": 0.85,
4455
+ "description": "Minimum name score, 0.5 to 1; default 0.85"
4456
+ },
4457
+ "limit": {
4458
+ "type": "integer",
4459
+ "minimum": 1,
4460
+ "maximum": 25,
4461
+ "default": 10,
4462
+ "description": "Most matches returned, 1 to 25; default 10. Total counts all qualifying entries"
4463
+ }
4464
+ },
4465
+ "required": [
4466
+ "name"
4467
+ ]
4468
+ },
4469
+ "example": {
4470
+ "name": "Huawei Technologies Co., Ltd."
4471
+ }
4472
+ },
4473
+ {
4474
+ "name": "field_service_clients",
4475
+ "method": "POST",
4476
+ "path": "/v1/tools/field_service/clients",
4477
+ "paid": true,
4478
+ "readOnly": true,
4479
+ "title": "Field service clients",
4480
+ "description": "Clients read from the customer's connected field service system, with contact details, tags and balance, filtered by text and by last change. Read-only. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4481
+ "inputSchema": {
4482
+ "type": "object",
4483
+ "properties": {
4484
+ "connection_id": {
4485
+ "type": "string",
4486
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4487
+ },
4488
+ "query": {
4489
+ "type": "string",
4490
+ "description": "Clients whose name, company, email, phone or property matches this text"
4491
+ },
4492
+ "updated_since": {
4493
+ "type": "string",
4494
+ "description": "Clients changed on or after this day (YYYY-MM-DD, UTC)"
4495
+ },
4496
+ "limit": {
4497
+ "type": "integer",
4498
+ "description": "Clients per page, 1 to 100 (default 25)"
4499
+ },
4500
+ "cursor": {
4501
+ "type": "string",
4502
+ "description": "The next_cursor of the previous page"
4503
+ }
4504
+ },
4505
+ "required": [
4506
+ "connection_id"
4507
+ ]
4508
+ },
4509
+ "example": {
4510
+ "connection_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f",
4511
+ "query": "Reyes",
4512
+ "limit": 25
4513
+ }
4514
+ },
4515
+ {
4516
+ "name": "field_service_invoices",
4517
+ "method": "POST",
4518
+ "path": "/v1/tools/field_service/invoices",
4519
+ "paid": true,
4520
+ "readOnly": true,
4521
+ "title": "Field service invoices",
4522
+ "description": "Invoices read from the customer's connected field service system, each with its client, status, total, balance and dates, filtered by client, status and due date. Read-only: nothing is sent or collected. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4523
+ "inputSchema": {
4524
+ "type": "object",
4525
+ "properties": {
4526
+ "connection_id": {
4527
+ "type": "string",
4528
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4529
+ },
4530
+ "client_id": {
4531
+ "type": "string",
4532
+ "description": "Only this client's records, by the id field_service_clients answers"
4533
+ },
4534
+ "status": {
4535
+ "type": "string",
4536
+ "enum": [
4537
+ "draft",
4538
+ "awaiting_payment",
4539
+ "past_due",
4540
+ "paid",
4541
+ "all"
4542
+ ],
4543
+ "description": "draft, awaiting_payment, past_due, paid or all (default all)"
4544
+ },
4545
+ "due_before": {
4546
+ "type": "string",
4547
+ "description": "Invoices due on or before this day (YYYY-MM-DD, UTC)"
4548
+ },
4549
+ "limit": {
4550
+ "type": "integer",
4551
+ "description": "Invoices per page, 1 to 100 (default 25)"
4552
+ },
4553
+ "cursor": {
4554
+ "type": "string",
4555
+ "description": "The next_cursor of the previous page"
4556
+ }
4557
+ },
4558
+ "required": [
4559
+ "connection_id"
4560
+ ]
4561
+ },
4562
+ "example": {
4563
+ "connection_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f",
4564
+ "status": "past_due",
4565
+ "due_before": "2026-10-20",
4566
+ "limit": 25
4567
+ }
4568
+ },
4569
+ {
4570
+ "name": "field_service_jobs",
4571
+ "method": "POST",
4572
+ "path": "/v1/tools/field_service/jobs",
4573
+ "paid": true,
4574
+ "readOnly": true,
4575
+ "title": "Field service jobs",
4576
+ "description": "Jobs read from the customer's connected field service system, each with its client, status, total and visits, filtered by client, status and visit dates. Read-only: nothing is scheduled or changed. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4577
+ "inputSchema": {
4578
+ "type": "object",
4579
+ "properties": {
4580
+ "connection_id": {
4581
+ "type": "string",
4582
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4583
+ },
4584
+ "client_id": {
4585
+ "type": "string",
4586
+ "description": "Only this client's records, by the id field_service_clients answers"
4587
+ },
4588
+ "status": {
4589
+ "type": "string",
4590
+ "enum": [
4591
+ "upcoming",
4592
+ "active",
4593
+ "late",
4594
+ "completed",
4595
+ "all"
4596
+ ],
4597
+ "description": "upcoming, active, late, completed or all (default all)"
4598
+ },
4599
+ "scheduled_after": {
4600
+ "type": "string",
4601
+ "description": "Jobs with a visit on or after this day (YYYY-MM-DD, UTC)"
4602
+ },
4603
+ "scheduled_before": {
4604
+ "type": "string",
4605
+ "description": "Jobs with a visit on or before this day (YYYY-MM-DD, UTC)"
4606
+ },
4607
+ "limit": {
4608
+ "type": "integer",
4609
+ "description": "Jobs per page, 1 to 100 (default 25)"
4610
+ },
4611
+ "cursor": {
4612
+ "type": "string",
4613
+ "description": "The next_cursor of the previous page"
4614
+ }
4615
+ },
4616
+ "required": [
4617
+ "connection_id"
4618
+ ]
4619
+ },
4620
+ "example": {
4621
+ "connection_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f",
4622
+ "status": "upcoming",
4623
+ "scheduled_after": "2026-10-21",
4624
+ "scheduled_before": "2026-10-21",
4625
+ "limit": 25
4626
+ }
4627
+ },
4628
+ {
4629
+ "name": "field_service_quotes",
4630
+ "method": "POST",
4631
+ "path": "/v1/tools/field_service/quotes",
4632
+ "paid": true,
4633
+ "readOnly": true,
4634
+ "title": "Field service quotes",
4635
+ "description": "Quotes read from the customer's connected field service system, each with its client, status, total and when it was sent and approved, filtered by client, status and send date. Read-only: nothing is sent or approved. Paid per read. Call oneshot_connections_list first and pick the connection_id by system and account_label.",
4636
+ "inputSchema": {
4637
+ "type": "object",
4638
+ "properties": {
4639
+ "connection_id": {
4640
+ "type": "string",
4641
+ "description": "The connection to read. An agent can have several connections to the same system: list your connections first (`GET /v1/connections`) and pick by `system` and `account_label`."
4642
+ },
4643
+ "client_id": {
4644
+ "type": "string",
4645
+ "description": "Only this client's records, by the id field_service_clients answers"
4646
+ },
4647
+ "status": {
4648
+ "type": "string",
4649
+ "enum": [
4650
+ "draft",
4651
+ "awaiting_response",
4652
+ "approved",
4653
+ "converted",
4654
+ "archived",
4655
+ "all"
4656
+ ],
4657
+ "description": "draft, awaiting_response, approved, converted, archived or all (default all)"
4658
+ },
4659
+ "sent_after": {
4660
+ "type": "string",
4661
+ "description": "Quotes last sent to the client on or after this day (YYYY-MM-DD, UTC)"
4662
+ },
4663
+ "limit": {
4664
+ "type": "integer",
4665
+ "description": "Quotes per page, 1 to 100 (default 25)"
4666
+ },
4667
+ "cursor": {
4668
+ "type": "string",
4669
+ "description": "The next_cursor of the previous page"
4670
+ }
4671
+ },
4672
+ "required": [
4673
+ "connection_id"
4674
+ ]
4675
+ },
4676
+ "example": {
4677
+ "connection_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f",
4678
+ "status": "awaiting_response",
4679
+ "sent_after": "2026-10-01",
4680
+ "limit": 25
4681
+ }
4682
+ },
4283
4683
  {
4284
4684
  "name": "files_read",
4285
4685
  "method": "POST",
@@ -4351,7 +4751,7 @@ export const ROUTE_MANIFEST = [
4351
4751
  },
4352
4752
  "folder_id": {
4353
4753
  "type": "string",
4354
- "description": "Optional opaque folder id. Recursive for Microsoft; direct children for Google Drive."
4754
+ "description": "Optional opaque folder id. Recursive for Box and Microsoft; direct children for Google Drive."
4355
4755
  }
4356
4756
  },
4357
4757
  "required": [
@@ -4365,6 +4765,46 @@ export const ROUTE_MANIFEST = [
4365
4765
  "limit": 25
4366
4766
  }
4367
4767
  },
4768
+ {
4769
+ "name": "company_fund_holdings",
4770
+ "method": "POST",
4771
+ "path": "/v1/tools/lookup/company-fund-holdings",
4772
+ "paid": true,
4773
+ "readOnly": true,
4774
+ "title": "Fund Holdings",
4775
+ "description": "Look up an institutional investment manager’s quarterly Form 13F holdings by manager CIK: issuer, class, CUSIP, FIGI, value in dollars, shares or principal, put or call, investment discretion and voting authority, largest first. For example, “What did Berkshire Hathaway hold at the end of June 2026?” or “Show the positions inside a 13F-HR, beyond the filing that company_filings with form 13F-HR lists.” Form 13F-HR and 13F-HR/A information tables of institutional investment managers. Holdings are reported quarterly, up to 45 days after each quarter ends, and loaded from data sets the SEC posts every three months, so the newest period can be several months old. The four newest data sets (a year of filing dates) are held. Values are in US dollars as reported; confidential holdings the SEC allowed a manager to omit are not listed.",
4776
+ "inputSchema": {
4777
+ "type": "object",
4778
+ "properties": {
4779
+ "cik": {
4780
+ "type": "string",
4781
+ "description": "Investment manager CIK, 1 to 10 digits"
4782
+ },
4783
+ "period": {
4784
+ "type": "string",
4785
+ "description": "Quarter end the report covers, YYYY-MM-DD; default the newest loaded period"
4786
+ },
4787
+ "cusip": {
4788
+ "type": "string",
4789
+ "description": "Nine-character CUSIP; only holdings of this security"
4790
+ },
4791
+ "limit": {
4792
+ "type": "integer",
4793
+ "description": "Page size, 1-500, default 100"
4794
+ },
4795
+ "offset": {
4796
+ "type": "integer",
4797
+ "description": "Holdings to skip, 0-100000, default 0"
4798
+ }
4799
+ },
4800
+ "required": [
4801
+ "cik"
4802
+ ]
4803
+ },
4804
+ "example": {
4805
+ "cik": "1067983"
4806
+ }
4807
+ },
4368
4808
  {
4369
4809
  "name": "physical_mail_order",
4370
4810
  "method": "GET",
@@ -5227,6 +5667,67 @@ export const ROUTE_MANIFEST = [
5227
5667
  "limit": 25
5228
5668
  }
5229
5669
  },
5670
+ {
5671
+ "name": "company_radio_licenses",
5672
+ "method": "POST",
5673
+ "path": "/v1/tools/lookup/company-radio-licenses",
5674
+ "paid": true,
5675
+ "readOnly": true,
5676
+ "title": "Radio Licenses",
5677
+ "description": "Find a company's active radio licences by FRN, call sign or exact folded legal name. For example, “Which paging licences does AMS Spectrum Holdings hold?” or “Find spectrum licences for a company's radio fleet; company_contractor_license covers trade credentials.” Returns call signs, services, status, dates and business licensee details. Active company FCC licences in private and commercial land mobile, microwave, market-based spectrum, cellular and paging services, loaded from weekly complete files. Individual licensees are excluded. Records with no company name and malformed records are also excluded. No match says nothing about other services or expired licences.",
5678
+ "inputSchema": {
5679
+ "type": "object",
5680
+ "properties": {
5681
+ "frn": {
5682
+ "type": "string",
5683
+ "pattern": "^[0-9]{10}$",
5684
+ "description": "FCC Registration Number, exactly ten digits; supply exactly one identifier"
5685
+ },
5686
+ "call_sign": {
5687
+ "type": "string",
5688
+ "description": "FCC call sign; supply exactly one identifier"
5689
+ },
5690
+ "licensee_name": {
5691
+ "type": "string",
5692
+ "description": "Exact legal name after case, punctuation and legal suffix folding; supply exactly one identifier"
5693
+ },
5694
+ "service": {
5695
+ "type": "string",
5696
+ "enum": [
5697
+ "LMpriv",
5698
+ "LMcomm",
5699
+ "micro",
5700
+ "market",
5701
+ "cell",
5702
+ "paging"
5703
+ ],
5704
+ "description": "Weekly service file to search; omit to check all six"
5705
+ },
5706
+ "expiring_before": {
5707
+ "type": "string",
5708
+ "format": "date",
5709
+ "description": "Expiration strictly before this real YYYY-MM-DD date"
5710
+ },
5711
+ "limit": {
5712
+ "type": "integer",
5713
+ "minimum": 1,
5714
+ "maximum": 100,
5715
+ "description": "Page size, default 50"
5716
+ },
5717
+ "offset": {
5718
+ "type": "integer",
5719
+ "minimum": 0,
5720
+ "maximum": 10000,
5721
+ "description": "Results to skip, default 0"
5722
+ }
5723
+ },
5724
+ "required": []
5725
+ },
5726
+ "example": {
5727
+ "frn": "0019131390",
5728
+ "service": "paging"
5729
+ }
5730
+ },
5230
5731
  {
5231
5732
  "name": "physical_mail_recover",
5232
5733
  "method": "GET",
@@ -3,7 +3,7 @@ export declare const predictInputSchema: {
3
3
  readonly properties: {
4
4
  readonly model: {
5
5
  readonly type: "string";
6
- readonly enum: readonly ["simulation", "forecast"];
6
+ readonly enum: readonly ["simulation", "forecast", "alignment"];
7
7
  };
8
8
  readonly time_limit_s: {
9
9
  readonly default: 20;
@@ -268,8 +268,43 @@ export declare const predictInputSchema: {
268
268
  readonly required: readonly ["series", "horizon"];
269
269
  readonly additionalProperties: false;
270
270
  };
271
+ readonly alignment: {
272
+ readonly type: "object";
273
+ readonly properties: {
274
+ readonly mode: {
275
+ readonly type: "string";
276
+ readonly enum: readonly ["pairwise", "search"];
277
+ };
278
+ readonly sequence_type: {
279
+ readonly default: "auto";
280
+ readonly type: "string";
281
+ readonly enum: readonly ["auto", "protein", "nucleotide"];
282
+ };
283
+ readonly sequences: {
284
+ readonly minItems: 1;
285
+ readonly maxItems: 50;
286
+ readonly type: "array";
287
+ readonly items: {
288
+ readonly type: "object";
289
+ readonly properties: {
290
+ readonly id: {
291
+ readonly type: "string";
292
+ readonly minLength: 1;
293
+ readonly maxLength: 128;
294
+ };
295
+ readonly sequence: {
296
+ readonly type: "string";
297
+ };
298
+ };
299
+ readonly required: readonly ["id", "sequence"];
300
+ readonly additionalProperties: false;
301
+ };
302
+ };
303
+ };
304
+ readonly required: readonly ["mode", "sequences"];
305
+ readonly additionalProperties: false;
306
+ };
271
307
  };
272
308
  readonly required: readonly ["model"];
273
309
  readonly additionalProperties: false;
274
- readonly $schema: "http://json-schema.org/draft-07/schema#";
275
310
  };
@@ -6,7 +6,8 @@ export const predictInputSchema = {
6
6
  "type": "string",
7
7
  "enum": [
8
8
  "simulation",
9
- "forecast"
9
+ "forecast",
10
+ "alignment"
10
11
  ]
11
12
  },
12
13
  "time_limit_s": {
@@ -341,11 +342,59 @@ export const predictInputSchema = {
341
342
  "horizon"
342
343
  ],
343
344
  "additionalProperties": false
345
+ },
346
+ "alignment": {
347
+ "type": "object",
348
+ "properties": {
349
+ "mode": {
350
+ "type": "string",
351
+ "enum": [
352
+ "pairwise",
353
+ "search"
354
+ ]
355
+ },
356
+ "sequence_type": {
357
+ "default": "auto",
358
+ "type": "string",
359
+ "enum": [
360
+ "auto",
361
+ "protein",
362
+ "nucleotide"
363
+ ]
364
+ },
365
+ "sequences": {
366
+ "minItems": 1,
367
+ "maxItems": 50,
368
+ "type": "array",
369
+ "items": {
370
+ "type": "object",
371
+ "properties": {
372
+ "id": {
373
+ "type": "string",
374
+ "minLength": 1,
375
+ "maxLength": 128
376
+ },
377
+ "sequence": {
378
+ "type": "string"
379
+ }
380
+ },
381
+ "required": [
382
+ "id",
383
+ "sequence"
384
+ ],
385
+ "additionalProperties": false
386
+ }
387
+ }
388
+ },
389
+ "required": [
390
+ "mode",
391
+ "sequences"
392
+ ],
393
+ "additionalProperties": false
344
394
  }
345
395
  },
346
396
  "required": [
347
397
  "model"
348
398
  ],
349
- "additionalProperties": false,
350
- "$schema": "http://json-schema.org/draft-07/schema#"
399
+ "additionalProperties": false
351
400
  };
@@ -1,4 +1,4 @@
1
1
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
2
  import type { OneShot } from '@oneshot-agent/sdk';
3
3
  export declare const predictTool: Tool;
4
- export declare function handlePredict(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").PredictPendingResult | import("@oneshot-agent/sdk").PredictSimulationResult | import("@oneshot-agent/sdk").PredictForecastResult>;
4
+ export declare function handlePredict(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").PredictPendingResult | import("@oneshot-agent/sdk").PredictSimulationResult | import("@oneshot-agent/sdk").PredictForecastResult | import("@oneshot-agent/sdk").PredictAlignmentResult>;
@@ -1,7 +1,7 @@
1
1
  import { predictInputSchema } from './predict-schema.generated.js';
2
2
  export const predictTool = {
3
3
  name: 'oneshot_predict',
4
- description: 'Predict outcomes with uncertainty and consistency checks. Supported models: simulation (named distributions and arithmetic outputs, returning means, medians and percentiles) and forecast (time series projected ahead with prediction intervals). Provide the matching model block.',
4
+ description: 'Predict outcomes with uncertainty and consistency checks. Supported models: simulation (named distributions and arithmetic outputs, returning means, medians and percentiles), forecast (time series projected ahead with prediction intervals) and alignment (local sequence comparison across the supplied sequences, returning matched regions with identity, coverage and significance). Provide the matching model block.',
5
5
  inputSchema: JSON.parse(JSON.stringify(predictInputSchema)),
6
6
  };
7
7
  export async function handlePredict(agent, args) {
@@ -535,16 +535,11 @@ export declare const solveInputSchema: {
535
535
  readonly type: "array";
536
536
  readonly items: {
537
537
  readonly type: "array";
538
- readonly items: readonly [{
538
+ readonly items: {
539
539
  readonly type: "string";
540
540
  readonly minLength: 1;
541
541
  readonly pattern: "^(?:[^\\u0000\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])*$";
542
- }, {
543
- readonly type: "string";
544
- readonly minLength: 1;
545
- readonly pattern: "^(?:[^\\u0000\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])*$";
546
- }];
547
- readonly additionalItems: false;
542
+ };
548
543
  readonly minItems: 2;
549
544
  readonly maxItems: 2;
550
545
  };
@@ -698,5 +693,4 @@ export declare const solveInputSchema: {
698
693
  };
699
694
  readonly required: readonly ["problem"];
700
695
  readonly additionalProperties: false;
701
- readonly $schema: "http://json-schema.org/draft-07/schema#";
702
696
  };
@@ -625,19 +625,11 @@ export const solveInputSchema = {
625
625
  "type": "array",
626
626
  "items": {
627
627
  "type": "array",
628
- "items": [
629
- {
630
- "type": "string",
631
- "minLength": 1,
632
- "pattern": "^(?:[^\\u0000\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])*$"
633
- },
634
- {
635
- "type": "string",
636
- "minLength": 1,
637
- "pattern": "^(?:[^\\u0000\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])*$"
638
- }
639
- ],
640
- "additionalItems": false,
628
+ "items": {
629
+ "type": "string",
630
+ "minLength": 1,
631
+ "pattern": "^(?:[^\\u0000\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])*$"
632
+ },
641
633
  "minItems": 2,
642
634
  "maxItems": 2
643
635
  }
@@ -817,6 +809,5 @@ export const solveInputSchema = {
817
809
  "required": [
818
810
  "problem"
819
811
  ],
820
- "additionalProperties": false,
821
- "$schema": "http://json-schema.org/draft-07/schema#"
812
+ "additionalProperties": false
822
813
  };
@@ -18,11 +18,13 @@ export const UNTRUSTED_TOOLS = new Set([
18
18
  "company_domain_registration",
19
19
  "company_dossier",
20
20
  "company_environmental_compliance",
21
+ "company_export_restrictions",
21
22
  "company_fda_registration",
22
23
  "company_federal_awards",
23
24
  "company_filings",
24
25
  "company_financials",
25
26
  "company_find",
27
+ "company_fund_holdings",
26
28
  "company_health_provider",
27
29
  "company_insider_trades",
28
30
  "company_legal_identifier",
@@ -32,6 +34,7 @@ export const UNTRUSTED_TOOLS = new Set([
32
34
  "company_nonprofit_status",
33
35
  "company_private_raises",
34
36
  "company_profile",
37
+ "company_radio_licenses",
35
38
  "company_sanctions",
36
39
  "company_sba_loans",
37
40
  "company_vat_registration",
@@ -39,6 +42,13 @@ export const UNTRUSTED_TOOLS = new Set([
39
42
  "compound_properties",
40
43
  "compound_resolve",
41
44
  "compound_targets",
45
+ "crm_activity",
46
+ "crm_tickets",
47
+ "field_service",
48
+ "field_service_clients",
49
+ "field_service_invoices",
50
+ "field_service_jobs",
51
+ "field_service_quotes",
42
52
  "files",
43
53
  "files_read",
44
54
  "files_search",
@@ -70,6 +80,7 @@ export const UNTRUSTED_TOOLS = new Set([
70
80
  "meetings",
71
81
  "meetings_get",
72
82
  "meetings_list",
83
+ "organism_resolve",
73
84
  "person_articles",
74
85
  "person_dossier",
75
86
  "person_email",
@@ -178,6 +189,7 @@ export const UNTRUSTED_TOOLS = new Set([
178
189
  "research/market_medicare_drug_spending",
179
190
  "research/market_medicare_fees",
180
191
  "research/market_truck_rates",
192
+ "research/organism_resolve",
181
193
  "research/person_articles",
182
194
  "research/person_dossier",
183
195
  "research/person_email",
@@ -279,6 +291,12 @@ export const UNTRUSTED_ROUTES = [
279
291
  ["GET", "/v1/tools/voice/inbound/:id"],
280
292
  ["POST", "/v1/tools/browser"],
281
293
  ["POST", "/v1/tools/changes"],
294
+ ["POST", "/v1/tools/crm/activity"],
295
+ ["POST", "/v1/tools/crm/tickets"],
296
+ ["POST", "/v1/tools/field_service/clients"],
297
+ ["POST", "/v1/tools/field_service/invoices"],
298
+ ["POST", "/v1/tools/field_service/jobs"],
299
+ ["POST", "/v1/tools/field_service/quotes"],
282
300
  ["POST", "/v1/tools/files/read"],
283
301
  ["POST", "/v1/tools/files/search"],
284
302
  ["POST", "/v1/tools/find/business"],
@@ -305,10 +323,12 @@ export const UNTRUSTED_ROUTES = [
305
323
  ["POST", "/v1/tools/lookup/company-domain-registration"],
306
324
  ["POST", "/v1/tools/lookup/company-dossier"],
307
325
  ["POST", "/v1/tools/lookup/company-environmental-compliance"],
326
+ ["POST", "/v1/tools/lookup/company-export-restrictions"],
308
327
  ["POST", "/v1/tools/lookup/company-fda-registration"],
309
328
  ["POST", "/v1/tools/lookup/company-federal-awards"],
310
329
  ["POST", "/v1/tools/lookup/company-filings"],
311
330
  ["POST", "/v1/tools/lookup/company-financials"],
331
+ ["POST", "/v1/tools/lookup/company-fund-holdings"],
312
332
  ["POST", "/v1/tools/lookup/company-health-provider"],
313
333
  ["POST", "/v1/tools/lookup/company-insider-trades"],
314
334
  ["POST", "/v1/tools/lookup/company-legal-identifier"],
@@ -318,6 +338,7 @@ export const UNTRUSTED_ROUTES = [
318
338
  ["POST", "/v1/tools/lookup/company-nonprofit-status"],
319
339
  ["POST", "/v1/tools/lookup/company-private-raises"],
320
340
  ["POST", "/v1/tools/lookup/company-profile"],
341
+ ["POST", "/v1/tools/lookup/company-radio-licenses"],
321
342
  ["POST", "/v1/tools/lookup/company-sanctions"],
322
343
  ["POST", "/v1/tools/lookup/company-sba-loans"],
323
344
  ["POST", "/v1/tools/lookup/company-vat-registration"],
@@ -402,6 +423,7 @@ export const UNTRUSTED_ROUTES = [
402
423
  ["POST", "/v1/tools/resolve/business"],
403
424
  ["POST", "/v1/tools/resolve/compound"],
404
425
  ["POST", "/v1/tools/resolve/gene"],
426
+ ["POST", "/v1/tools/resolve/organism"],
405
427
  ["POST", "/v1/tools/resolve/place"],
406
428
  ["POST", "/v1/tools/resolve/protein"],
407
429
  ["POST", "/v1/tools/resolve/variant"],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneshot-agent/mcp-server",
3
- "version": "0.50.0",
4
- "description": "MCP server for OneShot - 233 tools for AI agents",
3
+ "version": "0.51.0",
4
+ "description": "MCP server for OneShot - 243 tools for AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "@coinbase/cdp-sdk": "1.45.0",
28
28
  "@modelcontextprotocol/sdk": "1.32.2",
29
- "@oneshot-agent/sdk": "^0.62.0",
29
+ "@oneshot-agent/sdk": "^0.63.0",
30
30
  "zod": "4.6.7"
31
31
  },
32
32
  "devDependencies": {