@oneshot-agent/mcp-server 0.46.0 → 0.47.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
@@ -143,7 +143,7 @@ wallet. The server signs it for you. A read with no proof and no valid token is
143
143
 
144
144
  ## Tool discovery
145
145
 
146
- The MCP catalog contains 173 tools. `oneshot_discover_tools` is a free, read-only
146
+ The MCP catalog contains 183 tools. `oneshot_discover_tools` is a free, read-only
147
147
  search over the tools your token can call. Call it with no arguments for category
148
148
  counts, `{ "query": "send a printed letter" }` to search, or `{ "category": "email" }`
149
149
  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.46.0", // keep in sync with package.json; guarded by version.test.ts
53
+ version: "0.47.0", // keep in sync with package.json; guarded by version.test.ts
54
54
  }, {
55
55
  capabilities: {
56
56
  tools: {},
@@ -30,5 +30,7 @@ export interface RouteManifestEntry {
30
30
  required: string[];
31
31
  };
32
32
  example: Record<string, unknown>;
33
+ /** `false` for a route whose 202 envelope is the answer (a verification_url to hand on): the handler returns it and never waits for the job. */
34
+ wait?: false;
33
35
  }
34
36
  export declare const ROUTE_MANIFEST: readonly RouteManifestEntry[];
@@ -188,6 +188,29 @@ export const LOOKUP_MANIFEST = [
188
188
  "name": "aspirin"
189
189
  }
190
190
  },
191
+ {
192
+ "name": "compound_targets",
193
+ "path": "lookup/compound-targets",
194
+ "title": "Compound Targets",
195
+ "description": "Reports what the Open Targets Platform public database says about a drug or clinical candidate’s protein targets and mechanisms of action, with gene symbols and references. For research; not medical advice. Give exactly one of chembl_id or name. A PubChem CID is not accepted: pass the compound’s name, which Compound Resolve and Compound Properties return. A name search selects the first hit and lists up to three candidates so you can retry by ChEMBL id. An unknown compound returns matched: false. Does not return indications, adverse events, warnings, measured bioactivity or synthesis and preparation data.",
196
+ "inputSchema": {
197
+ "type": "object",
198
+ "properties": {
199
+ "chembl_id": {
200
+ "type": "string",
201
+ "description": "ChEMBL molecule identifier; lowercase is accepted. CHEMBL followed by 1 to 9 digits, without a leading zero."
202
+ },
203
+ "name": {
204
+ "type": "string",
205
+ "description": "Drug or compound name; the first search hit is used. 2 to 100 characters."
206
+ }
207
+ },
208
+ "required": []
209
+ },
210
+ "example": {
211
+ "chembl_id": "CHEMBL1201580"
212
+ }
213
+ },
191
214
  {
192
215
  "name": "company_consumer_complaints",
193
216
  "path": "lookup/company-consumer-complaints",
@@ -218,6 +241,47 @@ export const LOOKUP_MANIFEST = [
218
241
  "limit": 1
219
242
  }
220
243
  },
244
+ {
245
+ "name": "company_contractor_license",
246
+ "path": "lookup/company-contractor-license",
247
+ "title": "Contractor Licence",
248
+ "description": "Look up a construction contractor in the Washington State contractor licence register, which refreshes daily. `state` is required; currently only WA is covered. Give exactly one of `license_number`, `ubi` (the state business identifier) and `name`. Names are matched ignoring case as a substring of the business name, so a short distinctive fragment works best. Return at most `limit` licences, newest effective date first, each with its type, status, whether it is active, effective, expiration and suspension dates, specialties, business type, principal and address. The phone number is not returned, and the street line is null for an individual (a sole proprietor), whose street may be a home. Missing values are null; dates are YYYY-MM-DD. An empty licenses list is a completed result: no licence was found under that number, identifier or name, not evidence that the contractor never held one.",
249
+ "inputSchema": {
250
+ "type": "object",
251
+ "properties": {
252
+ "state": {
253
+ "type": "string",
254
+ "enum": [
255
+ "WA"
256
+ ],
257
+ "description": "State whose contractor register is searched"
258
+ },
259
+ "license_number": {
260
+ "type": "string",
261
+ "description": "The state contractor licence number, including any asterisks. 1 to 20 characters."
262
+ },
263
+ "ubi": {
264
+ "type": "string",
265
+ "description": "The state business identifier (UBI)"
266
+ },
267
+ "name": {
268
+ "type": "string",
269
+ "description": "A fragment of the business name, matched ignoring case. 2 to 100 characters."
270
+ },
271
+ "limit": {
272
+ "type": "integer",
273
+ "description": "Most licences to return. From 1 to 20. Defaults to `5`."
274
+ }
275
+ },
276
+ "required": [
277
+ "state"
278
+ ]
279
+ },
280
+ "example": {
281
+ "state": "WA",
282
+ "license_number": "ABSHEC*345PS"
283
+ }
284
+ },
221
285
  {
222
286
  "name": "record_court_cases_find",
223
287
  "path": "find/record-court-cases",
@@ -595,6 +659,41 @@ export const LOOKUP_MANIFEST = [
595
659
  "limit": 3
596
660
  }
597
661
  },
