@digital-science-dsl/dimensions-analytics-mcp 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +152 -0
- package/bin/dimensions-analytics-mcp-http.js +2 -0
- package/bin/dimensions-analytics-mcp.js +2 -0
- package/dist/client/auth/config-loaders.d.ts +22 -0
- package/dist/client/auth/config-loaders.d.ts.map +1 -0
- package/dist/client/auth/config-loaders.js +68 -0
- package/dist/client/auth/config-loaders.js.map +1 -0
- package/dist/client/auth/decorators/index.d.ts +7 -0
- package/dist/client/auth/decorators/index.d.ts.map +1 -0
- package/dist/client/auth/decorators/index.js +6 -0
- package/dist/client/auth/decorators/index.js.map +1 -0
- package/dist/client/auth/decorators/with-caching.d.ts +81 -0
- package/dist/client/auth/decorators/with-caching.d.ts.map +1 -0
- package/dist/client/auth/decorators/with-caching.js +168 -0
- package/dist/client/auth/decorators/with-caching.js.map +1 -0
- package/dist/client/auth/factory.d.ts +13 -0
- package/dist/client/auth/factory.d.ts.map +1 -0
- package/dist/client/auth/factory.js +29 -0
- package/dist/client/auth/factory.js.map +1 -0
- package/dist/client/auth/index.d.ts +7 -0
- package/dist/client/auth/index.d.ts.map +1 -0
- package/dist/client/auth/index.js +6 -0
- package/dist/client/auth/index.js.map +1 -0
- package/dist/client/auth/jwt-utils.d.ts +17 -0
- package/dist/client/auth/jwt-utils.d.ts.map +1 -0
- package/dist/client/auth/jwt-utils.js +33 -0
- package/dist/client/auth/jwt-utils.js.map +1 -0
- package/dist/client/auth/node.d.ts +16 -0
- package/dist/client/auth/node.d.ts.map +1 -0
- package/dist/client/auth/node.js +15 -0
- package/dist/client/auth/node.js.map +1 -0
- package/dist/client/auth/providers/index.d.ts +2 -0
- package/dist/client/auth/providers/index.d.ts.map +1 -0
- package/dist/client/auth/providers/index.js +2 -0
- package/dist/client/auth/providers/index.js.map +1 -0
- package/dist/client/auth/providers/jwt-auth-provider.d.ts +70 -0
- package/dist/client/auth/providers/jwt-auth-provider.d.ts.map +1 -0
- package/dist/client/auth/providers/jwt-auth-provider.js +134 -0
- package/dist/client/auth/providers/jwt-auth-provider.js.map +1 -0
- package/dist/client/auth/schemas.d.ts +19 -0
- package/dist/client/auth/schemas.d.ts.map +1 -0
- package/dist/client/auth/schemas.js +23 -0
- package/dist/client/auth/schemas.js.map +1 -0
- package/dist/client/auth/types.d.ts +25 -0
- package/dist/client/auth/types.d.ts.map +1 -0
- package/dist/client/auth/types.js +9 -0
- package/dist/client/auth/types.js.map +1 -0
- package/dist/client/command.d.ts +44 -0
- package/dist/client/command.d.ts.map +1 -0
- package/dist/client/command.js +23 -0
- package/dist/client/command.js.map +1 -0
- package/dist/client/config/index.d.ts +11 -0
- package/dist/client/config/index.d.ts.map +1 -0
- package/dist/client/config/index.js +8 -0
- package/dist/client/config/index.js.map +1 -0
- package/dist/client/config/loader.d.ts +27 -0
- package/dist/client/config/loader.d.ts.map +1 -0
- package/dist/client/config/loader.js +128 -0
- package/dist/client/config/loader.js.map +1 -0
- package/dist/client/config/node.d.ts +18 -0
- package/dist/client/config/node.d.ts.map +1 -0
- package/dist/client/config/node.js +17 -0
- package/dist/client/config/node.js.map +1 -0
- package/dist/client/config/schemas.d.ts +23 -0
- package/dist/client/config/schemas.d.ts.map +1 -0
- package/dist/client/config/schemas.js +24 -0
- package/dist/client/config/schemas.js.map +1 -0
- package/dist/client/config/types.d.ts +37 -0
- package/dist/client/config/types.d.ts.map +1 -0
- package/dist/client/config/types.js +6 -0
- package/dist/client/config/types.js.map +1 -0
- package/dist/client/config/unified-loader.d.ts +41 -0
- package/dist/client/config/unified-loader.d.ts.map +1 -0
- package/dist/client/config/unified-loader.js +86 -0
- package/dist/client/config/unified-loader.js.map +1 -0
- package/dist/client/config.d.ts +43 -0
- package/dist/client/config.d.ts.map +1 -0
- package/dist/client/config.js +56 -0
- package/dist/client/config.js.map +1 -0
- package/dist/client/deployment-config.d.ts +36 -0
- package/dist/client/deployment-config.d.ts.map +1 -0
- package/dist/client/deployment-config.js +79 -0
- package/dist/client/deployment-config.js.map +1 -0
- package/dist/client/errors.d.ts +180 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +253 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/http-client.d.ts +215 -0
- package/dist/client/http-client.d.ts.map +1 -0
- package/dist/client/http-client.js +419 -0
- package/dist/client/http-client.js.map +1 -0
- package/dist/client/index.d.ts +28 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/internal-dsl-client.d.ts +30 -0
- package/dist/client/internal-dsl-client.d.ts.map +1 -0
- package/dist/client/internal-dsl-client.js +101 -0
- package/dist/client/internal-dsl-client.js.map +1 -0
- package/dist/client/rate-limiter.d.ts +79 -0
- package/dist/client/rate-limiter.d.ts.map +1 -0
- package/dist/client/rate-limiter.js +118 -0
- package/dist/client/rate-limiter.js.map +1 -0
- package/dist/client/resolve-api-key-user.d.ts +24 -0
- package/dist/client/resolve-api-key-user.d.ts.map +1 -0
- package/dist/client/resolve-api-key-user.js +80 -0
- package/dist/client/resolve-api-key-user.js.map +1 -0
- package/dist/client/types.d.ts +44 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +10 -0
- package/dist/client/types.js.map +1 -0
- package/dist/dsl/client.d.ts +330 -0
- package/dist/dsl/client.d.ts.map +1 -0
- package/dist/dsl/client.js +433 -0
- package/dist/dsl/client.js.map +1 -0
- package/dist/dsl/commands/apply-filters.d.ts +15 -0
- package/dist/dsl/commands/apply-filters.d.ts.map +1 -0
- package/dist/dsl/commands/apply-filters.js +29 -0
- package/dist/dsl/commands/apply-filters.js.map +1 -0
- package/dist/dsl/commands/facet/index.d.ts +6 -0
- package/dist/dsl/commands/facet/index.d.ts.map +1 -0
- package/dist/dsl/commands/facet/index.js +6 -0
- package/dist/dsl/commands/facet/index.js.map +1 -0
- package/dist/dsl/commands/facet/schemas.d.ts +71 -0
- package/dist/dsl/commands/facet/schemas.d.ts.map +1 -0
- package/dist/dsl/commands/facet/schemas.js +84 -0
- package/dist/dsl/commands/facet/schemas.js.map +1 -0
- package/dist/dsl/commands/functions/ClassifyCommand.d.ts +96 -0
- package/dist/dsl/commands/functions/ClassifyCommand.d.ts.map +1 -0
- package/dist/dsl/commands/functions/ClassifyCommand.js +95 -0
- package/dist/dsl/commands/functions/ClassifyCommand.js.map +1 -0
- package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts +86 -0
- package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts.map +1 -0
- package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js +131 -0
- package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js.map +1 -0
- package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts +73 -0
- package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts.map +1 -0
- package/dist/dsl/commands/functions/ExtractConceptsCommand.js +110 -0
- package/dist/dsl/commands/functions/ExtractConceptsCommand.js.map +1 -0
- package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts +66 -0
- package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts.map +1 -0
- package/dist/dsl/commands/functions/ExtractGrantsCommand.js +87 -0
- package/dist/dsl/commands/functions/ExtractGrantsCommand.js.map +1 -0
- package/dist/dsl/commands/functions/index.d.ts +10 -0
- package/dist/dsl/commands/functions/index.d.ts.map +1 -0
- package/dist/dsl/commands/functions/index.js +10 -0
- package/dist/dsl/commands/functions/index.js.map +1 -0
- package/dist/dsl/commands/index.d.ts +8 -0
- package/dist/dsl/commands/index.d.ts.map +1 -0
- package/dist/dsl/commands/index.js +7 -0
- package/dist/dsl/commands/index.js.map +1 -0
- package/dist/dsl/commands/validate-input.d.ts +18 -0
- package/dist/dsl/commands/validate-input.d.ts.map +1 -0
- package/dist/dsl/commands/validate-input.js +27 -0
- package/dist/dsl/commands/validate-input.js.map +1 -0
- package/dist/dsl/create-client.d.ts +32 -0
- package/dist/dsl/create-client.d.ts.map +1 -0
- package/dist/dsl/create-client.js +58 -0
- package/dist/dsl/create-client.js.map +1 -0
- package/dist/dsl/fluent-query-builder.d.ts +439 -0
- package/dist/dsl/fluent-query-builder.d.ts.map +1 -0
- package/dist/dsl/fluent-query-builder.js +534 -0
- package/dist/dsl/fluent-query-builder.js.map +1 -0
- package/dist/dsl/index.d.ts +32 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +31 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/pagination.d.ts +82 -0
- package/dist/dsl/pagination.d.ts.map +1 -0
- package/dist/dsl/pagination.js +135 -0
- package/dist/dsl/pagination.js.map +1 -0
- package/dist/dsl/query-builder.d.ts +456 -0
- package/dist/dsl/query-builder.d.ts.map +1 -0
- package/dist/dsl/query-builder.js +994 -0
- package/dist/dsl/query-builder.js.map +1 -0
- package/dist/dsl/response-parser.d.ts +111 -0
- package/dist/dsl/response-parser.d.ts.map +1 -0
- package/dist/dsl/response-parser.js +210 -0
- package/dist/dsl/response-parser.js.map +1 -0
- package/dist/dsl/schema/cache.d.ts +52 -0
- package/dist/dsl/schema/cache.d.ts.map +1 -0
- package/dist/dsl/schema/cache.js +97 -0
- package/dist/dsl/schema/cache.js.map +1 -0
- package/dist/dsl/schema/extract.d.ts +18 -0
- package/dist/dsl/schema/extract.d.ts.map +1 -0
- package/dist/dsl/schema/extract.js +41 -0
- package/dist/dsl/schema/extract.js.map +1 -0
- package/dist/dsl/schema/index.d.ts +13 -0
- package/dist/dsl/schema/index.d.ts.map +1 -0
- package/dist/dsl/schema/index.js +12 -0
- package/dist/dsl/schema/index.js.map +1 -0
- package/dist/dsl/schema/load.d.ts +41 -0
- package/dist/dsl/schema/load.d.ts.map +1 -0
- package/dist/dsl/schema/load.js +119 -0
- package/dist/dsl/schema/load.js.map +1 -0
- package/dist/dsl/schema/store.d.ts +137 -0
- package/dist/dsl/schema/store.d.ts.map +1 -0
- package/dist/dsl/schema/store.js +204 -0
- package/dist/dsl/schema/store.js.map +1 -0
- package/dist/dsl/schema/structured-entities.d.ts +21 -0
- package/dist/dsl/schema/structured-entities.d.ts.map +1 -0
- package/dist/dsl/schema/structured-entities.js +39 -0
- package/dist/dsl/schema/structured-entities.js.map +1 -0
- package/dist/dsl/schema/summary.d.ts +51 -0
- package/dist/dsl/schema/summary.d.ts.map +1 -0
- package/dist/dsl/schema/summary.js +61 -0
- package/dist/dsl/schema/summary.js.map +1 -0
- package/dist/dsl/schema/types.d.ts +36 -0
- package/dist/dsl/schema/types.d.ts.map +1 -0
- package/dist/dsl/schema/types.js +6 -0
- package/dist/dsl/schema/types.js.map +1 -0
- package/dist/dsl/schema/validation.d.ts +21 -0
- package/dist/dsl/schema/validation.d.ts.map +1 -0
- package/dist/dsl/schema/validation.js +44 -0
- package/dist/dsl/schema/validation.js.map +1 -0
- package/dist/dsl/types/buckets.d.ts +18 -0
- package/dist/dsl/types/buckets.d.ts.map +1 -0
- package/dist/dsl/types/buckets.js +6 -0
- package/dist/dsl/types/buckets.js.map +1 -0
- package/dist/dsl/types/common.d.ts +91 -0
- package/dist/dsl/types/common.d.ts.map +1 -0
- package/dist/dsl/types/common.js +6 -0
- package/dist/dsl/types/common.js.map +1 -0
- package/dist/dsl/types/entities.d.ts +35 -0
- package/dist/dsl/types/entities.d.ts.map +1 -0
- package/dist/dsl/types/entities.js +11 -0
- package/dist/dsl/types/entities.js.map +1 -0
- package/dist/dsl/types/index.d.ts +12 -0
- package/dist/dsl/types/index.d.ts.map +1 -0
- package/dist/dsl/types/index.js +7 -0
- package/dist/dsl/types/index.js.map +1 -0
- package/dist/dsl/types/return-clauses.d.ts +107 -0
- package/dist/dsl/types/return-clauses.d.ts.map +1 -0
- package/dist/dsl/types/return-clauses.js +22 -0
- package/dist/dsl/types/return-clauses.js.map +1 -0
- package/dist/dsl/types/special-functions.d.ts +175 -0
- package/dist/dsl/types/special-functions.d.ts.map +1 -0
- package/dist/dsl/types/special-functions.js +25 -0
- package/dist/dsl/types/special-functions.js.map +1 -0
- package/dist/dsl/types/vocabulary.d.ts +21 -0
- package/dist/dsl/types/vocabulary.d.ts.map +1 -0
- package/dist/dsl/types/vocabulary.js +44 -0
- package/dist/dsl/types/vocabulary.js.map +1 -0
- package/dist/dsl/usage-policy.d.ts +87 -0
- package/dist/dsl/usage-policy.d.ts.map +1 -0
- package/dist/dsl/usage-policy.js +133 -0
- package/dist/dsl/usage-policy.js.map +1 -0
- package/dist/dsl/utils/escape.d.ts +24 -0
- package/dist/dsl/utils/escape.d.ts.map +1 -0
- package/dist/dsl/utils/escape.js +124 -0
- package/dist/dsl/utils/escape.js.map +1 -0
- package/dist/dsl/utils/sanitize.d.ts +13 -0
- package/dist/dsl/utils/sanitize.d.ts.map +1 -0
- package/dist/dsl/utils/sanitize.js +19 -0
- package/dist/dsl/utils/sanitize.js.map +1 -0
- package/dist/dsl/utils/string-utils.d.ts +35 -0
- package/dist/dsl/utils/string-utils.d.ts.map +1 -0
- package/dist/dsl/utils/string-utils.js +145 -0
- package/dist/dsl/utils/string-utils.js.map +1 -0
- package/dist/dsl/utils/validate-field-name.d.ts +11 -0
- package/dist/dsl/utils/validate-field-name.d.ts.map +1 -0
- package/dist/dsl/utils/validate-field-name.js +18 -0
- package/dist/dsl/utils/validate-field-name.js.map +1 -0
- package/dist/examples/dsl-examples.d.ts +11 -0
- package/dist/examples/dsl-examples.d.ts.map +1 -0
- package/dist/examples/dsl-examples.js +49 -0
- package/dist/examples/dsl-examples.js.map +1 -0
- package/dist/examples/usage-scenarios.d.ts +22 -0
- package/dist/examples/usage-scenarios.d.ts.map +1 -0
- package/dist/examples/usage-scenarios.js +173 -0
- package/dist/examples/usage-scenarios.js.map +1 -0
- package/dist/funder-org-names.d.ts +12 -0
- package/dist/funder-org-names.d.ts.map +1 -0
- package/dist/funder-org-names.js +30 -0
- package/dist/funder-org-names.js.map +1 -0
- package/dist/http-main.d.ts +7 -0
- package/dist/http-main.d.ts.map +1 -0
- package/dist/http-main.js +36 -0
- package/dist/http-main.js.map +1 -0
- package/dist/http.d.ts +29 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +173 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/kwq/build-query.d.ts +26 -0
- package/dist/kwq/build-query.d.ts.map +1 -0
- package/dist/kwq/build-query.js +37 -0
- package/dist/kwq/build-query.js.map +1 -0
- package/dist/kwq/concept-groups.d.ts +49 -0
- package/dist/kwq/concept-groups.d.ts.map +1 -0
- package/dist/kwq/concept-groups.js +55 -0
- package/dist/kwq/concept-groups.js.map +1 -0
- package/dist/kwq/dsl-assembler.d.ts +28 -0
- package/dist/kwq/dsl-assembler.d.ts.map +1 -0
- package/dist/kwq/dsl-assembler.js +124 -0
- package/dist/kwq/dsl-assembler.js.map +1 -0
- package/dist/kwq/ensemble.d.ts +38 -0
- package/dist/kwq/ensemble.d.ts.map +1 -0
- package/dist/kwq/ensemble.js +107 -0
- package/dist/kwq/ensemble.js.map +1 -0
- package/dist/kwq/index.d.ts +16 -0
- package/dist/kwq/index.d.ts.map +1 -0
- package/dist/kwq/index.js +14 -0
- package/dist/kwq/index.js.map +1 -0
- package/dist/kwq/types.d.ts +120 -0
- package/dist/kwq/types.d.ts.map +1 -0
- package/dist/kwq/types.js +11 -0
- package/dist/kwq/types.js.map +1 -0
- package/dist/lambda.d.ts +10 -0
- package/dist/lambda.d.ts.map +1 -0
- package/dist/lambda.js +4 -0
- package/dist/lambda.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +33 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/batch-fetch.d.ts +89 -0
- package/dist/mcp/batch-fetch.d.ts.map +1 -0
- package/dist/mcp/batch-fetch.js +178 -0
- package/dist/mcp/batch-fetch.js.map +1 -0
- package/dist/mcp/examples/dsl-examples.d.ts +21 -0
- package/dist/mcp/examples/dsl-examples.d.ts.map +1 -0
- package/dist/mcp/examples/dsl-examples.js +61 -0
- package/dist/mcp/examples/dsl-examples.js.map +1 -0
- package/dist/mcp/examples/usage-scenarios.d.ts +20 -0
- package/dist/mcp/examples/usage-scenarios.d.ts.map +1 -0
- package/dist/mcp/examples/usage-scenarios.js +169 -0
- package/dist/mcp/examples/usage-scenarios.js.map +1 -0
- package/dist/mcp/export-format.d.ts +43 -0
- package/dist/mcp/export-format.d.ts.map +1 -0
- package/dist/mcp/export-format.js +92 -0
- package/dist/mcp/export-format.js.map +1 -0
- package/dist/mcp/funder-org-names.d.ts +12 -0
- package/dist/mcp/funder-org-names.d.ts.map +1 -0
- package/dist/mcp/funder-org-names.js +30 -0
- package/dist/mcp/funder-org-names.js.map +1 -0
- package/dist/mcp/http-server.d.ts +20 -0
- package/dist/mcp/http-server.d.ts.map +1 -0
- package/dist/mcp/http-server.js +118 -0
- package/dist/mcp/http-server.js.map +1 -0
- package/dist/mcp/middleware/field-aliases.d.ts +97 -0
- package/dist/mcp/middleware/field-aliases.d.ts.map +1 -0
- package/dist/mcp/middleware/field-aliases.js +208 -0
- package/dist/mcp/middleware/field-aliases.js.map +1 -0
- package/dist/mcp/resources/schema.d.ts +13 -0
- package/dist/mcp/resources/schema.d.ts.map +1 -0
- package/dist/mcp/resources/schema.js +262 -0
- package/dist/mcp/resources/schema.js.map +1 -0
- package/dist/mcp/schema/context.d.ts +10 -0
- package/dist/mcp/schema/context.d.ts.map +1 -0
- package/dist/mcp/schema/context.js +6 -0
- package/dist/mcp/schema/context.js.map +1 -0
- package/dist/mcp/schema/index.d.ts +8 -0
- package/dist/mcp/schema/index.d.ts.map +1 -0
- package/dist/mcp/schema/index.js +6 -0
- package/dist/mcp/schema/index.js.map +1 -0
- package/dist/mcp/server.d.ts +56 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +168 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shared-schema.d.ts +13 -0
- package/dist/mcp/shared-schema.d.ts.map +1 -0
- package/dist/mcp/shared-schema.js +28 -0
- package/dist/mcp/shared-schema.js.map +1 -0
- package/dist/mcp/tools/analytics-filters.d.ts +18 -0
- package/dist/mcp/tools/analytics-filters.d.ts.map +1 -0
- package/dist/mcp/tools/analytics-filters.js +35 -0
- package/dist/mcp/tools/analytics-filters.js.map +1 -0
- package/dist/mcp/tools/analytics.d.ts +16 -0
- package/dist/mcp/tools/analytics.d.ts.map +1 -0
- package/dist/mcp/tools/analytics.js +381 -0
- package/dist/mcp/tools/analytics.js.map +1 -0
- package/dist/mcp/tools/concept-profile.d.ts +14 -0
- package/dist/mcp/tools/concept-profile.d.ts.map +1 -0
- package/dist/mcp/tools/concept-profile.js +130 -0
- package/dist/mcp/tools/concept-profile.js.map +1 -0
- package/dist/mcp/tools/dataset-profile.d.ts +15 -0
- package/dist/mcp/tools/dataset-profile.d.ts.map +1 -0
- package/dist/mcp/tools/dataset-profile.js +194 -0
- package/dist/mcp/tools/dataset-profile.js.map +1 -0
- package/dist/mcp/tools/fetch-search-pages.d.ts +15 -0
- package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -0
- package/dist/mcp/tools/fetch-search-pages.js +237 -0
- package/dist/mcp/tools/fetch-search-pages.js.map +1 -0
- package/dist/mcp/tools/functions.d.ts +14 -0
- package/dist/mcp/tools/functions.d.ts.map +1 -0
- package/dist/mcp/tools/functions.js +87 -0
- package/dist/mcp/tools/functions.js.map +1 -0
- package/dist/mcp/tools/impact-chain.d.ts +15 -0
- package/dist/mcp/tools/impact-chain.d.ts.map +1 -0
- package/dist/mcp/tools/impact-chain.js +96 -0
- package/dist/mcp/tools/impact-chain.js.map +1 -0
- package/dist/mcp/tools/kwq.d.ts +19 -0
- package/dist/mcp/tools/kwq.d.ts.map +1 -0
- package/dist/mcp/tools/kwq.js +156 -0
- package/dist/mcp/tools/kwq.js.map +1 -0
- package/dist/mcp/tools/lookup.d.ts +14 -0
- package/dist/mcp/tools/lookup.d.ts.map +1 -0
- package/dist/mcp/tools/lookup.js +146 -0
- package/dist/mcp/tools/lookup.js.map +1 -0
- package/dist/mcp/tools/policy-profile.d.ts +15 -0
- package/dist/mcp/tools/policy-profile.d.ts.map +1 -0
- package/dist/mcp/tools/policy-profile.js +174 -0
- package/dist/mcp/tools/policy-profile.js.map +1 -0
- package/dist/mcp/tools/profile.d.ts +14 -0
- package/dist/mcp/tools/profile.d.ts.map +1 -0
- package/dist/mcp/tools/profile.js +349 -0
- package/dist/mcp/tools/profile.js.map +1 -0
- package/dist/mcp/tools/query.d.ts +16 -0
- package/dist/mcp/tools/query.d.ts.map +1 -0
- package/dist/mcp/tools/query.js +75 -0
- package/dist/mcp/tools/query.js.map +1 -0
- package/dist/mcp/tools/schema.d.ts +23 -0
- package/dist/mcp/tools/schema.d.ts.map +1 -0
- package/dist/mcp/tools/schema.js +124 -0
- package/dist/mcp/tools/schema.js.map +1 -0
- package/dist/mcp/tools/search-entity-metadata.d.ts +18 -0
- package/dist/mcp/tools/search-entity-metadata.d.ts.map +1 -0
- package/dist/mcp/tools/search-entity-metadata.js +221 -0
- package/dist/mcp/tools/search-entity-metadata.js.map +1 -0
- package/dist/mcp/tools/search-input.d.ts +58 -0
- package/dist/mcp/tools/search-input.d.ts.map +1 -0
- package/dist/mcp/tools/search-input.js +76 -0
- package/dist/mcp/tools/search-input.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +24 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +115 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/utils.d.ts +82 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +126 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/middleware/field-aliases.d.ts +97 -0
- package/dist/middleware/field-aliases.d.ts.map +1 -0
- package/dist/middleware/field-aliases.js +208 -0
- package/dist/middleware/field-aliases.js.map +1 -0
- package/dist/resources/schema.d.ts +13 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +204 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/schema/context.d.ts +10 -0
- package/dist/schema/context.d.ts.map +1 -0
- package/dist/schema/context.js +6 -0
- package/dist/schema/context.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/load.d.ts +43 -0
- package/dist/schema/load.d.ts.map +1 -0
- package/dist/schema/load.js +139 -0
- package/dist/schema/load.js.map +1 -0
- package/dist/schema/store.d.ts +112 -0
- package/dist/schema/store.d.ts.map +1 -0
- package/dist/schema/store.js +173 -0
- package/dist/schema/store.js.map +1 -0
- package/dist/schema/structured-entities.d.ts +21 -0
- package/dist/schema/structured-entities.d.ts.map +1 -0
- package/dist/schema/structured-entities.js +39 -0
- package/dist/schema/structured-entities.js.map +1 -0
- package/dist/schema/types.d.ts +36 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +6 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/server.d.ts +57 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +144 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry.d.ts +172 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +233 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools/analytics-filters.d.ts +18 -0
- package/dist/tools/analytics-filters.d.ts.map +1 -0
- package/dist/tools/analytics-filters.js +35 -0
- package/dist/tools/analytics-filters.js.map +1 -0
- package/dist/tools/analytics.d.ts +16 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +381 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/concept-profile.d.ts +14 -0
- package/dist/tools/concept-profile.d.ts.map +1 -0
- package/dist/tools/concept-profile.js +130 -0
- package/dist/tools/concept-profile.js.map +1 -0
- package/dist/tools/dataset-profile.d.ts +15 -0
- package/dist/tools/dataset-profile.d.ts.map +1 -0
- package/dist/tools/dataset-profile.js +194 -0
- package/dist/tools/dataset-profile.js.map +1 -0
- package/dist/tools/functions.d.ts +14 -0
- package/dist/tools/functions.d.ts.map +1 -0
- package/dist/tools/functions.js +294 -0
- package/dist/tools/functions.js.map +1 -0
- package/dist/tools/impact-chain.d.ts +15 -0
- package/dist/tools/impact-chain.d.ts.map +1 -0
- package/dist/tools/impact-chain.js +96 -0
- package/dist/tools/impact-chain.js.map +1 -0
- package/dist/tools/kwq.d.ts +19 -0
- package/dist/tools/kwq.d.ts.map +1 -0
- package/dist/tools/kwq.js +156 -0
- package/dist/tools/kwq.js.map +1 -0
- package/dist/tools/lookup.d.ts +14 -0
- package/dist/tools/lookup.d.ts.map +1 -0
- package/dist/tools/lookup.js +213 -0
- package/dist/tools/lookup.js.map +1 -0
- package/dist/tools/policy-profile.d.ts +15 -0
- package/dist/tools/policy-profile.d.ts.map +1 -0
- package/dist/tools/policy-profile.js +174 -0
- package/dist/tools/policy-profile.js.map +1 -0
- package/dist/tools/profile.d.ts +14 -0
- package/dist/tools/profile.d.ts.map +1 -0
- package/dist/tools/profile.js +349 -0
- package/dist/tools/profile.js.map +1 -0
- package/dist/tools/query.d.ts +16 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +53 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/schema.d.ts +23 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +124 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/search-entity-metadata.d.ts +18 -0
- package/dist/tools/search-entity-metadata.d.ts.map +1 -0
- package/dist/tools/search-entity-metadata.js +221 -0
- package/dist/tools/search-entity-metadata.js.map +1 -0
- package/dist/tools/search.d.ts +23 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +110 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/solr-fields.d.ts +39 -0
- package/dist/tools/solr-fields.d.ts.map +1 -0
- package/dist/tools/solr-fields.js +40 -0
- package/dist/tools/solr-fields.js.map +1 -0
- package/dist/utils.d.ts +70 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +104 -0
- package/dist/utils.js.map +1 -0
- package/package.json +41 -0
- package/src/client/auth/config-loaders.ts +81 -0
- package/src/client/auth/decorators/index.ts +7 -0
- package/src/client/auth/decorators/with-caching.ts +237 -0
- package/src/client/auth/factory.ts +34 -0
- package/src/client/auth/index.ts +6 -0
- package/src/client/auth/jwt-utils.ts +36 -0
- package/src/client/auth/node.ts +16 -0
- package/src/client/auth/providers/index.ts +1 -0
- package/src/client/auth/providers/jwt-auth-provider.ts +153 -0
- package/src/client/auth/schemas.ts +25 -0
- package/src/client/auth/types.ts +30 -0
- package/src/client/command.ts +54 -0
- package/src/client/config/index.ts +15 -0
- package/src/client/config/loader.ts +155 -0
- package/src/client/config/node.ts +22 -0
- package/src/client/config/schemas.ts +28 -0
- package/src/client/config/types.ts +39 -0
- package/src/client/config/unified-loader.ts +118 -0
- package/src/client/config.ts +69 -0
- package/src/client/deployment-config.ts +98 -0
- package/src/client/errors.ts +295 -0
- package/src/client/http-client.ts +577 -0
- package/src/client/index.ts +68 -0
- package/src/client/internal-dsl-client.ts +128 -0
- package/src/client/rate-limiter.ts +139 -0
- package/src/client/resolve-api-key-user.ts +99 -0
- package/src/client/types.ts +44 -0
- package/src/dsl/client.ts +538 -0
- package/src/dsl/commands/apply-filters.ts +35 -0
- package/src/dsl/commands/facet/index.ts +12 -0
- package/src/dsl/commands/facet/schemas.ts +101 -0
- package/src/dsl/commands/functions/ClassifyCommand.ts +129 -0
- package/src/dsl/commands/functions/ExtractAffiliationsCommand.ts +163 -0
- package/src/dsl/commands/functions/ExtractConceptsCommand.ts +141 -0
- package/src/dsl/commands/functions/ExtractGrantsCommand.ts +112 -0
- package/src/dsl/commands/functions/index.ts +31 -0
- package/src/dsl/commands/index.ts +29 -0
- package/src/dsl/commands/validate-input.ts +29 -0
- package/src/dsl/create-client.ts +80 -0
- package/src/dsl/fluent-query-builder.ts +684 -0
- package/src/dsl/index.ts +206 -0
- package/src/dsl/pagination.ts +202 -0
- package/src/dsl/query-builder.ts +1120 -0
- package/src/dsl/response-parser.ts +299 -0
- package/src/dsl/schema/cache.ts +124 -0
- package/src/dsl/schema/extract.ts +44 -0
- package/src/dsl/schema/index.ts +50 -0
- package/src/dsl/schema/load.ts +160 -0
- package/src/dsl/schema/store.ts +253 -0
- package/src/dsl/schema/structured-entities.ts +44 -0
- package/src/dsl/schema/summary.ts +94 -0
- package/src/dsl/schema/types.ts +40 -0
- package/src/dsl/schema/validation.ts +56 -0
- package/src/dsl/types/buckets.ts +22 -0
- package/src/dsl/types/common.ts +99 -0
- package/src/dsl/types/entities.ts +43 -0
- package/src/dsl/types/index.ts +63 -0
- package/src/dsl/types/return-clauses.ts +147 -0
- package/src/dsl/types/special-functions.ts +220 -0
- package/src/dsl/types/vocabulary.ts +82 -0
- package/src/dsl/usage-policy.ts +219 -0
- package/src/dsl/utils/escape.ts +123 -0
- package/src/dsl/utils/sanitize.ts +21 -0
- package/src/dsl/utils/string-utils.ts +147 -0
- package/src/dsl/utils/validate-field-name.ts +19 -0
- package/src/http-main.ts +41 -0
- package/src/index.ts +14 -0
- package/src/main.ts +40 -0
- package/src/mcp/batch-fetch.ts +255 -0
- package/src/mcp/examples/dsl-examples.ts +66 -0
- package/src/mcp/examples/usage-scenarios.ts +185 -0
- package/src/mcp/export-format.ts +113 -0
- package/src/mcp/funder-org-names.ts +30 -0
- package/src/mcp/http-server.ts +148 -0
- package/src/mcp/middleware/field-aliases.ts +274 -0
- package/src/mcp/resources/schema.ts +364 -0
- package/src/mcp/schema/context.ts +11 -0
- package/src/mcp/schema/index.ts +38 -0
- package/src/mcp/server.ts +247 -0
- package/src/mcp/shared-schema.ts +34 -0
- package/src/mcp/tools/analytics-filters.ts +46 -0
- package/src/mcp/tools/analytics.ts +453 -0
- package/src/mcp/tools/fetch-search-pages.ts +329 -0
- package/src/mcp/tools/functions.ts +105 -0
- package/src/mcp/tools/lookup.ts +182 -0
- package/src/mcp/tools/query.ts +91 -0
- package/src/mcp/tools/schema.ts +147 -0
- package/src/mcp/tools/search-entity-metadata.ts +253 -0
- package/src/mcp/tools/search-input.ts +87 -0
- package/src/mcp/tools/search.ts +168 -0
- package/src/mcp/utils.ts +199 -0
- package/test/client/auth/config-loaders.test.ts +92 -0
- package/test/client/auth/decorators/with-caching.test.ts +482 -0
- package/test/client/auth/factory.test.ts +68 -0
- package/test/client/auth/providers/jwt-auth-provider.test.ts +398 -0
- package/test/client/auth/types.test.ts +18 -0
- package/test/client/command.test.ts +163 -0
- package/test/client/config/loader.test.ts +377 -0
- package/test/client/config/unified-loader.test.ts +136 -0
- package/test/client/deployment-config.test.ts +69 -0
- package/test/client/errors/index.test.ts +408 -0
- package/test/client/helpers/mock-fetch.ts +42 -0
- package/test/client/http-client.test.ts +1148 -0
- package/test/client/integration/auth-providers.integration.test.ts +186 -0
- package/test/client/internal-dsl-client.test.ts +76 -0
- package/test/client/rate-limiter.test.ts +204 -0
- package/test/client/resolve-api-key-user.test.ts +87 -0
- package/test/dsl/client.special-functions.test.ts +387 -0
- package/test/dsl/client.test.ts +457 -0
- package/test/dsl/commands/apply-filters.test.ts +147 -0
- package/test/dsl/commands/functions/ClassifyCommand.test.ts +170 -0
- package/test/dsl/commands/functions/ExtractAffiliationsCommand.test.ts +306 -0
- package/test/dsl/commands/functions/ExtractConceptsCommand.test.ts +136 -0
- package/test/dsl/commands/functions/ExtractGrantsCommand.test.ts +202 -0
- package/test/dsl/commands/search/filters.test.ts +42 -0
- package/test/dsl/fluent-query-builder.test.ts +865 -0
- package/test/dsl/integration/client.integration.test.ts +294 -0
- package/test/dsl/integration/facet-api.integration.test.ts +276 -0
- package/test/dsl/integration/field-existence.integration.test.ts +148 -0
- package/test/dsl/integration/fluent-api-docs-examples.integration.test.ts +988 -0
- package/test/dsl/integration/fluent-api.integration.test.ts +615 -0
- package/test/dsl/integration/search-helpers.ts +27 -0
- package/test/dsl/integration/special-functions.integration.test.ts +224 -0
- package/test/dsl/integration/test-config.ts +52 -0
- package/test/dsl/pagination.test.ts +86 -0
- package/test/dsl/query-builder.test.ts +1775 -0
- package/test/dsl/response-parser.test.ts +520 -0
- package/test/dsl/schema/cache.test.ts +53 -0
- package/test/dsl/schema/load.test.ts +165 -0
- package/test/dsl/schema/summary.test.ts +61 -0
- package/test/dsl/schema/validation.test.ts +46 -0
- package/test/dsl/time-series.test.ts +135 -0
- package/test/dsl/unnest.test.ts +151 -0
- package/test/dsl/usage-policy.test.ts +100 -0
- package/test/dsl/utils/escape.property.test.ts +109 -0
- package/test/dsl/utils/escape.test.ts +140 -0
- package/test/dsl/utils/validate-field-name.property.test.ts +99 -0
- package/test/dsl/utils/validate-field-name.test.ts +55 -0
- package/test/examples/dsl-examples.test.ts +29 -0
- package/test/examples/usage-scenarios.test.ts +90 -0
- package/test/fixtures/describe-schema.json +4000 -0
- package/test/funder-org-names.test.ts +20 -0
- package/test/helpers/schema-fixture.ts +18 -0
- package/test/helpers/tool-test-harness.ts +114 -0
- package/test/integration/assertions.ts +263 -0
- package/test/integration/env.ts +108 -0
- package/test/integration/harness.ts +307 -0
- package/test/integration/hosted-client.ts +56 -0
- package/test/integration/hosted-mocks.ts +81 -0
- package/test/integration/hosted-run.ts +86 -0
- package/test/integration/hosted.e2e.test.ts +101 -0
- package/test/integration/reporter.ts +100 -0
- package/test/integration/run.ts +74 -0
- package/test/integration/suites/analytics.integration.ts +72 -0
- package/test/integration/suites/functions.integration.ts +37 -0
- package/test/integration/suites/hosted-smoke.integration.ts +38 -0
- package/test/integration/suites/index.ts +22 -0
- package/test/integration/suites/lookup.integration.ts +57 -0
- package/test/integration/suites/query.integration.ts +49 -0
- package/test/integration/suites/resources.integration.ts +68 -0
- package/test/integration/suites/search.integration.ts +80 -0
- package/test/integration/types.ts +92 -0
- package/test/integration/verify-usage-scenarios.ts +162 -0
- package/test/mcp/export-format.test.ts +67 -0
- package/test/mcp/http-server.test.ts +80 -0
- package/test/middleware/field-aliases.test.ts +287 -0
- package/test/resources/schema.test.ts +28 -0
- package/test/schema/describe-contract.test.ts +24 -0
- package/test/schema/store.test.ts +45 -0
- package/test/server.test.ts +170 -0
- package/test/tools/analytics-filters.test.ts +35 -0
- package/test/tools/analytics.test.ts +419 -0
- package/test/tools/fetch-search-pages.test.ts +200 -0
- package/test/tools/functions.test.ts +153 -0
- package/test/tools/lookup.test.ts +296 -0
- package/test/tools/query.test.ts +100 -0
- package/test/tools/schema.test.ts +37 -0
- package/test/tools/search.test.ts +415 -0
- package/test/utils.test.ts +45 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.3
|
|
4
|
+
|
|
5
|
+
Republish on public npm after package unpublish (0.5.2 cannot be re-used).
|
|
6
|
+
|
|
7
|
+
## 0.5.2
|
|
8
|
+
|
|
9
|
+
### Packaging
|
|
10
|
+
|
|
11
|
+
- Resolve `catalog:` dependencies in published npm manifest (use `pnpm pack` + `npm publish` tarball)
|
|
12
|
+
|
|
13
|
+
## 0.5.1
|
|
14
|
+
|
|
15
|
+
### Packaging
|
|
16
|
+
|
|
17
|
+
- Fix npm publish stripping CLI `bin` entries (wrappers under `bin/` per npm 11)
|
|
18
|
+
|
|
19
|
+
## 0.5.0
|
|
20
|
+
|
|
21
|
+
### Tool surface
|
|
22
|
+
|
|
23
|
+
- Remove dedicated MCP tools: KWQ (`build_query`, `ensemble_queries`), NLP (`classify_text`, `extract_concepts`), similarity search, profile lookup, `recent_high_impact`
|
|
24
|
+
- Keep `extract_affiliations`, `extract_grants`; classify/extract/similar remain available via **`execute_dsl`**
|
|
25
|
+
|
|
26
|
+
### Packaging & install
|
|
27
|
+
|
|
28
|
+
- Rename npm package to `@digital-science-dsl/dimensions-analytics-mcp` (was `@digital-science/dsl-mcp`)
|
|
29
|
+
- Rename CLIs to `dimensions-analytics-mcp` and `dimensions-analytics-mcp-http`
|
|
30
|
+
- Publish to public npm; guided installer no longer requires a GitHub token
|
|
31
|
+
- Add `docs/IDENTIFIERS.md` mapping product name to technical names
|
|
32
|
+
|
|
33
|
+
### Hosted deployment
|
|
34
|
+
|
|
35
|
+
- Add Streamable HTTP entrypoint (`dimensions-analytics-mcp-http`) at `POST /mcp` with `GET /health`
|
|
36
|
+
- Add dsl-service adapter (`POST /query`, JSON body, service basic-auth, `X-DIMENSIONS-USER`)
|
|
37
|
+
- Add Bearer API key validation via Radar `POST /api/auth.json`
|
|
38
|
+
- Omit `fetch_search_pages` on hosted (local disk export)
|
|
39
|
+
- Schema warmup uses derived identity `mcp@<DSL_HOST>` (no bootstrap env var)
|
|
40
|
+
- Docker image (`apps/mcp/Dockerfile`) and Kubernetes example (`deploy/kubernetes/dsl-mcp.yaml`) — **moved to `dimensions-analytics-mcp-deploy` repo**
|
|
41
|
+
|
|
42
|
+
### Testing & CI
|
|
43
|
+
|
|
44
|
+
- Mock hosted e2e tests (default CI, no secrets)
|
|
45
|
+
- Nightly/manual integration workflow for live stdio and hosted smoke
|
|
46
|
+
- Docker build/push workflow — **`dimensions-analytics-mcp-deploy` repo**
|
|
47
|
+
|
|
48
|
+
## 0.4.0
|
|
49
|
+
|
|
50
|
+
- Pagination on `search_*` (`skip`, `page`, metadata)
|
|
51
|
+
- `fetch_search_pages` tool: page, aggregate, and file export modes (JSONL + CSV)
|
|
52
|
+
- Reasonable-use policy guardrails (`dimensions://schema/policy`, `confirmLargeFetch`)
|
|
53
|
+
- Per-source example resources: `dimensions://examples/{source}`
|
|
54
|
+
|
|
55
|
+
## 0.3.0
|
|
56
|
+
|
|
57
|
+
- Consolidate monorepo into single `@digital-science/dsl-mcp` package (`apps/mcp` only)
|
|
58
|
+
|
|
59
|
+
## 0.1.0
|
|
60
|
+
|
|
61
|
+
Initial release from [digital-science/dimensions-analytics-mcp](https://github.com/digital-science/dimensions-analytics-mcp) as npm package `@digital-science/dsl-mcp`.
|
package/README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Dimensions Analytics MCP
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) server for the Dimensions Analytics API — enables AI assistants to search and analyze linked research data with the Dimensions DSL.
|
|
4
|
+
|
|
5
|
+
**Transport:** stdio (`dimensions-analytics-mcp`) for local use. A hosted remote option (URL + Bearer token) is **coming soon** — see [Installation — Hosted Dimensions Analytics MCP](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md#hosted-dimensions-analytics-mcp-coming-soon).
|
|
6
|
+
|
|
7
|
+
## What It Does
|
|
8
|
+
|
|
9
|
+
Dimensions Analytics MCP provides access to Dimensions, the world's largest linked research information database with over 140M publications, grants, patents, clinical trials, and more. It enables Claude and other MCP-compatible AI assistants to search and analyze research data.
|
|
10
|
+
|
|
11
|
+
## Available Tools
|
|
12
|
+
|
|
13
|
+
### Search Tools
|
|
14
|
+
|
|
15
|
+
| Tool | Description |
|
|
16
|
+
| ---- | ----------- |
|
|
17
|
+
| `search_publications` | Search research articles, preprints, and books with citation metrics |
|
|
18
|
+
| `search_grants` | Search research grants and funding awards |
|
|
19
|
+
| `search_researchers` | Search researcher profiles with publication counts and affiliations |
|
|
20
|
+
| `search_patents` | Search patents with assignee and filing information |
|
|
21
|
+
| `search_clinical_trials` | Search clinical trials by phase, condition, or status |
|
|
22
|
+
| `search_datasets` | Search research datasets and repositories |
|
|
23
|
+
| `search_policy_documents` | Search policy briefs and government documents |
|
|
24
|
+
| `search_organizations` | Search universities, research institutes, and companies |
|
|
25
|
+
| `fetch_search_pages` | Paginated / batch search (page, aggregate, JSONL/CSV file export) — **local stdio only** |
|
|
26
|
+
|
|
27
|
+
### Lookup Tools
|
|
28
|
+
|
|
29
|
+
| Tool | Description |
|
|
30
|
+
| ---- | ----------- |
|
|
31
|
+
| `get_by_doi` | Retrieve publication by DOI |
|
|
32
|
+
| `get_by_pmid` | Retrieve publication by PubMed ID |
|
|
33
|
+
| `get_by_id` | Retrieve any entity by Dimensions ID |
|
|
34
|
+
|
|
35
|
+
### Analytics & Trend Tools
|
|
36
|
+
|
|
37
|
+
| Tool | Description |
|
|
38
|
+
| ---- | ----------- |
|
|
39
|
+
| `aggregate_query` | Numeric aggregation (sum/avg/count) over any entity with grouping |
|
|
40
|
+
| `facet_query` | Facet counts for top values of any field |
|
|
41
|
+
| `citation_trend` | Citation counts over time for a topic or entity |
|
|
42
|
+
| `funding_trend` | Funding awarded over time for a topic or entity |
|
|
43
|
+
|
|
44
|
+
### Entity Resolution Tools
|
|
45
|
+
|
|
46
|
+
| Tool | Description |
|
|
47
|
+
| ---- | ----------- |
|
|
48
|
+
| `extract_affiliations` | Resolve organization affiliations to GRID/ROR identifiers |
|
|
49
|
+
| `extract_grants` | Resolve grant numbers to full grant records |
|
|
50
|
+
| `execute_dsl` | Execute raw Dimensions DSL queries (includes classify, extract concepts, similarity, etc.) |
|
|
51
|
+
|
|
52
|
+
### Schema Tools
|
|
53
|
+
|
|
54
|
+
| Tool | Description |
|
|
55
|
+
| ---- | ----------- |
|
|
56
|
+
| `describe_schema` | Summarize live describe schema (sources, entities, limits) |
|
|
57
|
+
| `refresh_schema` | Reload describe schema from the API |
|
|
58
|
+
|
|
59
|
+
### Removed in 0.5.0
|
|
60
|
+
|
|
61
|
+
Dedicated MCP tools for KWQ (`build_query`, `ensemble_queries`), NLP (`classify_text`, `extract_concepts`), similarity search, profile lookup, and `recent_high_impact` were removed. Use **`execute_dsl`** for those DSL capabilities.
|
|
62
|
+
|
|
63
|
+
## Quick Start
|
|
64
|
+
|
|
65
|
+
**Easiest** — one-line install (no clone required):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
curl -fsSL https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.sh | bash
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```powershell
|
|
72
|
+
irm https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.ps1 | iex
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
See [Installation](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md) for manual setup.
|
|
76
|
+
|
|
77
|
+
### Build from source (developers)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pnpm install
|
|
81
|
+
pnpm run build
|
|
82
|
+
export DIMENSIONS_API_KEY=your-key
|
|
83
|
+
node apps/mcp/dist/main.js # stdio
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Claude Desktop (stdio)
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"mcpServers": {
|
|
91
|
+
"dimensions": {
|
|
92
|
+
"command": "node",
|
|
93
|
+
"args": ["/path/to/dimensions-analytics-mcp/apps/mcp/dist/main.js"],
|
|
94
|
+
"env": {
|
|
95
|
+
"DIMENSIONS_API_KEY": "your-api-key"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Hosted remote MCP (coming soon)
|
|
103
|
+
|
|
104
|
+
A hosted Dimensions Analytics MCP endpoint (URL + Bearer token, no local install) is **not available yet**. We will announce it in the near future. See [Installation — Hosted Dimensions Analytics MCP](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md#hosted-dimensions-analytics-mcp-coming-soon).
|
|
105
|
+
|
|
106
|
+
## Examples and usage
|
|
107
|
+
|
|
108
|
+
**[Usage guide](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/USAGE.md)** — workflows, JSON tool examples, DSL snippets, and natural-language prompts.
|
|
109
|
+
|
|
110
|
+
Quick prompt examples:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
Find the top 10 most-cited publications about CRISPR from the last 5 years
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
Facet journals for "quantum computing" publications since 2020
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Documentation
|
|
121
|
+
|
|
122
|
+
**This package**
|
|
123
|
+
|
|
124
|
+
- [Usage guide](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/USAGE.md) — **start here** for examples
|
|
125
|
+
- [Deployment](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/DEPLOYMENT.md) — local stdio setup; hosted option (coming soon)
|
|
126
|
+
- [Configuration](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/CONFIGURATION.md) — env vars
|
|
127
|
+
- [MCP field aliases](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/MCP_FIELD_ALIASES.md) — alias reference for tool users
|
|
128
|
+
|
|
129
|
+
**Repository** ([dimensions-analytics-mcp](https://github.com/digital-science/dimensions-analytics-mcp))
|
|
130
|
+
|
|
131
|
+
- [Root README](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/README.md)
|
|
132
|
+
- [Installation](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md)
|
|
133
|
+
|
|
134
|
+
**External**
|
|
135
|
+
|
|
136
|
+
- [Dimensions API Docs](https://docs.dimensions.ai/)
|
|
137
|
+
- [Model Context Protocol spec](https://modelcontextprotocol.io/)
|
|
138
|
+
|
|
139
|
+
## Development
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
pnpm install # from repo root
|
|
143
|
+
pnpm run build
|
|
144
|
+
|
|
145
|
+
pnpm run test # unit + mock hosted e2e
|
|
146
|
+
pnpm run integration:smoke # live stdio smoke (DIMENSIONS_API_KEY)
|
|
147
|
+
pnpm run typecheck
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## License
|
|
151
|
+
|
|
152
|
+
MIT
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loaders for JWT AuthConfig.
|
|
3
|
+
* @module client/auth/config-loaders
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthConfig, JwtAuthConfig } from "./types.js";
|
|
6
|
+
/** Options for loading config from environment variables. */
|
|
7
|
+
export interface FromEnvOptions {
|
|
8
|
+
/** Env prefix (default `DIMENSIONS` → `DIMENSIONS_API_KEY`) */
|
|
9
|
+
prefix?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load JWT auth config from environment variables.
|
|
13
|
+
* @param type - Must be `"jwt"`
|
|
14
|
+
* @param options - Optional env prefix
|
|
15
|
+
* @returns Validated JwtAuthConfig
|
|
16
|
+
*/
|
|
17
|
+
export declare function fromEnv(type: "jwt", options?: FromEnvOptions): JwtAuthConfig;
|
|
18
|
+
/** Load JWT auth config from a JSON file. */
|
|
19
|
+
export declare function fromPath(filePath: string): AuthConfig;
|
|
20
|
+
/** Validate and return JWT auth config from an object. */
|
|
21
|
+
export declare function fromObject(obj: unknown): AuthConfig;
|
|
22
|
+
//# sourceMappingURL=config-loaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loaders.d.ts","sourceRoot":"","sources":["../../../src/client/auth/config-loaders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAwB5E;AAED,6CAA6C;AAC7C,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAoBrD;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAQnD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loaders for JWT AuthConfig.
|
|
3
|
+
* @module client/auth/config-loaders
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { ValidationError } from "../errors.js";
|
|
7
|
+
import { JwtAuthConfigSchema } from "./schemas.js";
|
|
8
|
+
/**
|
|
9
|
+
* Load JWT auth config from environment variables.
|
|
10
|
+
* @param type - Must be `"jwt"`
|
|
11
|
+
* @param options - Optional env prefix
|
|
12
|
+
* @returns Validated JwtAuthConfig
|
|
13
|
+
*/
|
|
14
|
+
export function fromEnv(type, options) {
|
|
15
|
+
if (type !== "jwt") {
|
|
16
|
+
throw new ValidationError("Only JWT auth is supported");
|
|
17
|
+
}
|
|
18
|
+
const envPrefix = options?.prefix ?? "DIMENSIONS";
|
|
19
|
+
const apiKey = process.env[`${envPrefix}_API_KEY`];
|
|
20
|
+
if (!apiKey) {
|
|
21
|
+
throw new ValidationError(`Missing required environment variable: ${envPrefix}_API_KEY`);
|
|
22
|
+
}
|
|
23
|
+
const authUrl = process.env[`${envPrefix}_AUTH_URL`];
|
|
24
|
+
const tokenCacheDuration = process.env[`${envPrefix}_TOKEN_CACHE_DURATION`];
|
|
25
|
+
const timeout = process.env[`${envPrefix}_TIMEOUT`];
|
|
26
|
+
return {
|
|
27
|
+
type: "jwt",
|
|
28
|
+
apiKey,
|
|
29
|
+
...(authUrl && { authUrl }),
|
|
30
|
+
...(tokenCacheDuration && {
|
|
31
|
+
tokenCacheDuration: Number.parseInt(tokenCacheDuration, 10),
|
|
32
|
+
}),
|
|
33
|
+
...(timeout && { timeout: Number.parseInt(timeout, 10) }),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Load JWT auth config from a JSON file. */
|
|
37
|
+
export function fromPath(filePath) {
|
|
38
|
+
let fileContent;
|
|
39
|
+
try {
|
|
40
|
+
fileContent = readFileSync(filePath, "utf-8");
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
throw new ValidationError(`Failed to read config file: ${filePath}`, {
|
|
44
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(fileContent);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new ValidationError(`Invalid JSON in config file: ${filePath}`, {
|
|
53
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return fromObject(parsed);
|
|
57
|
+
}
|
|
58
|
+
/** Validate and return JWT auth config from an object. */
|
|
59
|
+
export function fromObject(obj) {
|
|
60
|
+
const parseResult = JwtAuthConfigSchema.safeParse(obj);
|
|
61
|
+
if (!parseResult.success) {
|
|
62
|
+
throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
|
|
63
|
+
issues: parseResult.error.issues,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return parseResult.data;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config-loaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loaders.js","sourceRoot":"","sources":["../../../src/client/auth/config-loaders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AASnD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAW,EAAE,OAAwB;IAC3D,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,eAAe,CAAC,0CAA0C,SAAS,UAAU,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,WAAW,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,uBAAuB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,MAAM;QACN,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,kBAAkB,IAAI;YACxB,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC5D,CAAC;QACF,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,+BAA+B,QAAQ,EAAE,EAAE;YACnE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,gCAAgC,QAAQ,EAAE,EAAE;YACpE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,+BAA+B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/auth/decorators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/client/auth/decorators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caching decorator for AuthProvider.
|
|
3
|
+
* @module core/auth/decorators/with-caching
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthProvider } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration options for the caching decorator.
|
|
8
|
+
*/
|
|
9
|
+
export interface CachingOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Cache duration in milliseconds.
|
|
12
|
+
* Headers will be refreshed after this time.
|
|
13
|
+
* @default 3600000 (1 hour)
|
|
14
|
+
*/
|
|
15
|
+
cacheDurationMs?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Buffer before expiry to trigger refresh, as a decimal (0-1).
|
|
18
|
+
* E.g., 0.1 means refresh when 90% of TTL has passed.
|
|
19
|
+
* @default 0.1
|
|
20
|
+
*/
|
|
21
|
+
expiryBuffer?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Initial backoff delay in milliseconds after a failed fetch.
|
|
24
|
+
* Grows exponentially on consecutive failures up to {@link failureBackoffMaxMs}.
|
|
25
|
+
* @default 1000
|
|
26
|
+
*/
|
|
27
|
+
failureBackoffMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Maximum backoff delay in milliseconds. Caps exponential growth.
|
|
30
|
+
* @default 60000
|
|
31
|
+
*/
|
|
32
|
+
failureBackoffMaxMs?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Multiplication factor applied to the base delay on each consecutive failure.
|
|
35
|
+
* Set to 1 for flat (non-exponential) backoff.
|
|
36
|
+
* @default 2
|
|
37
|
+
*/
|
|
38
|
+
failureBackoffFactor?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Jitter as a fraction of the computed delay (0–1), e.g. 0.1 = ±10%.
|
|
41
|
+
* Prevents thundering herd by spreading retry times across clients.
|
|
42
|
+
* Set to 0 for deterministic delays (useful in tests).
|
|
43
|
+
* @default 0.1
|
|
44
|
+
*/
|
|
45
|
+
failureBackoffJitter?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Wraps an AuthProvider with caching behavior.
|
|
49
|
+
*
|
|
50
|
+
* Features:
|
|
51
|
+
* - Caches getHeaders() results with configurable TTL
|
|
52
|
+
* - Deduplicates concurrent calls (reuses in-flight promise)
|
|
53
|
+
* - Calls underlying provider's getHeaders() when cache expires
|
|
54
|
+
* - Propagates errors (no stale fallback)
|
|
55
|
+
* - Implements exponential backoff with jitter after failures to prevent thundering herd
|
|
56
|
+
*
|
|
57
|
+
* @param provider - The AuthProvider to wrap
|
|
58
|
+
* @param options - Caching configuration
|
|
59
|
+
* @returns A new AuthProvider with caching behavior
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const baseProvider = new JwtAuthProvider(config);
|
|
64
|
+
* const cachedProvider = withCaching(baseProvider, {
|
|
65
|
+
* cacheDurationMs: 3600000, // 1 hour
|
|
66
|
+
* expiryBuffer: 0.1, // Refresh at 90% of TTL
|
|
67
|
+
* failureBackoffMs: 1000, // Initial backoff: 1s
|
|
68
|
+
* failureBackoffMaxMs: 60000, // Cap at 60s
|
|
69
|
+
* failureBackoffFactor: 2, // Double each failure: 1s, 2s, 4s, 8s...
|
|
70
|
+
* failureBackoffJitter: 0.1, // ±10% jitter
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // First call fetches headers
|
|
74
|
+
* const headers1 = await cachedProvider.getHeaders();
|
|
75
|
+
*
|
|
76
|
+
* // Subsequent calls return cached value
|
|
77
|
+
* const headers2 = await cachedProvider.getHeaders();
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function withCaching(provider: AuthProvider, options?: CachingOptions): AuthProvider;
|
|
81
|
+
//# sourceMappingURL=with-caching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-caching.d.ts","sourceRoot":"","sources":["../../../../src/client/auth/decorators/with-caching.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,CAmI1F"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caching decorator for AuthProvider.
|
|
3
|
+
* @module core/auth/decorators/with-caching
|
|
4
|
+
*/
|
|
5
|
+
/** Default cache duration: 1 hour */
|
|
6
|
+
const DEFAULT_CACHE_DURATION_MS = 3600000;
|
|
7
|
+
/** Default expiry buffer: 10% */
|
|
8
|
+
const DEFAULT_EXPIRY_BUFFER = 0.1;
|
|
9
|
+
/** Default failure backoff: 1 second */
|
|
10
|
+
const DEFAULT_FAILURE_BACKOFF_MS = 1000;
|
|
11
|
+
/** Default max backoff delay: 60 seconds */
|
|
12
|
+
const DEFAULT_FAILURE_BACKOFF_MAX_MS = 60_000;
|
|
13
|
+
/** Default backoff multiplication factor */
|
|
14
|
+
const DEFAULT_FAILURE_BACKOFF_FACTOR = 2;
|
|
15
|
+
/** Default jitter fraction: ±10% */
|
|
16
|
+
const DEFAULT_FAILURE_BACKOFF_JITTER = 0.1;
|
|
17
|
+
/**
|
|
18
|
+
* Wraps an AuthProvider with caching behavior.
|
|
19
|
+
*
|
|
20
|
+
* Features:
|
|
21
|
+
* - Caches getHeaders() results with configurable TTL
|
|
22
|
+
* - Deduplicates concurrent calls (reuses in-flight promise)
|
|
23
|
+
* - Calls underlying provider's getHeaders() when cache expires
|
|
24
|
+
* - Propagates errors (no stale fallback)
|
|
25
|
+
* - Implements exponential backoff with jitter after failures to prevent thundering herd
|
|
26
|
+
*
|
|
27
|
+
* @param provider - The AuthProvider to wrap
|
|
28
|
+
* @param options - Caching configuration
|
|
29
|
+
* @returns A new AuthProvider with caching behavior
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const baseProvider = new JwtAuthProvider(config);
|
|
34
|
+
* const cachedProvider = withCaching(baseProvider, {
|
|
35
|
+
* cacheDurationMs: 3600000, // 1 hour
|
|
36
|
+
* expiryBuffer: 0.1, // Refresh at 90% of TTL
|
|
37
|
+
* failureBackoffMs: 1000, // Initial backoff: 1s
|
|
38
|
+
* failureBackoffMaxMs: 60000, // Cap at 60s
|
|
39
|
+
* failureBackoffFactor: 2, // Double each failure: 1s, 2s, 4s, 8s...
|
|
40
|
+
* failureBackoffJitter: 0.1, // ±10% jitter
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // First call fetches headers
|
|
44
|
+
* const headers1 = await cachedProvider.getHeaders();
|
|
45
|
+
*
|
|
46
|
+
* // Subsequent calls return cached value
|
|
47
|
+
* const headers2 = await cachedProvider.getHeaders();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function withCaching(provider, options) {
|
|
51
|
+
const cacheDurationMs = options?.cacheDurationMs ?? DEFAULT_CACHE_DURATION_MS;
|
|
52
|
+
const expiryBuffer = options?.expiryBuffer ?? DEFAULT_EXPIRY_BUFFER;
|
|
53
|
+
const failureBackoffMs = options?.failureBackoffMs ?? DEFAULT_FAILURE_BACKOFF_MS;
|
|
54
|
+
const failureBackoffMaxMs = options?.failureBackoffMaxMs ?? DEFAULT_FAILURE_BACKOFF_MAX_MS;
|
|
55
|
+
const failureBackoffFactor = options?.failureBackoffFactor ?? DEFAULT_FAILURE_BACKOFF_FACTOR;
|
|
56
|
+
const failureBackoffJitter = options?.failureBackoffJitter ?? DEFAULT_FAILURE_BACKOFF_JITTER;
|
|
57
|
+
let cachedHeaders = null;
|
|
58
|
+
let cacheExpiry = 0;
|
|
59
|
+
let refreshPromise = null;
|
|
60
|
+
let failureCount = 0;
|
|
61
|
+
let backoffDeadline = 0;
|
|
62
|
+
/**
|
|
63
|
+
* Calculate the effective expiry time with buffer.
|
|
64
|
+
* @param durationMs - Full cache duration
|
|
65
|
+
* @returns Expiry timestamp with buffer applied
|
|
66
|
+
*/
|
|
67
|
+
const calculateExpiry = (durationMs) => {
|
|
68
|
+
// Buffer is at least 1 minute, but never more than 90% of duration
|
|
69
|
+
const bufferMs = Math.min(Math.max(durationMs * expiryBuffer, 60000), durationMs * 0.9);
|
|
70
|
+
return Date.now() + durationMs - bufferMs;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Calculates the backoff delay for a given consecutive failure count.
|
|
74
|
+
* Uses exponential backoff with multiplicative jitter.
|
|
75
|
+
* @param count - Number of consecutive failures (must be >= 1)
|
|
76
|
+
* @returns Delay in milliseconds
|
|
77
|
+
*/
|
|
78
|
+
const calculateBackoffDelay = (count) => {
|
|
79
|
+
const base = Math.min(failureBackoffMs * failureBackoffFactor ** (count - 1), failureBackoffMaxMs);
|
|
80
|
+
const jittered = base * (1 + (Math.random() - 0.5) * 2 * failureBackoffJitter);
|
|
81
|
+
return Math.max(0, jittered);
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Check if we're in a backoff period after a failure.
|
|
85
|
+
* @returns True if still in backoff period
|
|
86
|
+
*/
|
|
87
|
+
const isInBackoffPeriod = () => {
|
|
88
|
+
if (backoffDeadline === 0)
|
|
89
|
+
return false;
|
|
90
|
+
return Date.now() < backoffDeadline;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Fetch fresh headers from the underlying provider.
|
|
94
|
+
*
|
|
95
|
+
* Calls getHeaders() directly rather than refresh() + getHeaders().
|
|
96
|
+
* The provider's getHeaders() is self-sufficient (fetches a token when
|
|
97
|
+
* needed), so an explicit refresh() is unnecessary and creates a race
|
|
98
|
+
* window where invalidate() between the two calls triggers a redundant
|
|
99
|
+
* token fetch.
|
|
100
|
+
*
|
|
101
|
+
* @returns Fresh headers
|
|
102
|
+
*/
|
|
103
|
+
const fetchHeaders = async () => {
|
|
104
|
+
try {
|
|
105
|
+
const headers = await provider.getHeaders();
|
|
106
|
+
cachedHeaders = headers;
|
|
107
|
+
cacheExpiry = calculateExpiry(cacheDurationMs);
|
|
108
|
+
failureCount = 0;
|
|
109
|
+
backoffDeadline = 0;
|
|
110
|
+
return headers;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
failureCount += 1;
|
|
114
|
+
backoffDeadline = Date.now() + calculateBackoffDelay(failureCount);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const wrapper = {
|
|
119
|
+
get type() {
|
|
120
|
+
return provider.type;
|
|
121
|
+
},
|
|
122
|
+
async initialize() {
|
|
123
|
+
await provider.initialize();
|
|
124
|
+
},
|
|
125
|
+
async getHeaders() {
|
|
126
|
+
// Return cached headers if valid
|
|
127
|
+
if (cachedHeaders && Date.now() < cacheExpiry) {
|
|
128
|
+
return cachedHeaders;
|
|
129
|
+
}
|
|
130
|
+
// If already refreshing, wait for that promise
|
|
131
|
+
if (refreshPromise) {
|
|
132
|
+
return refreshPromise;
|
|
133
|
+
}
|
|
134
|
+
// Check backoff period - if in backoff, rethrow if no cache
|
|
135
|
+
if (isInBackoffPeriod()) {
|
|
136
|
+
if (cachedHeaders) {
|
|
137
|
+
// Return stale cache during backoff rather than failing
|
|
138
|
+
return cachedHeaders;
|
|
139
|
+
}
|
|
140
|
+
// No cache available and in backoff - we must try anyway
|
|
141
|
+
}
|
|
142
|
+
// Fetch new headers
|
|
143
|
+
refreshPromise = fetchHeaders();
|
|
144
|
+
try {
|
|
145
|
+
return await refreshPromise;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
refreshPromise = null;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
async refresh() {
|
|
152
|
+
cachedHeaders = null;
|
|
153
|
+
cacheExpiry = 0;
|
|
154
|
+
failureCount = 0;
|
|
155
|
+
backoffDeadline = 0;
|
|
156
|
+
await provider.refresh();
|
|
157
|
+
},
|
|
158
|
+
invalidate() {
|
|
159
|
+
cachedHeaders = null;
|
|
160
|
+
cacheExpiry = 0;
|
|
161
|
+
failureCount = 0;
|
|
162
|
+
backoffDeadline = 0;
|
|
163
|
+
provider.invalidate();
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
return wrapper;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=with-caching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-caching.js","sourceRoot":"","sources":["../../../../src/client/auth/decorators/with-caching.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory function for creating JWT AuthProvider instances.
|
|
3
|
+
* @module client/auth/factory
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthProvider, JwtAuthConfig } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a JWT AuthProvider with token caching.
|
|
8
|
+
* @param config - JWT authentication configuration
|
|
9
|
+
* @returns Configured AuthProvider instance
|
|
10
|
+
* @throws {ValidationError} If the configuration is invalid
|
|
11
|
+
*/
|
|
12
|
+
export declare function createAuthProvider(config: JwtAuthConfig): AuthProvider;
|
|
13
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/client/auth/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK9D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAatE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory function for creating JWT AuthProvider instances.
|
|
3
|
+
* @module client/auth/factory
|
|
4
|
+
*/
|
|
5
|
+
import { ValidationError } from "../errors.js";
|
|
6
|
+
import { withCaching } from "./decorators/index.js";
|
|
7
|
+
import { JwtAuthProvider } from "./providers/jwt-auth-provider.js";
|
|
8
|
+
import { JwtAuthConfigSchema } from "./schemas.js";
|
|
9
|
+
/** Default token cache duration for JWT: 1 hour */
|
|
10
|
+
const DEFAULT_TOKEN_CACHE_DURATION_MS = 3600000;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a JWT AuthProvider with token caching.
|
|
13
|
+
* @param config - JWT authentication configuration
|
|
14
|
+
* @returns Configured AuthProvider instance
|
|
15
|
+
* @throws {ValidationError} If the configuration is invalid
|
|
16
|
+
*/
|
|
17
|
+
export function createAuthProvider(config) {
|
|
18
|
+
const parseResult = JwtAuthConfigSchema.safeParse(config);
|
|
19
|
+
if (!parseResult.success) {
|
|
20
|
+
throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
|
|
21
|
+
issues: parseResult.error.issues,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const validConfig = parseResult.data;
|
|
25
|
+
const jwtProvider = new JwtAuthProvider(validConfig);
|
|
26
|
+
const cacheDurationMs = (validConfig.tokenCacheDuration ?? 3600) * 1000 || DEFAULT_TOKEN_CACHE_DURATION_MS;
|
|
27
|
+
return withCaching(jwtProvider, { cacheDurationMs });
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/client/auth/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,mDAAmD;AACnD,MAAM,+BAA+B,GAAG,OAAO,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,+BAA+B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;SACjC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,eAAe,GACnB,CAAC,WAAW,CAAC,kBAAkB,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,+BAA+B,CAAC;IACrF,OAAO,WAAW,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,CAAC"}
|