@cyanheads/zenodo-mcp-server 0.1.1

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 (97) hide show
  1. package/AGENTS.md +435 -0
  2. package/CLAUDE.md +435 -0
  3. package/Dockerfile +140 -0
  4. package/LICENSE +201 -0
  5. package/README.md +292 -0
  6. package/changelog/0.1.x/0.1.1.md +21 -0
  7. package/changelog/template.md +151 -0
  8. package/dist/config/server-config.d.ts +13 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +19 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +21 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts +186 -0
  17. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts.map +1 -0
  18. package/dist/mcp-server/tools/definitions/get-record.tool.js +568 -0
  19. package/dist/mcp-server/tools/definitions/get-record.tool.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/index.d.ts +721 -0
  21. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/index.js +21 -0
  23. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/list-files.tool.d.ts +108 -0
  25. package/dist/mcp-server/tools/definitions/list-files.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/list-files.tool.js +348 -0
  27. package/dist/mcp-server/tools/definitions/list-files.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts +92 -0
  29. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/list-versions.tool.js +268 -0
  31. package/dist/mcp-server/tools/definitions/list-versions.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts +99 -0
  33. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js +324 -0
  35. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/read-file.tool.d.ts +104 -0
  37. package/dist/mcp-server/tools/definitions/read-file.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/read-file.tool.js +370 -0
  39. package/dist/mcp-server/tools/definitions/read-file.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts +181 -0
  41. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/search-records.tool.js +531 -0
  43. package/dist/mcp-server/tools/definitions/search-records.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/record-miss.d.ts +37 -0
  45. package/dist/mcp-server/tools/record-miss.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/record-miss.js +51 -0
  47. package/dist/mcp-server/tools/record-miss.js.map +1 -0
  48. package/dist/mcp-server/tools/render.d.ts +31 -0
  49. package/dist/mcp-server/tools/render.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/render.js +53 -0
  51. package/dist/mcp-server/tools/render.js.map +1 -0
  52. package/dist/mcp-server/tools/schema-helpers.d.ts +20 -0
  53. package/dist/mcp-server/tools/schema-helpers.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/schema-helpers.js +44 -0
  55. package/dist/mcp-server/tools/schema-helpers.js.map +1 -0
  56. package/dist/services/zenodo/cache.d.ts +25 -0
  57. package/dist/services/zenodo/cache.d.ts.map +1 -0
  58. package/dist/services/zenodo/cache.js +58 -0
  59. package/dist/services/zenodo/cache.js.map +1 -0
  60. package/dist/services/zenodo/html-to-text.d.ts +23 -0
  61. package/dist/services/zenodo/html-to-text.d.ts.map +1 -0
  62. package/dist/services/zenodo/html-to-text.js +148 -0
  63. package/dist/services/zenodo/html-to-text.js.map +1 -0
  64. package/dist/services/zenodo/http.d.ts +73 -0
  65. package/dist/services/zenodo/http.d.ts.map +1 -0
  66. package/dist/services/zenodo/http.js +378 -0
  67. package/dist/services/zenodo/http.js.map +1 -0
  68. package/dist/services/zenodo/identifiers.d.ts +104 -0
  69. package/dist/services/zenodo/identifiers.d.ts.map +1 -0
  70. package/dist/services/zenodo/identifiers.js +261 -0
  71. package/dist/services/zenodo/identifiers.js.map +1 -0
  72. package/dist/services/zenodo/normalize.d.ts +29 -0
  73. package/dist/services/zenodo/normalize.d.ts.map +1 -0
  74. package/dist/services/zenodo/normalize.js +324 -0
  75. package/dist/services/zenodo/normalize.js.map +1 -0
  76. package/dist/services/zenodo/query-builder.d.ts +87 -0
  77. package/dist/services/zenodo/query-builder.d.ts.map +1 -0
  78. package/dist/services/zenodo/query-builder.js +221 -0
  79. package/dist/services/zenodo/query-builder.js.map +1 -0
  80. package/dist/services/zenodo/resource-types.d.ts +34 -0
  81. package/dist/services/zenodo/resource-types.d.ts.map +1 -0
  82. package/dist/services/zenodo/resource-types.js +97 -0
  83. package/dist/services/zenodo/resource-types.js.map +1 -0
  84. package/dist/services/zenodo/text-preview.d.ts +56 -0
  85. package/dist/services/zenodo/text-preview.d.ts.map +1 -0
  86. package/dist/services/zenodo/text-preview.js +151 -0
  87. package/dist/services/zenodo/text-preview.js.map +1 -0
  88. package/dist/services/zenodo/types.d.ts +517 -0
  89. package/dist/services/zenodo/types.d.ts.map +1 -0
  90. package/dist/services/zenodo/types.js +8 -0
  91. package/dist/services/zenodo/types.js.map +1 -0
  92. package/dist/services/zenodo/zenodo-service.d.ts +98 -0
  93. package/dist/services/zenodo/zenodo-service.d.ts.map +1 -0
  94. package/dist/services/zenodo/zenodo-service.js +392 -0
  95. package/dist/services/zenodo/zenodo-service.js.map +1 -0
  96. package/package.json +110 -0
  97. package/server.json +113 -0
