@talonic/docs 0.20.19 → 0.20.20

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.
Files changed (2) hide show
  1. package/dist/content.js +970 -176
  2. package/package.json +1 -1
package/dist/content.js CHANGED
@@ -27700,11 +27700,11 @@ var sections_default2 = [
27700
27700
  parentSlug: "mcp-overview",
27701
27701
  title: "Introduction",
27702
27702
  seoTitle: "MCP Server Introduction \u2014 Talonic Docs",
27703
- description: "Official Talonic MCP server for AI agents. Eight tools and two resources for structured document extraction via the Model Context Protocol.",
27703
+ description: "Official Talonic MCP server for AI agents. Nine tools and two resources for structured document extraction via the Model Context Protocol.",
27704
27704
  content: [
27705
27705
  {
27706
27706
  type: "paragraph",
27707
- text: "The `@talonic/mcp` package is the official Talonic MCP server. It gives AI agents eight tools and two resources for extracting structured, schema-validated data from any document via the [Model Context Protocol](https://modelcontextprotocol.io)."
27707
+ text: "The `@talonic/mcp` package is the official Talonic MCP server. It gives AI agents nine tools and two resources for extracting structured, schema-validated data from any document via the [Model Context Protocol](https://modelcontextprotocol.io)."
27708
27708
  },
27709
27709
  {
27710
27710
  type: "paragraph",
@@ -27712,7 +27712,7 @@ var sections_default2 = [
27712
27712
  },
27713
27713
  {
27714
27714
  type: "paragraph",
27715
- text: "With this MCP server installed, the agent has a `talonic_extract` tool that returns schema-validated JSON with per-field confidence scores, a detected document type, and stable IDs for follow-up calls. The other seven tools cover the rest of the workflow: searching the workspace, filtering by extracted field values, fetching document metadata, getting OCR markdown, listing saved schemas, saving new ones, and reading the workspace credit balance for budget-aware behaviour."
27715
+ text: "With this MCP server installed, the agent has a `talonic_extract` tool that returns schema-validated JSON with per-field confidence scores, a detected document type, and stable IDs for follow-up calls. The other eight tools cover the rest of the workflow: searching the workspace, filtering by extracted field values, fetching document metadata, getting OCR markdown, listing saved schemas, saving new ones, and reading the workspace credit balance for budget-aware behaviour."
27716
27716
  },
27717
27717
  {
27718
27718
  type: "callout",
@@ -27720,17 +27720,31 @@ var sections_default2 = [
27720
27720
  }
27721
27721
  ],
27722
27722
  related: [
27723
- { label: "Installation", slug: "mcp-installation" },
27724
- { label: "Tools", slug: "mcp-talonic-extract" },
27725
- { label: "Node SDK", slug: "sdk-introduction" }
27723
+ {
27724
+ label: "Installation",
27725
+ slug: "mcp-installation"
27726
+ },
27727
+ {
27728
+ label: "Tools",
27729
+ slug: "mcp-talonic-extract"
27730
+ },
27731
+ {
27732
+ label: "Node SDK",
27733
+ slug: "sdk-introduction"
27734
+ }
27726
27735
  ],
27727
27736
  faq: [
27728
27737
  {
27729
27738
  question: "What is the Talonic MCP server?",
27730
- answer: "An official Model Context Protocol server that gives AI agents eight tools for document extraction, search, filtering, schema management, and credit-balance lookup via the Talonic API."
27739
+ answer: "An official Model Context Protocol server that gives AI agents nine tools for document extraction, search, filtering, schema management, and credit-balance lookup via the Talonic API."
27731
27740
  }
27732
27741
  ],
27733
- mentions: ["MCP", "Model Context Protocol", "AI agents", "document extraction"]
27742
+ mentions: [
27743
+ "MCP",
27744
+ "Model Context Protocol",
27745
+ "AI agents",
27746
+ "document extraction"
27747
+ ]
27734
27748
  },
27735
27749
  {
27736
27750
  slug: "mcp-installation",
@@ -27743,6 +27757,10 @@ var sections_default2 = [
27743
27757
  type: "paragraph",
27744
27758
  text: "Three install paths. Pick the one that matches your client."
27745
27759
  },
27760
+ {
27761
+ type: "callout",
27762
+ text: "The hosted MCP endpoint accepts both `https://mcp.talonic.com/mcp` and the bare origin `https://mcp.talonic.com` as connector URLs \u2014 POST/DELETE/SSE traffic at either path routes through the same Streamable HTTP transport. Plain `GET /` still returns the discovery JSON. Either URL works in any of the install paths below."
27763
+ },
27746
27764
  {
27747
27765
  type: "heading",
27748
27766
  level: 3,
@@ -27769,7 +27787,11 @@ var sections_default2 = [
27769
27787
  type: "callout",
27770
27788
  text: "The connector does not need an API key in its config. Token rotation is handled by the OAuth flow."
27771
27789
  },
27772
- { type: "heading", level: 3, text: "Local stdio (npx)" },
27790
+ {
27791
+ type: "heading",
27792
+ level: 3,
27793
+ text: "Local stdio (npx)"
27794
+ },
27773
27795
  {
27774
27796
  type: "paragraph",
27775
27797
  text: "Recommended for IDE-style clients (Claude Desktop, Cursor, Cline, Continue, Cowork). Runs on your machine via stdio; requires Node.js 18 or later. Uses a `TALONIC_API_KEY` from `app.talonic.com`."
@@ -27805,9 +27827,18 @@ var sections_default2 = [
27805
27827
  }
27806
27828
  ],
27807
27829
  related: [
27808
- { label: "Claude Desktop", slug: "mcp-claude-desktop" },
27809
- { label: "Cursor", slug: "mcp-cursor" },
27810
- { label: "Authentication", slug: "mcp-authentication" }
27830
+ {
27831
+ label: "Claude Desktop",
27832
+ slug: "mcp-claude-desktop"
27833
+ },
27834
+ {
27835
+ label: "Cursor",
27836
+ slug: "mcp-cursor"
27837
+ },
27838
+ {
27839
+ label: "Authentication",
27840
+ slug: "mcp-authentication"
27841
+ }
27811
27842
  ],
27812
27843
  faq: [
27813
27844
  {
@@ -27841,7 +27872,11 @@ var sections_default2 = [
27841
27872
  type: "paragraph",
27842
27873
  text: "Each user runs against their own isolated Talonic workspace. Your documents and schemas are private to you. There are three authentication paths depending on how you connect."
27843
27874
  },
27844
- { type: "heading", level: 3, text: "OAuth 2.1 (Claude.ai connector, recommended)" },
27875
+ {
27876
+ type: "heading",
27877
+ level: 3,
27878
+ text: "OAuth 2.1 (Claude.ai connector, recommended)"
27879
+ },
27845
27880
  {
27846
27881
  type: "paragraph",
27847
27882
  text: "When you connect via Claude.ai's custom-connector flow, the connector launches an OAuth 2.1 sign-in to `app.talonic.com` (PKCE + Dynamic Client Registration). After consent, the connector exchanges a short-lived bearer token that is rotated automatically; no API key sits in the connector config. The Talonic MCP server validates the token on each request against the API, so revocation propagates immediately."
@@ -27872,7 +27907,11 @@ var sections_default2 = [
27872
27907
  "`?apiKey=tlnc_...` query parameter (only for clients that cannot set custom headers)."
27873
27908
  ]
27874
27909
  },
27875
- { type: "heading", level: 3, text: "Environment variable (local stdio)" },
27910
+ {
27911
+ type: "heading",
27912
+ level: 3,
27913
+ text: "Environment variable (local stdio)"
27914
+ },
27876
27915
  {
27877
27916
  type: "paragraph",
27878
27917
  text: "Set `TALONIC_API_KEY` in the `env` block of your MCP client config. The local server reads it at startup."
@@ -27888,8 +27927,14 @@ var sections_default2 = [
27888
27927
  }
27889
27928
  ],
27890
27929
  related: [
27891
- { label: "Installation", slug: "mcp-installation" },
27892
- { label: "API Authentication", slug: "authentication" }
27930
+ {
27931
+ label: "Installation",
27932
+ slug: "mcp-installation"
27933
+ },
27934
+ {
27935
+ label: "API Authentication",
27936
+ slug: "authentication"
27937
+ }
27893
27938
  ],
27894
27939
  faq: [
27895
27940
  {
@@ -27918,14 +27963,22 @@ var sections_default2 = [
27918
27963
  type: "paragraph",
27919
27964
  text: "Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows)."
27920
27965
  },
27921
- { type: "heading", level: 3, text: "Hosted (recommended)" },
27966
+ {
27967
+ type: "heading",
27968
+ level: 3,
27969
+ text: "Hosted (recommended)"
27970
+ },
27922
27971
  {
27923
27972
  type: "code",
27924
27973
  language: "json",
27925
27974
  title: "claude_desktop_config.json",
27926
27975
  code: '{\n "mcpServers": {\n "talonic": {\n "url": "https://mcp.talonic.com/mcp",\n "headers": {\n "Authorization": "Bearer tlnc_your_key_here"\n }\n }\n }\n}'
27927
27976
  },
27928
- { type: "heading", level: 3, text: "Local (npx)" },
27977
+ {
27978
+ type: "heading",
27979
+ level: 3,
27980
+ text: "Local (npx)"
27981
+ },
27929
27982
  {
27930
27983
  type: "code",
27931
27984
  language: "json",
@@ -27938,8 +27991,14 @@ var sections_default2 = [
27938
27991
  }
27939
27992
  ],
27940
27993
  related: [
27941
- { label: "Cursor", slug: "mcp-cursor" },
27942
- { label: "Tool Reference", slug: "mcp-talonic-extract" }
27994
+ {
27995
+ label: "Cursor",
27996
+ slug: "mcp-cursor"
27997
+ },
27998
+ {
27999
+ label: "Tool Reference",
28000
+ slug: "mcp-talonic-extract"
28001
+ }
27943
28002
  ],
27944
28003
  faq: [
27945
28004
  {
@@ -27947,7 +28006,11 @@ var sections_default2 = [
27947
28006
  answer: "Edit claude_desktop_config.json, add the Talonic MCP server config (hosted URL or local npx) with your API key, and fully restart Claude Desktop (Cmd+Q on macOS)."
27948
28007
  }
27949
28008
  ],
27950
- mentions: ["Claude Desktop", "macOS", "Windows"]
28009
+ mentions: [
28010
+ "Claude Desktop",
28011
+ "macOS",
28012
+ "Windows"
28013
+ ]
27951
28014
  },
27952
28015
  {
27953
28016
  slug: "mcp-cursor",
@@ -27960,14 +28023,22 @@ var sections_default2 = [
27960
28023
  type: "paragraph",
27961
28024
  text: "Edit `~/.cursor/mcp.json` (or open Cursor settings \u2192 MCP \u2192 edit config):"
27962
28025
  },
27963
- { type: "heading", level: 3, text: "Hosted (recommended)" },
28026
+ {
28027
+ type: "heading",
28028
+ level: 3,
28029
+ text: "Hosted (recommended)"
28030
+ },
27964
28031
  {
27965
28032
  type: "code",
27966
28033
  language: "json",
27967
28034
  title: "~/.cursor/mcp.json",
27968
28035
  code: '{\n "mcpServers": {\n "talonic": {\n "url": "https://mcp.talonic.com/mcp",\n "headers": {\n "Authorization": "Bearer tlnc_your_key_here"\n }\n }\n }\n}'
27969
28036
  },
27970
- { type: "heading", level: 3, text: "Local (npx)" },
28037
+ {
28038
+ type: "heading",
28039
+ level: 3,
28040
+ text: "Local (npx)"
28041
+ },
27971
28042
  {
27972
28043
  type: "code",
27973
28044
  language: "json",
@@ -27976,8 +28047,14 @@ var sections_default2 = [
27976
28047
  }
27977
28048
  ],
27978
28049
  related: [
27979
- { label: "Claude Desktop", slug: "mcp-claude-desktop" },
27980
- { label: "Cline", slug: "mcp-cline" }
28050
+ {
28051
+ label: "Claude Desktop",
28052
+ slug: "mcp-claude-desktop"
28053
+ },
28054
+ {
28055
+ label: "Cline",
28056
+ slug: "mcp-cline"
28057
+ }
27981
28058
  ],
27982
28059
  faq: [
27983
28060
  {
@@ -27985,7 +28062,10 @@ var sections_default2 = [
27985
28062
  answer: "Edit ~/.cursor/mcp.json and add the Talonic MCP server config with your API key. Hosted or local."
27986
28063
  }
27987
28064
  ],
27988
- mentions: ["Cursor", "IDE"]
28065
+ mentions: [
28066
+ "Cursor",
28067
+ "IDE"
28068
+ ]
27989
28069
  },
27990
28070
  {
27991
28071
  slug: "mcp-cline",
@@ -27998,23 +28078,40 @@ var sections_default2 = [
27998
28078
  type: "paragraph",
27999
28079
  text: "Open the Cline panel \u2192 settings (gear icon) \u2192 MCP Servers \u2192 Edit."
28000
28080
  },
28001
- { type: "heading", level: 3, text: "Hosted (recommended)" },
28081
+ {
28082
+ type: "heading",
28083
+ level: 3,
28084
+ text: "Hosted (recommended)"
28085
+ },
28002
28086
  {
28003
28087
  type: "code",
28004
28088
  language: "json",
28005
28089
  code: '{\n "mcpServers": {\n "talonic": {\n "url": "https://mcp.talonic.com/mcp",\n "headers": {\n "Authorization": "Bearer tlnc_your_key_here"\n }\n }\n }\n}'
28006
28090
  },
28007
- { type: "heading", level: 3, text: "Local (npx)" },
28091
+ {
28092
+ type: "heading",
28093
+ level: 3,
28094
+ text: "Local (npx)"
28095
+ },
28008
28096
  {
28009
28097
  type: "code",
28010
28098
  language: "json",
28011
28099
  code: '{\n "mcpServers": {\n "talonic": {\n "command": "npx",\n "args": ["-y", "@talonic/mcp@latest"],\n "env": {\n "TALONIC_API_KEY": "tlnc_your_key_here"\n }\n }\n }\n}'
28012
28100
  },
28013
- { type: "paragraph", text: "Save and restart the panel." }
28101
+ {
28102
+ type: "paragraph",
28103
+ text: "Save and restart the panel."
28104
+ }
28014
28105
  ],
28015
28106
  related: [
28016
- { label: "Continue", slug: "mcp-continue" },
28017
- { label: "Cursor", slug: "mcp-cursor" }
28107
+ {
28108
+ label: "Continue",
28109
+ slug: "mcp-continue"
28110
+ },
28111
+ {
28112
+ label: "Cursor",
28113
+ slug: "mcp-cursor"
28114
+ }
28018
28115
  ],
28019
28116
  faq: [
28020
28117
  {
@@ -28022,7 +28119,10 @@ var sections_default2 = [
28022
28119
  answer: "Open the Cline panel settings, go to MCP Servers, click Edit, and add the Talonic config entry."
28023
28120
  }
28024
28121
  ],
28025
- mentions: ["Cline", "VS Code"]
28122
+ mentions: [
28123
+ "Cline",
28124
+ "VS Code"
28125
+ ]
28026
28126
  },
28027
28127
  {
28028
28128
  slug: "mcp-continue",
@@ -28035,14 +28135,22 @@ var sections_default2 = [
28035
28135
  type: "paragraph",
28036
28136
  text: "Edit `~/.continue/config.json`. Add to the `mcpServers` array:"
28037
28137
  },
28038
- { type: "heading", level: 3, text: "Hosted (recommended)" },
28138
+ {
28139
+ type: "heading",
28140
+ level: 3,
28141
+ text: "Hosted (recommended)"
28142
+ },
28039
28143
  {
28040
28144
  type: "code",
28041
28145
  language: "json",
28042
28146
  title: "~/.continue/config.json",
28043
28147
  code: '{\n "name": "talonic",\n "url": "https://mcp.talonic.com/mcp",\n "headers": {\n "Authorization": "Bearer tlnc_your_key_here"\n }\n}'
28044
28148
  },
28045
- { type: "heading", level: 3, text: "Local (npx)" },
28149
+ {
28150
+ type: "heading",
28151
+ level: 3,
28152
+ text: "Local (npx)"
28153
+ },
28046
28154
  {
28047
28155
  type: "code",
28048
28156
  language: "json",
@@ -28051,8 +28159,14 @@ var sections_default2 = [
28051
28159
  }
28052
28160
  ],
28053
28161
  related: [
28054
- { label: "Cowork", slug: "mcp-cowork" },
28055
- { label: "Cline", slug: "mcp-cline" }
28162
+ {
28163
+ label: "Cowork",
28164
+ slug: "mcp-cowork"
28165
+ },
28166
+ {
28167
+ label: "Cline",
28168
+ slug: "mcp-cline"
28169
+ }
28056
28170
  ],
28057
28171
  faq: [
28058
28172
  {
@@ -28060,7 +28174,11 @@ var sections_default2 = [
28060
28174
  answer: "Edit ~/.continue/config.json and add a Talonic entry to the mcpServers array with your API key."
28061
28175
  }
28062
28176
  ],
28063
- mentions: ["Continue", "VS Code", "JetBrains"]
28177
+ mentions: [
28178
+ "Continue",
28179
+ "VS Code",
28180
+ "JetBrains"
28181
+ ]
28064
28182
  },
28065
28183
  {
28066
28184
  slug: "mcp-cowork",
@@ -28069,14 +28187,25 @@ var sections_default2 = [
28069
28187
  seoTitle: "MCP Setup for Cowork \u2014 Talonic Docs",
28070
28188
  description: "Configure the Talonic MCP server in Cowork. Hosted and local configs.",
28071
28189
  content: [
28072
- { type: "paragraph", text: "Open Cowork settings \u2192 MCP Servers \u2192 Add." },
28073
- { type: "heading", level: 3, text: "Hosted (recommended)" },
28190
+ {
28191
+ type: "paragraph",
28192
+ text: "Open Cowork settings \u2192 MCP Servers \u2192 Add."
28193
+ },
28194
+ {
28195
+ type: "heading",
28196
+ level: 3,
28197
+ text: "Hosted (recommended)"
28198
+ },
28074
28199
  {
28075
28200
  type: "code",
28076
28201
  language: "json",
28077
28202
  code: '{\n "mcpServers": {\n "talonic": {\n "url": "https://mcp.talonic.com/mcp",\n "headers": {\n "Authorization": "Bearer tlnc_your_key_here"\n }\n }\n }\n}'
28078
28203
  },
28079
- { type: "heading", level: 3, text: "Local (npx)" },
28204
+ {
28205
+ type: "heading",
28206
+ level: 3,
28207
+ text: "Local (npx)"
28208
+ },
28080
28209
  {
28081
28210
  type: "code",
28082
28211
  language: "json",
@@ -28084,8 +28213,14 @@ var sections_default2 = [
28084
28213
  }
28085
28214
  ],
28086
28215
  related: [
28087
- { label: "Claude Desktop", slug: "mcp-claude-desktop" },
28088
- { label: "Tool Reference", slug: "mcp-talonic-extract" }
28216
+ {
28217
+ label: "Claude Desktop",
28218
+ slug: "mcp-claude-desktop"
28219
+ },
28220
+ {
28221
+ label: "Tool Reference",
28222
+ slug: "mcp-talonic-extract"
28223
+ }
28089
28224
  ],
28090
28225
  faq: [
28091
28226
  {
@@ -28093,7 +28228,9 @@ var sections_default2 = [
28093
28228
  answer: "Open Cowork settings, go to MCP Servers, click Add, and paste the standard Talonic config with your API key."
28094
28229
  }
28095
28230
  ],
28096
- mentions: ["Cowork"]
28231
+ mentions: [
28232
+ "Cowork"
28233
+ ]
28097
28234
  },
28098
28235
  {
28099
28236
  slug: "mcp-talonic-extract",
@@ -28106,7 +28243,11 @@ var sections_default2 = [
28106
28243
  type: "paragraph",
28107
28244
  text: "Extract structured, schema-validated data from a document. Returns clean JSON matching the schema, with per-field confidence scores and document metadata."
28108
28245
  },
28109
- { type: "heading", level: 3, text: "When to use" },
28246
+ {
28247
+ type: "heading",
28248
+ level: 3,
28249
+ text: "When to use"
28250
+ },
28110
28251
  {
28111
28252
  type: "list",
28112
28253
  ordered: false,
@@ -28117,7 +28258,11 @@ var sections_default2 = [
28117
28258
  "You want validated JSON instead of trying to OCR + parse with raw LLM calls."
28118
28259
  ]
28119
28260
  },
28120
- { type: "heading", level: 3, text: "When NOT to use" },
28261
+ {
28262
+ type: "heading",
28263
+ level: 3,
28264
+ text: "When NOT to use"
28265
+ },
28121
28266
  {
28122
28267
  type: "list",
28123
28268
  ordered: false,
@@ -28126,7 +28271,11 @@ var sections_default2 = [
28126
28271
  "The user wants to find documents matching a query \u2192 use `talonic_search` or `talonic_filter`."
28127
28272
  ]
28128
28273
  },
28129
- { type: "heading", level: 3, text: "Input schema" },
28274
+ {
28275
+ type: "heading",
28276
+ level: 3,
28277
+ text: "Input schema"
28278
+ },
28130
28279
  {
28131
28280
  type: "param-table",
28132
28281
  title: "File source (provide exactly one)",
@@ -28195,14 +28344,22 @@ var sections_default2 = [
28195
28344
  }
28196
28345
  ]
28197
28346
  },
28198
- { type: "heading", level: 3, text: "Response shape" },
28347
+ {
28348
+ type: "heading",
28349
+ level: 3,
28350
+ text: "Response shape"
28351
+ },
28199
28352
  {
28200
28353
  type: "code",
28201
28354
  language: "json",
28202
28355
  title: "Example response",
28203
28356
  code: '{\n "data": {\n "vendor_name": "Acme Corp",\n "invoice_number": "INV-2024-0847",\n "total_amount": 14250.00,\n "due_date": "2024-03-15"\n },\n "confidence": {\n "vendor_name": 0.97,\n "invoice_number": 0.99,\n "total_amount": 0.94,\n "due_date": 0.91\n },\n "document": {\n "id": "d_abc123",\n "filename": "invoice.pdf",\n "documentType": "invoice",\n "language": "en",\n "pageCount": 2\n },\n "extraction": {\n "id": "ext_xyz789",\n "schemaId": "sch_def456"\n },\n "cost": {\n "costCredits": 1,\n "costEur": 0.05,\n "balanceCredits": 999,\n "cellsResolvedRegistry": 3,\n "cellsResolvedAi": 1\n }\n}'
28204
28357
  },
28205
- { type: "heading", level: 3, text: "Confidence scores and human escalation" },
28358
+ {
28359
+ type: "heading",
28360
+ level: 3,
28361
+ text: "Confidence scores and human escalation"
28362
+ },
28206
28363
  {
28207
28364
  type: "paragraph",
28208
28365
  text: "Each field in the `confidence` object is a float from 0.0 to 1.0. Values above **0.90** are high confidence. Values between **0.70\u20130.90** should be treated with caution \u2014 flag them to the user for verification. Values below **0.70** indicate low confidence \u2014 the agent should ask the user to verify the value or re-extract with more specific instructions."
@@ -28212,17 +28369,29 @@ var sections_default2 = [
28212
28369
  variant: "warning",
28213
28370
  text: "Always provide either a `schema` or `schema_id`. The MCP layer rejects schema-less calls with a validation error before they reach the API."
28214
28371
  },
28215
- { type: "heading", level: 3, text: "Cost" },
28372
+ {
28373
+ type: "heading",
28374
+ level: 3,
28375
+ text: "Cost"
28376
+ },
28216
28377
  {
28217
28378
  type: "paragraph",
28218
28379
  text: "Each `talonic_extract` call with a new file consumes **one extraction credit**. Re-extracting the same `document_id` with a different schema also consumes one credit. The per-call cost is surfaced on the response under `cost` (`costCredits`, `costEur`, `balanceCredits`, plus a breakdown of how many cells were resolved by the registry vs the AI), parsed from the `X-Talonic-Cost-*` and `X-Talonic-Balance-*` response headers. To avoid unnecessary cost, check if a document has already been extracted before calling again \u2014 use `talonic_search` or `talonic_filter` to find existing results, and `talonic_get_balance` to check your runway before kicking off a large batch."
28219
28380
  },
28220
- { type: "heading", level: 3, text: "Errors" },
28381
+ {
28382
+ type: "heading",
28383
+ level: 3,
28384
+ text: "Errors"
28385
+ },
28221
28386
  {
28222
28387
  type: "param-table",
28223
28388
  title: "Common errors",
28224
28389
  params: [
28225
- { name: "unauthorized", type: "401", description: "Invalid or missing API key." },
28390
+ {
28391
+ name: "unauthorized",
28392
+ type: "401",
28393
+ description: "Invalid or missing API key."
28394
+ },
28226
28395
  {
28227
28396
  name: "validation_error",
28228
28397
  type: "422",
@@ -28247,9 +28416,18 @@ var sections_default2 = [
28247
28416
  }
28248
28417
  ],
28249
28418
  related: [
28250
- { label: "SDK Extract", slug: "sdk-extract" },
28251
- { label: "POST /v1/extract", slug: "post-extract" },
28252
- { label: "Cost & Rate Limits", slug: "mcp-cost-and-limits" }
28419
+ {
28420
+ label: "SDK Extract",
28421
+ slug: "sdk-extract"
28422
+ },
28423
+ {
28424
+ label: "POST /v1/extract",
28425
+ slug: "post-extract"
28426
+ },
28427
+ {
28428
+ label: "Cost & Rate Limits",
28429
+ slug: "mcp-cost-and-limits"
28430
+ }
28253
28431
  ],
28254
28432
  faq: [
28255
28433
  {
@@ -28261,7 +28439,13 @@ var sections_default2 = [
28261
28439
  answer: "Scores above 0.90 are reliable. Between 0.70\u20130.90, flag to the user for verification. Below 0.70, ask the user to verify or re-extract with more specific instructions."
28262
28440
  }
28263
28441
  ],
28264
- mentions: ["talonic_extract", "file_data", "schema", "confidence", "extraction"]
28442
+ mentions: [
28443
+ "talonic_extract",
28444
+ "file_data",
28445
+ "schema",
28446
+ "confidence",
28447
+ "extraction"
28448
+ ]
28265
28449
  },
28266
28450
  {
28267
28451
  slug: "mcp-talonic-search",
@@ -28274,7 +28458,11 @@ var sections_default2 = [
28274
28458
  type: "paragraph",
28275
28459
  text: "Omnisearch across documents, extracted field values, field names, sources, and schemas in the workspace. Returns ranked results across all entity types in one call."
28276
28460
  },
28277
- { type: "heading", level: 3, text: "When to use" },
28461
+ {
28462
+ type: "heading",
28463
+ level: 3,
28464
+ text: "When to use"
28465
+ },
28278
28466
  {
28279
28467
  type: "list",
28280
28468
  ordered: false,
@@ -28286,7 +28474,11 @@ var sections_default2 = [
28286
28474
  "You need to discover canonical field names before using `talonic_filter`."
28287
28475
  ]
28288
28476
  },
28289
- { type: "heading", level: 3, text: "When NOT to use" },
28477
+ {
28478
+ type: "heading",
28479
+ level: 3,
28480
+ text: "When NOT to use"
28481
+ },
28290
28482
  {
28291
28483
  type: "list",
28292
28484
  ordered: false,
@@ -28296,7 +28488,11 @@ var sections_default2 = [
28296
28488
  "The user wants to extract data from a new document \u2192 use `talonic_extract`."
28297
28489
  ]
28298
28490
  },
28299
- { type: "heading", level: 3, text: "Input schema" },
28491
+ {
28492
+ type: "heading",
28493
+ level: 3,
28494
+ text: "Input schema"
28495
+ },
28300
28496
  {
28301
28497
  type: "param-table",
28302
28498
  title: "Parameters",
@@ -28314,28 +28510,48 @@ var sections_default2 = [
28314
28510
  }
28315
28511
  ]
28316
28512
  },
28317
- { type: "heading", level: 3, text: "Response shape" },
28513
+ {
28514
+ type: "heading",
28515
+ level: 3,
28516
+ text: "Response shape"
28517
+ },
28318
28518
  {
28319
28519
  type: "code",
28320
28520
  language: "json",
28321
28521
  title: "Example response",
28322
- code: '{\n "documents": [\n {\n "id": "d_abc123",\n "filename": "acme-invoice-q4.pdf",\n "documentType": "invoice",\n "score": 0.92\n }\n ],\n "fieldMatches": [\n {\n "resolvedFieldId": "f_ghi789",\n "displayName": "Vendor Name",\n "matchedValue": "Acme Corp",\n "documentCount": 3,\n "filterable": true\n }\n ],\n "sources": [],\n "schemas": [\n {\n "id": "sch_def456",\n "name": "Standard Invoice"\n }\n ],\n "fields": [\n {\n "id": "f_ghi789",\n "canonicalName": "vendor.name",\n "displayName": "Vendor Name",\n "documentCount": 12,\n "filterable": true\n }\n ]\n}'
28522
+ code: '{\n "documents": [\n {\n "id": "d_abc123",\n "filename": "acme-invoice-q4.pdf",\n "documentType": "invoice",\n "score": 0.92\n }\n ],\n "fieldMatches": [\n {\n "resolvedFieldId": "f_ghi789",\n "displayName": "Vendor Name",\n "matchedValue": "Acme Corp",\n "documentCount": 3,\n "filterable": true,\n "dataType": "string"\n }\n ],\n "sources": [],\n "schemas": [\n {\n "id": "sch_def456",\n "name": "Standard Invoice"\n }\n ],\n "fields": [\n {\n "id": "f_total",\n "canonicalName": "total_amount",\n "displayName": "Total Amount",\n "documentCount": 14,\n "filterable": true,\n "dataType": "number"\n }\n ]\n}'
28323
28523
  },
28324
28524
  {
28325
28525
  type: "callout",
28326
28526
  text: "Only `fields[]` entries with `filterable: true` can be used with `talonic_filter`. These have extracted data in the workspace. Fields with `filterable: false` exist in a schema definition but have no extracted data yet \u2014 they become filterable after documents are processed against their schema."
28327
28527
  },
28328
- { type: "heading", level: 3, text: "Cost" },
28528
+ {
28529
+ type: "callout",
28530
+ text: 'Every `fieldMatches[]` and `fields[]` entry carries a `dataType` (`"string"`, `"number"`, `"array"`, etc.). Use it to pick the right `talonic_filter` operator on the first call \u2014 numeric operators (`gt`, `gte`, `lt`, `lte`, `between`) only resolve correctly when `dataType === "number"`. See the *Schema typing* section under `talonic_filter` for the full preventive / reactive pattern.'
28531
+ },
28532
+ {
28533
+ type: "heading",
28534
+ level: 3,
28535
+ text: "Cost"
28536
+ },
28329
28537
  {
28330
28538
  type: "paragraph",
28331
28539
  text: "Search calls are **free** \u2014 they do not consume extraction credits. Use search liberally to explore before extracting."
28332
28540
  },
28333
- { type: "heading", level: 3, text: "Errors" },
28541
+ {
28542
+ type: "heading",
28543
+ level: 3,
28544
+ text: "Errors"
28545
+ },
28334
28546
  {
28335
28547
  type: "param-table",
28336
28548
  title: "Common errors",
28337
28549
  params: [
28338
- { name: "unauthorized", type: "401", description: "Invalid or missing API key." },
28550
+ {
28551
+ name: "unauthorized",
28552
+ type: "401",
28553
+ description: "Invalid or missing API key."
28554
+ },
28339
28555
  {
28340
28556
  name: "validation_error",
28341
28557
  type: "422",
@@ -28345,8 +28561,14 @@ var sections_default2 = [
28345
28561
  }
28346
28562
  ],
28347
28563
  related: [
28348
- { label: "talonic_filter", slug: "mcp-talonic-filter" },
28349
- { label: "Omnisearch", slug: "omnisearch" }
28564
+ {
28565
+ label: "talonic_filter",
28566
+ slug: "mcp-talonic-filter"
28567
+ },
28568
+ {
28569
+ label: "Omnisearch",
28570
+ slug: "omnisearch"
28571
+ }
28350
28572
  ],
28351
28573
  faq: [
28352
28574
  {
@@ -28356,22 +28578,38 @@ var sections_default2 = [
28356
28578
  {
28357
28579
  question: "What entities does talonic_search return?",
28358
28580
  answer: "Documents, field matches (with canonical names and values), sources, schemas, and field definitions \u2014 all ranked by relevance score."
28581
+ },
28582
+ {
28583
+ question: "How do I avoid a `talonic_filter` numeric query returning zero matches?",
28584
+ answer: 'Check `dataType` on the field entry in the search response before constructing the filter. Numeric operators (`gt`, `gte`, `lt`, `lte`, `between`) only resolve against fields where `dataType === "number"`. If the type is `string` (common for monetary or formatted-number fields), suggest the user change the field\'s data type in the schema before filtering.'
28359
28585
  }
28360
28586
  ],
28361
- mentions: ["talonic_search", "omnisearch", "canonicalName", "field discovery"]
28587
+ mentions: [
28588
+ "canonicalName",
28589
+ "dataType",
28590
+ "field discovery",
28591
+ "omnisearch",
28592
+ "preventive guard",
28593
+ "schema typing",
28594
+ "talonic_search"
28595
+ ]
28362
28596
  },
28363
28597
  {
28364
28598
  slug: "mcp-talonic-filter",
28365
28599
  parentSlug: "mcp-tools",
28366
28600
  title: "talonic_filter",
28367
28601
  seoTitle: "talonic_filter MCP Tool \u2014 Talonic Docs",
28368
- description: "Filter documents by extracted field values. Full operator reference, input/output schema, and composable condition examples.",
28602
+ description: "Filter documents by extracted field values. Full operator reference, input/output schema, composable condition examples, and the preventive + reactive pattern for guarding numeric operators against string-typed fields.",
28369
28603
  content: [
28370
28604
  {
28371
28605
  type: "paragraph",
28372
28606
  text: "Filter documents by extracted field values using composable conditions. Conditions accept canonical field names (e.g. `vendor.name`, `policy.0_coverage_type`) or field UUIDs. The Talonic API resolves names to IDs server-side."
28373
28607
  },
28374
- { type: "heading", level: 3, text: "When to use" },
28608
+ {
28609
+ type: "heading",
28610
+ level: 3,
28611
+ text: "When to use"
28612
+ },
28375
28613
  {
28376
28614
  type: "list",
28377
28615
  ordered: false,
@@ -28381,7 +28619,11 @@ var sections_default2 = [
28381
28619
  "You need a sortable, paginated list filtered by field conditions."
28382
28620
  ]
28383
28621
  },
28384
- { type: "heading", level: 3, text: "When NOT to use" },
28622
+ {
28623
+ type: "heading",
28624
+ level: 3,
28625
+ text: "When NOT to use"
28626
+ },
28385
28627
  {
28386
28628
  type: "list",
28387
28629
  ordered: false,
@@ -28391,7 +28633,11 @@ var sections_default2 = [
28391
28633
  "The user wants to extract from a new document \u2192 use `talonic_extract`."
28392
28634
  ]
28393
28635
  },
28394
- { type: "heading", level: 3, text: "Input schema" },
28636
+ {
28637
+ type: "heading",
28638
+ level: 3,
28639
+ text: "Input schema"
28640
+ },
28395
28641
  {
28396
28642
  type: "param-table",
28397
28643
  title: "Top-level parameters",
@@ -28417,7 +28663,11 @@ var sections_default2 = [
28417
28663
  type: "number",
28418
28664
  description: "Page number for pagination (1-based)."
28419
28665
  },
28420
- { name: "limit", type: "number", description: "Results per page. Default: 50." },
28666
+ {
28667
+ name: "limit",
28668
+ type: "number",
28669
+ description: "Results per page. Default: 50."
28670
+ },
28421
28671
  {
28422
28672
  name: "source_connection_id",
28423
28673
  type: "string",
@@ -28457,13 +28707,25 @@ var sections_default2 = [
28457
28707
  }
28458
28708
  ]
28459
28709
  },
28460
- { type: "heading", level: 3, text: "Operator reference" },
28710
+ {
28711
+ type: "heading",
28712
+ level: 3,
28713
+ text: "Operator reference"
28714
+ },
28461
28715
  {
28462
28716
  type: "param-table",
28463
28717
  title: "Operators",
28464
28718
  params: [
28465
- { name: "eq", type: "=", description: "Exact equality." },
28466
- { name: "neq", type: "!=", description: "Not equal." },
28719
+ {
28720
+ name: "eq",
28721
+ type: "=",
28722
+ description: "Exact equality."
28723
+ },
28724
+ {
28725
+ name: "neq",
28726
+ type: "!=",
28727
+ description: "Not equal."
28728
+ },
28467
28729
  {
28468
28730
  name: "gt / gte",
28469
28731
  type: "> / >=",
@@ -28484,7 +28746,11 @@ var sections_default2 = [
28484
28746
  type: "substring",
28485
28747
  description: "Case-insensitive substring match on string fields."
28486
28748
  },
28487
- { name: "is_empty", type: "null check", description: "Field has no value." },
28749
+ {
28750
+ name: "is_empty",
28751
+ type: "null check",
28752
+ description: "Field has no value."
28753
+ },
28488
28754
  {
28489
28755
  name: "is_not_empty",
28490
28756
  type: "presence",
@@ -28492,14 +28758,22 @@ var sections_default2 = [
28492
28758
  }
28493
28759
  ]
28494
28760
  },
28495
- { type: "heading", level: 3, text: "Example" },
28761
+ {
28762
+ type: "heading",
28763
+ level: 3,
28764
+ text: "Example"
28765
+ },
28496
28766
  {
28497
28767
  type: "code",
28498
28768
  language: "json",
28499
28769
  title: "Find invoices over 1000 from Acme",
28500
28770
  code: '{\n "conditions": [\n { "field": "vendor.name", "operator": "contains", "value": "Acme" },\n { "field": "total_amount", "operator": "gt", "value": 1000 }\n ],\n "sort": { "field": "total_amount", "direction": "desc" },\n "limit": 10\n}'
28501
28771
  },
28502
- { type: "heading", level: 3, text: "Response shape" },
28772
+ {
28773
+ type: "heading",
28774
+ level: 3,
28775
+ text: "Response shape"
28776
+ },
28503
28777
  {
28504
28778
  type: "code",
28505
28779
  language: "json",
@@ -28507,20 +28781,61 @@ var sections_default2 = [
28507
28781
  code: '{\n "documents": [\n {\n "id": "d_abc123",\n "filename": "acme-invoice-q4.pdf",\n "documentType": "invoice",\n "extractedFields": {\n "vendor.name": "Acme Corp",\n "total_amount": 14250.00\n }\n }\n ],\n "total": 1,\n "page": 1,\n "perPage": 10\n}'
28508
28782
  },
28509
28783
  {
28510
- type: "callout",
28511
- text: "Numeric operators (`gt`, `gte`, `lt`, `lte`, `between`) only resolve correctly when the schema field is typed as `number`. A field typed as `string` that holds numeric content (e.g. `\u20AC1,500.00`) will silently return zero matches. The API now returns a `warnings[]` array on the filter response when a numeric operator is applied to a string-typed field, explaining the lexicographic-comparison issue and suggesting a `data_type` change."
28784
+ type: "heading",
28785
+ level: 3,
28786
+ text: "Schema typing (preventive + reactive)"
28787
+ },
28788
+ {
28789
+ type: "paragraph",
28790
+ text: "Numeric operators (`gt`, `gte`, `lt`, `lte`, `between`) only resolve correctly when the schema field is typed as `number`. A field typed as `string` that holds numeric content (e.g. `\u20AC1,500.00`) will silently return zero matches even after extraction. There are two ways to handle this \u2014 pick the right one before constructing the call."
28791
+ },
28792
+ {
28793
+ type: "heading",
28794
+ level: 4,
28795
+ text: "Preventive \u2014 gate on `dataType`"
28796
+ },
28797
+ {
28798
+ type: "paragraph",
28799
+ text: 'Call `talonic_search` first and read `dataType` on the field entry. If `dataType !== "number"`, do **not** issue a numeric operator on that field. Pick a string-friendly operator (`eq`, `contains`) or warn the user that the field needs a `data_type` change in the schema before the query can succeed. This avoids the silent-zero-matches outcome entirely.'
28800
+ },
28801
+ {
28802
+ type: "heading",
28803
+ level: 4,
28804
+ text: "Reactive \u2014 handle `warnings[]`"
28805
+ },
28806
+ {
28807
+ type: "paragraph",
28808
+ text: "When a numeric operator is applied to a string-typed field, the API attaches a `warnings[]` array to the filter response. Each entry has `code`, `message`, `field`/`field_id`, and a `suggestion`. The MCP tool surfaces this in `structuredContent` \u2014 agents should relay the `message` (and `suggestion`, when present) to the user rather than silently retrying."
28809
+ },
28810
+ {
28811
+ type: "code",
28812
+ language: "json",
28813
+ title: "Response with a warning",
28814
+ code: '{\n "data": [],\n "total": 0,\n "warnings": [\n {\n "code": "numeric_operator_on_string_field",\n "message": "Operator `gt` was applied to field `invoice_total` typed as string. Numeric comparisons against string-typed fields use lexicographic ordering and may return zero matches.",\n "field": "invoice_total",\n "field_id": "fld_inv_total",\n "suggestion": "Change the field\'s data_type to `number` in the schema definition."\n }\n ]\n}'
28815
+ },
28816
+ {
28817
+ type: "heading",
28818
+ level: 3,
28819
+ text: "Cost"
28512
28820
  },
28513
- { type: "heading", level: 3, text: "Cost" },
28514
28821
  {
28515
28822
  type: "paragraph",
28516
28823
  text: "Filter calls are **free** \u2014 they query already-extracted data and do not consume extraction credits."
28517
28824
  },
28518
- { type: "heading", level: 3, text: "Errors" },
28825
+ {
28826
+ type: "heading",
28827
+ level: 3,
28828
+ text: "Errors"
28829
+ },
28519
28830
  {
28520
28831
  type: "param-table",
28521
28832
  title: "Common errors",
28522
28833
  params: [
28523
- { name: "unauthorized", type: "401", description: "Invalid or missing API key." },
28834
+ {
28835
+ name: "unauthorized",
28836
+ type: "401",
28837
+ description: "Invalid or missing API key."
28838
+ },
28524
28839
  {
28525
28840
  name: "no_field_match",
28526
28841
  type: "422",
@@ -28535,8 +28850,14 @@ var sections_default2 = [
28535
28850
  }
28536
28851
  ],
28537
28852
  related: [
28538
- { label: "talonic_search", slug: "mcp-talonic-search" },
28539
- { label: "Filter & Search API", slug: "field-autocomplete" }
28853
+ {
28854
+ label: "talonic_search",
28855
+ slug: "mcp-talonic-search"
28856
+ },
28857
+ {
28858
+ label: "Filter & Search API",
28859
+ slug: "field-autocomplete"
28860
+ }
28540
28861
  ],
28541
28862
  faq: [
28542
28863
  {
@@ -28546,16 +28867,23 @@ var sections_default2 = [
28546
28867
  {
28547
28868
  question: "How do I find field names for filtering?",
28548
28869
  answer: "Call talonic_search first. Use fields[] entries where filterable is true \u2014 their canonicalName values are what you pass as the field parameter in filter conditions. Fields with filterable: false have no extracted data yet and cannot be filtered."
28870
+ },
28871
+ {
28872
+ question: "Why does my `talonic_filter` query with `gt` return zero matches on a numeric-looking field?",
28873
+ answer: "The schema field is almost certainly typed as `string`, not `number`. Numeric operators against string-typed fields fall back to lexicographic comparison and silently return zero. Prevention: call `talonic_search` first and check `dataType` before issuing the filter. Recovery: the response's `warnings[]` array explains the issue and suggests a `data_type` change in the schema definition."
28549
28874
  }
28550
28875
  ],
28551
28876
  mentions: [
28552
- "talonic_filter",
28553
- "filter",
28877
+ "canonical field name",
28554
28878
  "conditions",
28879
+ "dataType",
28880
+ "filter",
28881
+ "is_not_empty",
28555
28882
  "operators",
28556
- "canonical field name",
28557
- "warnings",
28558
- "is_not_empty"
28883
+ "preventive guard",
28884
+ "schema typing",
28885
+ "talonic_filter",
28886
+ "warnings"
28559
28887
  ]
28560
28888
  },
28561
28889
  {
@@ -28569,7 +28897,11 @@ var sections_default2 = [
28569
28897
  type: "paragraph",
28570
28898
  text: "Fetch full metadata for a single document by ID. Returns filename, page count, detected document type, language, processing log, and link URLs."
28571
28899
  },
28572
- { type: "heading", level: 3, text: "When to use" },
28900
+ {
28901
+ type: "heading",
28902
+ level: 3,
28903
+ text: "When to use"
28904
+ },
28573
28905
  {
28574
28906
  type: "list",
28575
28907
  ordered: false,
@@ -28579,7 +28911,11 @@ var sections_default2 = [
28579
28911
  "The user asks 'tell me about document X'."
28580
28912
  ]
28581
28913
  },
28582
- { type: "heading", level: 3, text: "When NOT to use" },
28914
+ {
28915
+ type: "heading",
28916
+ level: 3,
28917
+ text: "When NOT to use"
28918
+ },
28583
28919
  {
28584
28920
  type: "list",
28585
28921
  ordered: false,
@@ -28589,7 +28925,11 @@ var sections_default2 = [
28589
28925
  "The user has a file but no `document_id` yet \u2192 call `talonic_extract` first."
28590
28926
  ]
28591
28927
  },
28592
- { type: "heading", level: 3, text: "Input schema" },
28928
+ {
28929
+ type: "heading",
28930
+ level: 3,
28931
+ text: "Input schema"
28932
+ },
28593
28933
  {
28594
28934
  type: "param-table",
28595
28935
  title: "Parameters",
@@ -28602,22 +28942,43 @@ var sections_default2 = [
28602
28942
  }
28603
28943
  ]
28604
28944
  },
28605
- { type: "heading", level: 3, text: "Response shape" },
28945
+ {
28946
+ type: "heading",
28947
+ level: 3,
28948
+ text: "Response shape"
28949
+ },
28606
28950
  {
28607
28951
  type: "code",
28608
28952
  language: "json",
28609
28953
  title: "Example response",
28610
28954
  code: '{\n "id": "d_abc123",\n "filename": "invoice.pdf",\n "documentType": "invoice",\n "language": "en",\n "pageCount": 2,\n "processingLog": [...],\n "links": {\n "self": "https://api.talonic.com/v1/documents/d_abc123",\n "extractions": "https://api.talonic.com/v1/documents/d_abc123/extractions",\n "dashboard": "https://app.talonic.com/documents/d_abc123"\n }\n}'
28611
28955
  },
28612
- { type: "heading", level: 3, text: "Cost" },
28613
- { type: "paragraph", text: "Free \u2014 metadata lookups do not consume extraction credits." }
28956
+ {
28957
+ type: "heading",
28958
+ level: 3,
28959
+ text: "Cost"
28960
+ },
28961
+ {
28962
+ type: "paragraph",
28963
+ text: "Free \u2014 metadata lookups do not consume extraction credits."
28964
+ }
28614
28965
  ],
28615
28966
  related: [
28616
- { label: "SDK Documents", slug: "sdk-documents" },
28617
- { label: "Get Document", slug: "get-document" }
28967
+ {
28968
+ label: "SDK Documents",
28969
+ slug: "sdk-documents"
28970
+ },
28971
+ {
28972
+ label: "Get Document",
28973
+ slug: "get-document"
28974
+ }
28618
28975
  ],
28619
28976
  faq: [],
28620
- mentions: ["talonic_get_document", "metadata", "document_id"]
28977
+ mentions: [
28978
+ "talonic_get_document",
28979
+ "metadata",
28980
+ "document_id"
28981
+ ]
28621
28982
  },
28622
28983
  {
28623
28984
  slug: "mcp-talonic-to-markdown",
@@ -28630,7 +28991,11 @@ var sections_default2 = [
28630
28991
  type: "paragraph",
28631
28992
  text: "Get OCR-converted markdown for a document. Accepts an existing `document_id` (cheapest \u2014 one API call, no re-processing), or raw file bytes, a local path, or a URL."
28632
28993
  },
28633
- { type: "heading", level: 3, text: "When to use" },
28994
+ {
28995
+ type: "heading",
28996
+ level: 3,
28997
+ text: "When to use"
28998
+ },
28634
28999
  {
28635
29000
  type: "list",
28636
29001
  ordered: false,
@@ -28641,7 +29006,11 @@ var sections_default2 = [
28641
29006
  "The user has a raw PDF / scan / image and wants markdown directly without designing a schema."
28642
29007
  ]
28643
29008
  },
28644
- { type: "heading", level: 3, text: "When NOT to use" },
29009
+ {
29010
+ type: "heading",
29011
+ level: 3,
29012
+ text: "When NOT to use"
29013
+ },
28645
29014
  {
28646
29015
  type: "list",
28647
29016
  ordered: false,
@@ -28649,8 +29018,15 @@ var sections_default2 = [
28649
29018
  "The user wants specific structured fields \u2192 use `talonic_extract` with a schema."
28650
29019
  ]
28651
29020
  },
28652
- { type: "heading", level: 3, text: "Input schema" },
28653
- { type: "paragraph", text: "Provide **exactly one** of the following:" },
29021
+ {
29022
+ type: "heading",
29023
+ level: 3,
29024
+ text: "Input schema"
29025
+ },
29026
+ {
29027
+ type: "paragraph",
29028
+ text: "Provide **exactly one** of the following:"
29029
+ },
28654
29030
  {
28655
29031
  type: "param-table",
28656
29032
  title: "Parameters",
@@ -28682,19 +29058,31 @@ var sections_default2 = [
28682
29058
  }
28683
29059
  ]
28684
29060
  },
28685
- { type: "heading", level: 3, text: "Response shape" },
29061
+ {
29062
+ type: "heading",
29063
+ level: 3,
29064
+ text: "Response shape"
29065
+ },
28686
29066
  {
28687
29067
  type: "code",
28688
29068
  language: "json",
28689
29069
  title: "Example response",
28690
29070
  code: '{\n "documentId": "d_abc123",\n "markdown": "# Invoice INV-2024-0847\\n\\n**Vendor:** Acme Corp\\n**Date:** 2024-01-15\\n\\n| Item | Qty | Unit Price | Total |\\n|------|-----|------------|-------|\\n| Widget A | 100 | 42.50 | 4,250.00 |\\n| Widget B | 200 | 50.00 | 10,000.00 |\\n\\n**Total: 14,250.00 EUR**"\n}'
28691
29071
  },
28692
- { type: "heading", level: 3, text: "Cost" },
29072
+ {
29073
+ type: "heading",
29074
+ level: 3,
29075
+ text: "Cost"
29076
+ },
28693
29077
  {
28694
29078
  type: "paragraph",
28695
29079
  text: "**Free when using `document_id`** \u2014 the document is already ingested. When passing a raw file (`file_data`, `file_path`, `file_url`), the tool auto-ingests via extract first, consuming **one extraction credit**. To avoid unnecessary cost: if you've already extracted a document, reuse the `document_id` from that response."
28696
29080
  },
28697
- { type: "heading", level: 3, text: "Errors" },
29081
+ {
29082
+ type: "heading",
29083
+ level: 3,
29084
+ text: "Errors"
29085
+ },
28698
29086
  {
28699
29087
  type: "param-table",
28700
29088
  title: "Common errors",
@@ -28723,8 +29111,14 @@ var sections_default2 = [
28723
29111
  }
28724
29112
  ],
28725
29113
  related: [
28726
- { label: "talonic_extract", slug: "mcp-talonic-extract" },
28727
- { label: "SDK getMarkdown", slug: "sdk-documents" }
29114
+ {
29115
+ label: "talonic_extract",
29116
+ slug: "mcp-talonic-extract"
29117
+ },
29118
+ {
29119
+ label: "SDK getMarkdown",
29120
+ slug: "sdk-documents"
29121
+ }
28728
29122
  ],
28729
29123
  faq: [
28730
29124
  {
@@ -28736,7 +29130,12 @@ var sections_default2 = [
28736
29130
  answer: "If you already called talonic_extract, reuse the document_id from that response to call talonic_to_markdown for free."
28737
29131
  }
28738
29132
  ],
28739
- mentions: ["talonic_to_markdown", "OCR", "markdown", "document_id"]
29133
+ mentions: [
29134
+ "talonic_to_markdown",
29135
+ "OCR",
29136
+ "markdown",
29137
+ "document_id"
29138
+ ]
28740
29139
  },
28741
29140
  {
28742
29141
  slug: "mcp-talonic-list-schemas",
@@ -28749,7 +29148,11 @@ var sections_default2 = [
28749
29148
  type: "paragraph",
28750
29149
  text: "List all saved schemas in the workspace. Returns each schema with its ID, name, description, version, field count, and full JSON Schema definition."
28751
29150
  },
28752
- { type: "heading", level: 3, text: "When to use" },
29151
+ {
29152
+ type: "heading",
29153
+ level: 3,
29154
+ text: "When to use"
29155
+ },
28753
29156
  {
28754
29157
  type: "list",
28755
29158
  ordered: false,
@@ -28760,7 +29163,11 @@ var sections_default2 = [
28760
29163
  "You need a `schema_id` for `talonic_extract`."
28761
29164
  ]
28762
29165
  },
28763
- { type: "heading", level: 3, text: "When NOT to use" },
29166
+ {
29167
+ type: "heading",
29168
+ level: 3,
29169
+ text: "When NOT to use"
29170
+ },
28764
29171
  {
28765
29172
  type: "list",
28766
29173
  ordered: false,
@@ -28768,17 +29175,41 @@ var sections_default2 = [
28768
29175
  "The user wants to extract data and provides an inline schema \u2192 call `talonic_extract` directly."
28769
29176
  ]
28770
29177
  },
28771
- { type: "heading", level: 3, text: "Input schema" },
28772
- { type: "paragraph", text: "No parameters required." },
28773
- { type: "heading", level: 3, text: "Cost" },
28774
- { type: "paragraph", text: "Free \u2014 listing schemas does not consume extraction credits." }
29178
+ {
29179
+ type: "heading",
29180
+ level: 3,
29181
+ text: "Input schema"
29182
+ },
29183
+ {
29184
+ type: "paragraph",
29185
+ text: "No parameters required."
29186
+ },
29187
+ {
29188
+ type: "heading",
29189
+ level: 3,
29190
+ text: "Cost"
29191
+ },
29192
+ {
29193
+ type: "paragraph",
29194
+ text: "Free \u2014 listing schemas does not consume extraction credits."
29195
+ }
28775
29196
  ],
28776
29197
  related: [
28777
- { label: "talonic_save_schema", slug: "mcp-talonic-save-schema" },
28778
- { label: "SDK Schemas", slug: "sdk-schemas" }
29198
+ {
29199
+ label: "talonic_save_schema",
29200
+ slug: "mcp-talonic-save-schema"
29201
+ },
29202
+ {
29203
+ label: "SDK Schemas",
29204
+ slug: "sdk-schemas"
29205
+ }
28779
29206
  ],
28780
29207
  faq: [],
28781
- mentions: ["talonic_list_schemas", "schemas", "schema_id"]
29208
+ mentions: [
29209
+ "talonic_list_schemas",
29210
+ "schemas",
29211
+ "schema_id"
29212
+ ]
28782
29213
  },
28783
29214
  {
28784
29215
  slug: "mcp-talonic-save-schema",
@@ -28791,7 +29222,11 @@ var sections_default2 = [
28791
29222
  type: "paragraph",
28792
29223
  text: "Save a schema definition to the workspace for reuse across future extractions. Returns the saved schema with its assigned `id` (UUID) and `short_id` (`SCH-XXXXXXXX`)."
28793
29224
  },
28794
- { type: "heading", level: 3, text: "When to use" },
29225
+ {
29226
+ type: "heading",
29227
+ level: 3,
29228
+ text: "When to use"
29229
+ },
28795
29230
  {
28796
29231
  type: "list",
28797
29232
  ordered: false,
@@ -28801,7 +29236,11 @@ var sections_default2 = [
28801
29236
  "The user wants to standardise extraction across many documents of the same type."
28802
29237
  ]
28803
29238
  },
28804
- { type: "heading", level: 3, text: "When NOT to use" },
29239
+ {
29240
+ type: "heading",
29241
+ level: 3,
29242
+ text: "When NOT to use"
29243
+ },
28805
29244
  {
28806
29245
  type: "list",
28807
29246
  ordered: false,
@@ -28810,7 +29249,11 @@ var sections_default2 = [
28810
29249
  "The user has not confirmed the schema design \u2014 avoid creating clutter."
28811
29250
  ]
28812
29251
  },
28813
- { type: "heading", level: 3, text: "Input schema" },
29252
+ {
29253
+ type: "heading",
29254
+ level: 3,
29255
+ text: "Input schema"
29256
+ },
28814
29257
  {
28815
29258
  type: "param-table",
28816
29259
  title: "Parameters",
@@ -28834,8 +29277,15 @@ var sections_default2 = [
28834
29277
  }
28835
29278
  ]
28836
29279
  },
28837
- { type: "heading", level: 3, text: "Schema format guidance" },
28838
- { type: "paragraph", text: "**Full JSON Schema (recommended):**" },
29280
+ {
29281
+ type: "heading",
29282
+ level: 3,
29283
+ text: "Schema format guidance"
29284
+ },
29285
+ {
29286
+ type: "paragraph",
29287
+ text: "**Full JSON Schema (recommended):**"
29288
+ },
28839
29289
  {
28840
29290
  type: "code",
28841
29291
  language: "json",
@@ -28861,12 +29311,25 @@ var sections_default2 = [
28861
29311
  type: "callout",
28862
29312
  text: "When you call `talonic_save_schema` (or update an existing schema), the API samples the field's prior extracted values. If 80% or more of a string-typed field's values parse as numbers (with at least 5 samples), the response includes a `warnings[]` suggesting `data_type: \"number\"`. Heed the warning if you plan to filter on that field with numeric operators."
28863
29313
  },
28864
- { type: "heading", level: 3, text: "Cost" },
28865
- { type: "paragraph", text: "Free \u2014 saving a schema does not consume extraction credits." }
29314
+ {
29315
+ type: "heading",
29316
+ level: 3,
29317
+ text: "Cost"
29318
+ },
29319
+ {
29320
+ type: "paragraph",
29321
+ text: "Free \u2014 saving a schema does not consume extraction credits."
29322
+ }
28866
29323
  ],
28867
29324
  related: [
28868
- { label: "talonic_list_schemas", slug: "mcp-talonic-list-schemas" },
28869
- { label: "Schemas API", slug: "create-schema" }
29325
+ {
29326
+ label: "talonic_list_schemas",
29327
+ slug: "mcp-talonic-list-schemas"
29328
+ },
29329
+ {
29330
+ label: "Schemas API",
29331
+ slug: "create-schema"
29332
+ }
28870
29333
  ],
28871
29334
  faq: [
28872
29335
  {
@@ -28874,7 +29337,12 @@ var sections_default2 = [
28874
29337
  answer: "Full JSON Schema ({type: 'object', properties: {...}}) is most reliable. Flat key-type maps ({field: 'type'}) work for simple schemas but are normalized server-side and may produce errors with complex structures."
28875
29338
  }
28876
29339
  ],
28877
- mentions: ["talonic_save_schema", "schema", "JSON Schema", "flat key-type"]
29340
+ mentions: [
29341
+ "talonic_save_schema",
29342
+ "schema",
29343
+ "JSON Schema",
29344
+ "flat key-type"
29345
+ ]
28878
29346
  },
28879
29347
  {
28880
29348
  slug: "mcp-talonic-get-balance",
@@ -28887,7 +29355,11 @@ var sections_default2 = [
28887
29355
  type: "paragraph",
28888
29356
  text: "Read the user's current Talonic credit balance, EUR value, 30-day burn rate, projected runway, tier, and next-tier-reset timestamp. Use this to make budget-aware decisions before kicking off large batches or re-extractions."
28889
29357
  },
28890
- { type: "heading", level: 3, text: "When to use" },
29358
+ {
29359
+ type: "heading",
29360
+ level: 3,
29361
+ text: "When to use"
29362
+ },
28891
29363
  {
28892
29364
  type: "list",
28893
29365
  ordered: false,
@@ -28897,7 +29369,11 @@ var sections_default2 = [
28897
29369
  "The user asks how long their balance will last at the current rate."
28898
29370
  ]
28899
29371
  },
28900
- { type: "heading", level: 3, text: "When NOT to use" },
29372
+ {
29373
+ type: "heading",
29374
+ level: 3,
29375
+ text: "When NOT to use"
29376
+ },
28901
29377
  {
28902
29378
  type: "list",
28903
29379
  ordered: false,
@@ -28906,14 +29382,29 @@ var sections_default2 = [
28906
29382
  "The user wants to top up credits \u2014 route them to the dashboard at `https://app.talonic.com`."
28907
29383
  ]
28908
29384
  },
28909
- { type: "heading", level: 3, text: "Input schema" },
28910
- { type: "paragraph", text: "No parameters required." },
28911
- { type: "heading", level: 3, text: "Response shape" },
29385
+ {
29386
+ type: "heading",
29387
+ level: 3,
29388
+ text: "Input schema"
29389
+ },
29390
+ {
29391
+ type: "paragraph",
29392
+ text: "No parameters required."
29393
+ },
29394
+ {
29395
+ type: "heading",
29396
+ level: 3,
29397
+ text: "Response shape"
29398
+ },
28912
29399
  {
28913
29400
  type: "param-table",
28914
29401
  title: "Fields",
28915
29402
  params: [
28916
- { name: "balance_credits", type: "number", description: "Current credit balance." },
29403
+ {
29404
+ name: "balance_credits",
29405
+ type: "number",
29406
+ description: "Current credit balance."
29407
+ },
28917
29408
  {
28918
29409
  name: "balance_eur",
28919
29410
  type: "number",
@@ -28947,12 +29438,25 @@ var sections_default2 = [
28947
29438
  title: "Example response",
28948
29439
  code: '{\n "balance_credits": 1000,\n "balance_eur": 50.00,\n "burn_rate_30d_credits": 240,\n "projected_runway_days": 125,\n "tier": "pro",\n "tier_resets_at": "2026-06-01T00:00:00.000Z"\n}'
28949
29440
  },
28950
- { type: "heading", level: 3, text: "Cost" },
28951
- { type: "paragraph", text: "Free \u2014 balance lookups do not consume extraction credits." }
29441
+ {
29442
+ type: "heading",
29443
+ level: 3,
29444
+ text: "Cost"
29445
+ },
29446
+ {
29447
+ type: "paragraph",
29448
+ text: "Free \u2014 balance lookups do not consume extraction credits."
29449
+ }
28952
29450
  ],
28953
29451
  related: [
28954
- { label: "talonic_extract", slug: "mcp-talonic-extract" },
28955
- { label: "Cost & Rate Limits", slug: "mcp-cost-and-limits" }
29452
+ {
29453
+ label: "talonic_extract",
29454
+ slug: "mcp-talonic-extract"
29455
+ },
29456
+ {
29457
+ label: "Cost & Rate Limits",
29458
+ slug: "mcp-cost-and-limits"
29459
+ }
28956
29460
  ],
28957
29461
  faq: [
28958
29462
  {
@@ -28964,7 +29468,157 @@ var sections_default2 = [
28964
29468
  answer: "Days of runway at the trailing 30-day average burn rate. The value -1 means no consumption in the trailing window, so runway cannot be computed."
28965
29469
  }
28966
29470
  ],
28967
- mentions: ["talonic_get_balance", "credits", "balance", "tier", "burn rate", "runway"]
29471
+ mentions: [
29472
+ "talonic_get_balance",
29473
+ "credits",
29474
+ "balance",
29475
+ "tier",
29476
+ "burn rate",
29477
+ "runway"
29478
+ ]
29479
+ },
29480
+ {
29481
+ slug: "mcp-talonic-request-upload",
29482
+ parentSlug: "mcp-tools",
29483
+ title: "talonic_request_upload",
29484
+ seoTitle: "talonic_request_upload MCP Tool \u2014 Talonic Docs",
29485
+ description: "Request a browser upload link for files too large for tool-call arguments or when running in a sandboxed hosted environment.",
29486
+ content: [
29487
+ {
29488
+ type: "paragraph",
29489
+ text: "Request a browser upload link for the user. Use this when the user wants to extract a file but you cannot deliver it directly \u2014 the file is too large for tool-call arguments (~32 KB cap on hosted connectors), or you're running in a sandboxed environment (Claude.ai, ChatGPT) that blocks outbound file transfers."
29490
+ },
29491
+ {
29492
+ type: "heading",
29493
+ level: 3,
29494
+ text: "When to use"
29495
+ },
29496
+ {
29497
+ type: "list",
29498
+ ordered: false,
29499
+ items: [
29500
+ "The user has a file to extract but you cannot send it via `file_data` (file larger than ~32 KB, or the environment blocks outbound data).",
29501
+ "You are running in a hosted/sandboxed environment (Claude.ai, ChatGPT) where `file_data` cannot be used reliably.",
29502
+ "The user explicitly asks for an upload link."
29503
+ ]
29504
+ },
29505
+ {
29506
+ type: "heading",
29507
+ level: 3,
29508
+ text: "When NOT to use"
29509
+ },
29510
+ {
29511
+ type: "list",
29512
+ ordered: false,
29513
+ items: [
29514
+ "You can deliver the file directly via `file_data` (local stdio installs with small files).",
29515
+ "The file is already accessible via a public URL \u2192 use `file_url` on `talonic_extract`.",
29516
+ "The document is already in the workspace \u2192 use `document_id` on `talonic_extract`."
29517
+ ]
29518
+ },
29519
+ {
29520
+ type: "heading",
29521
+ level: 3,
29522
+ text: "How the flow works"
29523
+ },
29524
+ {
29525
+ type: "list",
29526
+ ordered: true,
29527
+ items: [
29528
+ "Call `talonic_request_upload` with the filename. You receive a `document_id`, an `upload_url`, and an `expires_at` timestamp.",
29529
+ "Show the `upload_url` to the user and ask them to open it in their browser.",
29530
+ "The user drops the file on the upload page. The browser uploads directly to Talonic \u2014 no tool-call size cap, no sandbox restriction.",
29531
+ "Poll with `talonic_get_document` using the `document_id` until `status` is `uploaded`.",
29532
+ "Call `talonic_extract` with the `document_id` and a schema to extract structured data."
29533
+ ]
29534
+ },
29535
+ {
29536
+ type: "heading",
29537
+ level: 3,
29538
+ text: "Input schema"
29539
+ },
29540
+ {
29541
+ type: "param-table",
29542
+ title: "Parameters",
29543
+ params: [
29544
+ {
29545
+ name: "filename",
29546
+ type: "string",
29547
+ required: true,
29548
+ description: "The name of the file being uploaded, including extension (e.g. `invoice.pdf`). Used to pre-allocate the document and infer MIME type."
29549
+ }
29550
+ ]
29551
+ },
29552
+ {
29553
+ type: "heading",
29554
+ level: 3,
29555
+ text: "Response shape"
29556
+ },
29557
+ {
29558
+ type: "code",
29559
+ language: "json",
29560
+ code: '{\n "document_id": "d8f3a1b2-...",\n "upload_url": "https://app.talonic.com/u/abc12345-...",\n "expires_at": "2026-05-27T22:15:00.000Z"\n}'
29561
+ },
29562
+ {
29563
+ type: "param-table",
29564
+ title: "Response fields",
29565
+ params: [
29566
+ {
29567
+ name: "document_id",
29568
+ type: "string",
29569
+ description: "The pre-allocated document ID. Use with `talonic_get_document` to poll status, and with `talonic_extract` once uploaded."
29570
+ },
29571
+ {
29572
+ name: "upload_url",
29573
+ type: "string",
29574
+ description: "URL the user should open in their browser to drop the file. Expires after 15 minutes."
29575
+ },
29576
+ {
29577
+ name: "expires_at",
29578
+ type: "string",
29579
+ description: "ISO 8601 timestamp when the upload link expires."
29580
+ }
29581
+ ]
29582
+ },
29583
+ {
29584
+ type: "callout",
29585
+ text: "Upload links are single-use and expire after 15 minutes. If the user doesn't upload in time, call `talonic_request_upload` again to get a fresh link."
29586
+ }
29587
+ ],
29588
+ related: [
29589
+ {
29590
+ label: "talonic_extract",
29591
+ slug: "mcp-talonic-extract"
29592
+ },
29593
+ {
29594
+ label: "talonic_get_document",
29595
+ slug: "mcp-talonic-get-document"
29596
+ },
29597
+ {
29598
+ label: "Drag & Drop in Chat",
29599
+ slug: "mcp-drag-drop"
29600
+ }
29601
+ ],
29602
+ faq: [
29603
+ {
29604
+ question: "How do I upload a file through Claude.ai to Talonic?",
29605
+ answer: "Call talonic_request_upload with the filename. Show the returned upload_url to the user. They open it in their browser and drop the file. Poll talonic_get_document until status is 'uploaded', then call talonic_extract with the document_id."
29606
+ },
29607
+ {
29608
+ question: "Why can't I just send the file through file_data on Claude.ai?",
29609
+ answer: "Claude.ai's hosted connector caps tool-call arguments at ~32 KB (decoded). Real documents are typically 100 KB to several MB. The browser-handoff upload bypasses this limit entirely by moving the file transfer to the user's browser."
29610
+ }
29611
+ ],
29612
+ mentions: [
29613
+ "upload",
29614
+ "browser handoff",
29615
+ "hosted connector",
29616
+ "Claude.ai",
29617
+ "ChatGPT",
29618
+ "file size limit",
29619
+ "sandbox",
29620
+ "upload link"
29621
+ ]
28968
29622
  },
28969
29623
  {
28970
29624
  slug: "mcp-schemas-resource",
@@ -28973,25 +29627,43 @@ var sections_default2 = [
28973
29627
  seoTitle: "MCP Resources \u2014 Talonic Docs",
28974
29628
  description: "Two MCP resources exposed by the Talonic server: talonic://schemas (saved schemas) and talonic://webhooks/reference (webhook event reference).",
28975
29629
  content: [
28976
- { type: "heading", level: 3, text: "talonic://schemas" },
29630
+ {
29631
+ type: "heading",
29632
+ level: 3,
29633
+ text: "talonic://schemas"
29634
+ },
28977
29635
  {
28978
29636
  type: "paragraph",
28979
29637
  text: "Exposes the saved-schemas list to clients that browse MCP resources separately. Claude Desktop and Cowork render these in the UI. The contents mirror `talonic_list_schemas` but in a browseable form."
28980
29638
  },
28981
- { type: "heading", level: 3, text: "talonic://webhooks/reference" },
29639
+ {
29640
+ type: "heading",
29641
+ level: 3,
29642
+ text: "talonic://webhooks/reference"
29643
+ },
28982
29644
  {
28983
29645
  type: "paragraph",
28984
29646
  text: "Static reference documenting the webhook events the Talonic API can fire (extraction lifecycle, document classification, etc.), their payload shapes, and how to subscribe. Useful when an agent is helping the user wire Talonic into a backend that needs to react to extraction events."
28985
29647
  }
28986
29648
  ],
28987
- related: [{ label: "talonic_list_schemas", slug: "mcp-talonic-list-schemas" }],
29649
+ related: [
29650
+ {
29651
+ label: "talonic_list_schemas",
29652
+ slug: "mcp-talonic-list-schemas"
29653
+ }
29654
+ ],
28988
29655
  faq: [
28989
29656
  {
28990
29657
  question: "What resources does the Talonic MCP server expose?",
28991
29658
  answer: "Two resources: talonic://schemas (browseable list of saved schemas) and talonic://webhooks/reference (static reference for the API's webhook events and payloads)."
28992
29659
  }
28993
29660
  ],
28994
- mentions: ["MCP resource", "talonic://schemas", "talonic://webhooks/reference", "webhooks"]
29661
+ mentions: [
29662
+ "MCP resource",
29663
+ "talonic://schemas",
29664
+ "talonic://webhooks/reference",
29665
+ "webhooks"
29666
+ ]
28995
29667
  },
28996
29668
  {
28997
29669
  slug: "mcp-cost-and-limits",
@@ -29000,7 +29672,11 @@ var sections_default2 = [
29000
29672
  seoTitle: "MCP Cost and Rate Limits \u2014 Talonic Docs",
29001
29673
  description: "Which MCP tool calls cost extraction credits, rate limit behavior, insufficient-credit handling, and how to avoid re-extraction.",
29002
29674
  content: [
29003
- { type: "heading", level: 3, text: "What costs credits" },
29675
+ {
29676
+ type: "heading",
29677
+ level: 3,
29678
+ text: "What costs credits"
29679
+ },
29004
29680
  {
29005
29681
  type: "paragraph",
29006
29682
  text: "Only extraction operations consume credits. Everything else is free:"
@@ -29024,14 +29700,26 @@ var sections_default2 = [
29024
29700
  type: "free",
29025
29701
  description: "Document already ingested \u2014 just fetches stored markdown."
29026
29702
  },
29027
- { name: "talonic_search", type: "free", description: "Queries indexed data." },
29703
+ {
29704
+ name: "talonic_search",
29705
+ type: "free",
29706
+ description: "Queries indexed data."
29707
+ },
29028
29708
  {
29029
29709
  name: "talonic_filter",
29030
29710
  type: "free",
29031
29711
  description: "Queries extracted field values."
29032
29712
  },
29033
- { name: "talonic_get_document", type: "free", description: "Metadata lookup." },
29034
- { name: "talonic_list_schemas", type: "free", description: "Lists saved schemas." },
29713
+ {
29714
+ name: "talonic_get_document",
29715
+ type: "free",
29716
+ description: "Metadata lookup."
29717
+ },
29718
+ {
29719
+ name: "talonic_list_schemas",
29720
+ type: "free",
29721
+ description: "Lists saved schemas."
29722
+ },
29035
29723
  {
29036
29724
  name: "talonic_save_schema",
29037
29725
  type: "free",
@@ -29048,7 +29736,11 @@ var sections_default2 = [
29048
29736
  type: "callout",
29049
29737
  text: "The per-call cost of `talonic_extract` (and `talonic_to_markdown` with a raw file) is also surfaced on the response under `cost` (`costCredits`, `costEur`, `balanceCredits`, plus a breakdown of `cellsResolvedRegistry` and `cellsResolvedAi`). Agents can read this immediately after the call rather than calling `talonic_get_balance` again."
29050
29738
  },
29051
- { type: "heading", level: 3, text: "Avoiding re-extraction" },
29739
+ {
29740
+ type: "heading",
29741
+ level: 3,
29742
+ text: "Avoiding re-extraction"
29743
+ },
29052
29744
  {
29053
29745
  type: "paragraph",
29054
29746
  text: "Agents should avoid extracting the same document twice. Best practices:"
@@ -29062,26 +29754,47 @@ var sections_default2 = [
29062
29754
  "Use `talonic_filter` to query already-extracted data instead of re-extracting with a different schema when the fields you need are already captured."
29063
29755
  ]
29064
29756
  },
29065
- { type: "heading", level: 3, text: "Rate limits" },
29757
+ {
29758
+ type: "heading",
29759
+ level: 3,
29760
+ text: "Rate limits"
29761
+ },
29066
29762
  {
29067
29763
  type: "paragraph",
29068
29764
  text: "The Talonic API enforces per-key rate limits. When exceeded, the server returns `429 Too Many Requests` with a `X-RateLimit-Reset` header. The MCP server (and the underlying Node SDK) retries automatically with exponential backoff up to `maxRetries` (default: 3). If retries are exhausted, the tool returns an error with the reset timestamp."
29069
29765
  },
29070
- { type: "heading", level: 3, text: "Insufficient credits" },
29766
+ {
29767
+ type: "heading",
29768
+ level: 3,
29769
+ text: "Insufficient credits"
29770
+ },
29071
29771
  {
29072
29772
  type: "paragraph",
29073
29773
  text: "When extraction credits are exhausted, the API returns `402 Payment Required`. The tool surfaces this as an error. The agent should inform the user that their credit balance is depleted and suggest upgrading their plan or waiting for the daily reset (free tier: 50 extractions/day, resets at midnight UTC)."
29074
29774
  },
29075
- { type: "heading", level: 3, text: "Free tier limits" },
29775
+ {
29776
+ type: "heading",
29777
+ level: 3,
29778
+ text: "Free tier limits"
29779
+ },
29076
29780
  {
29077
29781
  type: "paragraph",
29078
29782
  text: "The free tier includes 50 extractions per day (resets at midnight UTC). Search, filter, metadata, and schema operations are unlimited. No credit card required."
29079
29783
  }
29080
29784
  ],
29081
29785
  related: [
29082
- { label: "talonic_extract", slug: "mcp-talonic-extract" },
29083
- { label: "Authentication", slug: "mcp-authentication" },
29084
- { label: "SDK Retries", slug: "sdk-retries" }
29786
+ {
29787
+ label: "talonic_extract",
29788
+ slug: "mcp-talonic-extract"
29789
+ },
29790
+ {
29791
+ label: "Authentication",
29792
+ slug: "mcp-authentication"
29793
+ },
29794
+ {
29795
+ label: "SDK Retries",
29796
+ slug: "sdk-retries"
29797
+ }
29085
29798
  ],
29086
29799
  faq: [
29087
29800
  {
@@ -29097,7 +29810,14 @@ var sections_default2 = [
29097
29810
  answer: "The API returns 429 with a reset timestamp. The SDK retries automatically with exponential backoff (up to 3 retries by default)."
29098
29811
  }
29099
29812
  ],
29100
- mentions: ["credits", "rate limits", "429", "402", "free tier", "cost"]
29813
+ mentions: [
29814
+ "credits",
29815
+ "rate limits",
29816
+ "429",
29817
+ "402",
29818
+ "free tier",
29819
+ "cost"
29820
+ ]
29101
29821
  },
29102
29822
  {
29103
29823
  slug: "mcp-drag-drop",
@@ -29119,30 +29839,49 @@ var sections_default2 = [
29119
29839
  type: "paragraph",
29120
29840
  text: "From `@talonic/mcp@0.1.4`, agents can pass **`file_data`** (base64-encoded file bytes) and **`filename`** on `talonic_extract` and `talonic_to_markdown`. The agent reads the file bytes from the conversation, base64-encodes them, and passes them through the MCP tool call. The MCP server decodes, infers MIME type from the filename, and uploads to the Talonic API as a normal multipart request. Tool descriptions advertise `file_data` as the recommended input here, so well-trained agents reach for it automatically. No client-side configuration required."
29121
29841
  },
29122
- { type: "heading", level: 3, text: "Claude.ai hosted connector" },
29842
+ {
29843
+ type: "heading",
29844
+ level: 3,
29845
+ text: "Claude.ai hosted connector"
29846
+ },
29123
29847
  {
29124
29848
  type: "callout",
29125
29849
  variant: "warning",
29126
- text: "Claude.ai's hosted-connector pipeline imposes a hard size limit on tool-call arguments (effectively under ~1 KB). A base64-encoded real PDF (typically hundreds of KB at minimum) gets truncated before reaching the MCP server. The Talonic API receives a few hundred bytes, registers an empty document, and the response comes back with `null` extracted fields. This is a Claude.ai platform limit on connectors, not a Talonic MCP server bug."
29850
+ text: "Claude.ai's hosted-connector pipeline imposes a hard size limit on tool-call arguments (effectively ~32 KB decoded). A base64-encoded real PDF (typically hundreds of KB at minimum) gets truncated before reaching the MCP server. The Talonic API receives ~32 KB, registers an empty document, and the response comes back with `null` extracted fields. This is a Claude.ai platform limit on connectors, not a Talonic MCP server bug."
29851
+ },
29852
+ {
29853
+ type: "paragraph",
29854
+ text: "**Workarounds for Claude.ai users:**"
29127
29855
  },
29128
- { type: "paragraph", text: "**Workarounds for Claude.ai users:**" },
29129
29856
  {
29130
29857
  type: "list",
29131
29858
  ordered: false,
29132
29859
  items: [
29860
+ "`talonic_request_upload`: the recommended path. The agent gets an upload link, the user drops the file in their browser, and the agent continues with the `document_id`. Works with any file size the API accepts.",
29133
29861
  "`file_url`: pass a publicly reachable URL; the Talonic API fetches it server-side. Best for files already on the public web.",
29134
29862
  "`document_id`: upload the file once via `app.talonic.com`, then reference the returned id. Best for sensitive files you don't want to expose publicly.",
29135
29863
  "Switch to a local stdio install (`npx -y @talonic/mcp@latest` in Claude Desktop, Cursor, Cline, etc.) \u2014 local stdio has no parameter-size cap and `file_data` works for any file size the API accepts."
29136
- ]
29864
+ ],
29865
+ text: ""
29137
29866
  },
29138
29867
  {
29139
29868
  type: "paragraph",
29140
- text: "The architectural fix that would unblock drag-and-drop through the Claude.ai connector is a pre-signed upload URL flow: a new MCP tool returns a one-time URL plus a reserved `document_id`, the user uploads from their browser directly to Talonic's storage, and the agent then calls `talonic_extract` with the `document_id`. This bypasses the connector's argument-size pipe entirely."
29869
+ text: "From `@talonic/mcp@0.1.7`, this is solved by the **`talonic_request_upload`** tool. The agent calls it to get a one-time upload URL plus a reserved `document_id`. The user opens the link in their browser and drops the file \u2014 no tool-call size cap, no sandbox restriction. The agent then polls `talonic_get_document` until the file is ready and proceeds with `talonic_extract` using the `document_id`."
29141
29870
  }
29142
29871
  ],
29143
29872
  related: [
29144
- { label: "talonic_extract", slug: "mcp-talonic-extract" },
29145
- { label: "Installation", slug: "mcp-installation" }
29873
+ {
29874
+ label: "talonic_extract",
29875
+ slug: "mcp-talonic-extract"
29876
+ },
29877
+ {
29878
+ label: "Installation",
29879
+ slug: "mcp-installation"
29880
+ },
29881
+ {
29882
+ label: "talonic_request_upload",
29883
+ slug: "mcp-talonic-request-upload"
29884
+ }
29146
29885
  ],
29147
29886
  faq: [
29148
29887
  {
@@ -29151,7 +29890,7 @@ var sections_default2 = [
29151
29890
  },
29152
29891
  {
29153
29892
  question: "Why does drag-and-drop fail on the Claude.ai connector?",
29154
- answer: "Claude.ai imposes a hard ~1 KB cap on tool-call argument values. A base64-encoded real PDF cannot fit, so file_data is truncated to a few hundred bytes before the MCP server receives it. Workarounds: file_url (public URL), document_id (upload via app.talonic.com first), or switch to a local stdio install."
29893
+ answer: "Claude.ai imposes a ~32 KB cap on tool-call argument values. A base64-encoded real PDF cannot fit. Use talonic_request_upload to get a browser upload link \u2014 the user drops the file in their browser, bypassing the cap entirely. Alternatives: file_url (public URL), document_id (upload via app.talonic.com first), or switch to a local stdio install."
29155
29894
  }
29156
29895
  ],
29157
29896
  mentions: [
@@ -29197,11 +29936,23 @@ var sections_default2 = [
29197
29936
  }
29198
29937
  ],
29199
29938
  related: [
29200
- { label: "Configuration", slug: "mcp-configuration" },
29201
- { label: "Introduction", slug: "mcp-introduction" }
29939
+ {
29940
+ label: "Configuration",
29941
+ slug: "mcp-configuration"
29942
+ },
29943
+ {
29944
+ label: "Introduction",
29945
+ slug: "mcp-introduction"
29946
+ }
29202
29947
  ],
29203
29948
  faq: [],
29204
- mentions: ["architecture", "stdio", "HTTP", "Streamable HTTP", "session"]
29949
+ mentions: [
29950
+ "architecture",
29951
+ "stdio",
29952
+ "HTTP",
29953
+ "Streamable HTTP",
29954
+ "session"
29955
+ ]
29205
29956
  },
29206
29957
  {
29207
29958
  slug: "mcp-configuration",
@@ -29210,8 +29961,15 @@ var sections_default2 = [
29210
29961
  seoTitle: "MCP Server Configuration \u2014 Talonic Docs",
29211
29962
  description: "Environment variables for the local MCP server and header options for the hosted server.",
29212
29963
  content: [
29213
- { type: "heading", level: 3, text: "Local server (env vars)" },
29214
- { type: "paragraph", text: "Set via the `env` block in your MCP client config:" },
29964
+ {
29965
+ type: "heading",
29966
+ level: 3,
29967
+ text: "Local server (env vars)"
29968
+ },
29969
+ {
29970
+ type: "paragraph",
29971
+ text: "Set via the `env` block in your MCP client config:"
29972
+ },
29215
29973
  {
29216
29974
  type: "param-table",
29217
29975
  title: "Environment variables",
@@ -29229,7 +29987,11 @@ var sections_default2 = [
29229
29987
  }
29230
29988
  ]
29231
29989
  },
29232
- { type: "heading", level: 3, text: "Hosted server (headers)" },
29990
+ {
29991
+ type: "heading",
29992
+ level: 3,
29993
+ text: "Hosted server (headers)"
29994
+ },
29233
29995
  {
29234
29996
  type: "paragraph",
29235
29997
  text: "The hosted server at `mcp.talonic.com` is configured entirely via the MCP client config:"
@@ -29245,11 +30007,22 @@ var sections_default2 = [
29245
30007
  }
29246
30008
  ],
29247
30009
  related: [
29248
- { label: "Installation", slug: "mcp-installation" },
29249
- { label: "Authentication", slug: "mcp-authentication" }
30010
+ {
30011
+ label: "Installation",
30012
+ slug: "mcp-installation"
30013
+ },
30014
+ {
30015
+ label: "Authentication",
30016
+ slug: "mcp-authentication"
30017
+ }
29250
30018
  ],
29251
30019
  faq: [],
29252
- mentions: ["TALONIC_API_KEY", "TALONIC_BASE_URL", "configuration", "headers"]
30020
+ mentions: [
30021
+ "TALONIC_API_KEY",
30022
+ "TALONIC_BASE_URL",
30023
+ "configuration",
30024
+ "headers"
30025
+ ]
29253
30026
  },
29254
30027
  {
29255
30028
  slug: "mcp-troubleshooting",
@@ -29338,7 +30111,12 @@ var sections_default2 = [
29338
30111
  type: "paragraph",
29339
30112
  text: "Extraction credit balance is exhausted. Free tier: 50 extractions/day, resets at midnight UTC. Upgrade plan or wait for reset."
29340
30113
  },
29341
- { type: "heading", level: 3, id: "ts-cached", text: "Tool descriptions look wrong" },
30114
+ {
30115
+ type: "heading",
30116
+ level: 3,
30117
+ id: "ts-cached",
30118
+ text: "Tool descriptions look wrong"
30119
+ },
29342
30120
  {
29343
30121
  type: "paragraph",
29344
30122
  text: "Some MCP clients cache tool descriptions. Restart the client after a server update."
@@ -29355,12 +30133,28 @@ var sections_default2 = [
29355
30133
  }
29356
30134
  ],
29357
30135
  related: [
29358
- { label: "Installation", slug: "mcp-installation" },
29359
- { label: "Configuration", slug: "mcp-configuration" },
29360
- { label: "Cost & Rate Limits", slug: "mcp-cost-and-limits" }
30136
+ {
30137
+ label: "Installation",
30138
+ slug: "mcp-installation"
30139
+ },
30140
+ {
30141
+ label: "Configuration",
30142
+ slug: "mcp-configuration"
30143
+ },
30144
+ {
30145
+ label: "Cost & Rate Limits",
30146
+ slug: "mcp-cost-and-limits"
30147
+ }
29361
30148
  ],
29362
30149
  faq: [],
29363
- mentions: ["troubleshooting", "debugging", "errors", "401", "402", "500"]
30150
+ mentions: [
30151
+ "troubleshooting",
30152
+ "debugging",
30153
+ "errors",
30154
+ "401",
30155
+ "402",
30156
+ "500"
30157
+ ]
29364
30158
  }
29365
30159
  ];
29366
30160