@oneshot-agent/mcp-server 0.39.1 → 0.41.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.
@@ -111,6 +111,29 @@ export const LOOKUP_MANIFEST = [
111
111
  "limit": 1
112
112
  }
113
113
  },
114
+ {
115
+ "name": "compound_properties",
116
+ "path": "lookup/compound-properties",
117
+ "title": "Compound Properties",
118
+ "description": "Give the computed molecular descriptors of a chemical compound by its compound identifier (CID) or its InChIKey: the IUPAC name, molecular formula, InChIKey, molecular weight in g/mol, exact mass in Da, XLogP, topological polar surface area in square angstroms, the counts of hydrogen bond donors and acceptors, rotatable bonds and heavy atoms, the formal charge and the complexity score, with a link to the compound page. These are values the source computes from the structure, not measurements. Use it to characterise a compound in a literature review, a screening library or a regulatory file. Give exactly one of `cid` and `inchikey`. `compound` is null when the source knows no compound with that identifier. Synonyms, depositor records, and any synthesis or preparation data are not returned.",
119
+ "inputSchema": {
120
+ "type": "object",
121
+ "properties": {
122
+ "cid": {
123
+ "type": "integer",
124
+ "description": "The compound identifier (CID), for example 2244. From 1 to 999999999."
125
+ },
126
+ "inchikey": {
127
+ "type": "string",
128
+ "description": "The standard InChIKey of the compound, for example BSYNRYMUTXBXSQ-UHFFFAOYSA-N. Exactly 27 characters. An InChIKey is 14 capitals, a hyphen, 10 capitals, a hyphen and one capital."
129
+ }
130
+ },
131
+ "required": []
132
+ },
133
+ "example": {
134
+ "cid": 2244
135
+ }
136
+ },
114
137
  {
115
138
  "name": "compound_resolve",
116
139
  "path": "resolve/compound",
@@ -269,6 +292,42 @@ export const LOOKUP_MANIFEST = [
269
292
  "variant": "FWD"
270
293
  }
271
294
  },
295
+ {
296
+ "name": "product_device_clearances",
297
+ "path": "lookup/product-device-clearances",
298
+ "title": "Device Clearances",
299
+ "description": "Look up medical devices cleared by the US Food and Drug Administration through premarket notification (510(k)). Supply at least one clearance number, applicant, device name or product code. Names are matched as word phrases; multiple filters must all match. Returns the total matches and clearance records, newest decision first, with device classifications and decision and received dates. Contact names and street addresses are excluded. No match returns an empty list. The source refreshes weekly.",
300
+ "inputSchema": {
301
+ "type": "object",
302
+ "properties": {
303
+ "k_number": {
304
+ "type": "string",
305
+ "description": "The clearance number, for example K253582"
306
+ },
307
+ "applicant": {
308
+ "type": "string",
309
+ "description": "The company that applied, matched as words. 2 to 100 characters."
310
+ },
311
+ "device_name": {
312
+ "type": "string",
313
+ "description": "The device name, matched as words. 2 to 100 characters."
314
+ },
315
+ "product_code": {
316
+ "type": "string",
317
+ "description": "The FDA product code"
318
+ },
319
+ "limit": {
320
+ "type": "integer",
321
+ "description": "The most clearance records to return. From 1 to 25. Defaults to `10`."
322
+ }
323
+ },
324
+ "required": []
325
+ },
326
+ "example": {
327
+ "applicant": "Apple Inc",
328
+ "limit": 2
329
+ }
330
+ },
272
331
  {
273
332
  "name": "place_disasters",
274
333
  "path": "lookup/place-disasters",
@@ -1003,6 +1062,47 @@ export const LOOKUP_MANIFEST = [
1003
1062
  "limit": 10
1004
1063
  }
1005
1064
  },