@@ -0,0 +1,721 @@
1
+ /**
2
+ * @fileoverview Barrel of every tool definition this server registers.
3
+ * @module mcp-server/tools/definitions
4
+ */
5
+ import { getRecord } from './get-record.tool.js';
6
+ import { listFiles } from './list-files.tool.js';
7
+ import { listVersions } from './list-versions.tool.js';
8
+ import { lookupVocabulary } from './lookup-vocabulary.tool.js';
9
+ import { readFile } from './read-file.tool.js';
10
+ import { searchRecords } from './search-records.tool.js';
11
+ export { getRecord, listFiles, listVersions, lookupVocabulary, readFile, searchRecords };
12
+ /** All tool definitions, in registration order. */
13
+ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
14
+ id: import("zod").ZodString;
15
+ page: import("zod").ZodDefault<import("zod").ZodNumber>;
16
+ size: import("zod").ZodDefault<import("zod").ZodNumber>;
17
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
18
+ found: import("zod").ZodBoolean;
19
+ input_kind: import("zod").ZodEnum<{
20
+ external_doi: "external_doi";
21
+ record_id: "record_id";
22
+ url: "url";
23
+ zenodo_doi: "zenodo_doi";
24
+ }>;
25
+ miss_kind: import("zod").ZodOptional<import("zod").ZodEnum<{
26
+ deleted: "deleted";
27
+ not_found: "not_found";
28
+ not_on_zenodo: "not_on_zenodo";
29
+ restricted: "restricted";
30
+ }>>;
31
+ guidance: import("zod").ZodOptional<import("zod").ZodString>;
32
+ tombstone: import("zod").ZodOptional<import("zod").ZodObject<{
33
+ removal_date: import("zod").ZodOptional<import("zod").ZodString>;
34
+ removal_reason: import("zod").ZodOptional<import("zod").ZodString>;
35
+ note: import("zod").ZodOptional<import("zod").ZodString>;
36
+ citation_text: import("zod").ZodOptional<import("zod").ZodString>;
37
+ }, import("zod/v4/core").$strip>>;
38
+ concept_recid: import("zod").ZodOptional<import("zod").ZodString>;
39
+ concept_doi: import("zod").ZodOptional<import("zod").ZodString>;
40
+ total_versions: import("zod").ZodOptional<import("zod").ZodNumber>;
41
+ latest_recid: import("zod").ZodOptional<import("zod").ZodString>;
42
+ page: import("zod").ZodNumber;
43
+ size: import("zod").ZodNumber;
44
+ has_more: import("zod").ZodBoolean;
45
+ next_page: import("zod").ZodOptional<import("zod").ZodNumber>;
46
+ versions: import("zod").ZodArray<import("zod").ZodObject<{
47
+ recid: import("zod").ZodString;
48
+ doi: import("zod").ZodOptional<import("zod").ZodString>;
49
+ version: import("zod").ZodOptional<import("zod").ZodString>;
50
+ title: import("zod").ZodString;
51
+ publication_date: import("zod").ZodOptional<import("zod").ZodString>;
52
+ index: import("zod").ZodOptional<import("zod").ZodNumber>;
53
+ is_latest: import("zod").ZodOptional<import("zod").ZodBoolean>;
54
+ file_count: import("zod").ZodOptional<import("zod").ZodNumber>;
55
+ total_bytes: import("zod").ZodOptional<import("zod").ZodNumber>;
56
+ views: import("zod").ZodOptional<import("zod").ZodNumber>;
57
+ downloads: import("zod").ZodOptional<import("zod").ZodNumber>;
58
+ }, import("zod/v4/core").$strip>>;
59
+ }, import("zod/v4/core").$strip>, readonly [{
60
+ readonly reason: "invalid_identifier";
61
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
62
+ readonly when: "id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host";
63
+ readonly recovery: "Pass a Zenodo record id (22705923), a DOI (10.5281/zenodo.22705923), or a zenodo.org/records URL as id; for a title or keyword, use zenodo_search_records.";
64
+ }, {
65
+ readonly reason: "result_window_exceeded";
66
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
67
+ readonly when: "page × size exceeds 10,000";
68
+ readonly recovery: "Zenodo pages only the first 10,000 versions of a series, and no series comes near that; call zenodo_list_versions with page 1 (total_versions and has_more show how far the series goes).";
69
+ }, {
70
+ readonly reason: "record_unavailable";
71
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
72
+ readonly when: "Zenodo could not serve this record or its versions page: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete record response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit)";
73
+ readonly thrownBy: "service";
74
+ readonly recovery: "Look the record up with zenodo_search_records using query doi:\"<its DOI>\" (all_versions true) or its title; withdrawn legacy records and deposits with more than about 10,000 files fail on the record endpoint, and if a keyword search also fails, Zenodo is degraded.";
75
+ }, {
76
+ readonly reason: "upstream_timeout";
77
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout;
78
+ readonly when: "The versions page got no complete response within its time budget";
79
+ readonly retryable: false;
80
+ readonly thrownBy: "service";
81
+ readonly recovery: "Call zenodo_list_versions again with a smaller size (5); this series holds large file manifests.";
82
+ }, {
83
+ readonly reason: "rate_limited";
84
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
85
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
86
+ readonly retryable: true;
87
+ readonly thrownBy: "service";
88
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_list_versions again with the same arguments.";
89
+ }], {
90
+ readonly truncated: import("zod").ZodBoolean;
91
+ readonly shown: import("zod").ZodNumber;
92
+ readonly cap: import("zod").ZodNumber;
93
+ readonly totalCount: import("zod").ZodNumber;
94
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
95
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
96
+ query: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
97
+ resource_type: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
98
+ [x: string]: string;
99
+ }>>>, unknown>;
100
+ community: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
101
+ funder: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
102
+ award: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
103
+ creator_orcid: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
104
+ file_type: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>, unknown>;
105
+ license: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
106
+ access_status: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodEnum<{
107
+ embargoed: "embargoed";
108
+ "metadata-only": "metadata-only";
109
+ open: "open";
110
+ restricted: "restricted";
111
+ }>>, unknown>;
112
+ published_from: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
113
+ published_to: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
114
+ all_versions: import("zod").ZodDefault<import("zod").ZodBoolean>;
115
+ sort: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodEnum<{
116
+ bestmatch: "bestmatch";
117
+ mostdownloaded: "mostdownloaded";
118
+ mostviewed: "mostviewed";
119
+ newest: "newest";
120
+ oldest: "oldest";
121
+ "updated-asc": "updated-asc";
122
+ "updated-desc": "updated-desc";
123
+ }>>, unknown>;
124
+ page: import("zod").ZodDefault<import("zod").ZodNumber>;
125
+ size: import("zod").ZodDefault<import("zod").ZodNumber>;
126
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
127
+ total: import("zod").ZodNumber;
128
+ reachable: import("zod").ZodNumber;
129
+ page: import("zod").ZodNumber;
130
+ size: import("zod").ZodNumber;
131
+ has_more: import("zod").ZodBoolean;
132
+ next_page: import("zod").ZodOptional<import("zod").ZodNumber>;
133
+ hits: import("zod").ZodArray<import("zod").ZodObject<{
134
+ recid: import("zod").ZodString;
135
+ doi: import("zod").ZodOptional<import("zod").ZodString>;
136
+ doi_provider: import("zod").ZodOptional<import("zod").ZodString>;
137
+ concept_recid: import("zod").ZodOptional<import("zod").ZodString>;
138
+ concept_doi: import("zod").ZodOptional<import("zod").ZodString>;
139
+ title: import("zod").ZodString;
140
+ publication_date: import("zod").ZodOptional<import("zod").ZodString>;
141
+ resource_type: import("zod").ZodOptional<import("zod").ZodObject<{
142
+ id: import("zod").ZodString;
143
+ title: import("zod").ZodOptional<import("zod").ZodString>;
144
+ }, import("zod/v4/core").$strip>>;
145
+ version: import("zod").ZodOptional<import("zod").ZodString>;
146
+ is_latest: import("zod").ZodOptional<import("zod").ZodBoolean>;
147
+ version_index: import("zod").ZodOptional<import("zod").ZodNumber>;
148
+ creators: import("zod").ZodArray<import("zod").ZodObject<{
149
+ name: import("zod").ZodString;
150
+ orcid: import("zod").ZodOptional<import("zod").ZodString>;
151
+ }, import("zod/v4/core").$strip>>;
152
+ creator_count: import("zod").ZodNumber;
153
+ license_ids: import("zod").ZodArray<import("zod").ZodString>;
154
+ access: import("zod").ZodObject<{
155
+ status: import("zod").ZodString;
156
+ files: import("zod").ZodOptional<import("zod").ZodString>;
157
+ embargo_until: import("zod").ZodOptional<import("zod").ZodString>;
158
+ }, import("zod/v4/core").$strip>;
159
+ communities: import("zod").ZodArray<import("zod").ZodString>;
160
+ file_count: import("zod").ZodOptional<import("zod").ZodNumber>;
161
+ total_bytes: import("zod").ZodOptional<import("zod").ZodNumber>;
162
+ views: import("zod").ZodOptional<import("zod").ZodNumber>;
163
+ downloads: import("zod").ZodOptional<import("zod").ZodNumber>;
164
+ description_snippet: import("zod").ZodOptional<import("zod").ZodString>;
165
+ zenodo_url: import("zod").ZodString;
166
+ }, import("zod/v4/core").$strip>>;
167
+ facets: import("zod").ZodObject<{
168
+ resource_type: import("zod").ZodArray<import("zod").ZodObject<{
169
+ id: import("zod").ZodString;
170
+ label: import("zod").ZodString;
171
+ count: import("zod").ZodNumber;
172
+ subtypes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
173
+ id: import("zod").ZodString;
174
+ label: import("zod").ZodString;
175
+ count: import("zod").ZodNumber;
176
+ }, import("zod/v4/core").$strip>>>;
177
+ }, import("zod/v4/core").$strip>>;
178
+ access_status: import("zod").ZodArray<import("zod").ZodObject<{
179
+ id: import("zod").ZodString;
180
+ label: import("zod").ZodString;
181
+ count: import("zod").ZodNumber;
182
+ }, import("zod/v4/core").$strip>>;
183
+ file_type: import("zod").ZodArray<import("zod").ZodObject<{
184
+ id: import("zod").ZodString;
185
+ label: import("zod").ZodString;
186
+ count: import("zod").ZodNumber;
187
+ }, import("zod/v4/core").$strip>>;
188
+ subject: import("zod").ZodArray<import("zod").ZodObject<{
189
+ label: import("zod").ZodString;
190
+ count: import("zod").ZodNumber;
191
+ }, import("zod/v4/core").$strip>>;
192
+ publication_year: import("zod").ZodArray<import("zod").ZodObject<{
193
+ year: import("zod").ZodString;
194
+ count: import("zod").ZodNumber;
195
+ }, import("zod/v4/core").$strip>>;
196
+ }, import("zod/v4/core").$strip>;
197
+ }, import("zod/v4/core").$strip>, readonly [{
198
+ readonly reason: "query_is_identifier";
199
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
200
+ readonly when: "The query is a single DOI, doi.org URL, or zenodo.org record URL";
201
+ readonly recovery: "Pass this identifier to zenodo_get_record as id instead of searching for it.";
202
+ }, {
203
+ readonly reason: "query_syntax";
204
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
205
+ readonly when: "The query has an unpaired unescaped / outside quotes";
206
+ readonly recovery: "Escape the slash as \\/ or wrap that term in double quotes, then call zenodo_search_records again.";
207
+ }, {
208
+ readonly reason: "query_failed";
209
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
210
+ readonly when: "Zenodo answered HTTP 500 for a query that passed the local checks";
211
+ readonly retryable: false;
212
+ readonly thrownBy: "service";
213
+ readonly recovery: "Simplify the query (quote phrases, escape : and / with a backslash, or move identifiers into the dedicated filters) and call zenodo_search_records again; if a plain keyword query also fails, Zenodo is degraded, so retry in a few minutes.";
214
+ }, {
215
+ readonly reason: "upstream_timeout";
216
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout;
217
+ readonly when: "The search attempt got no complete response within its time budget";
218
+ readonly retryable: false;
219
+ readonly thrownBy: "service";
220
+ readonly recovery: "Call zenodo_search_records again with a smaller size (5) or narrower filters so the page holds fewer large deposits.";
221
+ }, {
222
+ readonly reason: "unknown_community";
223
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
224
+ readonly when: "community resolves to no Zenodo community";
225
+ readonly recovery: "Find the community’s slug with zenodo_lookup_vocabulary (vocabulary: communities), then pass it as community.";
226
+ }, {
227
+ readonly reason: "unknown_funder";
228
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
229
+ readonly when: "funder is not a known ROR id and no funder carries that Crossref Funder DOI";
230
+ readonly recovery: "Resolve the funder with zenodo_lookup_vocabulary (vocabulary: funders) and pass the returned ROR id as funder.";
231
+ }, {
232
+ readonly reason: "invalid_date_range";
233
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
234
+ readonly when: "The expanded published_from is after published_to";
235
+ readonly recovery: "Set published_from to a date on or before published_to and call zenodo_search_records again.";
236
+ }, {
237
+ readonly reason: "result_window_exceeded";
238
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
239
+ readonly when: "page × size exceeds 10,000";
240
+ readonly recovery: "Zenodo serves only the first 10,000 matches; add filters or a published_from/published_to range to zenodo_search_records instead of paging deeper.";
241
+ }, {
242
+ readonly reason: "rate_limited";
243
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
244
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
245
+ readonly retryable: true;
246
+ readonly thrownBy: "service";
247
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_search_records again with the same arguments.";
248
+ }], {
249
+ readonly truncated: import("zod").ZodBoolean;
250
+ readonly shown: import("zod").ZodNumber;
251
+ readonly cap: import("zod").ZodNumber;
252
+ readonly totalCount: import("zod").ZodNumber;
253
+ readonly effectiveQuery: import("zod").ZodOptional<import("zod").ZodString>;
254
+ readonly appliedSort: import("zod").ZodEnum<{
255
+ bestmatch: "bestmatch";
256
+ mostdownloaded: "mostdownloaded";
257
+ mostviewed: "mostviewed";
258
+ newest: "newest";
259
+ oldest: "oldest";
260
+ "updated-asc": "updated-asc";
261
+ "updated-desc": "updated-desc";
262
+ }>;
263
+ readonly allVersions: import("zod").ZodBoolean;
264
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
265
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
266
+ id: import("zod").ZodString;
267
+ citation_style: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodEnum<{
268
+ apa: "apa";
269
+ bibtex: "bibtex";
270
+ "chicago-author-date": "chicago-author-date";
271
+ "csl-json": "csl-json";
272
+ "harvard-cite-them-right": "harvard-cite-them-right";
273
+ ieee: "ieee";
274
+ "modern-language-association": "modern-language-association";
275
+ nature: "nature";
276
+ }>>, unknown>;
277
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
278
+ found: import("zod").ZodBoolean;
279
+ input_kind: import("zod").ZodEnum<{
280
+ external_doi: "external_doi";
281
+ record_id: "record_id";
282
+ url: "url";
283
+ zenodo_doi: "zenodo_doi";
284
+ }>;
285
+ resolved_from: import("zod").ZodOptional<import("zod").ZodEnum<{
286
+ concept_to_latest: "concept_to_latest";
287
+ external_doi: "external_doi";
288
+ version: "version";
289
+ }>>;
290
+ miss_kind: import("zod").ZodOptional<import("zod").ZodEnum<{
291
+ deleted: "deleted";
292
+ not_found: "not_found";
293
+ not_on_zenodo: "not_on_zenodo";
294
+ restricted: "restricted";
295
+ }>>;
296
+ guidance: import("zod").ZodOptional<import("zod").ZodString>;
297
+ tombstone: import("zod").ZodOptional<import("zod").ZodObject<{
298
+ removal_date: import("zod").ZodOptional<import("zod").ZodString>;
299
+ removal_reason: import("zod").ZodOptional<import("zod").ZodString>;
300
+ note: import("zod").ZodOptional<import("zod").ZodString>;
301
+ citation_text: import("zod").ZodOptional<import("zod").ZodString>;
302
+ }, import("zod/v4/core").$strip>>;
303
+ record: import("zod").ZodOptional<import("zod").ZodObject<{
304
+ recid: import("zod").ZodString;
305
+ concept_recid: import("zod").ZodOptional<import("zod").ZodString>;
306
+ doi: import("zod").ZodOptional<import("zod").ZodString>;
307
+ doi_provider: import("zod").ZodOptional<import("zod").ZodString>;
308
+ concept_doi: import("zod").ZodOptional<import("zod").ZodString>;
309
+ oai_id: import("zod").ZodOptional<import("zod").ZodString>;
310
+ title: import("zod").ZodString;
311
+ publication_date: import("zod").ZodOptional<import("zod").ZodString>;
312
+ version: import("zod").ZodOptional<import("zod").ZodString>;
313
+ publisher: import("zod").ZodOptional<import("zod").ZodString>;
314
+ resource_type: import("zod").ZodOptional<import("zod").ZodObject<{
315
+ id: import("zod").ZodString;
316
+ title: import("zod").ZodOptional<import("zod").ZodString>;
317
+ }, import("zod/v4/core").$strip>>;
318
+ description: import("zod").ZodOptional<import("zod").ZodString>;
319
+ description_truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
320
+ description_length: import("zod").ZodOptional<import("zod").ZodNumber>;
321
+ additional_descriptions: import("zod").ZodArray<import("zod").ZodObject<{
322
+ type: import("zod").ZodOptional<import("zod").ZodString>;
323
+ text: import("zod").ZodString;
324
+ }, import("zod/v4/core").$strip>>;
325
+ creators: import("zod").ZodArray<import("zod").ZodObject<{
326
+ name: import("zod").ZodString;
327
+ type: import("zod").ZodOptional<import("zod").ZodString>;
328
+ orcid: import("zod").ZodOptional<import("zod").ZodString>;
329
+ role: import("zod").ZodOptional<import("zod").ZodString>;
330
+ affiliations: import("zod").ZodArray<import("zod").ZodObject<{
331
+ name: import("zod").ZodOptional<import("zod").ZodString>;
332
+ ror: import("zod").ZodOptional<import("zod").ZodString>;
333
+ }, import("zod/v4/core").$strip>>;
334
+ }, import("zod/v4/core").$strip>>;
335
+ creator_count: import("zod").ZodNumber;
336
+ contributors: import("zod").ZodArray<import("zod").ZodObject<{
337
+ name: import("zod").ZodString;
338
+ type: import("zod").ZodOptional<import("zod").ZodString>;
339
+ orcid: import("zod").ZodOptional<import("zod").ZodString>;
340
+ role: import("zod").ZodOptional<import("zod").ZodString>;
341
+ affiliations: import("zod").ZodArray<import("zod").ZodObject<{
342
+ name: import("zod").ZodOptional<import("zod").ZodString>;
343
+ ror: import("zod").ZodOptional<import("zod").ZodString>;
344
+ }, import("zod/v4/core").$strip>>;
345
+ }, import("zod/v4/core").$strip>>;
346
+ contributor_count: import("zod").ZodNumber;
347
+ keywords: import("zod").ZodArray<import("zod").ZodString>;
348
+ rights: import("zod").ZodArray<import("zod").ZodObject<{
349
+ id: import("zod").ZodOptional<import("zod").ZodString>;
350
+ title: import("zod").ZodString;
351
+ url: import("zod").ZodOptional<import("zod").ZodString>;
352
+ }, import("zod/v4/core").$strip>>;
353
+ access: import("zod").ZodObject<{
354
+ status: import("zod").ZodString;
355
+ record: import("zod").ZodOptional<import("zod").ZodString>;
356
+ files: import("zod").ZodOptional<import("zod").ZodString>;
357
+ embargo_active: import("zod").ZodBoolean;
358
+ embargo_until: import("zod").ZodOptional<import("zod").ZodString>;
359
+ embargo_reason: import("zod").ZodOptional<import("zod").ZodString>;
360
+ }, import("zod/v4/core").$strip>;
361
+ funding: import("zod").ZodArray<import("zod").ZodObject<{
362
+ funder_id: import("zod").ZodOptional<import("zod").ZodString>;
363
+ funder_name: import("zod").ZodOptional<import("zod").ZodString>;
364
+ award_id: import("zod").ZodOptional<import("zod").ZodString>;
365
+ award_number: import("zod").ZodOptional<import("zod").ZodString>;
366
+ award_acronym: import("zod").ZodOptional<import("zod").ZodString>;
367
+ award_title: import("zod").ZodOptional<import("zod").ZodString>;
368
+ award_program: import("zod").ZodOptional<import("zod").ZodString>;
369
+ award_doi: import("zod").ZodOptional<import("zod").ZodString>;
370
+ award_url: import("zod").ZodOptional<import("zod").ZodString>;
371
+ }, import("zod/v4/core").$strip>>;
372
+ related_identifiers: import("zod").ZodArray<import("zod").ZodObject<{
373
+ identifier: import("zod").ZodString;
374
+ scheme: import("zod").ZodOptional<import("zod").ZodString>;
375
+ relation: import("zod").ZodOptional<import("zod").ZodString>;
376
+ resource_type: import("zod").ZodOptional<import("zod").ZodString>;
377
+ }, import("zod/v4/core").$strip>>;
378
+ related_identifier_count: import("zod").ZodNumber;
379
+ code_repository: import("zod").ZodOptional<import("zod").ZodString>;
380
+ communities: import("zod").ZodArray<import("zod").ZodObject<{
381
+ slug: import("zod").ZodString;
382
+ title: import("zod").ZodOptional<import("zod").ZodString>;
383
+ }, import("zod/v4/core").$strip>>;
384
+ versions: import("zod").ZodObject<{
385
+ index: import("zod").ZodOptional<import("zod").ZodNumber>;
386
+ is_latest: import("zod").ZodOptional<import("zod").ZodBoolean>;
387
+ latest_recid: import("zod").ZodOptional<import("zod").ZodString>;
388
+ }, import("zod/v4/core").$strip>;
389
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
390
+ this_version: import("zod").ZodObject<{
391
+ views: import("zod").ZodOptional<import("zod").ZodNumber>;
392
+ downloads: import("zod").ZodOptional<import("zod").ZodNumber>;
393
+ }, import("zod/v4/core").$strip>;
394
+ all_versions: import("zod").ZodObject<{
395
+ views: import("zod").ZodOptional<import("zod").ZodNumber>;
396
+ downloads: import("zod").ZodOptional<import("zod").ZodNumber>;
397
+ }, import("zod/v4/core").$strip>;
398
+ }, import("zod/v4/core").$strip>>;
399
+ files: import("zod").ZodObject<{
400
+ enabled: import("zod").ZodBoolean;
401
+ count: import("zod").ZodOptional<import("zod").ZodNumber>;
402
+ total_bytes: import("zod").ZodOptional<import("zod").ZodNumber>;
403
+ shown: import("zod").ZodNumber;
404
+ entries: import("zod").ZodArray<import("zod").ZodObject<{
405
+ key: import("zod").ZodString;
406
+ size: import("zod").ZodOptional<import("zod").ZodNumber>;
407
+ mimetype: import("zod").ZodOptional<import("zod").ZodString>;
408
+ md5: import("zod").ZodOptional<import("zod").ZodString>;
409
+ download_url: import("zod").ZodString;
410
+ }, import("zod/v4/core").$strip>>;
411
+ }, import("zod/v4/core").$strip>;
412
+ revision: import("zod").ZodOptional<import("zod").ZodNumber>;
413
+ zenodo_url: import("zod").ZodString;
414
+ }, import("zod/v4/core").$strip>>;
415
+ citation: import("zod").ZodOptional<import("zod").ZodString>;
416
+ citation_style: import("zod").ZodOptional<import("zod").ZodString>;
417
+ }, import("zod/v4/core").$strip>, readonly [{
418
+ readonly reason: "invalid_identifier";
419
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
420
+ readonly when: "id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host";
421
+ readonly recovery: "Pass a Zenodo record id (22705923), a DOI (10.5281/zenodo.22705923), or a zenodo.org/records URL as id; for a title or keyword, use zenodo_search_records.";
422
+ }, {
423
+ readonly reason: "record_unavailable";
424
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
425
+ readonly when: "Zenodo could not serve this record: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit)";
426
+ readonly thrownBy: "service";
427
+ readonly recovery: "Look the record up with zenodo_search_records using query doi:\"<its DOI>\" (all_versions true) or its title; withdrawn legacy records and deposits with more than about 10,000 files fail on the record endpoint, and if a keyword search also fails, Zenodo is degraded.";
428
+ }, {
429
+ readonly reason: "rate_limited";
430
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
431
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
432
+ readonly retryable: true;
433
+ readonly thrownBy: "service";
434
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_get_record again with the same arguments.";
435
+ }], {
436
+ readonly truncated: import("zod").ZodBoolean;
437
+ readonly shown: import("zod").ZodNumber;
438
+ readonly cap: import("zod").ZodNumber;
439
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
440
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
441
+ id: import("zod").ZodString;
442
+ archive_key: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
443
+ key_contains: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
444
+ offset: import("zod").ZodDefault<import("zod").ZodNumber>;
445
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
446
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
447
+ recid: import("zod").ZodString;
448
+ kind: import("zod").ZodEnum<{
449
+ archive: "archive";
450
+ manifest: "manifest";
451
+ }>;
452
+ access_status: import("zod").ZodString;
453
+ files_access: import("zod").ZodOptional<import("zod").ZodString>;
454
+ embargo_until: import("zod").ZodOptional<import("zod").ZodString>;
455
+ files_enabled: import("zod").ZodBoolean;
456
+ key_contains: import("zod").ZodOptional<import("zod").ZodString>;
457
+ offset: import("zod").ZodNumber;
458
+ limit: import("zod").ZodNumber;
459
+ matched: import("zod").ZodNumber;
460
+ has_more: import("zod").ZodBoolean;
461
+ next_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
462
+ file_count: import("zod").ZodOptional<import("zod").ZodNumber>;
463
+ total_bytes: import("zod").ZodOptional<import("zod").ZodNumber>;
464
+ entries: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
465
+ key: import("zod").ZodString;
466
+ size: import("zod").ZodOptional<import("zod").ZodNumber>;
467
+ mimetype: import("zod").ZodOptional<import("zod").ZodString>;
468
+ md5: import("zod").ZodOptional<import("zod").ZodString>;
469
+ download_url: import("zod").ZodString;
470
+ previewable: import("zod").ZodBoolean;
471
+ listable: import("zod").ZodBoolean;
472
+ }, import("zod/v4/core").$strip>>>;
473
+ archive: import("zod").ZodOptional<import("zod").ZodObject<{
474
+ key: import("zod").ZodString;
475
+ size: import("zod").ZodOptional<import("zod").ZodNumber>;
476
+ download_url: import("zod").ZodString;
477
+ listed_members: import("zod").ZodNumber;
478
+ upstream_truncated: import("zod").ZodBoolean;
479
+ directory_count: import("zod").ZodNumber;
480
+ }, import("zod/v4/core").$strip>>;
481
+ members: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
482
+ path: import("zod").ZodString;
483
+ size: import("zod").ZodOptional<import("zod").ZodNumber>;
484
+ compressed_size: import("zod").ZodOptional<import("zod").ZodNumber>;
485
+ mimetype: import("zod").ZodOptional<import("zod").ZodString>;
486
+ previewable: import("zod").ZodBoolean;
487
+ }, import("zod/v4/core").$strip>>>;
488
+ }, import("zod/v4/core").$strip>, readonly [{
489
+ readonly reason: "invalid_identifier";
490
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
491
+ readonly when: "id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host";
492
+ readonly recovery: "Pass a Zenodo record id (22705923), a DOI (10.5281/zenodo.22705923), or a zenodo.org/records URL as id; for a title or keyword, use zenodo_search_records.";
493
+ }, {
494
+ readonly reason: "record_not_found";
495
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
496
+ readonly when: "The record 404s, its metadata is restricted, or a non-Zenodo DOI is not registered to a record";
497
+ readonly recovery: "Check the id with zenodo_get_record, or find the deposit with zenodo_search_records.";
498
+ }, {
499
+ readonly reason: "record_deleted";
500
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
501
+ readonly when: "The record was deleted from Zenodo; only its removal tombstone remains";
502
+ readonly recovery: "Call zenodo_get_record with this id for the removal date and reason, then find a replacement deposit with zenodo_search_records.";
503
+ }, {
504
+ readonly reason: "file_not_found";
505
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
506
+ readonly when: "archive_key is not a key in the record, or Zenodo has no member listing for it";
507
+ readonly recovery: "Call zenodo_list_files without archive_key to see this record’s file keys.";
508
+ }, {
509
+ readonly reason: "not_an_archive";
510
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
511
+ readonly when: "archive_key is not a .zip";
512
+ readonly recovery: "Only .zip files can be listed; read a small text file with zenodo_read_file or fetch this file from its download_url.";
513
+ }, {
514
+ readonly reason: "archive_unavailable";
515
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
516
+ readonly when: "Zenodo cannot open the .zip named by archive_key: its member listing answered HTTP 500 after one retry, or no complete response arrived in time";
517
+ readonly thrownBy: "service";
518
+ readonly recovery: "Zenodo cannot list every .zip; download the archive from the URL in the error message (its download_url in the manifest) and list it locally, or read the record’s other files with zenodo_read_file.";
519
+ }, {
520
+ readonly reason: "record_unavailable";
521
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
522
+ readonly when: "Zenodo could not serve this record: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit)";
523
+ readonly thrownBy: "service";
524
+ readonly recovery: "Read the deposit’s metadata from zenodo_search_records with query doi:\"<its DOI>\" (all_versions true); withdrawn legacy records and deposits with more than about 10,000 files fail on the record endpoint, so their file manifest cannot be listed, and if a keyword search also fails, Zenodo is degraded.";
525
+ }, {
526
+ readonly reason: "rate_limited";
527
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
528
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
529
+ readonly retryable: true;
530
+ readonly thrownBy: "service";
531
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_list_files again with the same arguments.";
532
+ }], {
533
+ readonly truncated: import("zod").ZodBoolean;
534
+ readonly shown: import("zod").ZodNumber;
535
+ readonly cap: import("zod").ZodNumber;
536
+ readonly totalCount: import("zod").ZodNumber;
537
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
538
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
539
+ id: import("zod").ZodString;
540
+ key: import("zod").ZodString;
541
+ archive_member: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
542
+ offset_bytes: import("zod").ZodDefault<import("zod").ZodNumber>;
543
+ max_bytes: import("zod").ZodDefault<import("zod").ZodNumber>;
544
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
545
+ recid: import("zod").ZodString;
546
+ key: import("zod").ZodString;
547
+ archive_member: import("zod").ZodOptional<import("zod").ZodString>;
548
+ status: import("zod").ZodEnum<{
549
+ empty: "empty";
550
+ not_text: "not_text";
551
+ restricted: "restricted";
552
+ text: "text";
553
+ }>;
554
+ mimetype: import("zod").ZodOptional<import("zod").ZodString>;
555
+ file_size: import("zod").ZodOptional<import("zod").ZodNumber>;
556
+ md5: import("zod").ZodOptional<import("zod").ZodString>;
557
+ text: import("zod").ZodOptional<import("zod").ZodString>;
558
+ offset_bytes: import("zod").ZodNumber;
559
+ bytes_returned: import("zod").ZodNumber;
560
+ next_offset: import("zod").ZodOptional<import("zod").ZodNumber>;
561
+ has_more: import("zod").ZodBoolean;
562
+ replacement_chars: import("zod").ZodNumber;
563
+ rights: import("zod").ZodArray<import("zod").ZodObject<{
564
+ id: import("zod").ZodOptional<import("zod").ZodString>;
565
+ title: import("zod").ZodString;
566
+ }, import("zod/v4/core").$strip>>;
567
+ record_url: import("zod").ZodString;
568
+ download_url: import("zod").ZodString;
569
+ files_access: import("zod").ZodOptional<import("zod").ZodString>;
570
+ }, import("zod/v4/core").$strip>, readonly [{
571
+ readonly reason: "invalid_identifier";
572
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
573
+ readonly when: "id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host";
574
+ readonly recovery: "Pass a Zenodo record id (22705923), a DOI (10.5281/zenodo.22705923), or a zenodo.org/records URL as id; for a title or keyword, use zenodo_search_records.";
575
+ }, {
576
+ readonly reason: "record_not_found";
577
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
578
+ readonly when: "The record 404s, its metadata is restricted, or a non-Zenodo DOI is not registered to a record";
579
+ readonly recovery: "Check the id with zenodo_get_record, or find the deposit with zenodo_search_records.";
580
+ }, {
581
+ readonly reason: "record_deleted";
582
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
583
+ readonly when: "The record was deleted from Zenodo; only its removal tombstone remains";
584
+ readonly recovery: "Call zenodo_get_record with this id for the removal date and reason, then find a replacement deposit with zenodo_search_records.";
585
+ }, {
586
+ readonly reason: "file_not_found";
587
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
588
+ readonly when: "key is not in the record's manifest, or Zenodo serves no content for it";
589
+ readonly recovery: "Call zenodo_list_files with this id to see the record’s exact file keys.";
590
+ }, {
591
+ readonly reason: "not_an_archive";
592
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
593
+ readonly when: "archive_member is set but key is not a .zip";
594
+ readonly recovery: "Drop archive_member to read the file itself, or pick a .zip key from zenodo_list_files.";
595
+ }, {
596
+ readonly reason: "member_not_found";
597
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
598
+ readonly when: "Zenodo has no member at archive_member inside the .zip";
599
+ readonly recovery: "Call zenodo_list_files with archive_key set to this key to see the member paths.";
600
+ }, {
601
+ readonly reason: "member_offset_unsupported";
602
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
603
+ readonly when: "offset_bytes is above 0 together with archive_member";
604
+ readonly recovery: "Read the member from offset_bytes 0 with a larger max_bytes (up to 65536), or download the archive from download_url.";
605
+ }, {
606
+ readonly reason: "offset_out_of_range";
607
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
608
+ readonly when: "offset_bytes is at or past the end of the file";
609
+ readonly recovery: "Call zenodo_read_file again with an offset_bytes below the file’s size (size in zenodo_list_files, file_size in a prior zenodo_read_file result).";
610
+ }, {
611
+ readonly reason: "archive_unavailable";
612
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
613
+ readonly when: "Zenodo cannot open the .zip named by key: its member listing or the member read answered HTTP 500 after one retry, or no complete response arrived in time";
614
+ readonly thrownBy: "service";
615
+ readonly recovery: "Zenodo cannot open every .zip; download the archive from the URL in the error message and extract the member locally, or read the record’s top-level files with zenodo_read_file.";
616
+ }, {
617
+ readonly reason: "record_unavailable";
618
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
619
+ readonly when: "Zenodo could not serve this record: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit)";
620
+ readonly thrownBy: "service";
621
+ readonly recovery: "Read the deposit’s metadata from zenodo_search_records with query doi:\"<its DOI>\" (all_versions true); withdrawn legacy records and deposits with more than about 10,000 files fail on the record endpoint, so their files cannot be read, and if a keyword search also fails, Zenodo is degraded.";
622
+ }, {
623
+ readonly reason: "rate_limited";
624
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
625
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
626
+ readonly retryable: true;
627
+ readonly thrownBy: "service";
628
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_read_file again with the same arguments.";
629
+ }], {
630
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
631
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
632
+ vocabulary: import("zod").ZodPreprocess<import("zod").ZodEnum<{
633
+ awards: "awards";
634
+ communities: "communities";
635
+ funders: "funders";
636
+ licenses: "licenses";
637
+ resource_types: "resource_types";
638
+ }>, unknown>;
639
+ query: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
640
+ funder: import("zod").ZodPreprocess<import("zod").ZodOptional<import("zod").ZodString>, unknown>;
641
+ page: import("zod").ZodDefault<import("zod").ZodNumber>;
642
+ size: import("zod").ZodDefault<import("zod").ZodNumber>;
643
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
644
+ vocabulary: import("zod").ZodEnum<{
645
+ awards: "awards";
646
+ communities: "communities";
647
+ funders: "funders";
648
+ licenses: "licenses";
649
+ resource_types: "resource_types";
650
+ }>;
651
+ query: import("zod").ZodOptional<import("zod").ZodString>;
652
+ total: import("zod").ZodNumber;
653
+ page: import("zod").ZodNumber;
654
+ size: import("zod").ZodNumber;
655
+ has_more: import("zod").ZodBoolean;
656
+ next_page: import("zod").ZodOptional<import("zod").ZodNumber>;
657
+ entries: import("zod").ZodArray<import("zod").ZodObject<{
658
+ filter_param: import("zod").ZodEnum<{
659
+ award: "award";
660
+ community: "community";
661
+ funder: "funder";
662
+ license: "license";
663
+ resource_type: "resource_type";
664
+ }>;
665
+ filter_value: import("zod").ZodString;
666
+ label: import("zod").ZodString;
667
+ slug: import("zod").ZodOptional<import("zod").ZodString>;
668
+ uuid: import("zod").ZodOptional<import("zod").ZodString>;
669
+ community_type: import("zod").ZodOptional<import("zod").ZodString>;
670
+ website: import("zod").ZodOptional<import("zod").ZodString>;
671
+ organizations: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
672
+ ror_id: import("zod").ZodOptional<import("zod").ZodString>;
673
+ funder_doi: import("zod").ZodOptional<import("zod").ZodString>;
674
+ acronym: import("zod").ZodOptional<import("zod").ZodString>;
675
+ country: import("zod").ZodOptional<import("zod").ZodString>;
676
+ country_name: import("zod").ZodOptional<import("zod").ZodString>;
677
+ number: import("zod").ZodOptional<import("zod").ZodString>;
678
+ title: import("zod").ZodOptional<import("zod").ZodString>;
679
+ program: import("zod").ZodOptional<import("zod").ZodString>;
680
+ funder_id: import("zod").ZodOptional<import("zod").ZodString>;
681
+ funder_name: import("zod").ZodOptional<import("zod").ZodString>;
682
+ award_doi: import("zod").ZodOptional<import("zod").ZodString>;
683
+ award_url: import("zod").ZodOptional<import("zod").ZodString>;
684
+ start_date: import("zod").ZodOptional<import("zod").ZodString>;
685
+ end_date: import("zod").ZodOptional<import("zod").ZodString>;
686
+ url: import("zod").ZodOptional<import("zod").ZodString>;
687
+ osi_approved: import("zod").ZodOptional<import("zod").ZodBoolean>;
688
+ tags: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
689
+ parent_type: import("zod").ZodOptional<import("zod").ZodString>;
690
+ search_value: import("zod").ZodOptional<import("zod").ZodString>;
691
+ }, import("zod/v4/core").$strip>>;
692
+ }, import("zod/v4/core").$strip>, readonly [{
693
+ readonly reason: "funder_only_for_awards";
694
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
695
+ readonly when: "funder is set with a vocabulary other than awards";
696
+ readonly recovery: "Call zenodo_lookup_vocabulary again without funder, or set vocabulary to awards to scope grants by funder.";
697
+ }, {
698
+ readonly reason: "unknown_funder";
699
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
700
+ readonly when: "funder (awards) resolves to no Zenodo funder";
701
+ readonly recovery: "Resolve the funder first with zenodo_lookup_vocabulary (vocabulary: funders) and pass its ROR id as funder.";
702
+ }, {
703
+ readonly reason: "result_window_exceeded";
704
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
705
+ readonly when: "page × size exceeds 10,000";
706
+ readonly recovery: "Narrow the query and call zenodo_lookup_vocabulary again instead of paging past 10,000 entries.";
707
+ }, {
708
+ readonly reason: "rate_limited";
709
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
710
+ readonly when: "Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window";
711
+ readonly retryable: true;
712
+ readonly thrownBy: "service";
713
+ readonly recovery: "Wait for the retryAfter seconds in the error data, then call zenodo_lookup_vocabulary again with the same arguments.";
714
+ }], {
715
+ readonly truncated: import("zod").ZodBoolean;
716
+ readonly shown: import("zod").ZodNumber;
717
+ readonly cap: import("zod").ZodNumber;
718
+ readonly totalCount: import("zod").ZodNumber;
719
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
720
+ }>)[];
721
+ //# sourceMappingURL=index.d.ts.map