/** * @fileoverview Barrel export for all crossref-mcp-server tool definitions. * @module mcp-server/tools/definitions/index */ export { getMemberTool } from './get-member.tool.js'; export { getPrefixTool } from './get-prefix.tool.js'; export { getReferencesTool } from './get-references.tool.js'; export { getWorkTool } from './get-work.tool.js'; export { searchFundersTool } from './search-funders.tool.js'; export { searchJournalsTool } from './search-journals.tool.js'; export { searchWorksTool } from './search-works.tool.js'; export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-core").ToolDefinition; limit: import("zod").ZodDefault; }, import("zod/v4/core").$strip>, import("zod").ZodObject<{ volume: import("zod").ZodOptional; issue: import("zod").ZodOptional; page: import("zod").ZodOptional; articleNumber: import("zod").ZodOptional; updatedBy: import("zod").ZodOptional; updated: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>>>; updateTo: import("zod").ZodOptional; updated: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>>>; doi: import("zod").ZodString; title: import("zod").ZodOptional; subtitle: import("zod").ZodOptional; type: import("zod").ZodOptional; authors: import("zod").ZodOptional; family: import("zod").ZodOptional; name: import("zod").ZodOptional; orcid: import("zod").ZodOptional; affiliation: import("zod").ZodOptional; ror: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; sequence: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; authorCount: import("zod").ZodOptional; offset: import("zod").ZodOptional; editors: import("zod").ZodOptional; family: import("zod").ZodOptional; name: import("zod").ZodOptional; orcid: import("zod").ZodOptional; affiliation: import("zod").ZodOptional; ror: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; sequence: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; relations: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; abstract: import("zod").ZodOptional; isReferencedByCount: import("zod").ZodOptional; referencesCount: import("zod").ZodOptional; containerTitle: import("zod").ZodOptional; issn: import("zod").ZodOptional>; isbn: import("zod").ZodOptional>; publisher: import("zod").ZodOptional; published: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; funders: import("zod").ZodOptional; doi: import("zod").ZodOptional; ror: import("zod").ZodOptional; award: import("zod").ZodOptional>; }, import("zod/v4/core").$strip>>>; licenses: import("zod").ZodOptional; delayInDays: import("zod").ZodOptional; start: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; links: import("zod").ZodOptional; contentVersion: import("zod").ZodOptional; intendedApplication: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; url: import("zod").ZodOptional; subject: import("zod").ZodOptional>; language: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: "doi_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "Valid DOI format but no Crossref record exists."; readonly recovery: "Verify the DOI is correct or use crossref_search_works to find similar works by title or author."; }], { readonly nextOffset: import("zod").ZodOptional; readonly truncated: import("zod").ZodOptional; readonly shown: import("zod").ZodOptional; readonly cap: import("zod").ZodOptional; readonly notice: import("zod").ZodOptional; }>, import("@cyanheads/mcp-ts-core").ToolDefinition; limit: import("zod").ZodDefault; }, import("zod/v4/core").$strip>, import("zod").ZodObject<{ doi: import("zod").ZodString; referenceCount: import("zod").ZodNumber; offset: import("zod").ZodNumber; references: import("zod").ZodArray; doi: import("zod").ZodOptional; unstructured: import("zod").ZodOptional; author: import("zod").ZodOptional; year: import("zod").ZodOptional; journalTitle: import("zod").ZodOptional; articleTitle: import("zod").ZodOptional; volumeTitle: import("zod").ZodOptional; seriesTitle: import("zod").ZodOptional; volume: import("zod").ZodOptional; issue: import("zod").ZodOptional; firstPage: import("zod").ZodOptional; edition: import("zod").ZodOptional; issn: import("zod").ZodOptional; doiAssertedBy: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: "doi_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "Valid DOI format but no Crossref record exists."; readonly recovery: "Verify the DOI is correct or use crossref_search_works to find the work by title or author."; }], { readonly nextOffset: import("zod").ZodOptional; readonly truncated: import("zod").ZodOptional; readonly shown: import("zod").ZodOptional; readonly cap: import("zod").ZodOptional; readonly notice: import("zod").ZodOptional; }>, import("@cyanheads/mcp-ts-core").ToolDefinition; queryBibliographic: import("zod").ZodOptional; queryTitle: import("zod").ZodOptional; queryAuthor: import("zod").ZodOptional; queryContainerTitle: import("zod").ZodOptional; filter: import("zod").ZodOptional>; fields: import("zod").ZodOptional>>; rows: import("zod").ZodDefault; authorLimit: import("zod").ZodDefault; offset: import("zod").ZodOptional; cursor: import("zod").ZodOptional; sort: import("zod").ZodOptional, import("zod").ZodEnum<{ created: "created"; deposited: "deposited"; indexed: "indexed"; "is-referenced-by-count": "is-referenced-by-count"; published: "published"; "published-online": "published-online"; "published-print": "published-print"; "references-count": "references-count"; relevance: "relevance"; score: "score"; updated: "updated"; }>]>>; order: import("zod").ZodOptional, import("zod").ZodEnum<{ asc: "asc"; desc: "desc"; }>]>>; }, import("zod/v4/core").$strip>, import("zod").ZodObject<{ works: import("zod").ZodArray; issue: import("zod").ZodOptional; page: import("zod").ZodOptional; articleNumber: import("zod").ZodOptional; updatedBy: import("zod").ZodOptional; updated: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>>>; updateTo: import("zod").ZodOptional; updated: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>>>; doi: import("zod").ZodString; title: import("zod").ZodOptional; type: import("zod").ZodOptional; authors: import("zod").ZodOptional; family: import("zod").ZodOptional; name: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; authorCount: import("zod").ZodOptional; published: import("zod").ZodOptional; month: import("zod").ZodOptional; day: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; containerTitle: import("zod").ZodOptional; issn: import("zod").ZodOptional>; publisher: import("zod").ZodOptional; isReferencedByCount: import("zod").ZodOptional; score: import("zod").ZodOptional; abstract: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; nextCursor: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: 'unknown_filter'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref rejected a filter key it does not recognize (filter-not-available).'; readonly recovery: "Use Crossref's hyphenated filter keys — has-abstract, from-pub-date, has-full-text, has-references — taking the key the error message suggests when it names one. Crossref has no open-access flag; for openly licensed content filter on license.url with a Creative Commons license URL, e.g. http://creativecommons.org/licenses/by/4.0/."; }, { readonly reason: 'sort_cursor_conflict'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'A publication-date sort (published, published-print, published-online) was combined with cursor paging, which Crossref refuses.'; readonly recovery: 'Drop sort, or switch to one Crossref walks by cursor — created, deposited, indexed, updated, score, is-referenced-by-count, or references-count — or page with offset instead of cursor to keep the publication-date sort.'; }, { readonly reason: 'invalid_cursor'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref did not recognize the cursor token (HTTP 404 cursor-invalid).'; readonly recovery: 'Restart the walk by passing "*" as cursor (works_cursor on the journal and funder works lists), then chain only the continuation token each response returns (nextCursor, or nextWorksCursor on those lists), passed back unmodified.'; }, { readonly reason: 'invalid_parameter'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse.'; readonly recovery: 'Correct the value the error message names to the form it states — a type from the listed values, true or false for a has- flag, a yyyy-mm-dd date — then reissue the call.'; }, { readonly reason: "cursor_offset_conflict"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "Both cursor and offset were supplied in the same request."; readonly recovery: "Use cursor or offset, not both. Pass cursor=\"*\" to start cursor-based paging; use offset only for the first ~10K results."; }, { readonly reason: "offset_too_large"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "The requested offset exceeds the ~10K Crossref limit for offset-based paging."; readonly recovery: "Switch to cursor-based paging by passing cursor=\"*\" on the first request, then chaining the nextCursor token from each response."; }], { readonly totalResults: import("zod").ZodNumber; readonly returned: import("zod").ZodNumber; readonly truncated: import("zod").ZodOptional; readonly cap: import("zod").ZodOptional; readonly notice: import("zod").ZodOptional; }>, import("@cyanheads/mcp-ts-core").ToolDefinition; issn: import("zod").ZodOptional, import("zod").ZodString]>>; include_works: import("zod").ZodDefault; rows: import("zod").ZodDefault; offset: import("zod").ZodDefault; works_offset: import("zod").ZodDefault; works_cursor: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, import("zod").ZodObject<{ journals: import("zod").ZodArray; issnL: import("zod").ZodOptional; issn: import("zod").ZodOptional>; issnTypes: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; publisher: import("zod").ZodOptional; subjects: import("zod").ZodOptional>>; totalDois: import("zod").ZodOptional; currentDois: import("zod").ZodOptional; backfileDois: import("zod").ZodOptional; coverage: import("zod").ZodOptional; backfile: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; doisByYear: import("zod").ZodOptional>>; }, import("zod/v4/core").$strip>>; recentWorks: import("zod").ZodOptional; type: import("zod").ZodOptional; published: import("zod").ZodOptional; month: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; isReferencedByCount: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: 'invalid_cursor'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref did not recognize the cursor token (HTTP 404 cursor-invalid).'; readonly recovery: 'Restart the walk by passing "*" as cursor (works_cursor on the journal and funder works lists), then chain only the continuation token each response returns (nextCursor, or nextWorksCursor on those lists), passed back unmodified.'; }, { readonly reason: 'invalid_parameter'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse.'; readonly recovery: 'Correct the value the error message names to the form it states — a type from the listed values, true or false for a has- flag, a yyyy-mm-dd date — then reissue the call.'; }, { readonly reason: "issn_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "ISSN lookup returned 404 — ISSN is not registered in Crossref."; readonly recovery: "Verify the ISSN format (xxxx-xxxx) and check that the journal is registered in Crossref, or use a title query instead."; }, { readonly reason: "ambiguous_journal"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "include_works is true but the title query matched more than one journal, making the target ambiguous."; readonly recovery: "Re-run with issn set to one of the ISSNs listed in the error message and in the candidates field of the error data, or narrow the query when the journal you want is not among them."; }, { readonly reason: "offset_too_large"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "offset + rows exceeds the 100000-record ceiling Crossref allows on journal title search."; readonly recovery: "Narrow the title query so the journals you want fall within the first 100000 matches."; }, { readonly reason: "works_offset_too_large"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "works_offset + rows exceeds the 10000-record ceiling Crossref allows on a journal works list."; readonly recovery: "Restart the works list with works_cursor=\"*\" and chain the nextWorksCursor token from each response — cursor paging has no offset ceiling and reaches the whole list."; }, { readonly reason: "works_cursor_offset_conflict"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "include_works is true and works_cursor was supplied alongside a works_offset above zero."; readonly recovery: "Page the works list one way or the other. Keep works_cursor and drop works_offset to walk the whole list, or drop works_cursor to stay on offset paging."; }], { readonly journalCount: import("zod").ZodNumber; readonly journalsTotal: import("zod").ZodNumber; readonly nextOffset: import("zod").ZodOptional; readonly worksTotal: import("zod").ZodOptional; readonly nextWorksOffset: import("zod").ZodOptional; readonly nextWorksCursor: import("zod").ZodOptional; readonly notice: import("zod").ZodOptional; }>, import("@cyanheads/mcp-ts-core").ToolDefinition; funder_doi: import("zod").ZodOptional, import("zod").ZodString]>>; include_works: import("zod").ZodDefault; rows: import("zod").ZodDefault; offset: import("zod").ZodDefault; works_offset: import("zod").ZodDefault; works_cursor: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, import("zod").ZodObject<{ funders: import("zod").ZodArray; name: import("zod").ZodOptional; altNames: import("zod").ZodOptional>; country: import("zod").ZodOptional; uri: import("zod").ZodOptional; worksCount: import("zod").ZodOptional; replacedBy: import("zod").ZodOptional>; replaces: import("zod").ZodOptional>; }, import("zod/v4/core").$strip>>; fundedWorks: import("zod").ZodOptional; type: import("zod").ZodOptional; published: import("zod").ZodOptional; month: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; isReferencedByCount: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: 'invalid_cursor'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref did not recognize the cursor token (HTTP 404 cursor-invalid).'; readonly recovery: 'Restart the walk by passing "*" as cursor (works_cursor on the journal and funder works lists), then chain only the continuation token each response returns (nextCursor, or nextWorksCursor on those lists), passed back unmodified.'; }, { readonly reason: 'invalid_parameter'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly thrownBy: 'service'; readonly when: 'Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse.'; readonly recovery: 'Correct the value the error message names to the form it states — a type from the listed values, true or false for a has- flag, a yyyy-mm-dd date — then reissue the call.'; }, { readonly reason: "funder_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "Funder DOI lookup returned 404 — funder is not in the Crossref Funder Registry."; readonly recovery: "Verify the registry ID (100000001) or full funder DOI (10.13039/100000001) is correct, or use a name query instead."; }, { readonly reason: "ambiguous_funder"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "include_works is true but the name query matched more than one funder, making the target ambiguous."; readonly recovery: "Re-run with funder_doi set to one of the registry IDs listed in the error message and in the candidates field of the error data, or narrow the query when the funder you want is not among them."; }, { readonly reason: "offset_too_large"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "offset + rows exceeds the 100000-record ceiling Crossref allows on funder name search."; readonly recovery: "Narrow the name query so the funders you want fall within the first 100000 matches."; }, { readonly reason: "works_offset_too_large"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "works_offset + rows exceeds the 10000-record ceiling Crossref allows on a funded-works list."; readonly recovery: "Restart the funded-works list with works_cursor=\"*\" and chain the nextWorksCursor token from each response — cursor paging has no offset ceiling and reaches the whole list."; }, { readonly reason: "works_cursor_offset_conflict"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError; readonly when: "include_works is true and works_cursor was supplied alongside a works_offset above zero."; readonly recovery: "Page the funded-works list one way or the other. Keep works_cursor and drop works_offset to walk the whole list, or drop works_cursor to stay on offset paging."; }], { readonly funderCount: import("zod").ZodNumber; readonly fundersTotal: import("zod").ZodNumber; readonly nextOffset: import("zod").ZodOptional; readonly fundedWorksTotal: import("zod").ZodOptional; readonly nextWorksOffset: import("zod").ZodOptional; readonly nextWorksCursor: import("zod").ZodOptional; readonly notice: import("zod").ZodOptional; }>, import("@cyanheads/mcp-ts-core").ToolDefinition, import("zod").ZodObject<{ id: import("zod").ZodNumber; primaryName: import("zod").ZodOptional; names: import("zod").ZodOptional>; location: import("zod").ZodOptional; prefixes: import("zod").ZodOptional>; counts: import("zod").ZodOptional; currentDois: import("zod").ZodOptional; backfileDois: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>; worksByType: import("zod").ZodOptional>>; coverage: import("zod").ZodOptional; backfile: import("zod").ZodOptional; }, import("zod/v4/core").$strip>>>; deposits: import("zod").ZodOptional; depositsArticles: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: "member_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "No Crossref member exists for the given ID."; readonly recovery: "Verify the member ID, or resolve a DOI prefix to its owning member ID with crossref_get_prefix first."; }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition, import("zod").ZodObject<{ prefix: import("zod").ZodString; ownerName: import("zod").ZodOptional; memberId: import("zod").ZodOptional; }, import("zod/v4/core").$strip>, readonly [{ readonly reason: 'rate_limited'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited; readonly thrownBy: 'service'; readonly when: 'Crossref answered HTTP 429 and the limit did not clear inside the retry budget.'; readonly recovery: 'Crossref named no wait interval, so back off at least a minute before reissuing the same call, and lower the request rate. Setting CROSSREF_MAILTO on the server moves requests into the polite pool, which has higher limits.'; }, { readonly reason: 'upstream_unavailable'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable; readonly thrownBy: 'service'; readonly when: 'Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON.'; readonly recovery: 'The request was accepted as well-formed and Crossref failed to serve it — retry the same call in a minute rather than rewriting the query, and check https://status.crossref.org if it keeps failing.'; }, { readonly reason: 'malformed_response'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.SerializationError; readonly thrownBy: 'service'; readonly retryable: false; readonly when: 'Crossref returned HTTP 200 with a body that is not valid JSON.'; readonly recovery: 'Do not repeat the call unchanged — the body is corrupt rather than transient. Request less of the record (fewer rows, a narrower select) so a smaller response is serialized, or report the query that reproduces it.'; }, { readonly reason: 'request_timeout'; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Timeout; readonly thrownBy: 'service'; readonly when: 'Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504.'; readonly recovery: 'Ask for less work per call — lower rows, drop select fields, or split a broad query — or raise CROSSREF_TIMEOUT_MS on the server, then retry.'; }, { readonly reason: "prefix_not_found"; readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound; readonly when: "The DOI prefix is not registered with Crossref."; readonly recovery: "Verify the prefix (the \"10.NNNN\" portion of a DOI), or use crossref_search_works to find the work and its publisher."; }], undefined>]; //# sourceMappingURL=index.d.ts.map