1065
+ {
1066
+ "name": "protein_domains",
1067
+ "path": "lookup/protein-domains",
1068
+ "title": "Protein Domains",
1069
+ "description": "InterPro entries from InterPro at EMBL-EBI, under CC0 1.0. Returns integrated InterPro entries only, never member-database signatures. Covers canonical UniProtKB sequences; isoform accessions are refused. Filter by entry type or omit types for all entries. An empty types list keeps no entries. Entries are sorted by their first location’s start, then identifier. Locations span the first through last fragment; discontinuous marks multiple fragments or a fragment whose dc-status is not CONTINUOUS. Releases arrive about every eight weeks; no per-entry date is supplied, so changes are recorded as observations. Returns the first page only (up to 200 entries), with truncated true when another page exists. No match completes with an empty entries list and null protein_length.",
1070
+ "inputSchema": {
1071
+ "type": "object",
1072
+ "properties": {
1073
+ "accession": {
1074
+ "type": "string",
1075
+ "description": "The canonical UniProt accession identifying the protein, for example P04637; isoforms are not accepted"
1076
+ },
1077
+ "types": {
1078
+ "type": "array",
1079
+ "items": {
1080
+ "type": "string",
1081
+ "enum": [
1082
+ "family",
1083
+ "domain",
1084
+ "homologous_superfamily",
1085
+ "repeat",
1086
+ "conserved_site",
1087
+ "active_site",
1088
+ "binding_site",
1089
+ "ptm"
1090
+ ]
1091
+ },
1092
+ "description": "Keep only these entry types; omitted means all types"
1093
+ }
1094
+ },
1095
+ "required": [
1096
+ "accession"
1097
+ ]
1098
+ },
1099
+ "example": {
1100
+ "accession": "P04637",
1101
+ "types": [
1102
+ "conserved_site"
1103
+ ]
1104
+ }
1105
+ },
1006
1106
  {
1007
1107
  "name": "protein_function",
1008
1108
  "path": "lookup/protein-function",
@@ -1029,6 +1129,27 @@ export const LOOKUP_MANIFEST = [
1029
1129
  "include_sequence": false
1030
1130
  }
1031
1131
  },
1132
+ {
1133
+ "name": "protein_sequence",
1134
+ "path": "lookup/protein-sequence",
1135
+ "title": "Protein Sequence",
1136
+ "description": "Protein sequences from UniProt under CC BY 4.0, attributed to the UniProt Consortium. Medical or genetic information is for research and education only. The sequence is the reference sequence UniProtKB holds for a protein, never an individual’s sequence. Covers reviewed and unreviewed entries; an accession with an isoform suffix (P04637-2) returns that isoform’s sequence. Returns the one-letter sequence, length, molecular weight in daltons, CRC64 and MD5 checksums, gene, organism and the isoforms the entry lists. sequence_version and last_sequence_update describe the entry, also for an isoform. UniProt releases updates every eight weeks. Absent values are null. A merged, demerged or deleted accession returns no protein and the source’s inactive reason with any replacement accessions. No match, including an isoform the entry does not list, returns null for both.",
1137
+ "inputSchema": {
1138
+ "type": "object",
1139
+ "properties": {
1140
+ "accession": {
1141
+ "type": "string",
1142
+ "description": "The UniProt accession, for example P04637, or an isoform accession, for example P04637-2"
1143
+ }
1144
+ },
1145
+ "required": [
1146
+ "accession"
1147
+ ]
1148
+ },
1149
+ "example": {
1150
+ "accession": "P00001"
1151
+ }
1152
+ },
1032
1153
  {
1033
1154
  "name": "protein_structure",
1034
1155
  "path": "lookup/protein-structure",
@@ -1357,6 +1478,48 @@ export const ROUTE_MANIFEST = [
1357
1478
  "profile_id": "prof_01HX"
1358
1479
  }
1359
1480
  },
