@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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module test/funder-org-names
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, it } from "vitest";
|
|
6
|
+
import { resolveFunderOrgName } from "../src/mcp/funder-org-names.js";
|
|
7
|
+
|
|
8
|
+
describe("resolveFunderOrgName", () => {
|
|
9
|
+
it("resolves common acronyms case-insensitively", () => {
|
|
10
|
+
expect(resolveFunderOrgName("NCI")).toBe("National Cancer Institute");
|
|
11
|
+
expect(resolveFunderOrgName("nci")).toBe("National Cancer Institute");
|
|
12
|
+
expect(resolveFunderOrgName("NSF")).toBe("National Science Foundation");
|
|
13
|
+
expect(resolveFunderOrgName("NIH")).toBe("National Institutes of Health");
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("passes through unknown names unchanged", () => {
|
|
17
|
+
expect(resolveFunderOrgName("European Commission")).toBe("European Commission");
|
|
18
|
+
expect(resolveFunderOrgName(" Custom Funder ")).toBe("Custom Funder");
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helper providing a pre-loaded {@link SchemaStore} from fixture data.
|
|
3
|
+
* @module test/helpers/schema-fixture
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
createSchemaStoreFromResponse,
|
|
8
|
+
type DescribeSchemaResponse,
|
|
9
|
+
} from "../../src/mcp/schema/index.js";
|
|
10
|
+
import fixture from "../fixtures/describe-schema.json";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns a schema store built from the committed describe fixture.
|
|
14
|
+
* @returns Schema store for unit tests
|
|
15
|
+
*/
|
|
16
|
+
export function testSchemaStore() {
|
|
17
|
+
return createSchemaStoreFromResponse(fixture as DescribeSchemaResponse, "2.15.0");
|
|
18
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test harness for MCP tool handlers.
|
|
3
|
+
* Captures tool registrations from register*Tools() functions and provides
|
|
4
|
+
* helpers to invoke handlers directly without MCP SDK transport overhead.
|
|
5
|
+
* @module test/helpers/tool-test-harness
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { vi } from "vitest";
|
|
9
|
+
import { QueryBuilder } from "../../src/dsl/index.js";
|
|
10
|
+
import type { ToolResult } from "../../src/mcp/utils.js";
|
|
11
|
+
import { testSchemaStore } from "./schema-fixture.js";
|
|
12
|
+
|
|
13
|
+
/** Captured tool handler function signature. */
|
|
14
|
+
type ToolHandler = (
|
|
15
|
+
args: Record<string, unknown>,
|
|
16
|
+
extra?: Record<string, unknown>,
|
|
17
|
+
) => Promise<ToolResult>;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates a mock McpServer that captures `.tool()` and `.registerTool()` registrations into a Map.
|
|
21
|
+
* @returns Object with the mock server and a Map of tool name to handler
|
|
22
|
+
*/
|
|
23
|
+
export function createMockServer() {
|
|
24
|
+
const handlers = new Map<string, ToolHandler>();
|
|
25
|
+
|
|
26
|
+
const registerTool = vi.fn((name: string, _config: unknown, handler: ToolHandler) => {
|
|
27
|
+
handlers.set(name, (args, extra) => handler(args, extra));
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const server = {
|
|
31
|
+
// Legacy — kept for backward compatibility during migration
|
|
32
|
+
tool: vi.fn(
|
|
33
|
+
(
|
|
34
|
+
name: string,
|
|
35
|
+
_descriptionOrSchema: unknown,
|
|
36
|
+
schemaOrHandler: unknown,
|
|
37
|
+
maybeHandler?: unknown,
|
|
38
|
+
) => {
|
|
39
|
+
// server.tool() has two overloads:
|
|
40
|
+
// tool(name, description, schema, handler)
|
|
41
|
+
// tool(name, schema, handler)
|
|
42
|
+
const handler = (maybeHandler ?? schemaOrHandler) as ToolHandler;
|
|
43
|
+
handlers.set(name, handler);
|
|
44
|
+
},
|
|
45
|
+
),
|
|
46
|
+
registerTool,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return { server, handlers };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Creates a mock DimensionsClient with vi.fn() stubs for all methods
|
|
54
|
+
* used by the tool handlers.
|
|
55
|
+
* @returns Mock client with spyable methods
|
|
56
|
+
*/
|
|
57
|
+
export function createMockClient() {
|
|
58
|
+
const schemaStore = testSchemaStore();
|
|
59
|
+
const mockBuilder = {
|
|
60
|
+
where: vi.fn().mockReturnThis(),
|
|
61
|
+
fields: vi.fn().mockReturnThis(),
|
|
62
|
+
limit: vi.fn().mockReturnThis(),
|
|
63
|
+
forSimilar: vi.fn().mockReturnThis(),
|
|
64
|
+
execute: vi.fn().mockResolvedValue({ totalCount: 0, data: [] }),
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
createQueryBuilder: vi.fn(() => new QueryBuilder(schemaStore)),
|
|
69
|
+
attachSchemaStore: vi.fn(),
|
|
70
|
+
rawQuery: vi.fn().mockResolvedValue({}),
|
|
71
|
+
send: vi.fn().mockResolvedValue({}),
|
|
72
|
+
classify: vi.fn().mockResolvedValue({}),
|
|
73
|
+
extractConcepts: vi.fn().mockResolvedValue({ extracted_concepts: [] }),
|
|
74
|
+
extractAffiliations: vi.fn().mockResolvedValue({ extracted_affiliations: [] }),
|
|
75
|
+
extractGrants: vi.fn().mockResolvedValue({ extracted_grants: [] }),
|
|
76
|
+
publications: vi.fn().mockReturnValue(mockBuilder),
|
|
77
|
+
grants: vi.fn().mockReturnValue(mockBuilder),
|
|
78
|
+
/** Access the fluent builder mock for assertions. */
|
|
79
|
+
_builder: mockBuilder,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Invokes a captured tool handler by name.
|
|
85
|
+
* @param handlers - Map of tool handlers from createMockServer()
|
|
86
|
+
* @param name - Tool name to invoke
|
|
87
|
+
* @param args - Arguments to pass to the handler
|
|
88
|
+
* @returns The raw tool result
|
|
89
|
+
*/
|
|
90
|
+
export async function callTool(
|
|
91
|
+
handlers: Map<string, ToolHandler>,
|
|
92
|
+
name: string,
|
|
93
|
+
args: Record<string, unknown> = {},
|
|
94
|
+
extra?: Record<string, unknown>,
|
|
95
|
+
): Promise<ToolResult> {
|
|
96
|
+
const handler = handlers.get(name);
|
|
97
|
+
if (!handler) {
|
|
98
|
+
throw new Error(`Tool "${name}" not registered. Available: ${[...handlers.keys()].join(", ")}`);
|
|
99
|
+
}
|
|
100
|
+
return handler(args, extra);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Parses the JSON payload from a tool result envelope.
|
|
105
|
+
* @param result - The raw tool result from callTool()
|
|
106
|
+
* @returns Parsed JSON data from the text content
|
|
107
|
+
*/
|
|
108
|
+
export function parseToolResult(result: ToolResult): Record<string, unknown> {
|
|
109
|
+
const text = result.content[0]?.text;
|
|
110
|
+
if (!text) {
|
|
111
|
+
throw new Error("Tool result has no text content");
|
|
112
|
+
}
|
|
113
|
+
return JSON.parse(text) as Record<string, unknown>;
|
|
114
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assertion factory functions for MCP eval cases.
|
|
3
|
+
*
|
|
4
|
+
* Each function returns an {@link Assertion} object with a label and a check
|
|
5
|
+
* function. The check receives the parsed JSON output from a tool call.
|
|
6
|
+
* @module test/integration/assertions
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Assertion } from "./types.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a dot-separated path on an unknown value.
|
|
13
|
+
* @param data - Root object
|
|
14
|
+
* @param path - Dot-separated path (e.g., "publications.0.title")
|
|
15
|
+
* @returns The resolved value, or `undefined` if the path does not exist
|
|
16
|
+
*/
|
|
17
|
+
function resolvePath(data: unknown, path: string): unknown {
|
|
18
|
+
let current: unknown = data;
|
|
19
|
+
for (const segment of path.split(".")) {
|
|
20
|
+
if (current == null || typeof current !== "object") return undefined;
|
|
21
|
+
current = (current as Record<string, unknown>)[segment];
|
|
22
|
+
}
|
|
23
|
+
return current;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Asserts the result is not an error (no `isError` flag, no `error` field at top level).
|
|
28
|
+
* @returns Assertion
|
|
29
|
+
*/
|
|
30
|
+
export function isSuccess(): Assertion {
|
|
31
|
+
return {
|
|
32
|
+
label: "result is not an error",
|
|
33
|
+
check(data) {
|
|
34
|
+
const obj = data as Record<string, unknown>;
|
|
35
|
+
if (obj.error) return `Got error: ${String(obj.error)}`;
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Asserts a field at the given path exists (is not undefined).
|
|
43
|
+
* @param path - Dot-separated path
|
|
44
|
+
* @returns Assertion
|
|
45
|
+
*/
|
|
46
|
+
export function hasField(path: string): Assertion {
|
|
47
|
+
return {
|
|
48
|
+
label: `has field "${path}"`,
|
|
49
|
+
check(data) {
|
|
50
|
+
const value = resolvePath(data, path);
|
|
51
|
+
if (value === undefined) return `Field "${path}" is missing`;
|
|
52
|
+
return true;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Asserts a field at the given path equals the expected value.
|
|
59
|
+
* @param path - Dot-separated path
|
|
60
|
+
* @param expected - Expected value (compared with ===)
|
|
61
|
+
* @returns Assertion
|
|
62
|
+
*/
|
|
63
|
+
export function fieldEquals(path: string, expected: unknown): Assertion {
|
|
64
|
+
return {
|
|
65
|
+
label: `"${path}" === ${JSON.stringify(expected)}`,
|
|
66
|
+
check(data) {
|
|
67
|
+
const value = resolvePath(data, path);
|
|
68
|
+
if (value !== expected) {
|
|
69
|
+
return `Expected "${path}" to be ${JSON.stringify(expected)}, got ${JSON.stringify(value)}`;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Asserts a string field at the given path contains a substring (case-insensitive).
|
|
78
|
+
* @param path - Dot-separated path
|
|
79
|
+
* @param substring - Expected substring
|
|
80
|
+
* @returns Assertion
|
|
81
|
+
*/
|
|
82
|
+
export function fieldContains(path: string, substring: string): Assertion {
|
|
83
|
+
return {
|
|
84
|
+
label: `"${path}" contains "${substring}"`,
|
|
85
|
+
check(data) {
|
|
86
|
+
const value = resolvePath(data, path);
|
|
87
|
+
if (typeof value !== "string") {
|
|
88
|
+
return `Expected "${path}" to be a string, got ${typeof value}`;
|
|
89
|
+
}
|
|
90
|
+
if (!value.toLowerCase().includes(substring.toLowerCase())) {
|
|
91
|
+
return `"${path}" does not contain "${substring}" (got "${value.slice(0, 200)}")`;
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Asserts a string field at the given path matches a regex.
|
|
100
|
+
* @param path - Dot-separated path
|
|
101
|
+
* @param pattern - Regular expression
|
|
102
|
+
* @returns Assertion
|
|
103
|
+
*/
|
|
104
|
+
export function fieldMatches(path: string, pattern: RegExp): Assertion {
|
|
105
|
+
return {
|
|
106
|
+
label: `"${path}" matches ${pattern}`,
|
|
107
|
+
check(data) {
|
|
108
|
+
const value = resolvePath(data, path);
|
|
109
|
+
if (typeof value !== "string") {
|
|
110
|
+
return `Expected "${path}" to be a string, got ${typeof value}`;
|
|
111
|
+
}
|
|
112
|
+
if (!pattern.test(value)) {
|
|
113
|
+
return `"${path}" does not match ${pattern} (got "${value.slice(0, 200)}")`;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Asserts the value at the given path is an array with at least `min` items.
|
|
122
|
+
* @param path - Dot-separated path
|
|
123
|
+
* @param min - Minimum array length
|
|
124
|
+
* @returns Assertion
|
|
125
|
+
*/
|
|
126
|
+
export function arrayMinLength(path: string, min: number): Assertion {
|
|
127
|
+
return {
|
|
128
|
+
label: `"${path}" has at least ${min} items`,
|
|
129
|
+
check(data) {
|
|
130
|
+
const value = resolvePath(data, path);
|
|
131
|
+
if (!Array.isArray(value)) {
|
|
132
|
+
return `Expected "${path}" to be an array, got ${typeof value}`;
|
|
133
|
+
}
|
|
134
|
+
if (value.length < min) {
|
|
135
|
+
return `"${path}" has ${value.length} items, expected at least ${min}`;
|
|
136
|
+
}
|
|
137
|
+
return true;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Asserts a numeric field at the given path is greater than a threshold.
|
|
144
|
+
* @param path - Dot-separated path
|
|
145
|
+
* @param threshold - Minimum exclusive value
|
|
146
|
+
* @returns Assertion
|
|
147
|
+
*/
|
|
148
|
+
export function fieldGreaterThan(path: string, threshold: number): Assertion {
|
|
149
|
+
return {
|
|
150
|
+
label: `"${path}" > ${threshold}`,
|
|
151
|
+
check(data) {
|
|
152
|
+
const value = resolvePath(data, path);
|
|
153
|
+
if (typeof value !== "number") {
|
|
154
|
+
return `Expected "${path}" to be a number, got ${typeof value}`;
|
|
155
|
+
}
|
|
156
|
+
if (value <= threshold) {
|
|
157
|
+
return `"${path}" is ${value}, expected > ${threshold}`;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Asserts a numeric field at the given path is at least a threshold.
|
|
166
|
+
* @param path - Dot-separated path
|
|
167
|
+
* @param threshold - Minimum inclusive value
|
|
168
|
+
* @returns Assertion
|
|
169
|
+
*/
|
|
170
|
+
export function fieldAtLeast(path: string, threshold: number): Assertion {
|
|
171
|
+
return {
|
|
172
|
+
label: `"${path}" >= ${threshold}`,
|
|
173
|
+
check(data) {
|
|
174
|
+
const value = resolvePath(data, path);
|
|
175
|
+
if (typeof value !== "number") {
|
|
176
|
+
return `Expected "${path}" to be a number, got ${typeof value}`;
|
|
177
|
+
}
|
|
178
|
+
if (value < threshold) {
|
|
179
|
+
return `"${path}" is ${value}, expected >= ${threshold}`;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Asserts the value at the given path is one of the allowed values.
|
|
188
|
+
* @param path - Dot-separated path
|
|
189
|
+
* @param allowed - Set of allowed values
|
|
190
|
+
* @returns Assertion
|
|
191
|
+
*/
|
|
192
|
+
export function fieldOneOf(path: string, allowed: readonly unknown[]): Assertion {
|
|
193
|
+
return {
|
|
194
|
+
label: `"${path}" is one of [${allowed.map((v) => JSON.stringify(v)).join(", ")}]`,
|
|
195
|
+
check(data) {
|
|
196
|
+
const value = resolvePath(data, path);
|
|
197
|
+
if (!allowed.includes(value)) {
|
|
198
|
+
return `"${path}" is ${JSON.stringify(value)}, expected one of [${allowed.map((v) => JSON.stringify(v)).join(", ")}]`;
|
|
199
|
+
}
|
|
200
|
+
return true;
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Asserts that every element of the array at `path` satisfies all given assertions.
|
|
207
|
+
* @param path - Dot-separated path to an array
|
|
208
|
+
* @param itemAssertions - Assertions to apply to each item
|
|
209
|
+
* @returns Assertion
|
|
210
|
+
*/
|
|
211
|
+
export function everyItem(path: string, itemAssertions: readonly Assertion[]): Assertion {
|
|
212
|
+
return {
|
|
213
|
+
label: `every item in "${path}" passes ${itemAssertions.length} assertions`,
|
|
214
|
+
check(data) {
|
|
215
|
+
const value = resolvePath(data, path);
|
|
216
|
+
if (!Array.isArray(value)) {
|
|
217
|
+
return `Expected "${path}" to be an array, got ${typeof value}`;
|
|
218
|
+
}
|
|
219
|
+
for (let i = 0; i < value.length; i++) {
|
|
220
|
+
for (const assertion of itemAssertions) {
|
|
221
|
+
const result = assertion.check(value[i]);
|
|
222
|
+
if (result !== true) {
|
|
223
|
+
return `Item [${i}] failed "${assertion.label}": ${result}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return true;
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Asserts that at least one element of the array at `path` satisfies all given assertions.
|
|
234
|
+
* @param path - Dot-separated path to an array
|
|
235
|
+
* @param itemAssertions - Assertions to apply
|
|
236
|
+
* @returns Assertion
|
|
237
|
+
*/
|
|
238
|
+
export function someItem(path: string, itemAssertions: readonly Assertion[]): Assertion {
|
|
239
|
+
return {
|
|
240
|
+
label: `some item in "${path}" passes all assertions`,
|
|
241
|
+
check(data) {
|
|
242
|
+
const value = resolvePath(data, path);
|
|
243
|
+
if (!Array.isArray(value)) {
|
|
244
|
+
return `Expected "${path}" to be an array, got ${typeof value}`;
|
|
245
|
+
}
|
|
246
|
+
for (const item of value) {
|
|
247
|
+
const allPass = itemAssertions.every((a) => a.check(item) === true);
|
|
248
|
+
if (allPass) return true;
|
|
249
|
+
}
|
|
250
|
+
return `No item in "${path}" (${value.length} items) satisfied all assertions`;
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Custom assertion with a user-provided check function.
|
|
257
|
+
* @param label - Human-readable label
|
|
258
|
+
* @param check - Check function
|
|
259
|
+
* @returns Assertion
|
|
260
|
+
*/
|
|
261
|
+
export function custom(label: string, check: (data: unknown) => true | string): Assertion {
|
|
262
|
+
return { label, check };
|
|
263
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable helpers for live integration and hosted e2e tests.
|
|
3
|
+
* @module test/integration/env
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { HostedEnvConfig } from "../../src/client/deployment-config.js";
|
|
7
|
+
import { loadDeploymentConfig } from "../../src/client/deployment-config.js";
|
|
8
|
+
|
|
9
|
+
/** Env vars required for local (stdio) MCP integration smoke tests. */
|
|
10
|
+
export const LOCAL_INTEGRATION_ENV_VARS = ["DIMENSIONS_API_KEY"] as const;
|
|
11
|
+
|
|
12
|
+
/** Env vars required for hosted MCP integration smoke tests (live backends). */
|
|
13
|
+
export const HOSTED_INTEGRATION_ENV_VARS = [
|
|
14
|
+
"DIMENSIONS_API_KEY",
|
|
15
|
+
"DSL_SERVICE_URL",
|
|
16
|
+
"DSL_SERVICE_USERNAME",
|
|
17
|
+
"DSL_SERVICE_PASSWORD",
|
|
18
|
+
"DSL_SCHEMA",
|
|
19
|
+
"DSL_HOST",
|
|
20
|
+
"DSL_VARIANT",
|
|
21
|
+
"RADAR_AUTH_URL",
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
/** Optional env vars for hosted integration. */
|
|
25
|
+
export const HOSTED_INTEGRATION_OPTIONAL_ENV_VARS = [
|
|
26
|
+
"HOSTED_MCP_BASE_URL",
|
|
27
|
+
"SCHEMA_CACHE_PATH",
|
|
28
|
+
"MCP_HTTP_PORT",
|
|
29
|
+
] as const;
|
|
30
|
+
|
|
31
|
+
export type LocalIntegrationEnvVar = (typeof LOCAL_INTEGRATION_ENV_VARS)[number];
|
|
32
|
+
export type HostedIntegrationEnvVar = (typeof HOSTED_INTEGRATION_ENV_VARS)[number];
|
|
33
|
+
|
|
34
|
+
export interface LocalIntegrationConfig {
|
|
35
|
+
readonly apiKey: string;
|
|
36
|
+
readonly baseUrl?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface HostedIntegrationConfig {
|
|
40
|
+
readonly apiKey: string;
|
|
41
|
+
readonly hosted: HostedEnvConfig;
|
|
42
|
+
/** When set, tests hit this base URL instead of starting an in-process HTTP server. */
|
|
43
|
+
readonly remoteBaseUrl?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Returns env var names from `required` that are unset or empty.
|
|
48
|
+
*/
|
|
49
|
+
export function missingEnvVars(required: readonly string[]): string[] {
|
|
50
|
+
return required.filter((name) => !process.env[name]?.trim());
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns true when local integration smoke can run.
|
|
55
|
+
*/
|
|
56
|
+
export function isLocalIntegrationConfigured(): boolean {
|
|
57
|
+
return missingEnvVars(LOCAL_INTEGRATION_ENV_VARS).length === 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Returns true when hosted integration smoke can run against live backends.
|
|
62
|
+
*/
|
|
63
|
+
export function isHostedIntegrationConfigured(): boolean {
|
|
64
|
+
return missingEnvVars(HOSTED_INTEGRATION_ENV_VARS).length === 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Loads local integration config from environment, or undefined when credentials are missing.
|
|
69
|
+
*/
|
|
70
|
+
export function loadLocalIntegrationConfig(): LocalIntegrationConfig | undefined {
|
|
71
|
+
if (!isLocalIntegrationConfigured()) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
apiKey: process.env.DIMENSIONS_API_KEY!,
|
|
76
|
+
baseUrl: process.env.DIMENSIONS_BASE_URL,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Loads hosted integration config from environment, or undefined when credentials are missing.
|
|
82
|
+
* Sets `DEPLOYMENT_MODE=hosted` when loading deployment config.
|
|
83
|
+
*/
|
|
84
|
+
export function loadHostedIntegrationConfig(): HostedIntegrationConfig | undefined {
|
|
85
|
+
if (!isHostedIntegrationConfigured()) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
process.env.DEPLOYMENT_MODE = "hosted";
|
|
90
|
+
const deployment = loadDeploymentConfig();
|
|
91
|
+
if (deployment.deploymentMode !== "hosted") {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
apiKey: process.env.DIMENSIONS_API_KEY!,
|
|
97
|
+
hosted: deployment,
|
|
98
|
+
remoteBaseUrl: process.env.HOSTED_MCP_BASE_URL?.replace(/\/$/, ""),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Builds the MCP `/mcp` endpoint URL for hosted integration.
|
|
104
|
+
*/
|
|
105
|
+
export function hostedMcpEndpoint(baseUrl: string): string {
|
|
106
|
+
const trimmed = baseUrl.replace(/\/$/, "");
|
|
107
|
+
return trimmed.endsWith("/mcp") ? trimmed : `${trimmed}/mcp`;
|
|
108
|
+
}
|