@vendure/mcp-plugin 3.8.0-minor-bootstrap.0
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/lib/api/api-extensions.d.ts +2 -0
- package/lib/api/api-extensions.js +239 -0
- package/lib/api/api-extensions.js.map +1 -0
- package/lib/api/mcp-actor.service.d.ts +19 -0
- package/lib/api/mcp-actor.service.js +52 -0
- package/lib/api/mcp-actor.service.js.map +1 -0
- package/lib/api/mcp-admin.resolver.d.ts +105 -0
- package/lib/api/mcp-admin.resolver.js +463 -0
- package/lib/api/mcp-admin.resolver.js.map +1 -0
- package/lib/api/mcp-shop.resolver.d.ts +25 -0
- package/lib/api/mcp-shop.resolver.js +74 -0
- package/lib/api/mcp-shop.resolver.js.map +1 -0
- package/lib/check-options.d.ts +7 -0
- package/lib/check-options.js +130 -0
- package/lib/check-options.js.map +1 -0
- package/lib/constants.d.ts +48 -0
- package/lib/constants.js +72 -0
- package/lib/constants.js.map +1 -0
- package/lib/delete-in-batches.d.ts +5 -0
- package/lib/delete-in-batches.js +28 -0
- package/lib/delete-in-batches.js.map +1 -0
- package/lib/entities/index.d.ts +5 -0
- package/lib/entities/index.js +22 -0
- package/lib/entities/index.js.map +1 -0
- package/lib/entities/mcp-authorization-code.entity.d.ts +33 -0
- package/lib/entities/mcp-authorization-code.entity.js +77 -0
- package/lib/entities/mcp-authorization-code.entity.js.map +1 -0
- package/lib/entities/mcp-authorization-request.entity.d.ts +31 -0
- package/lib/entities/mcp-authorization-request.entity.js +73 -0
- package/lib/entities/mcp-authorization-request.entity.js.map +1 -0
- package/lib/entities/mcp-oauth-client.entity.d.ts +56 -0
- package/lib/entities/mcp-oauth-client.entity.js +70 -0
- package/lib/entities/mcp-oauth-client.entity.js.map +1 -0
- package/lib/entities/mcp-oauth-grant.entity.d.ts +77 -0
- package/lib/entities/mcp-oauth-grant.entity.js +121 -0
- package/lib/entities/mcp-oauth-grant.entity.js.map +1 -0
- package/lib/entities/mcp-tool-call-log.entity.d.ts +50 -0
- package/lib/entities/mcp-tool-call-log.entity.js +101 -0
- package/lib/entities/mcp-tool-call-log.entity.js.map +1 -0
- package/lib/events/mcp-tool-call.event.d.ts +17 -0
- package/lib/events/mcp-tool-call.event.js +23 -0
- package/lib/events/mcp-tool-call.event.js.map +1 -0
- package/lib/get-client-ip.d.ts +2 -0
- package/lib/get-client-ip.js +10 -0
- package/lib/get-client-ip.js.map +1 -0
- package/lib/get-language-code.d.ts +3 -0
- package/lib/get-language-code.js +12 -0
- package/lib/get-language-code.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +26 -0
- package/lib/index.js.map +1 -0
- package/lib/internal-types.d.ts +27 -0
- package/lib/internal-types.js +3 -0
- package/lib/internal-types.js.map +1 -0
- package/lib/logging/mcp-tool-call-log-retention.service.d.ts +8 -0
- package/lib/logging/mcp-tool-call-log-retention.service.js +54 -0
- package/lib/logging/mcp-tool-call-log-retention.service.js.map +1 -0
- package/lib/logging/mcp-tool-call-log.service.d.ts +24 -0
- package/lib/logging/mcp-tool-call-log.service.js +128 -0
- package/lib/logging/mcp-tool-call-log.service.js.map +1 -0
- package/lib/oauth/cimd/cimd-client-resolver.service.d.ts +18 -0
- package/lib/oauth/cimd/cimd-client-resolver.service.js +109 -0
- package/lib/oauth/cimd/cimd-client-resolver.service.js.map +1 -0
- package/lib/oauth/cimd/cimd-document.d.ts +11 -0
- package/lib/oauth/cimd/cimd-document.js +66 -0
- package/lib/oauth/cimd/cimd-document.js.map +1 -0
- package/lib/oauth/cimd/cimd-fetch.d.ts +14 -0
- package/lib/oauth/cimd/cimd-fetch.js +192 -0
- package/lib/oauth/cimd/cimd-fetch.js.map +1 -0
- package/lib/oauth/cimd/cimd-url.d.ts +5 -0
- package/lib/oauth/cimd/cimd-url.js +94 -0
- package/lib/oauth/cimd/cimd-url.js.map +1 -0
- package/lib/oauth/grant-session.service.d.ts +19 -0
- package/lib/oauth/grant-session.service.js +141 -0
- package/lib/oauth/grant-session.service.js.map +1 -0
- package/lib/oauth/oauth-error.d.ts +18 -0
- package/lib/oauth/oauth-error.js +60 -0
- package/lib/oauth/oauth-error.js.map +1 -0
- package/lib/oauth/oauth-metadata.service.d.ts +34 -0
- package/lib/oauth/oauth-metadata.service.js +107 -0
- package/lib/oauth/oauth-metadata.service.js.map +1 -0
- package/lib/oauth/oauth-retention.service.d.ts +23 -0
- package/lib/oauth/oauth-retention.service.js +103 -0
- package/lib/oauth/oauth-retention.service.js.map +1 -0
- package/lib/oauth/oauth-types.d.ts +61 -0
- package/lib/oauth/oauth-types.js +32 -0
- package/lib/oauth/oauth-types.js.map +1 -0
- package/lib/oauth/oauth-utils.d.ts +20 -0
- package/lib/oauth/oauth-utils.js +111 -0
- package/lib/oauth/oauth-utils.js.map +1 -0
- package/lib/oauth/oauth.controller.d.ts +31 -0
- package/lib/oauth/oauth.controller.js +132 -0
- package/lib/oauth/oauth.controller.js.map +1 -0
- package/lib/oauth/oauth.service.d.ts +69 -0
- package/lib/oauth/oauth.service.js +650 -0
- package/lib/oauth/oauth.service.js.map +1 -0
- package/lib/oauth/token-hash.d.ts +6 -0
- package/lib/oauth/token-hash.js +21 -0
- package/lib/oauth/token-hash.js.map +1 -0
- package/lib/plugin.d.ts +54 -0
- package/lib/plugin.js +171 -0
- package/lib/plugin.js.map +1 -0
- package/lib/rate-limit/ip-bucket-key.d.ts +1 -0
- package/lib/rate-limit/ip-bucket-key.js +35 -0
- package/lib/rate-limit/ip-bucket-key.js.map +1 -0
- package/lib/rate-limit/mcp-oauth-rate-limit.guard.d.ts +20 -0
- package/lib/rate-limit/mcp-oauth-rate-limit.guard.js +63 -0
- package/lib/rate-limit/mcp-oauth-rate-limit.guard.js.map +1 -0
- package/lib/rate-limit/mcp-rate-limiter.service.d.ts +47 -0
- package/lib/rate-limit/mcp-rate-limiter.service.js +248 -0
- package/lib/rate-limit/mcp-rate-limiter.service.js.map +1 -0
- package/lib/registry/bm25.d.ts +12 -0
- package/lib/registry/bm25.js +60 -0
- package/lib/registry/bm25.js.map +1 -0
- package/lib/registry/mcp-tool-execution.service.d.ts +45 -0
- package/lib/registry/mcp-tool-execution.service.js +72 -0
- package/lib/registry/mcp-tool-execution.service.js.map +1 -0
- package/lib/registry/mcp-tool-registry.service.d.ts +89 -0
- package/lib/registry/mcp-tool-registry.service.js +668 -0
- package/lib/registry/mcp-tool-registry.service.js.map +1 -0
- package/lib/registry/mcp-tool-schema.service.d.ts +42 -0
- package/lib/registry/mcp-tool-schema.service.js +229 -0
- package/lib/registry/mcp-tool-schema.service.js.map +1 -0
- package/lib/registry/registry-types.d.ts +32 -0
- package/lib/registry/registry-types.js +3 -0
- package/lib/registry/registry-types.js.map +1 -0
- package/lib/resolve-options.d.ts +7 -0
- package/lib/resolve-options.js +85 -0
- package/lib/resolve-options.js.map +1 -0
- package/lib/shared/endpoint-paths.d.ts +8 -0
- package/lib/shared/endpoint-paths.js +12 -0
- package/lib/shared/endpoint-paths.js.map +1 -0
- package/lib/shared/loopback.d.ts +2 -0
- package/lib/shared/loopback.js +9 -0
- package/lib/shared/loopback.js.map +1 -0
- package/lib/shop-session/mcp-shop-session.service.d.ts +47 -0
- package/lib/shop-session/mcp-shop-session.service.js +132 -0
- package/lib/shop-session/mcp-shop-session.service.js.map +1 -0
- package/lib/tasks/mcp-oauth-retention.task.d.ts +9 -0
- package/lib/tasks/mcp-oauth-retention.task.js +21 -0
- package/lib/tasks/mcp-oauth-retention.task.js.map +1 -0
- package/lib/tasks/mcp-tool-call-log-retention.task.d.ts +7 -0
- package/lib/tasks/mcp-tool-call-log-retention.task.js +22 -0
- package/lib/tasks/mcp-tool-call-log-retention.task.js.map +1 -0
- package/lib/tools/built-in/active-order.service.d.ts +26 -0
- package/lib/tools/built-in/active-order.service.js +125 -0
- package/lib/tools/built-in/active-order.service.js.map +1 -0
- package/lib/tools/built-in/admin/add-customer-to-group.tool.d.ts +23 -0
- package/lib/tools/built-in/admin/add-customer-to-group.tool.js +68 -0
- package/lib/tools/built-in/admin/add-customer-to-group.tool.js.map +1 -0
- package/lib/tools/built-in/admin/add-note-to-order.tool.d.ts +104 -0
- package/lib/tools/built-in/admin/add-note-to-order.tool.js +66 -0
- package/lib/tools/built-in/admin/add-note-to-order.tool.js.map +1 -0
- package/lib/tools/built-in/admin/adjust-stock.tool.d.ts +26 -0
- package/lib/tools/built-in/admin/adjust-stock.tool.js +88 -0
- package/lib/tools/built-in/admin/adjust-stock.tool.js.map +1 -0
- package/lib/tools/built-in/admin/cancel-order.tool.d.ts +17 -0
- package/lib/tools/built-in/admin/cancel-order.tool.js +60 -0
- package/lib/tools/built-in/admin/cancel-order.tool.js.map +1 -0
- package/lib/tools/built-in/admin/channel-access.d.ts +2 -0
- package/lib/tools/built-in/admin/channel-access.js +9 -0
- package/lib/tools/built-in/admin/channel-access.js.map +1 -0
- package/lib/tools/built-in/admin/create-customer.tool.d.ts +41 -0
- package/lib/tools/built-in/admin/create-customer.tool.js +57 -0
- package/lib/tools/built-in/admin/create-customer.tool.js.map +1 -0
- package/lib/tools/built-in/admin/create-fulfillment.tool.d.ts +118 -0
- package/lib/tools/built-in/admin/create-fulfillment.tool.js +156 -0
- package/lib/tools/built-in/admin/create-fulfillment.tool.js.map +1 -0
- package/lib/tools/built-in/admin/create-product.tool.d.ts +52 -0
- package/lib/tools/built-in/admin/create-product.tool.js +61 -0
- package/lib/tools/built-in/admin/create-product.tool.js.map +1 -0
- package/lib/tools/built-in/admin/create-variant.tool.d.ts +48 -0
- package/lib/tools/built-in/admin/create-variant.tool.js +79 -0
- package/lib/tools/built-in/admin/create-variant.tool.js.map +1 -0
- package/lib/tools/built-in/admin/entity-field-schemas.d.ts +36 -0
- package/lib/tools/built-in/admin/entity-field-schemas.js +63 -0
- package/lib/tools/built-in/admin/entity-field-schemas.js.map +1 -0
- package/lib/tools/built-in/admin/get-customer.tool.d.ts +28 -0
- package/lib/tools/built-in/admin/get-customer.tool.js +55 -0
- package/lib/tools/built-in/admin/get-customer.tool.js.map +1 -0
- package/lib/tools/built-in/admin/get-order.tool.d.ts +100 -0
- package/lib/tools/built-in/admin/get-order.tool.js +68 -0
- package/lib/tools/built-in/admin/get-order.tool.js.map +1 -0
- package/lib/tools/built-in/admin/get-product.tool.d.ts +69 -0
- package/lib/tools/built-in/admin/get-product.tool.js +77 -0
- package/lib/tools/built-in/admin/get-product.tool.js.map +1 -0
- package/lib/tools/built-in/admin/get-stock-levels.tool.d.ts +23 -0
- package/lib/tools/built-in/admin/get-stock-levels.tool.js +61 -0
- package/lib/tools/built-in/admin/get-stock-levels.tool.js.map +1 -0
- package/lib/tools/built-in/admin/index.d.ts +25 -0
- package/lib/tools/built-in/admin/index.js +54 -0
- package/lib/tools/built-in/admin/index.js.map +1 -0
- package/lib/tools/built-in/admin/list-channels.tool.d.ts +24 -0
- package/lib/tools/built-in/admin/list-channels.tool.js +56 -0
- package/lib/tools/built-in/admin/list-channels.tool.js.map +1 -0
- package/lib/tools/built-in/admin/list-customer-groups.tool.d.ts +23 -0
- package/lib/tools/built-in/admin/list-customer-groups.tool.js +52 -0
- package/lib/tools/built-in/admin/list-customer-groups.tool.js.map +1 -0
- package/lib/tools/built-in/admin/list-customers.tool.d.ts +62 -0
- package/lib/tools/built-in/admin/list-customers.tool.js +66 -0
- package/lib/tools/built-in/admin/list-customers.tool.js.map +1 -0
- package/lib/tools/built-in/admin/list-orders.tool.d.ts +142 -0
- package/lib/tools/built-in/admin/list-orders.tool.js +87 -0
- package/lib/tools/built-in/admin/list-orders.tool.js.map +1 -0
- package/lib/tools/built-in/admin/list-products.tool.d.ts +63 -0
- package/lib/tools/built-in/admin/list-products.tool.js +71 -0
- package/lib/tools/built-in/admin/list-products.tool.js.map +1 -0
- package/lib/tools/built-in/admin/refund-order.tool.d.ts +38 -0
- package/lib/tools/built-in/admin/refund-order.tool.js +115 -0
- package/lib/tools/built-in/admin/refund-order.tool.js.map +1 -0
- package/lib/tools/built-in/admin/set-active-channel.tool.d.ts +22 -0
- package/lib/tools/built-in/admin/set-active-channel.tool.js +84 -0
- package/lib/tools/built-in/admin/set-active-channel.tool.js.map +1 -0
- package/lib/tools/built-in/admin/translation-schemas.d.ts +12 -0
- package/lib/tools/built-in/admin/translation-schemas.js +17 -0
- package/lib/tools/built-in/admin/translation-schemas.js.map +1 -0
- package/lib/tools/built-in/admin/update-customer.tool.d.ts +42 -0
- package/lib/tools/built-in/admin/update-customer.tool.js +59 -0
- package/lib/tools/built-in/admin/update-customer.tool.js.map +1 -0
- package/lib/tools/built-in/admin/update-order-state.tool.d.ts +16 -0
- package/lib/tools/built-in/admin/update-order-state.tool.js +58 -0
- package/lib/tools/built-in/admin/update-order-state.tool.js.map +1 -0
- package/lib/tools/built-in/admin/update-product.tool.d.ts +53 -0
- package/lib/tools/built-in/admin/update-product.tool.js +68 -0
- package/lib/tools/built-in/admin/update-product.tool.js.map +1 -0
- package/lib/tools/built-in/admin/update-variant.tool.d.ts +46 -0
- package/lib/tools/built-in/admin/update-variant.tool.js +77 -0
- package/lib/tools/built-in/admin/update-variant.tool.js.map +1 -0
- package/lib/tools/built-in/admin/upload-asset.tool.d.ts +32 -0
- package/lib/tools/built-in/admin/upload-asset.tool.js +56 -0
- package/lib/tools/built-in/admin/upload-asset.tool.js.map +1 -0
- package/lib/tools/built-in/catalog-query.service.d.ts +21 -0
- package/lib/tools/built-in/catalog-query.service.js +128 -0
- package/lib/tools/built-in/catalog-query.service.js.map +1 -0
- package/lib/tools/built-in/custom-field-input.service.d.ts +10 -0
- package/lib/tools/built-in/custom-field-input.service.js +64 -0
- package/lib/tools/built-in/custom-field-input.service.js.map +1 -0
- package/lib/tools/built-in/email-schema.d.ts +2 -0
- package/lib/tools/built-in/email-schema.js +12 -0
- package/lib/tools/built-in/email-schema.js.map +1 -0
- package/lib/tools/built-in/id-schema.d.ts +3 -0
- package/lib/tools/built-in/id-schema.js +11 -0
- package/lib/tools/built-in/id-schema.js.map +1 -0
- package/lib/tools/built-in/int32-schema.d.ts +4 -0
- package/lib/tools/built-in/int32-schema.js +8 -0
- package/lib/tools/built-in/int32-schema.js.map +1 -0
- package/lib/tools/built-in/list-helpers.d.ts +48 -0
- package/lib/tools/built-in/list-helpers.js +76 -0
- package/lib/tools/built-in/list-helpers.js.map +1 -0
- package/lib/tools/built-in/order-list-helpers.d.ts +20 -0
- package/lib/tools/built-in/order-list-helpers.js +48 -0
- package/lib/tools/built-in/order-list-helpers.js.map +1 -0
- package/lib/tools/built-in/providers.d.ts +2 -0
- package/lib/tools/built-in/providers.js +7 -0
- package/lib/tools/built-in/providers.js.map +1 -0
- package/lib/tools/built-in/remote-asset.d.ts +4 -0
- package/lib/tools/built-in/remote-asset.js +54 -0
- package/lib/tools/built-in/remote-asset.js.map +1 -0
- package/lib/tools/built-in/serializer.service.d.ts +327 -0
- package/lib/tools/built-in/serializer.service.js +413 -0
- package/lib/tools/built-in/serializer.service.js.map +1 -0
- package/lib/tools/built-in/shop/add-to-cart.tool.d.ts +21 -0
- package/lib/tools/built-in/shop/add-to-cart.tool.js +100 -0
- package/lib/tools/built-in/shop/add-to-cart.tool.js.map +1 -0
- package/lib/tools/built-in/shop/address-schema.d.ts +15 -0
- package/lib/tools/built-in/shop/address-schema.js +20 -0
- package/lib/tools/built-in/shop/address-schema.js.map +1 -0
- package/lib/tools/built-in/shop/apply-coupon-code.tool.d.ts +17 -0
- package/lib/tools/built-in/shop/apply-coupon-code.tool.js +62 -0
- package/lib/tools/built-in/shop/apply-coupon-code.tool.js.map +1 -0
- package/lib/tools/built-in/shop/collection-lookup.d.ts +15 -0
- package/lib/tools/built-in/shop/collection-lookup.js +35 -0
- package/lib/tools/built-in/shop/collection-lookup.js.map +1 -0
- package/lib/tools/built-in/shop/get-cart.tool.d.ts +94 -0
- package/lib/tools/built-in/shop/get-cart.tool.js +55 -0
- package/lib/tools/built-in/shop/get-cart.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-collection.tool.d.ts +42 -0
- package/lib/tools/built-in/shop/get-collection.tool.js +64 -0
- package/lib/tools/built-in/shop/get-collection.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.d.ts +26 -0
- package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.js +58 -0
- package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.d.ts +30 -0
- package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.js +59 -0
- package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-my-account.tool.d.ts +22 -0
- package/lib/tools/built-in/shop/get-my-account.tool.js +57 -0
- package/lib/tools/built-in/shop/get-my-account.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-order.tool.d.ts +100 -0
- package/lib/tools/built-in/shop/get-order.tool.js +67 -0
- package/lib/tools/built-in/shop/get-order.tool.js.map +1 -0
- package/lib/tools/built-in/shop/get-product.tool.d.ts +57 -0
- package/lib/tools/built-in/shop/get-product.tool.js +81 -0
- package/lib/tools/built-in/shop/get-product.tool.js.map +1 -0
- package/lib/tools/built-in/shop/index.d.ts +19 -0
- package/lib/tools/built-in/shop/index.js +42 -0
- package/lib/tools/built-in/shop/index.js.map +1 -0
- package/lib/tools/built-in/shop/list-collections.tool.d.ts +42 -0
- package/lib/tools/built-in/shop/list-collections.tool.js +75 -0
- package/lib/tools/built-in/shop/list-collections.tool.js.map +1 -0
- package/lib/tools/built-in/shop/list-my-orders.tool.d.ts +100 -0
- package/lib/tools/built-in/shop/list-my-orders.tool.js +63 -0
- package/lib/tools/built-in/shop/list-my-orders.tool.js.map +1 -0
- package/lib/tools/built-in/shop/place-order.tool.d.ts +188 -0
- package/lib/tools/built-in/shop/place-order.tool.js +152 -0
- package/lib/tools/built-in/shop/place-order.tool.js.map +1 -0
- package/lib/tools/built-in/shop/product-search-query.d.ts +4 -0
- package/lib/tools/built-in/shop/product-search-query.js +34 -0
- package/lib/tools/built-in/shop/product-search-query.js.map +1 -0
- package/lib/tools/built-in/shop/remove-coupon-code.tool.d.ts +17 -0
- package/lib/tools/built-in/shop/remove-coupon-code.tool.js +63 -0
- package/lib/tools/built-in/shop/remove-coupon-code.tool.js.map +1 -0
- package/lib/tools/built-in/shop/remove-from-cart.tool.d.ts +17 -0
- package/lib/tools/built-in/shop/remove-from-cart.tool.js +58 -0
- package/lib/tools/built-in/shop/remove-from-cart.tool.js.map +1 -0
- package/lib/tools/built-in/shop/search-products.tool.d.ts +48 -0
- package/lib/tools/built-in/shop/search-products.tool.js +95 -0
- package/lib/tools/built-in/shop/search-products.tool.js.map +1 -0
- package/lib/tools/built-in/shop/set-checkout-details.tool.d.ts +56 -0
- package/lib/tools/built-in/shop/set-checkout-details.tool.js +187 -0
- package/lib/tools/built-in/shop/set-checkout-details.tool.js.map +1 -0
- package/lib/tools/built-in/shop/set-shipping-method.tool.d.ts +17 -0
- package/lib/tools/built-in/shop/set-shipping-method.tool.js +58 -0
- package/lib/tools/built-in/shop/set-shipping-method.tool.js.map +1 -0
- package/lib/tools/built-in/shop/update-cart-line.tool.d.ts +18 -0
- package/lib/tools/built-in/shop/update-cart-line.tool.js +60 -0
- package/lib/tools/built-in/shop/update-cart-line.tool.js.map +1 -0
- package/lib/tools/built-in/string-schemas.d.ts +4 -0
- package/lib/tools/built-in/string-schemas.js +13 -0
- package/lib/tools/built-in/string-schemas.js.map +1 -0
- package/lib/transport/mcp-server.factory.d.ts +13 -0
- package/lib/transport/mcp-server.factory.js +32 -0
- package/lib/transport/mcp-server.factory.js.map +1 -0
- package/lib/transport/mcp-transport.controller.d.ts +77 -0
- package/lib/transport/mcp-transport.controller.js +442 -0
- package/lib/transport/mcp-transport.controller.js.map +1 -0
- package/lib/types.d.ts +432 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/package.json +42 -0
- package/src/dashboard/components/activity-block.tsx +72 -0
- package/src/dashboard/components/actor-cell.tsx +31 -0
- package/src/dashboard/components/connection-dialog.tsx +106 -0
- package/src/dashboard/components/empty-cell.tsx +7 -0
- package/src/dashboard/components/grants-block.tsx +218 -0
- package/src/dashboard/components/stats-block.tsx +275 -0
- package/src/dashboard/components/tools-block.tsx +274 -0
- package/src/dashboard/components/tooltip-button.tsx +28 -0
- package/src/dashboard/components/use-mcp-table-state.ts +47 -0
- package/src/dashboard/i18n/ar.po +311 -0
- package/src/dashboard/i18n/bg.po +311 -0
- package/src/dashboard/i18n/cs.po +311 -0
- package/src/dashboard/i18n/de.po +311 -0
- package/src/dashboard/i18n/en.po +311 -0
- package/src/dashboard/i18n/es.po +311 -0
- package/src/dashboard/i18n/fa.po +311 -0
- package/src/dashboard/i18n/fr.po +311 -0
- package/src/dashboard/i18n/he.po +311 -0
- package/src/dashboard/i18n/hr.po +311 -0
- package/src/dashboard/i18n/hu.po +311 -0
- package/src/dashboard/i18n/it.po +311 -0
- package/src/dashboard/i18n/ja.po +311 -0
- package/src/dashboard/i18n/ko.po +311 -0
- package/src/dashboard/i18n/nb.po +311 -0
- package/src/dashboard/i18n/ne.po +311 -0
- package/src/dashboard/i18n/nl.po +311 -0
- package/src/dashboard/i18n/pl.po +311 -0
- package/src/dashboard/i18n/pt_BR.po +311 -0
- package/src/dashboard/i18n/pt_PT.po +311 -0
- package/src/dashboard/i18n/ro.po +311 -0
- package/src/dashboard/i18n/ru.po +311 -0
- package/src/dashboard/i18n/sv.po +311 -0
- package/src/dashboard/i18n/tr.po +311 -0
- package/src/dashboard/i18n/uk.po +311 -0
- package/src/dashboard/i18n/uz.po +311 -0
- package/src/dashboard/i18n/zh_Hans.po +311 -0
- package/src/dashboard/i18n/zh_Hant.po +311 -0
- package/src/dashboard/index.tsx +30 -0
- package/src/dashboard/mcp-activity-route.tsx +38 -0
- package/src/dashboard/mcp-authorize-route.tsx +369 -0
- package/src/dashboard/mcp-grants-route.tsx +38 -0
- package/src/dashboard/mcp-overview-route.tsx +46 -0
- package/src/dashboard/mcp-server-redirect-route.tsx +15 -0
- package/src/dashboard/mcp-tools-route.tsx +38 -0
- package/src/dashboard/mcp.graphql.ts +127 -0
- package/src/dashboard/published-files.spec.ts +54 -0
- package/src/dashboard/tsconfig.json +9 -0
- package/src/shared/endpoint-paths.ts +8 -0
- package/src/shared/loopback.ts +6 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.McpRateLimiterService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const core_1 = require("@vendure/core");
|
|
18
|
+
const node_crypto_1 = require("node:crypto");
|
|
19
|
+
const constants_1 = require("../constants");
|
|
20
|
+
const ip_bucket_key_1 = require("./ip-bucket-key");
|
|
21
|
+
let McpRateLimiterService = class McpRateLimiterService {
|
|
22
|
+
constructor(cacheService, options) {
|
|
23
|
+
this.cacheService = cacheService;
|
|
24
|
+
this.options = options;
|
|
25
|
+
/** Tail of the increment queue per bucket key; an entry is removed once its tail settles. */
|
|
26
|
+
this.inFlightIncrements = new Map();
|
|
27
|
+
}
|
|
28
|
+
// A refused request stays charged, like other fixed-window limiters.
|
|
29
|
+
async checkRateLimit(input) {
|
|
30
|
+
return this.runChecks(this.buildRateLimitChecks(input), input.subject);
|
|
31
|
+
}
|
|
32
|
+
// Kept separate from the standard request checks, which run later, to avoid double charging.
|
|
33
|
+
async checkAnonymousIpRateLimit(endpoint, clientIp) {
|
|
34
|
+
const check = this.buildAnonymousIpCheck(endpoint, (0, ip_bucket_key_1.ipBucketKey)(clientIp));
|
|
35
|
+
if (!check) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return this.runChecks([check], 'MCP request');
|
|
39
|
+
}
|
|
40
|
+
/** Meters the OAuth endpoints per IP; they have no session or user to key on. */
|
|
41
|
+
async checkOauthIpRateLimit(clientIp) {
|
|
42
|
+
const check = this.buildOauthIpCheck((0, ip_bucket_key_1.ipBucketKey)(clientIp));
|
|
43
|
+
if (!check) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return this.runChecks([check], 'MCP OAuth request');
|
|
47
|
+
}
|
|
48
|
+
// Only failed attempts count; once the limit is hit, every request from the IP is blocked until the window resets.
|
|
49
|
+
async checkBearerAuthFailureRateLimit(clientIp) {
|
|
50
|
+
const check = this.buildBearerAuthFailureCheck((0, ip_bucket_key_1.ipBucketKey)(clientIp));
|
|
51
|
+
if (!check) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
const state = await this.getBucketState(check.key);
|
|
56
|
+
if (state && state.count > check.rpm) {
|
|
57
|
+
// Keep counting refused attempts, so the cache entry stays alive while the flood lasts.
|
|
58
|
+
await this.incrementBucket(check.key, now);
|
|
59
|
+
return this.exceededDetails('MCP request', check.scope, state.resetAt, now);
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
async recordBearerAuthFailure(clientIp) {
|
|
64
|
+
const check = this.buildBearerAuthFailureCheck((0, ip_bucket_key_1.ipBucketKey)(clientIp));
|
|
65
|
+
if (!check) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
await this.incrementBucket(check.key, Date.now());
|
|
69
|
+
}
|
|
70
|
+
async runChecks(checks, subject) {
|
|
71
|
+
if (checks.length === 0) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const now = Date.now();
|
|
75
|
+
const results = await Promise.all(checks.map(async (check) => ({ check, state: await this.incrementBucket(check.key, now) })));
|
|
76
|
+
const exceeded = results.find(({ check, state }) => state.count > check.rpm);
|
|
77
|
+
if (exceeded) {
|
|
78
|
+
return this.exceededDetails(subject, exceeded.check.scope, exceeded.state.resetAt, now);
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
exceededDetails(subject, scope, resetAt, now) {
|
|
83
|
+
// Capped to one window, so a clock difference between instances can't advertise a wait longer than that.
|
|
84
|
+
const windowSeconds = constants_1.RATE_LIMIT_WINDOW_MS / 1000;
|
|
85
|
+
const retryAfterSeconds = Math.min(windowSeconds, Math.max(1, Math.ceil((resetAt - now) / 1000)));
|
|
86
|
+
return {
|
|
87
|
+
message: `Rate limit exceeded for ${subject} (${scope}). Retry after ${retryAfterSeconds} seconds.`,
|
|
88
|
+
retryAfterSeconds,
|
|
89
|
+
scope,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
buildRateLimitChecks(input) {
|
|
93
|
+
const checks = [
|
|
94
|
+
...this.buildSharedBucketChecks(input),
|
|
95
|
+
...this.buildPerToolChecks(input),
|
|
96
|
+
];
|
|
97
|
+
// De-dupe by key so a bucket is never double-counted within one request.
|
|
98
|
+
return [...new Map(checks.map(check => [check.key, check])).values()];
|
|
99
|
+
}
|
|
100
|
+
buildSharedBucketChecks(input) {
|
|
101
|
+
const checks = [];
|
|
102
|
+
const endpoint = input.endpoint;
|
|
103
|
+
const rateLimits = this.options.rateLimits;
|
|
104
|
+
const perSessionRpm = this.resolveRpm(rateLimits.perSession);
|
|
105
|
+
if (perSessionRpm > 0) {
|
|
106
|
+
checks.push({
|
|
107
|
+
key: `session:${endpoint}:${this.sessionOrIpKey(input.executionContext)}`,
|
|
108
|
+
rpm: perSessionRpm,
|
|
109
|
+
scope: 'session',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const userKey = this.userKey(input.executionContext);
|
|
113
|
+
const perUserRpm = this.resolveRpm(rateLimits.perUser);
|
|
114
|
+
if (userKey && perUserRpm > 0) {
|
|
115
|
+
checks.push({
|
|
116
|
+
key: `user:${endpoint}:${userKey}`,
|
|
117
|
+
rpm: perUserRpm,
|
|
118
|
+
scope: 'user',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const clientKey = this.clientKey(input.executionContext);
|
|
122
|
+
const perClientRpm = this.resolveRpm(rateLimits.perClient);
|
|
123
|
+
if (clientKey && perClientRpm > 0) {
|
|
124
|
+
checks.push({
|
|
125
|
+
key: `client:${endpoint}:${clientKey}`,
|
|
126
|
+
rpm: perClientRpm,
|
|
127
|
+
scope: 'OAuth client',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return checks;
|
|
131
|
+
}
|
|
132
|
+
/** The per-minute limit of a rate-limit option: 0 when the option is off or unset. */
|
|
133
|
+
resolveRpm(option) {
|
|
134
|
+
var _a;
|
|
135
|
+
return option === false ? 0 : ((_a = option === null || option === void 0 ? void 0 : option.rpm) !== null && _a !== void 0 ? _a : 0);
|
|
136
|
+
}
|
|
137
|
+
buildAnonymousIpCheck(endpoint, ipKey) {
|
|
138
|
+
const rpm = this.resolveRpm(this.options.rateLimits.anonymousIp);
|
|
139
|
+
if (endpoint !== 'shop' || rpm <= 0) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return { key: `anonymous-ip:${endpoint}:${ipKey}`, rpm, scope: 'anonymous IP' };
|
|
143
|
+
}
|
|
144
|
+
buildOauthIpCheck(ipKey) {
|
|
145
|
+
const rpm = this.resolveRpm(this.options.rateLimits.oauthIp);
|
|
146
|
+
if (rpm <= 0) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
return { key: `oauth-ip:${ipKey}`, rpm, scope: 'OAuth IP' };
|
|
150
|
+
}
|
|
151
|
+
// Governed by the same `oauthIp` option as the OAuth surface's bucket, since both meter an unauthenticated address.
|
|
152
|
+
buildBearerAuthFailureCheck(ipKey) {
|
|
153
|
+
const rpm = this.resolveRpm(this.options.rateLimits.oauthIp);
|
|
154
|
+
if (rpm <= 0) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return { key: `auth-failure:${ipKey}`, rpm, scope: 'authentication failures' };
|
|
158
|
+
}
|
|
159
|
+
/** The bucket for `input.subject`, keyed by actor+session (see {@link perToolBucketKey}). */
|
|
160
|
+
buildPerToolChecks(input) {
|
|
161
|
+
const rpm = this.resolveRpm(this.options.rateLimits.perTool[input.subject]);
|
|
162
|
+
if (rpm <= 0) {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
return [
|
|
166
|
+
{
|
|
167
|
+
key: `tool:${input.endpoint}:${this.perToolBucketKey(input.executionContext)}:${input.subject}`,
|
|
168
|
+
rpm,
|
|
169
|
+
scope: `tool:${input.subject}`,
|
|
170
|
+
},
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
async getBucketState(key) {
|
|
174
|
+
return this.cacheService.get(this.cacheKey(key));
|
|
175
|
+
}
|
|
176
|
+
incrementBucket(key, now) {
|
|
177
|
+
var _a;
|
|
178
|
+
const run = async () => {
|
|
179
|
+
const state = await this.getBucketState(key);
|
|
180
|
+
const next = state
|
|
181
|
+
? { count: state.count + 1, resetAt: state.resetAt }
|
|
182
|
+
: { count: 1, resetAt: now + constants_1.RATE_LIMIT_WINDOW_MS };
|
|
183
|
+
await this.cacheService.set(this.cacheKey(key), next, {
|
|
184
|
+
ttl: Math.max(1000, next.resetAt - now),
|
|
185
|
+
});
|
|
186
|
+
return next;
|
|
187
|
+
};
|
|
188
|
+
const previous = (_a = this.inFlightIncrements.get(key)) !== null && _a !== void 0 ? _a : Promise.resolve();
|
|
189
|
+
const result = previous.then(run, run);
|
|
190
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
191
|
+
this.inFlightIncrements.set(key, tail);
|
|
192
|
+
void tail.then(() => {
|
|
193
|
+
// Only clear the entry if no later increment has replaced it.
|
|
194
|
+
if (this.inFlightIncrements.get(key) === tail) {
|
|
195
|
+
this.inFlightIncrements.delete(key);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
sessionKey(executionContext) {
|
|
201
|
+
var _a, _b;
|
|
202
|
+
const sessionToken = (_a = executionContext.ctx.session) === null || _a === void 0 ? void 0 : _a.token;
|
|
203
|
+
if (sessionToken) {
|
|
204
|
+
return `vendure:${this.hash(sessionToken)}`;
|
|
205
|
+
}
|
|
206
|
+
if (((_b = executionContext.grant) === null || _b === void 0 ? void 0 : _b.id) != null) {
|
|
207
|
+
return `mcp:${executionContext.grant.id}`;
|
|
208
|
+
}
|
|
209
|
+
// An in-process caller with no session shares this one bucket; there is nothing here to tell them apart.
|
|
210
|
+
return 'none';
|
|
211
|
+
}
|
|
212
|
+
sessionOrIpKey(executionContext) {
|
|
213
|
+
if (executionContext.grant == null && executionContext.clientIp != null) {
|
|
214
|
+
return `anonymous-ip:${(0, ip_bucket_key_1.ipBucketKey)(executionContext.clientIp)}`;
|
|
215
|
+
}
|
|
216
|
+
return this.sessionKey(executionContext);
|
|
217
|
+
}
|
|
218
|
+
userKey(executionContext) {
|
|
219
|
+
const userId = executionContext.ctx.activeUserId;
|
|
220
|
+
return userId != null ? String(userId) : undefined;
|
|
221
|
+
}
|
|
222
|
+
clientKey(executionContext) {
|
|
223
|
+
var _a;
|
|
224
|
+
return ((_a = executionContext.grant) === null || _a === void 0 ? void 0 : _a.oauthClientId) != null
|
|
225
|
+
? `oauth:${executionContext.grant.oauthClientId}`
|
|
226
|
+
: undefined;
|
|
227
|
+
}
|
|
228
|
+
// Client alone would collapse all its users under one bucket, so session is folded in for fairness.
|
|
229
|
+
perToolBucketKey(executionContext) {
|
|
230
|
+
const clientKey = this.clientKey(executionContext);
|
|
231
|
+
return clientKey
|
|
232
|
+
? `client:${clientKey}:session:${this.sessionKey(executionContext)}`
|
|
233
|
+
: this.sessionOrIpKey(executionContext);
|
|
234
|
+
}
|
|
235
|
+
cacheKey(key) {
|
|
236
|
+
return `${constants_1.RATE_LIMIT_CACHE_PREFIX}:${this.hash(key)}`;
|
|
237
|
+
}
|
|
238
|
+
hash(value) {
|
|
239
|
+
return (0, node_crypto_1.createHash)('sha256').update(value).digest('base64url');
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
exports.McpRateLimiterService = McpRateLimiterService;
|
|
243
|
+
exports.McpRateLimiterService = McpRateLimiterService = __decorate([
|
|
244
|
+
(0, common_1.Injectable)(),
|
|
245
|
+
__param(1, (0, common_1.Inject)(constants_1.MCP_PLUGIN_OPTIONS)),
|
|
246
|
+
__metadata("design:paramtypes", [core_1.CacheService, Object])
|
|
247
|
+
], McpRateLimiterService);
|
|
248
|
+
//# sourceMappingURL=mcp-rate-limiter.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-rate-limiter.service.js","sourceRoot":"","sources":["../../src/rate-limit/mcp-rate-limiter.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function tokenize(text: string): string[];
|
|
2
|
+
export declare class Bm25Index {
|
|
3
|
+
private readonly docs;
|
|
4
|
+
private readonly df;
|
|
5
|
+
private readonly avgLength;
|
|
6
|
+
constructor(entries: Array<{
|
|
7
|
+
id: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}>);
|
|
10
|
+
/** BM25 relevance of one document for the query; 0 when no query term occurs in it. */
|
|
11
|
+
score(id: string, query: string): number;
|
|
12
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Bm25Index = void 0;
|
|
4
|
+
exports.tokenize = tokenize;
|
|
5
|
+
const STOPWORDS = new Set(('a an the of to for and or in on at by with from this that these those is are be as it its ' +
|
|
6
|
+
'my your our their i we you me us them').split(' '));
|
|
7
|
+
// Whole-word matching lets a nonsense query score zero and trigger the no-results hint, which substring matching could not.
|
|
8
|
+
function tokenize(text) {
|
|
9
|
+
return text
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.split(/[^a-z0-9]+/)
|
|
12
|
+
.filter(token => token.length > 0 && !STOPWORDS.has(token));
|
|
13
|
+
}
|
|
14
|
+
// Standard Okapi BM25 tuning values.
|
|
15
|
+
const K1 = 1.5;
|
|
16
|
+
const B = 0.75;
|
|
17
|
+
// Rare query terms count more than common ones, so a "refund" hit says more than an "order" hit when half the tools mention orders.
|
|
18
|
+
class Bm25Index {
|
|
19
|
+
constructor(entries) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
this.docs = new Map();
|
|
22
|
+
this.df = new Map();
|
|
23
|
+
for (const { id, text } of entries) {
|
|
24
|
+
const tokens = tokenize(text);
|
|
25
|
+
const termCounts = new Map();
|
|
26
|
+
for (const token of tokens) {
|
|
27
|
+
termCounts.set(token, ((_a = termCounts.get(token)) !== null && _a !== void 0 ? _a : 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
this.docs.set(id, { termCounts, length: tokens.length });
|
|
30
|
+
for (const term of termCounts.keys()) {
|
|
31
|
+
this.df.set(term, ((_b = this.df.get(term)) !== null && _b !== void 0 ? _b : 0) + 1);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const totalLength = [...this.docs.values()].reduce((sum, doc) => sum + doc.length, 0);
|
|
35
|
+
this.avgLength = this.docs.size > 0 ? totalLength / this.docs.size : 0;
|
|
36
|
+
}
|
|
37
|
+
/** BM25 relevance of one document for the query; 0 when no query term occurs in it. */
|
|
38
|
+
score(id, query) {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
const doc = this.docs.get(id);
|
|
41
|
+
if (!doc || doc.length === 0) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
let score = 0;
|
|
45
|
+
for (const term of tokenize(query)) {
|
|
46
|
+
const frequency = (_a = doc.termCounts.get(term)) !== null && _a !== void 0 ? _a : 0;
|
|
47
|
+
if (frequency === 0) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const df = (_b = this.df.get(term)) !== null && _b !== void 0 ? _b : 0;
|
|
51
|
+
const idf = Math.log(1 + (this.docs.size - df + 0.5) / (df + 0.5));
|
|
52
|
+
const numerator = frequency * (K1 + 1);
|
|
53
|
+
const denominator = frequency + K1 * (1 - B + B * (doc.length / this.avgLength));
|
|
54
|
+
score += idf * (numerator / denominator);
|
|
55
|
+
}
|
|
56
|
+
return score;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.Bm25Index = Bm25Index;
|
|
60
|
+
//# sourceMappingURL=bm25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/registry/bm25.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CallToolResult } from '@modelcontextprotocol/server';
|
|
2
|
+
import { RequestContext } from '@vendure/core';
|
|
3
|
+
import { McpToolset } from '@vendure/mcp-sdk';
|
|
4
|
+
import { McpToolSummary } from '../types';
|
|
5
|
+
import { McpToolRegistryService } from './mcp-tool-registry.service';
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* Lists and runs MCP tools from inside the Vendure process. Calls use the same pipeline as HTTP
|
|
9
|
+
* requests, including permissions, rate limits, validation, confirmations, and logging.
|
|
10
|
+
*
|
|
11
|
+
* Always pass the original `ctx` you received so the tool runs with the correct permissions and
|
|
12
|
+
* session. Anonymous shop tools can use a `sessionToken` to continue the same shopper session.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { Injectable } from '\@nestjs/common';
|
|
17
|
+
* import { RequestContext } from '\@vendure/core';
|
|
18
|
+
* import { McpToolExecutionService } from '\@vendure/mcp-plugin';
|
|
19
|
+
*
|
|
20
|
+
* \@Injectable()
|
|
21
|
+
* export class AssistantService {
|
|
22
|
+
* constructor(private mcpToolExecution: McpToolExecutionService) {}
|
|
23
|
+
*
|
|
24
|
+
* async reply(ctx: RequestContext, message: string) {
|
|
25
|
+
* const tools = await this.mcpToolExecution.listTools(ctx, 'shop');
|
|
26
|
+
* // Hand `tools` to your model, then run whichever one it picks:
|
|
27
|
+
* return this.mcpToolExecution.executeTool(ctx, 'shop', 'search_products', {
|
|
28
|
+
* query: message,
|
|
29
|
+
* });
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @docsCategory core plugins/McpPlugin
|
|
35
|
+
* @since 3.8.0
|
|
36
|
+
*/
|
|
37
|
+
export declare class McpToolExecutionService {
|
|
38
|
+
private readonly registry;
|
|
39
|
+
constructor(registry: McpToolRegistryService);
|
|
40
|
+
/** The context must match the toolset: a Shop API context for `'shop'`, an Admin API context for `'admin'`. */
|
|
41
|
+
listTools(ctx: RequestContext, toolset: McpToolset): Promise<McpToolSummary[]>;
|
|
42
|
+
/** Most failures come back as `isError: true` rather than thrown. Destructive tools require `confirm: true`. */
|
|
43
|
+
executeTool(ctx: RequestContext, toolset: McpToolset, toolName: string, input?: unknown): Promise<CallToolResult>;
|
|
44
|
+
private assertContextMatchesToolset;
|
|
45
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.McpToolExecutionService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const mcp_tool_registry_service_1 = require("./mcp-tool-registry.service");
|
|
15
|
+
/**
|
|
16
|
+
* @description
|
|
17
|
+
* Lists and runs MCP tools from inside the Vendure process. Calls use the same pipeline as HTTP
|
|
18
|
+
* requests, including permissions, rate limits, validation, confirmations, and logging.
|
|
19
|
+
*
|
|
20
|
+
* Always pass the original `ctx` you received so the tool runs with the correct permissions and
|
|
21
|
+
* session. Anonymous shop tools can use a `sessionToken` to continue the same shopper session.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { Injectable } from '\@nestjs/common';
|
|
26
|
+
* import { RequestContext } from '\@vendure/core';
|
|
27
|
+
* import { McpToolExecutionService } from '\@vendure/mcp-plugin';
|
|
28
|
+
*
|
|
29
|
+
* \@Injectable()
|
|
30
|
+
* export class AssistantService {
|
|
31
|
+
* constructor(private mcpToolExecution: McpToolExecutionService) {}
|
|
32
|
+
*
|
|
33
|
+
* async reply(ctx: RequestContext, message: string) {
|
|
34
|
+
* const tools = await this.mcpToolExecution.listTools(ctx, 'shop');
|
|
35
|
+
* // Hand `tools` to your model, then run whichever one it picks:
|
|
36
|
+
* return this.mcpToolExecution.executeTool(ctx, 'shop', 'search_products', {
|
|
37
|
+
* query: message,
|
|
38
|
+
* });
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @docsCategory core plugins/McpPlugin
|
|
44
|
+
* @since 3.8.0
|
|
45
|
+
*/
|
|
46
|
+
let McpToolExecutionService = class McpToolExecutionService {
|
|
47
|
+
constructor(registry) {
|
|
48
|
+
this.registry = registry;
|
|
49
|
+
}
|
|
50
|
+
/** The context must match the toolset: a Shop API context for `'shop'`, an Admin API context for `'admin'`. */
|
|
51
|
+
async listTools(ctx, toolset) {
|
|
52
|
+
this.assertContextMatchesToolset(ctx, toolset);
|
|
53
|
+
return this.registry.getCallableTools(ctx, toolset);
|
|
54
|
+
}
|
|
55
|
+
/** Most failures come back as `isError: true` rather than thrown. Destructive tools require `confirm: true`. */
|
|
56
|
+
async executeTool(ctx, toolset, toolName, input) {
|
|
57
|
+
this.assertContextMatchesToolset(ctx, toolset);
|
|
58
|
+
return this.registry.callToolDirect({ ctx }, toolset, toolName, input !== null && input !== void 0 ? input : {});
|
|
59
|
+
}
|
|
60
|
+
assertContextMatchesToolset(ctx, toolset) {
|
|
61
|
+
if (ctx.apiType !== toolset) {
|
|
62
|
+
throw new common_1.ForbiddenException(`The "${toolset}" MCP toolset requires a ${toolset} API RequestContext, ` +
|
|
63
|
+
`but the supplied context is for the "${ctx.apiType}" API.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
exports.McpToolExecutionService = McpToolExecutionService;
|
|
68
|
+
exports.McpToolExecutionService = McpToolExecutionService = __decorate([
|
|
69
|
+
(0, common_1.Injectable)(),
|
|
70
|
+
__metadata("design:paramtypes", [mcp_tool_registry_service_1.McpToolRegistryService])
|
|
71
|
+
], McpToolExecutionService);
|
|
72
|
+
//# sourceMappingURL=mcp-tool-execution.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-execution.service.js","sourceRoot":"","sources":["../../src/registry/mcp-tool-execution.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,2CAAgE;AAMhE,2EAAqE;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAChC,YAA6B,QAAgC;QAAhC,aAAQ,GAAR,QAAQ,CAAwB;IAAG,CAAC;IAEjE,+GAA+G;IAC/G,KAAK,CAAC,SAAS,CAAC,GAAmB,EAAE,OAAmB;QACpD,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,gHAAgH;IAChH,KAAK,CAAC,WAAW,CACb,GAAmB,EACnB,OAAmB,EACnB,QAAgB,EAChB,KAAe;QAEf,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAEO,2BAA2B,CAAC,GAAmB,EAAE,OAAmB;QACxE,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,2BAAkB,CACxB,QAAQ,OAAO,4BAA4B,OAAO,uBAAuB;gBACrE,wCAAwC,GAAG,CAAC,OAAO,QAAQ,CAClE,CAAC;QACN,CAAC;IACL,CAAC;CACJ,CAAA;AA5BY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;qCAE8B,kDAAsB;GADpD,uBAAuB,CA4BnC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { CallToolResult } from '@modelcontextprotocol/server';
|
|
2
|
+
import { OnApplicationBootstrap } from '@nestjs/common';
|
|
3
|
+
import { DiscoveryService } from '@nestjs/core';
|
|
4
|
+
import { ConfigService, RequestContext, SettingsStoreService, TransactionalConnection } from '@vendure/core';
|
|
5
|
+
import { McpToolset } from '@vendure/mcp-sdk';
|
|
6
|
+
import { McpExecutionContext, ResolvedMcpPluginOptions } from '../internal-types';
|
|
7
|
+
import { McpToolCallLogService } from '../logging/mcp-tool-call-log.service';
|
|
8
|
+
import { McpRateLimiterService } from '../rate-limit/mcp-rate-limiter.service';
|
|
9
|
+
import { McpShopSessionService } from '../shop-session/mcp-shop-session.service';
|
|
10
|
+
import { McpToolSummary } from '../types';
|
|
11
|
+
import { McpToolSchemaService } from './mcp-tool-schema.service';
|
|
12
|
+
import { McpExposedTool, McpRegisteredTool } from './registry-types';
|
|
13
|
+
/**
|
|
14
|
+
* @description
|
|
15
|
+
* Single source of truth for discovered `@McpTool` providers. It discovers tools at bootstrap,
|
|
16
|
+
* compiles their schemas once, and owns visibility, toggles, behavior,
|
|
17
|
+
* permissions, and execution.
|
|
18
|
+
*/
|
|
19
|
+
export declare class McpToolRegistryService implements OnApplicationBootstrap {
|
|
20
|
+
private readonly discoveryService;
|
|
21
|
+
private readonly settingsStoreService;
|
|
22
|
+
private readonly rateLimiter;
|
|
23
|
+
private readonly toolCallLog;
|
|
24
|
+
private readonly toolSchema;
|
|
25
|
+
private readonly shopSession;
|
|
26
|
+
private readonly configService;
|
|
27
|
+
private readonly connection;
|
|
28
|
+
private readonly options;
|
|
29
|
+
private readonly tools;
|
|
30
|
+
private knownPermissions?;
|
|
31
|
+
private discoveryMetaTools;
|
|
32
|
+
private bm25;
|
|
33
|
+
private toggleCache;
|
|
34
|
+
constructor(discoveryService: DiscoveryService, settingsStoreService: SettingsStoreService, rateLimiter: McpRateLimiterService, toolCallLog: McpToolCallLogService, toolSchema: McpToolSchemaService, shopSession: McpShopSessionService, configService: ConfigService, connection: TransactionalConnection, options: ResolvedMcpPluginOptions);
|
|
35
|
+
/** @internal */
|
|
36
|
+
onApplicationBootstrap(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Every registered tool. Consumed by the admin API.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
getRegistrySnapshot(): McpRegisteredTool[];
|
|
43
|
+
/** @internal */
|
|
44
|
+
getExposedTools(executionContext: McpExecutionContext, toolset: McpToolset): Promise<McpExposedTool[]>;
|
|
45
|
+
callTool(executionContext: McpExecutionContext, toolset: McpToolset, name: string, input: unknown): Promise<CallToolResult>;
|
|
46
|
+
getCallableTools(ctx: RequestContext, toolset: McpToolset): Promise<McpToolSummary[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Skips the meta-tool routing in {@link callTool}, since a caller using this already knows which tool it wants.
|
|
49
|
+
*
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
52
|
+
callToolDirect(executionContext: McpExecutionContext, toolset: McpToolset, name: string, input: unknown): Promise<CallToolResult>;
|
|
53
|
+
getToolToggles(ctx: RequestContext): Promise<Record<string, boolean>>;
|
|
54
|
+
/** @internal */
|
|
55
|
+
isToolEnabled(tool: Pick<McpRegisteredTool, 'toolset' | 'name'>, toggles: Record<string, boolean>): boolean;
|
|
56
|
+
setToolEnabled(ctx: RequestContext, toolset: McpToolset, name: string, enabled: boolean): Promise<void>;
|
|
57
|
+
toolKey(toolset: McpToolset, name: string): string;
|
|
58
|
+
private discoverTools;
|
|
59
|
+
private isToolHandler;
|
|
60
|
+
private buildRegisteredTool;
|
|
61
|
+
private assertValidToolMetadata;
|
|
62
|
+
private getKnownPermissions;
|
|
63
|
+
private registerTool;
|
|
64
|
+
private callRegisteredTool;
|
|
65
|
+
private resolveShopSession;
|
|
66
|
+
private runToolHandler;
|
|
67
|
+
private handleToolCallError;
|
|
68
|
+
private admitToolCall;
|
|
69
|
+
private buildToolCallResult;
|
|
70
|
+
private searchTools;
|
|
71
|
+
private toolSummary;
|
|
72
|
+
private buildSearchIndexes;
|
|
73
|
+
private buildDiscoveryMetaTools;
|
|
74
|
+
private visibleTools;
|
|
75
|
+
private deriveAnnotations;
|
|
76
|
+
private hasPermissions;
|
|
77
|
+
private isPubliclyCallable;
|
|
78
|
+
private acceptsSessionToken;
|
|
79
|
+
private toCallerInfo;
|
|
80
|
+
private getPluginSource;
|
|
81
|
+
private successResult;
|
|
82
|
+
private tooLargeMessage;
|
|
83
|
+
private completedTooLargeResult;
|
|
84
|
+
/** Reads a list of choices as a sentence does: "a", "a or b", "a, b, or c". */
|
|
85
|
+
private joinWithOr;
|
|
86
|
+
private errorResult;
|
|
87
|
+
private vendureErrorResult;
|
|
88
|
+
private confirmationRequiredResult;
|
|
89
|
+
}
|