1481
+ {
1482
+ "name": "physical_mail_approve",
1483
+ "method": "POST",
1484
+ "path": "/v1/tools/physical-mail/approve",
1485
+ "paid": false,
1486
+ "readOnly": false,
1487
+ "title": "Approve a Mail Quote",
1488
+ "description": "Approve the exact mailpiece and price of a quote. Repeat the input_hash and total_usdc the quote returned: a changed piece or price is refused. Nothing is charged yet. Returns approval_id, which oneshot_physical_mail_send needs with the quote_id.",
1489
+ "inputSchema": {
1490
+ "type": "object",
1491
+ "properties": {
1492
+ "quote_id": {
1493
+ "type": "string",
1494
+ "description": "Quote id from oneshot_physical_mail_preview"
1495
+ },
1496
+ "input_hash": {
1497
+ "type": "string",
1498
+ "description": "input_hash the quote returned (64 hex characters)"
1499
+ },
1500
+ "total_usdc": {
1501
+ "type": "string",
1502
+ "description": "total_usdc the quote returned, as a decimal string"
1503
+ },
1504
+ "approved": {
1505
+ "type": "boolean",
1506
+ "description": "Must be true: an explicit approval of this piece at this price"
1507
+ }
1508
+ },
1509
+ "required": [
1510
+ "quote_id",
1511
+ "input_hash",
1512
+ "total_usdc",
1513
+ "approved"
1514
+ ]
1515
+ },
1516
+ "example": {
1517
+ "quote_id": "00000000-0000-4000-8000-000000000000",
1518
+ "input_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1519
+ "total_usdc": "1.85",
1520
+ "approved": true
1521
+ }
1522
+ },
1360
1523
  {
1361
1524
  "name": "benchmark",
1362
1525
  "method": "POST",
@@ -1467,6 +1630,30 @@ export const ROUTE_MANIFEST = [
1467
1630
  "state": "IL"
1468
1631
  }
1469
1632
  },
1633
+ {
1634
+ "name": "physical_mail_cancel",
1635
+ "method": "POST",
1636
+ "path": "/v1/tools/physical-mail/orders/{order_id}/cancel",
1637
+ "paid": false,
1638
+ "readOnly": false,
1639
+ "title": "Cancel a Mail Order",
1640
+ "description": "Ask to cancel a mail order. Accepted (202) as a request: cancellation is not guaranteed once the mail has been submitted for printing; read the order to see whether it was canceled and refunded. Free.",
1641
+ "inputSchema": {
1642
+ "type": "object",
1643
+ "properties": {
1644
+ "order_id": {
1645
+ "type": "string",
1646
+ "description": "Order id from oneshot_physical_mail_send"
1647
+ }
1648
+ },
1649
+ "required": [
1650
+ "order_id"
1651
+ ]
1652
+ },
1653
+ "example": {
1654
+ "order_id": "00000000-0000-4000-8000-000000000000"
1655
+ }
1656
+ },
1470
1657
  {
1471
1658
  "name": "watch_update",
1472
1659
  "method": "PATCH",
@@ -1655,6 +1842,54 @@ export const ROUTE_MANIFEST = [
1655
1842
  "domain": "mail.example.com"
1656
1843
  }
1657
1844
  },
1845
+ {
1846
+ "name": "physical_mail_order",
1847
+ "method": "GET",
1848
+ "path": "/v1/tools/physical-mail/orders/{order_id}",
1849
+ "paid": false,
1850
+ "readOnly": true,
1851
+ "title": "Get a Mail Order",
1852
+ "description": "Read a mail order: order_status, payment_status, fulfillment_status, events, cancel_before and the signed receipt. Free. Delivery events are postal observations, never evidence the mail was read.",
1853
+ "inputSchema": {
1854
+ "type": "object",
1855
+ "properties": {
1856
+ "order_id": {
1857
+ "type": "string",
1858
+ "description": "Order id from oneshot_physical_mail_send or oneshot_physical_mail_recover"
1859
+ }
1860
+ },
1861
+ "required": [
1862
+ "order_id"
1863
+ ]
1864
+ },
1865
+ "example": {
1866
+ "order_id": "00000000-0000-4000-8000-000000000000"
1867
+ }
1868
+ },
1869
+ {
1870
+ "name": "physical_mail_quote",
1871
+ "method": "GET",
1872
+ "path": "/v1/tools/physical-mail/quotes/{quote_id}",
1873
+ "paid": false,
1874
+ "readOnly": true,
1875
+ "title": "Get a Mail Quote",
1876
+ "description": "Read a quote from oneshot_physical_mail_preview: its status (rendering or ready), input_hash, total_usdc, proof url, expires_at and approval_id once approved. Free. Poll it while status is rendering.",
1877
+ "inputSchema": {
1878
+ "type": "object",
1879
+ "properties": {
1880
+ "quote_id": {
1881
+ "type": "string",
1882
+ "description": "Quote id from oneshot_physical_mail_preview"
1883
+ }
1884
+ },
1885
+ "required": [
1886
+ "quote_id"
1887
+ ]
1888
+ },
1889
+ "example": {
1890
+ "quote_id": "00000000-0000-4000-8000-000000000000"
1891
+ }
1892
+ },
1658
1893
  {
1659
1894
  "name": "voice_inbound_get",
1660
1895
  "method": "GET",
@@ -1733,6 +1968,83 @@ export const ROUTE_MANIFEST = [
1733
1968
  },
1734
1969
  "example": {}
1735
1970
  },