662
+ {
663
+ "name": "company_fda_registration",
664
+ "path": "lookup/company-fda-registration",
665
+ "title": "FDA Establishment Registration",
666
+ "description": "Covers medical device establishments registered with the US Food and Drug Administration, worldwide. Supply exactly one registration number, FEI number or firm name. A name search may match many establishments of one group; country narrows name searches only. registration_year is the year the registration runs to. Groups up to 100 source listings into establishments, in first-seen order. Products are unique by product code, at most 25 per establishment, newest created date first; duplicate codes use the newest listing’s details. When truncated is true, only the first 100 source listings are considered: product lists may be incomplete, and name searches may omit entire establishments. Named contacts are excluded. No match returns an empty list. The source refreshes weekly; the evidence date identifies its snapshot.",
667
+ "inputSchema": {
668
+ "type": "object",
669
+ "properties": {
670
+ "registration_number": {
671
+ "type": "string",
672
+ "description": "The establishment’s FDA registration number"
673
+ },
674
+ "fei_number": {
675
+ "type": "string",
676
+ "description": "The FDA establishment identifier"
677
+ },
678
+ "firm_name": {
679
+ "type": "string",
680
+ "description": "Firm name phrase; only letters, digits, spaces, ampersands, hyphens, periods and commas are kept. 2 to 100 characters."
681
+ },
682
+ "country": {
683
+ "type": "string",
684
+ "description": "Two-letter ISO country code; narrows firm name searches only"
685
+ },
686
+ "limit": {
687
+ "type": "integer",
688
+ "description": "The most establishments to return. From 1 to 10. Defaults to `3`."
689
+ }
690
+ },
691
+ "required": []
692
+ },
693
+ "example": {
694
+ "registration_number": "1030489"
695
+ }
696
+ },
598
697
  {
599
698
  "name": "company_federal_awards",
600
699
  "path": "lookup/company-federal-awards",
@@ -867,6 +966,58 @@ export const LOOKUP_MANIFEST = [
867
966
  "variant": "4 cyl"
868
967
  }
869
968
  },
