@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,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dimensions reasonable-use policy guardrails for MCP tools.
|
|
3
|
+
* @see https://docs.dimensions.ai/dsl/usagepolicy.html
|
|
4
|
+
* @module dsl/usage-policy
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ValidationError } from "../client/index.js";
|
|
8
|
+
import {
|
|
9
|
+
CONFIRM_LARGE_FETCH_PAGES,
|
|
10
|
+
CONFIRM_LARGE_FETCH_RECORDS,
|
|
11
|
+
LARGE_RESULT_THRESHOLD,
|
|
12
|
+
largeResultWarning,
|
|
13
|
+
validatePaginationBounds,
|
|
14
|
+
} from "./pagination.js";
|
|
15
|
+
import { SCHEMA_LIMITS } from "./schema/store.js";
|
|
16
|
+
|
|
17
|
+
/** Official Dimensions usage policy URL. */
|
|
18
|
+
export const USAGE_POLICY_URL = "https://docs.dimensions.ai/dsl/usagepolicy.html";
|
|
19
|
+
|
|
20
|
+
/** MCP resource URI for policy guidance. */
|
|
21
|
+
export const USAGE_POLICY_RESOURCE_URI = "dimensions://schema/policy";
|
|
22
|
+
|
|
23
|
+
/** Short notice included in guarded tool responses. */
|
|
24
|
+
export const POLICY_NOTICE =
|
|
25
|
+
"Dimensions API is for task-sized analytical queries, not bulk local copies or training data. " +
|
|
26
|
+
`See ${USAGE_POLICY_RESOURCE_URI} and ${USAGE_POLICY_URL}.`;
|
|
27
|
+
|
|
28
|
+
/** Parsed skip/limit modifiers from a DSL query string. */
|
|
29
|
+
export type DslPaginationModifiers = {
|
|
30
|
+
readonly limit?: number;
|
|
31
|
+
readonly skip?: number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** Payload for dimensions://schema/policy. */
|
|
35
|
+
export type UsagePolicyPayload = {
|
|
36
|
+
readonly source: string;
|
|
37
|
+
readonly purpose: string;
|
|
38
|
+
readonly limits: typeof SCHEMA_LIMITS;
|
|
39
|
+
readonly guardrails: {
|
|
40
|
+
readonly largeResultWarningThreshold: number;
|
|
41
|
+
readonly confirmLargeFetchRequiredWhen: {
|
|
42
|
+
readonly batchMaxPagesExceeds: number;
|
|
43
|
+
readonly batchRecordsExceeds: number;
|
|
44
|
+
readonly searchSkipAtLeast: number;
|
|
45
|
+
readonly searchPageAtLeast: number;
|
|
46
|
+
};
|
|
47
|
+
readonly clientRateLimitPerMinute: number;
|
|
48
|
+
};
|
|
49
|
+
readonly recommendations: readonly string[];
|
|
50
|
+
readonly notice: string;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Builds the usage policy payload for MCP resources and agent discovery.
|
|
55
|
+
* @returns Policy guidance object
|
|
56
|
+
*/
|
|
57
|
+
export function buildUsagePolicy(): UsagePolicyPayload {
|
|
58
|
+
return {
|
|
59
|
+
source: USAGE_POLICY_URL,
|
|
60
|
+
purpose:
|
|
61
|
+
"Support complex analytical tasks — not local copies of Dimensions data, training corpora, or open-ended crawling.",
|
|
62
|
+
limits: SCHEMA_LIMITS,
|
|
63
|
+
guardrails: {
|
|
64
|
+
largeResultWarningThreshold: LARGE_RESULT_THRESHOLD,
|
|
65
|
+
confirmLargeFetchRequiredWhen: {
|
|
66
|
+
batchMaxPagesExceeds: CONFIRM_LARGE_FETCH_PAGES,
|
|
67
|
+
batchRecordsExceeds: CONFIRM_LARGE_FETCH_RECORDS,
|
|
68
|
+
searchSkipAtLeast: CONFIRM_LARGE_FETCH_RECORDS,
|
|
69
|
+
searchPageAtLeast: CONFIRM_LARGE_FETCH_PAGES,
|
|
70
|
+
},
|
|
71
|
+
clientRateLimitPerMinute: SCHEMA_LIMITS.requestsPerMinute,
|
|
72
|
+
},
|
|
73
|
+
recommendations: [
|
|
74
|
+
"Start with narrow filters and facet_query before paginating large sets",
|
|
75
|
+
"Use search_* with default limit 100 for discovery; raise only when needed",
|
|
76
|
+
"Use fetch_search_pages aggregate mode for ID lists and counts without full rows",
|
|
77
|
+
"Use fetch_search_pages file mode (JSONL or CSV) only with outputPath and confirmLargeFetch for large exports",
|
|
78
|
+
"Facets return at most 1000 buckets with no pagination — do not loop facet queries",
|
|
79
|
+
],
|
|
80
|
+
notice: POLICY_NOTICE,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Extracts `limit` and `skip` modifiers from a DSL query string.
|
|
86
|
+
* @param dsl - Raw DSL query
|
|
87
|
+
* @returns Parsed modifiers (undefined when absent)
|
|
88
|
+
*/
|
|
89
|
+
export function parseDslPagination(dsl: string): DslPaginationModifiers {
|
|
90
|
+
const limitMatch = dsl.match(/\blimit\s+(\d+)\b/i);
|
|
91
|
+
const skipMatch = dsl.match(/\bskip\s+(\d+)\b/i);
|
|
92
|
+
return {
|
|
93
|
+
...(limitMatch ? { limit: Number.parseInt(limitMatch[1], 10) } : {}),
|
|
94
|
+
...(skipMatch ? { skip: Number.parseInt(skipMatch[1], 10) } : {}),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Returns true when the DSL appears to be a facet-only query (no entity row pagination).
|
|
100
|
+
* @param dsl - Raw DSL query
|
|
101
|
+
* @returns Whether the query targets facets without entity records
|
|
102
|
+
*/
|
|
103
|
+
export function isFacetOnlyQuery(dsl: string): boolean {
|
|
104
|
+
const hasFacetReturn =
|
|
105
|
+
/\breturn\s+(?:year|journal|funder|researcher|category|phase|source|repository|funder_orgs?)\b/i.test(
|
|
106
|
+
dsl,
|
|
107
|
+
) ||
|
|
108
|
+
/\breturn\s+\w+\s+facet\b/i.test(dsl) ||
|
|
109
|
+
/\bfacet\s+\w+/i.test(dsl);
|
|
110
|
+
const hasEntityReturn =
|
|
111
|
+
/\breturn\s+(?:publications|grants|patents|clinical_trials|datasets|policy_documents|researchers|organizations)\b/i.test(
|
|
112
|
+
dsl,
|
|
113
|
+
);
|
|
114
|
+
const limitZero = /\blimit\s+0\b/i.test(dsl);
|
|
115
|
+
return hasFacetReturn && (!hasEntityReturn || limitZero);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Options for single-page search policy validation. */
|
|
119
|
+
export type SearchPolicyOptions = {
|
|
120
|
+
readonly skip: number;
|
|
121
|
+
readonly limit: number;
|
|
122
|
+
readonly confirmLargeFetch?: boolean;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Validates single-page search pagination against reasonable-use guardrails.
|
|
127
|
+
* @param options - Resolved skip/limit and optional confirmation flag
|
|
128
|
+
* @throws {ValidationError} When deep pagination lacks confirmation
|
|
129
|
+
*/
|
|
130
|
+
export function validateSearchPaginationPolicy(options: SearchPolicyOptions): void {
|
|
131
|
+
const { skip, limit, confirmLargeFetch } = options;
|
|
132
|
+
const page = limit > 0 ? Math.floor(skip / limit) : 0;
|
|
133
|
+
|
|
134
|
+
const needsConfirm =
|
|
135
|
+
skip >= CONFIRM_LARGE_FETCH_RECORDS ||
|
|
136
|
+
page >= CONFIRM_LARGE_FETCH_PAGES ||
|
|
137
|
+
(limit === SCHEMA_LIMITS.maxLimit && skip > 0);
|
|
138
|
+
|
|
139
|
+
if (needsConfirm && !confirmLargeFetch) {
|
|
140
|
+
throw new ValidationError(
|
|
141
|
+
`Deep pagination requires confirmLargeFetch: true (skip=${skip}, limit=${limit}, page≈${page}). ` +
|
|
142
|
+
"Narrow filters first or use facet_query. See dimensions://schema/policy.",
|
|
143
|
+
{ skip, limit, page, confirmLargeFetch, policyUri: USAGE_POLICY_RESOURCE_URI },
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Options for raw DSL policy validation. */
|
|
149
|
+
export type ExecuteDslPolicyOptions = {
|
|
150
|
+
readonly dsl: string;
|
|
151
|
+
readonly confirmLargeFetch?: boolean;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Validates a raw DSL query against pagination and reasonable-use guardrails.
|
|
156
|
+
* @param options - DSL string and optional confirmation flag
|
|
157
|
+
* @throws {ValidationError} When the query violates policy bounds
|
|
158
|
+
*/
|
|
159
|
+
export function validateExecuteDslPolicy(options: ExecuteDslPolicyOptions): void {
|
|
160
|
+
const { dsl, confirmLargeFetch } = options;
|
|
161
|
+
const { limit, skip } = parseDslPagination(dsl);
|
|
162
|
+
|
|
163
|
+
if (isFacetOnlyQuery(dsl) && skip !== undefined && skip > 0) {
|
|
164
|
+
throw new ValidationError(
|
|
165
|
+
"Facet queries cannot be paginated with skip — facets return at most 1000 buckets with no pagination.",
|
|
166
|
+
{ skip, policyUri: USAGE_POLICY_RESOURCE_URI },
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (skip !== undefined || limit !== undefined) {
|
|
171
|
+
validatePaginationBounds(skip ?? 0, limit ?? SCHEMA_LIMITS.maxLimit);
|
|
172
|
+
validateSearchPaginationPolicy({
|
|
173
|
+
skip: skip ?? 0,
|
|
174
|
+
limit: limit ?? 100,
|
|
175
|
+
confirmLargeFetch,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Builds response-level policy hints for execute_dsl results.
|
|
182
|
+
* @param dsl - Executed DSL query
|
|
183
|
+
* @param response - Raw API response
|
|
184
|
+
* @returns Optional policy fields to merge into the tool result
|
|
185
|
+
*/
|
|
186
|
+
export function buildExecuteDslPolicyHints(
|
|
187
|
+
dsl: string,
|
|
188
|
+
response: Record<string, unknown>,
|
|
189
|
+
): {
|
|
190
|
+
policyNotice?: string;
|
|
191
|
+
largeResultWarning?: string;
|
|
192
|
+
paginationHint?: string;
|
|
193
|
+
} {
|
|
194
|
+
const stats = response._stats as { total_count?: number } | undefined;
|
|
195
|
+
const totalCount = stats?.total_count;
|
|
196
|
+
const hints: {
|
|
197
|
+
policyNotice?: string;
|
|
198
|
+
largeResultWarning?: string;
|
|
199
|
+
paginationHint?: string;
|
|
200
|
+
} = {};
|
|
201
|
+
|
|
202
|
+
const warning = totalCount !== undefined ? largeResultWarning(totalCount) : undefined;
|
|
203
|
+
if (warning) {
|
|
204
|
+
hints.largeResultWarning = warning;
|
|
205
|
+
hints.policyNotice = POLICY_NOTICE;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const { limit, skip } = parseDslPagination(dsl);
|
|
209
|
+
if (totalCount !== undefined && limit !== undefined && totalCount > (skip ?? 0) + limit) {
|
|
210
|
+
const pages = Math.ceil(totalCount / limit);
|
|
211
|
+
const minutes = Math.ceil(pages / SCHEMA_LIMITS.requestsPerMinute);
|
|
212
|
+
hints.paginationHint =
|
|
213
|
+
`${totalCount} total matches; this page returned up to ${limit}. ` +
|
|
214
|
+
`Full pagination ≈${pages} requests (~${minutes} min). Prefer search_* or fetch_search_pages.`;
|
|
215
|
+
hints.policyNotice ??= POLICY_NOTICE;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return hints;
|
|
219
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escapes a string for safe inclusion in a DSL query.
|
|
3
|
+
*
|
|
4
|
+
* Handles backslashes, double quotes (including Unicode smart quotes),
|
|
5
|
+
* and control characters to prevent DSL injection attacks when
|
|
6
|
+
* user-supplied strings are interpolated into queries.
|
|
7
|
+
*
|
|
8
|
+
* Characters escaped via `\uXXXX` (ANTLR grammar-compatible):
|
|
9
|
+
* - Null byte and C0 controls (U+0000–U+001F) not covered by named escapes
|
|
10
|
+
* - DEL and C1 controls (U+007F–U+009F)
|
|
11
|
+
* - Smart single quotes (U+2018, U+2019)
|
|
12
|
+
* - Line and paragraph separators (U+2028, U+2029)
|
|
13
|
+
*
|
|
14
|
+
* @param text - The string to escape
|
|
15
|
+
* @returns The escaped string safe for DSL interpolation
|
|
16
|
+
*/
|
|
17
|
+
export function escapeDslString(text: string): string {
|
|
18
|
+
let result = "";
|
|
19
|
+
for (let i = 0; i < text.length; i++) {
|
|
20
|
+
const ch = text[i];
|
|
21
|
+
switch (ch) {
|
|
22
|
+
case "\\":
|
|
23
|
+
result += "\\\\";
|
|
24
|
+
break;
|
|
25
|
+
case '"':
|
|
26
|
+
result += '\\"';
|
|
27
|
+
break;
|
|
28
|
+
case "\u201c":
|
|
29
|
+
result += "\\\u201c";
|
|
30
|
+
break;
|
|
31
|
+
case "\u201d":
|
|
32
|
+
result += "\\\u201d";
|
|
33
|
+
break;
|
|
34
|
+
case "\n":
|
|
35
|
+
result += "\\n";
|
|
36
|
+
break;
|
|
37
|
+
case "\t":
|
|
38
|
+
result += "\\t";
|
|
39
|
+
break;
|
|
40
|
+
case "\r":
|
|
41
|
+
result += "\\r";
|
|
42
|
+
break;
|
|
43
|
+
case "\b":
|
|
44
|
+
result += "\\b";
|
|
45
|
+
break;
|
|
46
|
+
case "\f":
|
|
47
|
+
result += "\\f";
|
|
48
|
+
break;
|
|
49
|
+
default: {
|
|
50
|
+
const code = ch.charCodeAt(0);
|
|
51
|
+
if (
|
|
52
|
+
code <= 0x001f ||
|
|
53
|
+
(code >= 0x007f && code <= 0x009f) ||
|
|
54
|
+
code === 0x2018 ||
|
|
55
|
+
code === 0x2019 ||
|
|
56
|
+
code === 0x2028 ||
|
|
57
|
+
code === 0x2029
|
|
58
|
+
) {
|
|
59
|
+
result += `\\u${code.toString(16).padStart(4, "0")}`;
|
|
60
|
+
} else {
|
|
61
|
+
result += ch;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Unescapes DSL string literal content (inverse of {@link escapeDslString} for common sequences).
|
|
71
|
+
* @param text - Escaped string content without surrounding quotes
|
|
72
|
+
* @returns Unescaped string
|
|
73
|
+
*/
|
|
74
|
+
export function unescapeDslString(text: string): string {
|
|
75
|
+
if (!text.includes("\\")) return text;
|
|
76
|
+
|
|
77
|
+
let result = "";
|
|
78
|
+
for (let i = 0; i < text.length; i++) {
|
|
79
|
+
if (text[i] === "\\" && i + 1 < text.length) {
|
|
80
|
+
const next = text[i + 1];
|
|
81
|
+
switch (next) {
|
|
82
|
+
case '"':
|
|
83
|
+
case "\\":
|
|
84
|
+
case "n":
|
|
85
|
+
result += next === "n" ? "\n" : next;
|
|
86
|
+
i++;
|
|
87
|
+
break;
|
|
88
|
+
case "t":
|
|
89
|
+
result += "\t";
|
|
90
|
+
i++;
|
|
91
|
+
break;
|
|
92
|
+
case "r":
|
|
93
|
+
result += "\r";
|
|
94
|
+
i++;
|
|
95
|
+
break;
|
|
96
|
+
case "b":
|
|
97
|
+
result += "\b";
|
|
98
|
+
i++;
|
|
99
|
+
break;
|
|
100
|
+
case "f":
|
|
101
|
+
result += "\f";
|
|
102
|
+
i++;
|
|
103
|
+
break;
|
|
104
|
+
case "u": {
|
|
105
|
+
const hex = text.slice(i + 2, i + 6);
|
|
106
|
+
if (hex.length === 4 && /^[0-9a-fA-F]{4}$/.test(hex)) {
|
|
107
|
+
result += String.fromCharCode(Number.parseInt(hex, 16));
|
|
108
|
+
i += 5;
|
|
109
|
+
} else {
|
|
110
|
+
result += "\\";
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
result += "\\";
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
result += text[i];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input sanitization for DSL query construction.
|
|
3
|
+
* @module utils/sanitize
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** Maximum allowed length for search text within a `for "..."` clause. */
|
|
7
|
+
export const MAX_SEARCH_TEXT_LENGTH = 10_000;
|
|
8
|
+
|
|
9
|
+
const ZERO_WIDTH_RE = /[\u00AD\u180E\u200B-\u200F\u2028\u2029\uFEFF\u2060-\u2064]/g;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Normalizes user search text before embedding in DSL.
|
|
13
|
+
* @param text - Raw input text
|
|
14
|
+
* @returns Sanitized text
|
|
15
|
+
*/
|
|
16
|
+
export function sanitizeInput(text: string): string {
|
|
17
|
+
return text
|
|
18
|
+
.normalize("NFC")
|
|
19
|
+
.replace(ZERO_WIDTH_RE, "")
|
|
20
|
+
.replace(/[\u201c\u201d]/g, '"');
|
|
21
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String manipulation utilities for DSL quoting and escape sequences.
|
|
3
|
+
* @module utils/string-utils
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Strips the first and last character from a quoted string token.
|
|
8
|
+
* @param text - The raw STRING token text including quotes
|
|
9
|
+
* @returns The unquoted string content
|
|
10
|
+
*/
|
|
11
|
+
export function stripQuotes(text: string): string {
|
|
12
|
+
return unescapeString(text.slice(1, -1));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Strips triple quotes from a LONG_STRING token.
|
|
17
|
+
* @param text - The raw LONG_STRING token text including triple quotes
|
|
18
|
+
* @returns The unquoted string content
|
|
19
|
+
*/
|
|
20
|
+
export function stripTripleQuotes(text: string): string {
|
|
21
|
+
return unescapeString(text.slice(3, -3));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Processes escape sequences in a DSL string.
|
|
26
|
+
* @param text - The string content (without outer quotes)
|
|
27
|
+
* @returns The unescaped string
|
|
28
|
+
*/
|
|
29
|
+
export function unescapeString(text: string): string {
|
|
30
|
+
if (!text.includes("\\")) return text;
|
|
31
|
+
|
|
32
|
+
let result = "";
|
|
33
|
+
for (let i = 0; i < text.length; i++) {
|
|
34
|
+
if (text[i] === "\\" && i + 1 < text.length) {
|
|
35
|
+
const next = text[i + 1];
|
|
36
|
+
switch (next) {
|
|
37
|
+
case '"':
|
|
38
|
+
case "\u201c":
|
|
39
|
+
case "\u201d":
|
|
40
|
+
case "\\":
|
|
41
|
+
case "/":
|
|
42
|
+
case "^":
|
|
43
|
+
case "*":
|
|
44
|
+
case "?":
|
|
45
|
+
case ":":
|
|
46
|
+
case "~":
|
|
47
|
+
case "[":
|
|
48
|
+
case "]":
|
|
49
|
+
case "{":
|
|
50
|
+
case "}":
|
|
51
|
+
case "(":
|
|
52
|
+
case ")":
|
|
53
|
+
case "!":
|
|
54
|
+
case "|":
|
|
55
|
+
case "&":
|
|
56
|
+
case "+":
|
|
57
|
+
case "-":
|
|
58
|
+
result += next;
|
|
59
|
+
i++;
|
|
60
|
+
break;
|
|
61
|
+
case "n":
|
|
62
|
+
result += "\n";
|
|
63
|
+
i++;
|
|
64
|
+
break;
|
|
65
|
+
case "t":
|
|
66
|
+
result += "\t";
|
|
67
|
+
i++;
|
|
68
|
+
break;
|
|
69
|
+
case "r":
|
|
70
|
+
result += "\r";
|
|
71
|
+
i++;
|
|
72
|
+
break;
|
|
73
|
+
case "b":
|
|
74
|
+
result += "\b";
|
|
75
|
+
i++;
|
|
76
|
+
break;
|
|
77
|
+
case "f":
|
|
78
|
+
result += "\f";
|
|
79
|
+
i++;
|
|
80
|
+
break;
|
|
81
|
+
case "u": {
|
|
82
|
+
const hex = text.slice(i + 2, i + 6);
|
|
83
|
+
if (hex.length === 4 && /^[0-9a-fA-F]{4}$/.test(hex)) {
|
|
84
|
+
result += String.fromCharCode(Number.parseInt(hex, 16));
|
|
85
|
+
i += 5;
|
|
86
|
+
} else {
|
|
87
|
+
result += "\\";
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
default:
|
|
92
|
+
result += "\\";
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
result += text[i];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Escapes special characters in a string for DSL output.
|
|
104
|
+
* @param text - The raw string content
|
|
105
|
+
* @returns The escaped string (without surrounding quotes)
|
|
106
|
+
*/
|
|
107
|
+
export function escapeString(text: string): string {
|
|
108
|
+
let result = "";
|
|
109
|
+
for (let i = 0; i < text.length; i++) {
|
|
110
|
+
const ch = text[i];
|
|
111
|
+
switch (ch) {
|
|
112
|
+
case "\\":
|
|
113
|
+
result += "\\\\";
|
|
114
|
+
break;
|
|
115
|
+
case '"':
|
|
116
|
+
result += '\\"';
|
|
117
|
+
break;
|
|
118
|
+
case "\n":
|
|
119
|
+
result += "\\n";
|
|
120
|
+
break;
|
|
121
|
+
case "\t":
|
|
122
|
+
result += "\\t";
|
|
123
|
+
break;
|
|
124
|
+
case "\r":
|
|
125
|
+
result += "\\r";
|
|
126
|
+
break;
|
|
127
|
+
case "\b":
|
|
128
|
+
result += "\\b";
|
|
129
|
+
break;
|
|
130
|
+
case "\f":
|
|
131
|
+
result += "\\f";
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
result += ch;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Wraps a string in double quotes after escaping special characters.
|
|
142
|
+
* @param text - The raw string content
|
|
143
|
+
* @returns The quoted and escaped string
|
|
144
|
+
*/
|
|
145
|
+
export function quoteString(text: string): string {
|
|
146
|
+
return `"${escapeString(text)}"`;
|
|
147
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ValidationError } from "../../client/index.js";
|
|
2
|
+
|
|
3
|
+
/** Regex for valid DSL field names: letters, digits, underscores, dots. */
|
|
4
|
+
const FIELD_NAME_RE = /^[a-z_][a-z0-9_.]*$/i;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Validates a DSL field name to prevent injection via field interpolation.
|
|
8
|
+
* Valid names start with a letter or underscore and contain only letters,
|
|
9
|
+
* digits, underscores, and dots (for nested fields like `authors.first_name`).
|
|
10
|
+
*
|
|
11
|
+
* @param field - The field name to validate
|
|
12
|
+
* @returns void
|
|
13
|
+
* @throws {ValidationError} If the field name contains invalid characters
|
|
14
|
+
*/
|
|
15
|
+
export function validateFieldName(field: string): void {
|
|
16
|
+
if (!FIELD_NAME_RE.test(field)) {
|
|
17
|
+
throw new ValidationError(`Invalid field name: ${field}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
package/src/http-main.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HTTP MCP server entry for hosted deployment (Streamable HTTP at /mcp).
|
|
4
|
+
* @module http-main
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { loadDeploymentConfig } from "./client/deployment-config.js";
|
|
8
|
+
import { startHostedHttpServer } from "./mcp/http-server.js";
|
|
9
|
+
|
|
10
|
+
const deployment = loadDeploymentConfig();
|
|
11
|
+
if (deployment.deploymentMode !== "hosted") {
|
|
12
|
+
console.error("http-main requires DEPLOYMENT_MODE=hosted");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const { close, ready } = startHostedHttpServer({
|
|
17
|
+
hosted: deployment,
|
|
18
|
+
port: deployment.httpPort,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
ready
|
|
22
|
+
.then((port) => {
|
|
23
|
+
console.error(`Dimensions Analytics MCP HTTP server listening on port ${port}`);
|
|
24
|
+
})
|
|
25
|
+
.catch((error: unknown) => {
|
|
26
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
27
|
+
console.error(`Failed to start HTTP server: ${message}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
async function shutdown(): Promise<void> {
|
|
32
|
+
await close();
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
process.on("SIGTERM", () => {
|
|
37
|
+
void shutdown();
|
|
38
|
+
});
|
|
39
|
+
process.on("SIGINT", () => {
|
|
40
|
+
void shutdown();
|
|
41
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @digital-science-dsl/dimensions-analytics-mcp - Dimensions Analytics MCP server for Dimensions Analytics API.
|
|
3
|
+
* @module @digital-science-dsl/dimensions-analytics-mcp
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type { SchemaStore } from "./dsl/schema/index.js";
|
|
7
|
+
export type { SchemaContext } from "./mcp/schema/context.js";
|
|
8
|
+
export {
|
|
9
|
+
createMcpServerAsync,
|
|
10
|
+
type McpServerConfig,
|
|
11
|
+
type McpServerHandle,
|
|
12
|
+
startMcpServer,
|
|
13
|
+
} from "./mcp/server.js";
|
|
14
|
+
export { type McpLogLevel, mcpLog } from "./mcp/utils.js";
|
package/src/main.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP server entry point.
|
|
4
|
+
* Starts the Dimensions Analytics MCP server with stdio transport.
|
|
5
|
+
* @module main
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
+
import { createMcpServerAsync } from "./mcp/server.js";
|
|
10
|
+
|
|
11
|
+
let close: () => Promise<void>;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
const { server } = await createMcpServerAsync();
|
|
15
|
+
|
|
16
|
+
const transport = new StdioServerTransport();
|
|
17
|
+
|
|
18
|
+
server.server.onerror = (error: Error) => console.error(`MCP server error: ${error.message}`);
|
|
19
|
+
server.server.onclose = () => {
|
|
20
|
+
process.exit(0);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
await server.connect(transport);
|
|
24
|
+
|
|
25
|
+
close = async () => {
|
|
26
|
+
await server.close();
|
|
27
|
+
};
|
|
28
|
+
} catch (error: unknown) {
|
|
29
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
30
|
+
console.error(`Failed to start MCP server: ${message}`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const shutdown = async () => {
|
|
35
|
+
await close();
|
|
36
|
+
process.exit(0);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
process.on("SIGTERM", shutdown);
|
|
40
|
+
process.on("SIGINT", shutdown);
|