1971
+ {
1972
+ "name": "physical_mail_preview",
1973
+ "method": "POST",
1974
+ "path": "/v1/tools/physical-mail/preview",
1975
+ "paid": false,
1976
+ "readOnly": false,
1977
+ "title": "Preview and Quote a Mailpiece",
1978
+ "description": "Quote a letter or postcard and render an uncharged test proof. Nothing is printed or charged. Returns quote_id, input_hash, total_usdc (the price of this piece; see Pricing), the proof url and expires_at. Upload the artwork first with oneshot_physical_mail_upload; its asset ids go in artwork.file (letter) or artwork.front and artwork.back (postcard). Next: oneshot_physical_mail_approve with the returned quote_id, input_hash and total_usdc.",
1979
+ "inputSchema": {
1980
+ "type": "object",
1981
+ "properties": {
1982
+ "to": {
1983
+ "type": "object",
1984
+ "description": "Recipient address: { name, address_line1, address_line2?, address_city, address_state (two letters), address_zip (5 or 9 digits), address_country? (\"US\") }"
1985
+ },
1986
+ "from": {
1987
+ "type": "object",
1988
+ "description": "Return address, same shape as to"
1989
+ },
1990
+ "artwork": {
1991
+ "type": "object",
1992
+ "description": "Letter: { kind: \"letter\", file: <asset id of a PDF>, color?: boolean, double_sided?: boolean }. Postcard: { kind: \"postcard\", front: <asset id>, back: <asset id> }"
1993
+ }
1994
+ },
1995
+ "required": [
1996
+ "to",
1997
+ "from",
1998
+ "artwork"
1999
+ ]
2000
+ },
2001
+ "example": {
2002
+ "to": {
2003
+ "name": "Jane Doe",
2004
+ "address_line1": "185 Berry St",
2005
+ "address_city": "San Francisco",
2006
+ "address_state": "CA",
2007
+ "address_zip": "94107"
2008
+ },
2009
+ "from": {
2010
+ "name": "Acme Inc",
2011
+ "address_line1": "1 Main St",
2012
+ "address_city": "Austin",
2013
+ "address_state": "TX",
2014
+ "address_zip": "78701"
2015
+ },
2016
+ "artwork": {
2017
+ "kind": "letter",
2018
+ "file": "00000000-0000-4000-8000-000000000000",
2019
+ "color": false,
2020
+ "double_sided": false
2021
+ }
2022
+ }
2023
+ },
2024
+ {
2025
+ "name": "physical_mail_recover",
2026
+ "method": "GET",
2027
+ "path": "/v1/tools/physical-mail/orders/recover",
2028
+ "paid": false,
2029
+ "readOnly": true,
2030
+ "title": "Recover a Mail Order",
2031
+ "description": "Find the order a send created, by the idempotency key given to oneshot_physical_mail_send. Use it after a timeout or lost response instead of sending again. Free. Answers 404 when no send with that key reached the API.",
2032
+ "inputSchema": {
2033
+ "type": "object",
2034
+ "properties": {
2035
+ "key": {
2036
+ "type": "string",
2037
+ "description": "The idempotency key of the send (1-255 characters: letters, digits, _ . : -)"
2038
+ }
2039
+ },
2040
+ "required": [
2041
+ "key"
2042
+ ]
2043
+ },
2044
+ "example": {
2045
+ "key": "thank-you-2026-q3-jane-doe"
2046
+ }
2047
+ },
1736
2048
  {
1737
2049
  "name": "company_sanctions",
1738
2050
  "method": "POST",
@@ -1802,62 +2114,55 @@ export const ROUTE_MANIFEST = [
1802
2114
  }
1803
2115
  },