969
+ {
970
+ "name": "gene_diseases",
971
+ "path": "lookup/gene-diseases",
972
+ "title": "Gene Diseases",
973
+ "description": "Reports the diseases the Open Targets Platform (CC0) associates with a human gene, strongest overall score first, with the evidence score of each datatype (genetic association, somatic mutation, known drug, affected pathway, literature, RNA expression, animal model, genetic literature). Human genes only. Pass an official gene symbol or an Ensembl gene ID; a version suffix is dropped. A symbol matches only a search hit with exactly that name, ignoring case: otherwise matched is false and the near hits are listed as candidates so you can retry by Ensembl ID. An unknown Ensembl ID returns matched: false. A score between 0 and 1 summarises the strength of the evidence that the gene and disease are associated; it is not a measure of causation or clinical risk. The data is for research and is not medical advice.",
974
+ "inputSchema": {
975
+ "type": "object",
976
+ "properties": {
977
+ "gene": {
978
+ "type": "string",
979
+ "description": "An official human gene symbol (BRCA1) or an Ensembl gene ID (ENSG00000012048); a version suffix is dropped. 1 to 30 characters. Letters, digits, \".\", \"_\" and \"-\" only."
980
+ },
981
+ "limit": {
982
+ "type": "integer",
983
+ "description": "Diseases returned, highest overall score first. From 1 to 25. Defaults to `10`."
984
+ }
985
+ },
986
+ "required": [
987
+ "gene"
988
+ ]
989
+ },
990
+ "example": {
991
+ "gene": "BRCA1",
992
+ "limit": 2
993
+ }
994
+ },
995
+ {
996
+ "name": "gene_expression",
997
+ "path": "lookup/gene-expression",
998
+ "title": "Gene Expression",
999
+ "description": "Reports median expression across donors of normal (non-diseased) tissue for human genes only. Uses open-access summary data from the Genotype-Tissue Expression (GTEx) project, US National Institutes of Health. Please cite the GTEx Portal (https://gtexportal.org) and dbGaP accession phs000424. Values are transcripts per million (TPM), static between releases; the answer names the dataset. Pass an official human gene symbol or an Ensembl gene ID, with or without a version. Exactly one matching reference row is required; otherwise matched is false and candidates lists the returned rows. Tissues are sorted by highest median first; omit limit for all tissues. The data is for research and is not medical advice.",
1000
+ "inputSchema": {
1001
+ "type": "object",
1002
+ "properties": {
1003
+ "gene": {
1004
+ "type": "string",
1005
+ "description": "Official human gene symbol (TP53) or Ensembl gene ID (ENSG00000141510), with or without a version. 1 to 30 characters. Letters, digits, \".\", \"_\" and \"-\" only."
1006
+ },
1007
+ "limit": {
1008
+ "type": "integer",
1009
+ "description": "Tissues returned, highest median first; omit for all tissues. From 1 to 60."
1010
+ }
1011
+ },
1012
+ "required": [
1013
+ "gene"
1014
+ ]
1015
+ },
1016
+ "example": {
1017
+ "gene": "TP53",
1018
+ "limit": 2
1019
+ }
1020
+ },
870
1021
  {
871
1022
  "name": "gene_pathways",
872
1023
  "path": "lookup/gene-pathways",
@@ -1074,6 +1225,41 @@ export const LOOKUP_MANIFEST = [
1074
1225
  "npi": "1245319599"
1075
1226
  }
1076
1227
  },
1228
+ {
1229
+ "name": "company_health_provider",
1230
+ "path": "lookup/company-health-provider",
1231
+ "title": "Health Provider Registration (organisation)",
1232
+ "description": "Look up US health care organisations (clinics, hospitals, pharmacies and suppliers) in the national provider register. Give a 10-digit NPI, or organization_name and state with an optional city, never both. Names match a prefix: a trailing * is appended when absent, with at least two characters before it. Returns registered names, active status, organisational subpart status, registration and update dates, specialties with primary flags and licence details, practice and mailing addresses, and the authorised official name and title. The official telephone is omitted. The registry refreshes daily; judge each record by last_updated_on. Registration is not a licence check or proof of current practice at the address. Use person_health_provider for individual practitioners. total is the number returned, at most limit; no match completes with providers: [].",
1233
+ "inputSchema": {
1234
+ "type": "object",
1235
+ "properties": {
1236
+ "npi": {
1237
+ "type": "string",
1238
+ "description": "The organisation provider number. Give this, or organization_name and state, never both. A health provider number is exactly 10 digits."
1239
+ },
1240
+ "organization_name": {
1241
+ "type": "string",
1242
+ "description": "Organisation name prefix. Needs state; a trailing * is appended when absent. 2 to 100 characters. Give at least two characters before an optional trailing *."
1243
+ },
1244
+ "state": {
1245
+ "type": "string",
1246
+ "description": "US state code. Needs organization_name. A state is two capital letters, such as MN."
1247
+ },
1248
+ "city": {
1249
+ "type": "string",
1250
+ "description": "A city, to narrow a name search. An optional trailing * needs at least two preceding characters. 1 to 100 characters."
1251
+ },
1252
+ "limit": {
1253
+ "type": "integer",
1254
+ "description": "Most providers to return. From 1 to 20. Defaults to `5`."
1255
+ }
1256
+ },
1257
+ "required": []
1258
+ },
1259
+ "example": {
1260
+ "npi": "1881018208"
1261
+ }
1262
+ },
1077
1263
  {
1078
1264
  "name": "place_hospitals",
1079
1265
  "path": "lookup/place-hospitals",
@@ -1127,6 +1313,47 @@ export const LOOKUP_MANIFEST = [
1127
1313
  "lei": "DPRBOZP0K5RM2YE8UU08"
1128
1314
  }
1129
1315
  },
1316
+ {
1317
+ "name": "business_liquor_license",
1318
+ "path": "lookup/business-liquor-license",
1319
+ "title": "Liquor Licence",
1320
+ "description": "Look up a business location in the New York State Liquor Authority register, which lists active licences only and refreshes daily. `state` is required; currently only NY is covered. Give at least one of `license_id` and `name`; the id takes precedence when both are given. Names are matched as stored, ignoring case, as a substring of the trade or legal name. Try a short distinctive fragment: SORLEY matches MC SORLEYS, but McSorley's does not. `zipcode` narrows either search. Return at most `limit` licences, newest last issue date first, with their class, premises, issue dates and expiration date. Missing values are null; dates are YYYY-MM-DD. An empty licenses list is a completed result: no active licence was found under that name or id, not evidence that the location never held one. Pending and inactive licences are not searched.",
1321
+ "inputSchema": {
1322
+ "type": "object",
1323
+ "properties": {
1324
+ "state": {
1325
+ "type": "string",
1326
+ "enum": [
1327
+ "NY"
1328
+ ],
1329
+ "description": "State issuing the licence"
1330
+ },
1331
+ "license_id": {
1332
+ "type": "string",
1333
+ "description": "The source licence identifier; takes precedence over name"
1334
+ },
1335
+ "name": {
1336
+ "type": "string",
1337
+ "description": "A distinctive fragment of the trade or legal name, matched ignoring case. 2 to 100 characters."
1338
+ },
1339
+ "zipcode": {
1340
+ "type": "string",
1341
+ "description": "ZIP code to narrow the search"
1342
+ },
1343
+ "limit": {
1344
+ "type": "integer",
1345
+ "description": "Most licences to return. From 1 to 25. Defaults to `10`."
1346
+ }
1347
+ },
1348
+ "required": [
1349
+ "state"
1350
+ ]
1351
+ },
1352
+ "example": {
1353
+ "state": "NY",
1354
+ "license_id": "0138-21-123999"
1355
+ }
1356
+ },
1130
1357
  {
1131
1358
  "name": "company_lobbying",
1132
1359
  "path": "lookup/company-lobbying",
@@ -1158,6 +1385,48 @@ export const LOOKUP_MANIFEST = [
1158
1385
  "limit": 1
1159
1386
  }
1160
1387
  },