1804
2116
  {
1805
- "name": "solve",
2117
+ "name": "physical_mail_validate_address",
1806
2118
  "method": "POST",
1807
- "path": "/v1/tools/solve",
1808
- "paid": true,
2119
+ "path": "/v1/tools/physical-mail/validate-address",
2120
+ "paid": false,
1809
2121
  "readOnly": true,
1810
- "title": "Solve",
1811
- "description": "Plan vehicle routes within capacity and time windows. Returns the best route found, constraint checks and conflicts.",
2122
+ "title": "Validate a Mailing Address",
2123
+ "description": "Check that a U.S. postal address is deliverable before quoting mail to it. Returns deliverable, a deliverability code and the standardised address. Free; changes nothing.",
1812
2124
  "inputSchema": {
1813
2125
  "type": "object",
1814
2126
  "properties": {
1815
- "problem": {
2127
+ "name": {
1816
2128
  "type": "string",
1817
- "enum": [
1818
- "routing"
1819
- ]
2129
+ "description": "Recipient name (1-100 characters)"
1820
2130
  },
1821
- "time_limit_s": {
1822
- "type": "integer",
1823
- "minimum": 1,
1824
- "maximum": 300,
1825
- "default": 30
2131
+ "address_line1": {
2132
+ "type": "string",
2133
+ "description": "Street address (1-200 characters)"
1826
2134
  },
1827
- "routing": {
1828
- "type": "object",
1829
- "description": "Vehicles, stops, objective and optional travel matrix."
2135
+ "address_line2": {
2136
+ "type": "string",
2137
+ "description": "Apartment, suite or unit (optional)"
2138
+ },
2139
+ "address_city": {
2140
+ "type": "string"
2141
+ },
2142
+ "address_state": {
2143
+ "type": "string",
2144
+ "description": "Two-letter state code, e.g. CA"
2145
+ },
2146
+ "address_zip": {
2147
+ "type": "string",
2148
+ "description": "ZIP code, 5 digits or ZIP+4"
1830
2149
  }
1831
2150
  },
1832
2151
  "required": [
1833
- "problem",
1834
- "routing"
2152
+ "name",
2153
+ "address_line1",
2154
+ "address_city",
2155
+ "address_state",
2156
+ "address_zip"
1835
2157
  ]
1836
2158
  },
1837
2159
  "example": {
1838
- "problem": "routing",
1839
- "routing": {
1840
- "objective": "distance",
1841
- "vehicles": [
1842
- {
1843
- "id": "van",
1844
- "capacity": 10,
1845
- "start": {
1846
- "lat": 48,
1847
- "lng": 16
1848
- }
1849
- }
1850
- ],
1851
- "stops": [
1852
- {
1853
- "id": "stop",
1854
- "location": {
1855
- "lat": 48.01,
1856
- "lng": 16.01
1857
- }
1858
- }
1859
- ]
1860
- }
2160
+ "name": "Jane Doe",
2161
+ "address_line1": "185 Berry St",
2162
+ "address_line2": "Suite 6100",
2163
+ "address_city": "San Francisco",
2164
+ "address_state": "CA",
2165
+ "address_zip": "94107"
1861
2166
  }
1862
2167
  },
1863
2168
  {
@@ -1,25 +1,22 @@
1
+ import { PERSON_IDENTITY_PROPERTIES, personIdentity } from "./enrichment.js";
1
2
  export const personDossierTool = {
2
3
  name: "oneshot_person_dossier",
3
- description: "Get a person’s profile, known social accounts, articles, posts and written summary. Takes 2-5 minutes. Paid tool. Phone lookup is off by default. include_phone=true buys a lookup for up to one person at the add-on listed on the pricing page; no phone hit is guaranteed.",
4
+ description: "Get a person’s profile, known social accounts, articles, posts and written summary, from whatever you know: name (+ company), email, phone or a profile URL. Takes 2-5 minutes. Paid tool. Phone lookup is off by default. include_phone=true buys a lookup for up to one person at the add-on listed on the pricing page; no phone hit is guaranteed.",
4
5
  inputSchema: {
5
6
  type: "object",
6
7
  properties: {
7
8
  include_phone: { type: "boolean", default: false, description: "Phone lookup is off by default. include_phone=true buys a lookup for up to one person at the add-on listed on the pricing page; no phone hit is guaranteed." },
8
- email: { type: "string", description: "Person's email address" },
9
- social_media_url: { type: "string", description: "LinkedIn, Twitter, or other social profile URL" },
10
- name: { type: "string", description: "Person's full name" },
11
- company: { type: "string", description: "Company name (helps disambiguate)" },
9
+ ...PERSON_IDENTITY_PROPERTIES,
12
10
  },
13
11
  },
14
12
  };
15
13
  export const personSocialAccountsTool = {
16
14
  name: "oneshot_person_social_accounts",
17
- description: "Discover all social media profiles for a person across platforms (LinkedIn, Twitter, GitHub, YouTube, etc). Paid tool.",
15
+ description: "Discover all social media profiles for a person across platforms (LinkedIn, Twitter, GitHub, YouTube, etc), from a name (+ company), email, phone or a known profile URL. Paid tool.",
18
16
  inputSchema: {
19
17
  type: "object",
20
18
  properties: {
21
- email: { type: "string", description: "Person's email address" },
22
- social_media_url: { type: "string", description: "Known social profile URL to start from" },
19
+ ...PERSON_IDENTITY_PROPERTIES,
23
20
  },
24
21
  },
25
22
  };
@@ -39,38 +36,34 @@ export const personArticlesTool = {
39
36
  };
40
37
  export const personPostsTool = {
41
38
  name: "oneshot_person_posts",
42
- description: "Get a person's recent social media posts with likes, replies, and shares. Paid tool.",
39
+ description: "Get a person's recent social media posts with likes, replies, and shares. Give a profile URL, or a name (+ company) / email to resolve one. Paid tool.",
43
40
  inputSchema: {
44
41
  type: "object",
45
42
  properties: {
46
- social_media_url: { type: "string", description: "Social profile URL (Twitter, LinkedIn, etc)" },
43
+ ...PERSON_IDENTITY_PROPERTIES,
47
44
  },
48
- required: ["social_media_url"],
49
45
  },
50
46
  };
51
47
  export const personInterestsTool = {
52
48
  name: "oneshot_person_interests",
53
- description: "Figure out what someone cares about — sports, politics, tech, entertainment, etc. Paid tool.",
49
+ description: "Figure out what someone cares about — sports, politics, tech, entertainment, etc. Give a name (+ company), email, phone or profile URL. Paid tool.",
54
50
  inputSchema: {
55
51
  type: "object",
56
52
  properties: {
57
- email: { type: "string", description: "Person's email address" },
58
- phone: { type: "string", description: "Person's phone number" },
59
- social_media_url: { type: "string", description: "Social profile URL" },
53
+ ...PERSON_IDENTITY_PROPERTIES,
60
54
  },
61
55
  },
62
56
  };
63
57
  export const personFollowersTool = {
64
58
  name: "oneshot_person_followers",
65
- description: "See who someone follows, who follows them, and who they reply to. Paid tool.",
59
+ description: "See who someone follows, who follows them, and who they reply to. Give an X profile URL, or a name (+ company) / email to resolve one. Paid tool.",
66
60
  inputSchema: {
67
61
  type: "object",
68
62
  properties: {
69
- social_media_url: { type: "string", description: "Social profile or post URL (Twitter/X or Instagram)" },
63
+ ...PERSON_IDENTITY_PROPERTIES,
70
64
  type: { type: "string", enum: ["replies", "followers", "following", "followers,following"], description: "Interaction type (default: followers,following)" },
71
65
  max_results: { type: "number", description: "Max results 1-1000 (default: 100)" },
72
66
  },
73
- required: ["social_media_url"],
74
67
  },
75
68
  };
76
69
  /** Deep person research fans out across several providers. The SDK now defaults personDossier to the same 300 s (#1913); this keeps the MCP value explicit. */
@@ -78,18 +71,12 @@ export const PERSON_DOSSIER_TIMEOUT_SEC = 300;
78
71
  export async function handlePersonDossier(agent, args) {
79
72
  return agent.personDossier({
80
73
  includePhone: args.include_phone,
81
- email: args.email,
82
- social_media_url: args.social_media_url,
83
- name: args.name,
84
- company: args.company,
74
+ ...personIdentity(args),
85
75
  timeout: PERSON_DOSSIER_TIMEOUT_SEC,
86
76
  });
87
77
  }
88
78
  export async function handlePersonSocialAccounts(agent, args) {
89
- return agent.personSocialAccounts({
90
- email: args.email,
91
- social_media_url: args.social_media_url,
92
- });
79
+ return agent.personSocialAccounts(personIdentity(args));
93
80
  }
94
81
  export async function handlePersonArticles(agent, args) {
95
82
  return agent.personArticles({
@@ -100,20 +87,14 @@ export async function handlePersonArticles(agent, args) {
100
87
  });
101
88
  }
102
89
  export async function handlePersonPosts(agent, args) {
103
- return agent.personPosts({
104
- social_media_url: args.social_media_url,
105
- });
90
+ return agent.personPosts(personIdentity(args));
106
91
  }
107
92
  export async function handlePersonInterests(agent, args) {
108
- return agent.personInterests({
109
- email: args.email,
110
- phone: args.phone,
111
- social_media_url: args.social_media_url,
112
- });
93
+ return agent.personInterests(personIdentity(args));
113
94
  }
114
95
  export async function handlePersonFollowers(agent, args) {
115
96
  return agent.personFollowers({
116
- social_media_url: args.social_media_url,
97
+ ...personIdentity(args),
117
98
  type: args.type,
118
99
  max_results: args.max_results,
119
100
  });
@@ -0,0 +1,34 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { OneShot } from "@oneshot-agent/sdk";
3
+ /**
4
+ * The two Physical Mail steps that a generated route tool cannot carry (#1883): the send,
5
+ * which needs an idempotency key header beside the quote id and the approval id, and the
6
+ * artwork upload, whose body is a raw PDF, PNG or JPEG. Both go through the SDK's
7
+ * `physicalMail` (libs/agent-sdk/src/physical-mail.ts). The other seven routes (validate,
8
+ * preview, quote, approve, recover, order, cancel) are generated from the declaration.
9
+ */
10
+ /** The route's own limit (`uploadArtwork` in services/physical-mail/service.ts): 20 MB. */
11
+ export declare const PHYSICAL_MAIL_ASSET_LIMIT_BYTES: number;
12
+ export declare const PHYSICAL_MAIL_ASSET_TYPES: readonly ["application/pdf", "image/png", "image/jpeg"];
13
+ type AssetType = (typeof PHYSICAL_MAIL_ASSET_TYPES)[number];
14
+ export declare const physicalMailSendTool: Tool;
15
+ export declare function handlePhysicalMailSend(agent: OneShot, args: Record<string, unknown>): Promise<import("@oneshot-agent/sdk").MailOrder>;
16
+ export declare const physicalMailUploadTool: Tool;
17
+ /** Decodes the base64 `content`, refusing anything that is not base64 or that would exceed the route's limit before any bytes are sent. */
18
+ export declare function decodeArtwork(args: Record<string, unknown>): {
19
+ data: Uint8Array;
20
+ mime: AssetType;
21
+ };
22
+ /**
23
+ * The decoded size of structurally valid base64 (standard or URL-safe alphabet, padding optional), or null.
24
+ * `Buffer.from(text, "base64")` tolerates a length one past a quartet, missing, short and excess padding
25
+ * (`AAAAA`, `AAA==`, `AAAA==`), so counting characters and subtracting the `=`s would undercount such
26
+ * input; the bound has to come from a shape the decoder cannot read differently.
27
+ */
28
+ export declare function base64Size(text: string): number | null;
29
+ export declare function handlePhysicalMailUpload(agent: OneShot, args: Record<string, unknown>): Promise<{
30
+ asset_id: string;
31
+ content_hash: string;
32
+ mime_type: string;
33
+ }>;
34
+ export {};