1388
+ {
1389
+ "name": "company_medicare_ownership",
1390
+ "path": "lookup/company-medicare-ownership",
1391
+ "title": "Medicare Ownership",
1392
+ "description": "Look up the ownership of a US hospital, nursing home, home health agency, hospice, health center or rural health clinic, as reported by the facility to Medicare. facility_type picks the register: each kind of facility is its own dataset at the source. Give the facility enrollment_id, or part of its organization_name (matched as a substring, upper-cased), never both. Returns up to limit facilities, each with its owners: organisations and individuals with their role, share, join date, city and state, and owner-type flags such as holding_company, private_equity_company or reit. Individuals listed are owners, officers, directors or managing employees in that capacity; their street addresses are left out. Owners are sorted by share, highest first. The register is released monthly and release_file_date says which release answered. No match completes with facilities: []. When truncated is true the source page was full and the last facility may be missing owners.",
1393
+ "inputSchema": {
1394
+ "type": "object",
1395
+ "properties": {
1396
+ "facility_type": {
1397
+ "type": "string",
1398
+ "enum": [
1399
+ "hospital",
1400
+ "skilled_nursing",
1401
+ "home_health",
1402
+ "hospice",
1403
+ "health_center",
1404
+ "rural_health_clinic"
1405
+ ],
1406
+ "description": "Which register to search: each kind of facility is its own dataset at the source"
1407
+ },
1408
+ "enrollment_id": {
1409
+ "type": "string",
1410
+ "description": "The facility Medicare enrolment id. Give this or organization_name, never both. An enrolment id is O followed by 14 digits."
1411
+ },
1412
+ "organization_name": {
1413
+ "type": "string",
1414
+ "description": "Part of the enrolled organisation legal name; matched as a substring, upper-cased. 3 to 100 characters. Must be well-formed text, without unpaired UTF-16 surrogates."
1415
+ },
1416
+ "limit": {
1417
+ "type": "integer",
1418
+ "description": "Most facilities to return. From 1 to 10. Defaults to `3`."
1419
+ }
1420
+ },
1421
+ "required": [
1422
+ "facility_type"
1423
+ ]
1424
+ },
1425
+ "example": {
1426
+ "facility_type": "hospital",
1427
+ "enrollment_id": "O20020812000015"
1428
+ }
1429
+ },
1161
1430
  {
1162
1431
  "name": "company_motor_carrier",
1163
1432
  "path": "lookup/company-motor-carrier",
@@ -1421,6 +1690,56 @@ export const LOOKUP_MANIFEST = [
1421
1690
  "limit": 2
1422
1691
  }
1423
1692
  },
1693
+ {
1694
+ "name": "company_financials",
1695
+ "path": "lookup/company-financials",
1696
+ "title": "Reported Financials",
1697
+ "description": "Look up one reported financial figure of a US public company by its Central Index Key (CIK), the registrant number the US Securities and Exchange Commission assigns to every filer, as for Company Filings. `metric` is one of `revenue`, `net_income`, `operating_income`, `total_assets`, `total_liabilities`, `stockholders_equity`, `cash` or `eps_diluted`; `period` is `annual` (default) or `quarterly`. Returns the company name, the US GAAP tag and unit the figures come from, and one value per period, newest first, each with its calendar frame, start and end dates, fiscal year and period, the form that reported it, its filing date and accession number. Figures are as the company reported them in its filings, not adjusted or restated by anyone else; a later filing that restates a period replaces the earlier value. Looks up by identifier only: it does not search by company name or ticker. `periods` is empty when the company never reported the metric under its US GAAP tag. History is kept per series: Changes addresses one by the padded identifier, metric and period joined with colons (`0000320193:revenue:annual`); a call with a non-default `limit` is kept as a query.",
1698
+ "inputSchema": {
1699
+ "type": "object",
1700
+ "properties": {
1701
+ "cik": {
1702
+ "type": "string",
1703
+ "description": "The registry identifier (CIK), for example 320193. Shorter numbers are padded with zeros. A CIK is 1 to 10 digits."
1704
+ },
1705
+ "metric": {
1706
+ "type": "string",
1707
+ "enum": [
1708
+ "revenue",
1709
+ "net_income",
1710
+ "operating_income",
1711
+ "total_assets",
1712
+ "total_liabilities",
1713
+ "stockholders_equity",
1714
+ "cash",
1715
+ "eps_diluted"
1716
+ ],
1717
+ "description": "Which reported figure to return"
1718
+ },
1719
+ "period": {
1720
+ "type": "string",
1721
+ "enum": [
1722
+ "annual",
1723
+ "quarterly"
1724
+ ],
1725
+ "description": "Fiscal years or fiscal quarters. Defaults to `\"annual\"`."
1726
+ },
1727
+ "limit": {
1728
+ "type": "integer",
1729
+ "description": "Most periods to return, newest first. From 1 to 20. Defaults to `5`."
1730
+ }
1731
+ },
1732
+ "required": [
1733
+ "cik",
1734
+ "metric"
1735
+ ]
1736
+ },
1737
+ "example": {
1738
+ "cik": "320193",
1739
+ "metric": "revenue",
1740
+ "limit": 2
1741
+ }
1742
+ },
1424
1743
  {
1425
1744
  "name": "variant_clinical_significance",
1426
1745
  "path": "lookup/variant-clinical-significance",
@@ -2920,6 +3239,48 @@ export const ROUTE_MANIFEST = [
2920
3239
  "shipment_id": "se-1001"
2921
3240
  }
2922
3241
  },
3242
+ {
3243
+ "name": "identity_start",
3244
+ "method": "POST",
3245
+ "path": "/v1/tools/identity/start",
3246
+ "paid": true,
3247
+ "readOnly": false,
3248
+ "title": "Start an Identity Verification",
3249
+ "description": "Ask a person to verify their identity: they photograph an identity document and their face on a hosted page, after a consent page that shows them your purpose. Returns request_id, a verification_url to hand to the person (nothing is sent to them) and expires_at; the session expires after 7 days. Poll the request for the result: status (approved, declined, resubmission_requested, expired or abandoned), reason, document_type, issuing_country, name_matches and decided_at; every result, a resubmission request included, ends the session, so a fresh check needs a new request. The document number, images, date of birth and address are never kept. Charged when the session starts and not refunded if the person declines, abandons it or it expires (see Pricing). Subject to the agent's approval rules.",
3250
+ "inputSchema": {
3251
+ "type": "object",
3252
+ "properties": {
3253
+ "full_name": {
3254
+ "type": "string",
3255
+ "description": "The name of the person being verified, as it appears on their document (1 to 200 characters)"
3256
+ },
3257
+ "email": {
3258
+ "type": "string",
3259
+ "description": "Their email address (optional; deleted when the session ends)"
3260
+ },
3261
+ "purpose": {
3262
+ "type": "string",
3263
+ "description": "Why they are asked, shown to them on the consent page (at most 140 characters)"
3264
+ },
3265
+ "idempotency_key": {
3266
+ "type": "string",
3267
+ "description": "A key of your choosing (1 to 255 letters, digits, _ . : -); the same key with the same input returns the same session instead of starting and charging another"
3268
+ }
3269
+ },
3270
+ "required": [
3271
+ "full_name",
3272
+ "purpose",
3273
+ "idempotency_key"
3274
+ ]
3275
+ },
3276
+ "example": {
3277
+ "full_name": "Jane Doe",
3278
+ "email": "jane@example.com",
3279
+ "purpose": "Confirm the account holder before a payout",
3280
+ "idempotency_key": "kyc-2026-10-jane-doe"
3281
+ },
3282
+ "wait": false
3283
+ },
2923
3284
  {
2924
3285
  "name": "tax_calculate",
2925
3286
  "method": "POST",
@@ -40,5 +40,7 @@ export function routeRequest(entry, args) {
40
40
  }
41
41
  return entry.method === "GET" || entry.method === "DELETE" ? { params, query: rest } : { params, body: rest };
42
42
  }
43
- const routeHandler = (entry) => (agent, args) => agent.route(entry.method, entry.path, { ...routeRequest(entry, args), paid: entry.paid });
43
+ // An acceptance route (`wait: false`, Identity Verification) answers with the envelope the caller acts on
44
+ // (the verification_url to hand to the person): returned as it is, never polled until the person decides.
45
+ const routeHandler = (entry) => (agent, args) => agent.route(entry.method, entry.path, { ...routeRequest(entry, args), paid: entry.paid, ...(entry.wait === false ? { wait: false } : {}) });
44
46
  export const routeHandlers = Object.fromEntries(ROUTE_MANIFEST.map((entry) => [`oneshot_${entry.name}`, routeHandler(entry)]));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneshot-agent/mcp-server",
3
- "version": "0.46.0",
4
- "description": "MCP server for OneShot - 173 tools for AI agents",
3
+ "version": "0.47.0",
4
+ "description": "MCP server for OneShot - 183 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.27.1",
29
- "@oneshot-agent/sdk": "^0.58.0",
29
+ "@oneshot-agent/sdk": "^0.59.0",
30
30
  "zod": "3.25.76"
31
31
  },
32
32
  "devDependencies": {