@confluentinc/mcp-confluent 1.2.2 → 1.3.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/README.md +171 -193
- package/assets/oauth-templates/callback-failure.html +22 -0
- package/assets/oauth-templates/callback-success.html +19 -0
- package/assets/oauth-templates/logo.html +91 -0
- package/assets/oauth-templates/styles.html +49 -0
- package/config.example.yaml +149 -0
- package/config.oauth.example.yaml +45 -0
- package/dist/cli.d.ts +59 -12
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +131 -61
- package/dist/cli.js.map +1 -1
- package/dist/config/env-config.d.ts +33 -0
- package/dist/config/env-config.d.ts.map +1 -0
- package/dist/config/env-config.js +473 -0
- package/dist/config/env-config.js.map +1 -0
- package/dist/config/index.d.ts +31 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +76 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/interpolation.d.ts +9 -0
- package/dist/config/interpolation.d.ts.map +1 -0
- package/dist/config/interpolation.js +51 -0
- package/dist/config/interpolation.js.map +1 -0
- package/dist/config/models.d.ts +396 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +401 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/validation.d.ts +9 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +46 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/confluent/base-client-manager.d.ts +100 -0
- package/dist/confluent/base-client-manager.d.ts.map +1 -0
- package/dist/confluent/base-client-manager.js +188 -0
- package/dist/confluent/base-client-manager.js.map +1 -0
- package/dist/confluent/client-manager.d.ts +42 -77
- package/dist/confluent/client-manager.d.ts.map +1 -1
- package/dist/confluent/client-manager.js +5 -213
- package/dist/confluent/client-manager.js.map +1 -1
- package/dist/confluent/config-telemetry.d.ts +41 -0
- package/dist/confluent/config-telemetry.d.ts.map +1 -0
- package/dist/confluent/config-telemetry.js +17 -0
- package/dist/confluent/config-telemetry.js.map +1 -0
- package/dist/confluent/direct-client-manager.d.ts +43 -0
- package/dist/confluent/direct-client-manager.d.ts.map +1 -0
- package/dist/confluent/direct-client-manager.js +146 -0
- package/dist/confluent/direct-client-manager.js.map +1 -0
- package/dist/confluent/middleware.d.ts +32 -4
- package/dist/confluent/middleware.d.ts.map +1 -1
- package/dist/confluent/middleware.js +46 -2
- package/dist/confluent/middleware.js.map +1 -1
- package/dist/confluent/node-deps.d.ts +32 -39
- package/dist/confluent/node-deps.d.ts.map +1 -1
- package/dist/confluent/node-deps.js +42 -7
- package/dist/confluent/node-deps.js.map +1 -1
- package/dist/confluent/oauth/auth-context.d.ts +94 -0
- package/dist/confluent/oauth/auth-context.d.ts.map +1 -0
- package/dist/confluent/oauth/auth-context.js +323 -0
- package/dist/confluent/oauth/auth-context.js.map +1 -0
- package/dist/confluent/oauth/auth0-config.d.ts +12 -0
- package/dist/confluent/oauth/auth0-config.d.ts.map +1 -0
- package/dist/confluent/oauth/auth0-config.js +43 -0
- package/dist/confluent/oauth/auth0-config.js.map +1 -0
- package/dist/confluent/oauth/callback-pages.d.ts +5 -0
- package/dist/confluent/oauth/callback-pages.d.ts.map +1 -0
- package/dist/confluent/oauth/callback-pages.js +38 -0
- package/dist/confluent/oauth/callback-pages.js.map +1 -0
- package/dist/confluent/oauth/crypto-utils.d.ts +16 -0
- package/dist/confluent/oauth/crypto-utils.d.ts.map +1 -0
- package/dist/confluent/oauth/crypto-utils.js +23 -0
- package/dist/confluent/oauth/crypto-utils.js.map +1 -0
- package/dist/confluent/oauth/errors.d.ts +27 -0
- package/dist/confluent/oauth/errors.d.ts.map +1 -0
- package/dist/confluent/oauth/errors.js +6 -0
- package/dist/confluent/oauth/errors.js.map +1 -0
- package/dist/confluent/oauth/oauth-holder.d.ts +34 -0
- package/dist/confluent/oauth/oauth-holder.d.ts.map +1 -0
- package/dist/confluent/oauth/oauth-holder.js +155 -0
- package/dist/confluent/oauth/oauth-holder.js.map +1 -0
- package/dist/confluent/oauth/pkce-login.d.ts +26 -0
- package/dist/confluent/oauth/pkce-login.d.ts.map +1 -0
- package/dist/confluent/oauth/pkce-login.js +161 -0
- package/dist/confluent/oauth/pkce-login.js.map +1 -0
- package/dist/confluent/oauth/token-chain.d.ts +53 -0
- package/dist/confluent/oauth/token-chain.d.ts.map +1 -0
- package/dist/confluent/oauth/token-chain.js +141 -0
- package/dist/confluent/oauth/token-chain.js.map +1 -0
- package/dist/confluent/oauth/token-lifetimes.d.ts +13 -0
- package/dist/confluent/oauth/token-lifetimes.d.ts.map +1 -0
- package/dist/confluent/oauth/token-lifetimes.js +13 -0
- package/dist/confluent/oauth/token-lifetimes.js.map +1 -0
- package/dist/confluent/oauth/types.d.ts +68 -0
- package/dist/confluent/oauth/types.d.ts.map +1 -0
- package/dist/confluent/oauth/types.js +2 -0
- package/dist/confluent/oauth/types.js.map +1 -0
- package/dist/confluent/oauth-client-manager.d.ts +78 -0
- package/dist/confluent/oauth-client-manager.d.ts.map +1 -0
- package/dist/confluent/oauth-client-manager.js +265 -0
- package/dist/confluent/oauth-client-manager.js.map +1 -0
- package/dist/confluent/oauth-resource-resolvers.d.ts +6 -0
- package/dist/confluent/oauth-resource-resolvers.d.ts.map +1 -0
- package/dist/confluent/oauth-resource-resolvers.js +65 -0
- package/dist/confluent/oauth-resource-resolvers.js.map +1 -0
- package/dist/confluent/telemetry.d.ts +32 -1
- package/dist/confluent/telemetry.d.ts.map +1 -1
- package/dist/confluent/telemetry.js +31 -8
- package/dist/confluent/telemetry.js.map +1 -1
- package/dist/confluent/tools/base-tools.d.ts +98 -23
- package/dist/confluent/tools/base-tools.d.ts.map +1 -1
- package/dist/confluent/tools/base-tools.js +62 -4
- package/dist/confluent/tools/base-tools.js.map +1 -1
- package/dist/confluent/tools/cluster-arg-resolvers.d.ts +75 -0
- package/dist/confluent/tools/cluster-arg-resolvers.d.ts.map +1 -0
- package/dist/confluent/tools/cluster-arg-resolvers.js +127 -0
- package/dist/confluent/tools/cluster-arg-resolvers.js.map +1 -0
- package/dist/confluent/tools/connection-predicates.d.ts +168 -0
- package/dist/confluent/tools/connection-predicates.d.ts.map +1 -0
- package/dist/confluent/tools/connection-predicates.js +273 -0
- package/dist/confluent/tools/connection-predicates.js.map +1 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +3 -5
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +4 -8
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts +4 -5
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js +4 -8
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts +4 -5
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.js +4 -8
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts +4 -5
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.js +4 -8
- package/dist/confluent/tools/handlers/catalog/delete-tag.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts +4 -5
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.js +4 -8
- package/dist/confluent/tools/handlers/catalog/list-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts +4 -5
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js +4 -8
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +3 -5
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js +9 -12
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts +21 -0
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.js +22 -0
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts +11 -7
- package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/create-connector-handler.js +21 -21
- package/dist/confluent/tools/handlers/connect/create-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts +6 -7
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.js +10 -15
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts +6 -7
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.js +15 -17
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.d.ts +6 -7
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.js +10 -15
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts +57 -0
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js +122 -0
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts +17 -0
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js +234 -0
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts +13 -0
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js +285 -0
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +3 -5
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js +4 -8
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts +3 -5
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js +4 -8
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +16 -9
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +18 -12
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +15 -21
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts +14 -0
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.js +15 -0
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +15 -21
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +12 -20
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +12 -20
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +13 -29
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js +18 -23
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js +7 -13
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js +7 -13
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +8 -15
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +2 -2
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +7 -7
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +11 -17
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +2 -2
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts +21 -0
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js +31 -0
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js +7 -13
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js +9 -16
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.js +7 -13
- package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts +3 -5
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.js +20 -19
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +5 -4
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +23 -16
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +50 -14
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js +24 -7
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts +3 -5
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.js +20 -19
- package/dist/confluent/tools/handlers/kafka/get-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js +23 -9
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js +51 -32
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +4 -5
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +4 -8
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +22 -5
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +86 -52
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts +49 -0
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js +115 -0
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +11 -7
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts +3 -4
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +11 -6
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts +4 -5
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js +4 -8
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts +4 -5
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js +4 -8
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js +17 -13
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js +6 -12
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js +7 -13
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js +6 -12
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js +5 -9
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js +19 -21
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts +25 -0
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js +27 -0
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js +17 -13
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js +6 -12
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js +7 -13
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js +6 -12
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts +5 -7
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js +5 -9
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/tool-availability.d.ts +74 -0
- package/dist/confluent/tools/tool-availability.d.ts.map +1 -0
- package/dist/confluent/tools/tool-availability.js +121 -0
- package/dist/confluent/tools/tool-availability.js.map +1 -0
- package/dist/confluent/tools/tool-name.d.ts +5 -1
- package/dist/confluent/tools/tool-name.d.ts.map +1 -1
- package/dist/confluent/tools/tool-name.js +4 -0
- package/dist/confluent/tools/tool-name.js.map +1 -1
- package/dist/confluent/tools/tool-registry.d.ts +18 -0
- package/dist/confluent/tools/tool-registry.d.ts.map +1 -0
- package/dist/confluent/tools/{tool-factory.js → tool-registry.js} +32 -19
- package/dist/confluent/tools/tool-registry.js.map +1 -0
- package/dist/env-schema.d.ts +5 -7
- package/dist/env-schema.d.ts.map +1 -1
- package/dist/env-schema.js +20 -39
- package/dist/env-schema.js.map +1 -1
- package/dist/env.d.ts +16 -7
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +16 -6
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +74 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +279 -166
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +21 -20
- package/dist/logger.js.map +1 -1
- package/dist/mcp/server.d.ts +29 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +52 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/transports/auth.d.ts +20 -4
- package/dist/mcp/transports/auth.d.ts.map +1 -1
- package/dist/mcp/transports/auth.js +27 -7
- package/dist/mcp/transports/auth.js.map +1 -1
- package/dist/mcp/transports/http.d.ts +8 -2
- package/dist/mcp/transports/http.d.ts.map +1 -1
- package/dist/mcp/transports/http.js +57 -42
- package/dist/mcp/transports/http.js.map +1 -1
- package/dist/mcp/transports/manager.d.ts +23 -9
- package/dist/mcp/transports/manager.d.ts.map +1 -1
- package/dist/mcp/transports/manager.js +27 -24
- package/dist/mcp/transports/manager.js.map +1 -1
- package/dist/mcp/transports/server.d.ts +1 -1
- package/dist/mcp/transports/server.d.ts.map +1 -1
- package/dist/mcp/transports/server.js +17 -5
- package/dist/mcp/transports/server.js.map +1 -1
- package/dist/mcp/transports/session-registry.d.ts +33 -0
- package/dist/mcp/transports/session-registry.d.ts.map +1 -0
- package/dist/mcp/transports/session-registry.js +65 -0
- package/dist/mcp/transports/session-registry.js.map +1 -0
- package/dist/mcp/transports/sse.d.ts +13 -2
- package/dist/mcp/transports/sse.d.ts.map +1 -1
- package/dist/mcp/transports/sse.js +58 -46
- package/dist/mcp/transports/sse.js.map +1 -1
- package/dist/server-runtime.d.ts +28 -0
- package/dist/server-runtime.d.ts.map +1 -0
- package/dist/server-runtime.js +73 -0
- package/dist/server-runtime.js.map +1 -0
- package/package.json +25 -9
- package/dist/confluent/helpers.d.ts +0 -11
- package/dist/confluent/helpers.d.ts.map +0 -1
- package/dist/confluent/helpers.js +0 -17
- package/dist/confluent/helpers.js.map +0 -1
- package/dist/confluent/tools/tool-factory.d.ts +0 -9
- package/dist/confluent/tools/tool-factory.d.ts.map +0 -1
- package/dist/confluent/tools/tool-factory.js.map +0 -1
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
import { logger } from "../../logger.js";
|
|
2
|
+
import { createMcpServer } from "../../mcp/server.js";
|
|
2
3
|
import { HttpTransport } from "../../mcp/transports/http.js";
|
|
3
4
|
import { HttpServer } from "../../mcp/transports/server.js";
|
|
4
5
|
import { SseTransport } from "../../mcp/transports/sse.js";
|
|
5
6
|
import { StdioTransport } from "../../mcp/transports/stdio.js";
|
|
6
7
|
import { TransportType } from "../../mcp/transports/types.js";
|
|
7
8
|
export class TransportManager {
|
|
8
|
-
server;
|
|
9
9
|
config;
|
|
10
10
|
transports = new Map();
|
|
11
11
|
httpServer = null;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
stdioServer = null;
|
|
13
|
+
constructor(config) {
|
|
14
14
|
this.config = config;
|
|
15
15
|
}
|
|
16
|
-
async start(
|
|
16
|
+
async start(options) {
|
|
17
|
+
const { serverOptions, types, http } = options;
|
|
17
18
|
try {
|
|
18
19
|
const needsHttpServer = types.some((type) => type === TransportType.HTTP || type === TransportType.SSE);
|
|
19
20
|
// Initialize and prepare HTTP server if needed
|
|
20
21
|
if (needsHttpServer) {
|
|
22
|
+
if (!http) {
|
|
23
|
+
throw new Error("HTTP/SSE transports require `http` start options (port, host)");
|
|
24
|
+
}
|
|
21
25
|
// Prepare auth configuration
|
|
22
26
|
const authEnabled = !this.config?.disableAuth;
|
|
23
27
|
const apiKey = this.config?.apiKey;
|
|
@@ -32,29 +36,20 @@ export class TransportManager {
|
|
|
32
36
|
allowedHosts: this.config?.allowedHosts || ["localhost", "127.0.0.1"],
|
|
33
37
|
};
|
|
34
38
|
this.httpServer = new HttpServer({ auth: authConfig });
|
|
35
|
-
await this.httpServer.prepare();
|
|
39
|
+
await this.httpServer.prepare(http);
|
|
36
40
|
if (authEnabled) {
|
|
37
41
|
logger.info("MCP Server authentication enabled");
|
|
38
42
|
}
|
|
39
43
|
}
|
|
40
44
|
// Create and connect all transports
|
|
41
45
|
await Promise.all(types.map(async (type) => {
|
|
42
|
-
const transport =
|
|
46
|
+
const transport = this.createTransport(type, serverOptions, http);
|
|
43
47
|
this.transports.set(type, transport);
|
|
44
48
|
await transport.connect();
|
|
45
49
|
}));
|
|
46
50
|
// Start HTTP server if needed (after routes are registered)
|
|
47
|
-
if (needsHttpServer && this.httpServer) {
|
|
48
|
-
|
|
49
|
-
await this.httpServer.start({
|
|
50
|
-
port,
|
|
51
|
-
host,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
logger.error("Port and host are required");
|
|
56
|
-
throw new Error("Port and host are required");
|
|
57
|
-
}
|
|
51
|
+
if (needsHttpServer && this.httpServer && http) {
|
|
52
|
+
await this.httpServer.start(http);
|
|
58
53
|
}
|
|
59
54
|
logger.info("All transports started successfully");
|
|
60
55
|
}
|
|
@@ -81,21 +76,29 @@ export class TransportManager {
|
|
|
81
76
|
}));
|
|
82
77
|
this.transports.clear();
|
|
83
78
|
this.httpServer = null;
|
|
79
|
+
// close the cached stdio McpServer; HTTP and SSE per-session servers were already closed
|
|
80
|
+
// by their respective transports' disconnect() above
|
|
81
|
+
if (this.stdioServer) {
|
|
82
|
+
await this.stdioServer.close();
|
|
83
|
+
this.stdioServer = null;
|
|
84
|
+
}
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
+
createTransport(type, serverOptions, http) {
|
|
86
87
|
switch (type) {
|
|
87
|
-
case
|
|
88
|
+
case TransportType.HTTP:
|
|
88
89
|
if (!this.httpServer) {
|
|
89
90
|
throw new Error("HTTP server not initialized");
|
|
90
91
|
}
|
|
91
|
-
return new HttpTransport(
|
|
92
|
-
case
|
|
92
|
+
return new HttpTransport(() => createMcpServer(serverOptions), this.httpServer, http?.mcpEndpointPath);
|
|
93
|
+
case TransportType.SSE:
|
|
93
94
|
if (!this.httpServer) {
|
|
94
95
|
throw new Error("HTTP server not initialized");
|
|
95
96
|
}
|
|
96
|
-
return new SseTransport(
|
|
97
|
-
case
|
|
98
|
-
|
|
97
|
+
return new SseTransport(() => createMcpServer(serverOptions), this.httpServer, http?.sseEndpointPath, http?.sseMessageEndpointPath);
|
|
98
|
+
case TransportType.STDIO:
|
|
99
|
+
// stdio is single-client by construction (one process, one stdin/stdout pair), so we
|
|
100
|
+
// cache one McpServer for the lifetime of the manager rather than minting per session
|
|
101
|
+
return new StdioTransport((this.stdioServer ??= createMcpServer(serverOptions)));
|
|
99
102
|
default:
|
|
100
103
|
throw new Error(`Unsupported transport type: ${type}`);
|
|
101
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/mcp/transports/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/mcp/transports/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export declare class HttpServer {
|
|
|
13
13
|
private isSwaggerConfigured;
|
|
14
14
|
private authConfig;
|
|
15
15
|
constructor(config?: HttpServerConfig);
|
|
16
|
-
prepare(): Promise<void>;
|
|
16
|
+
prepare(config: ServerConfig): Promise<void>;
|
|
17
17
|
getInstance(): FastifyInstance;
|
|
18
18
|
start(config: ServerConfig): Promise<void>;
|
|
19
19
|
stop(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EAGX,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAGL,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,CAAC,EAAE,gBAAgB;IAY/B,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyElD,WAAW,IAAI,eAAe;IAIxB,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAS5B"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import fastifySwagger from "@fastify/swagger";
|
|
2
2
|
import fastifySwaggerUi from "@fastify/swagger-ui";
|
|
3
|
-
import env from "../../env.js";
|
|
4
3
|
import { logger } from "../../logger.js";
|
|
5
|
-
import { createAuthHook } from "../../mcp/transports/auth.js";
|
|
4
|
+
import { CFLT_MCP_API_KEY_HEADER, createAuthHook, } from "../../mcp/transports/auth.js";
|
|
5
|
+
import { pingHandler, pingRequestSchema, pingResponseSchema, } from "../../mcp/transports/ping.js";
|
|
6
6
|
import { default as Fastify, } from "fastify";
|
|
7
7
|
export class HttpServer {
|
|
8
8
|
fastify;
|
|
@@ -18,7 +18,7 @@ export class HttpServer {
|
|
|
18
18
|
this.authConfig = config.auth;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
async prepare() {
|
|
21
|
+
async prepare(config) {
|
|
22
22
|
if (this.isSwaggerConfigured) {
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
@@ -37,7 +37,7 @@ export class HttpServer {
|
|
|
37
37
|
},
|
|
38
38
|
servers: [
|
|
39
39
|
{
|
|
40
|
-
url: `http://${
|
|
40
|
+
url: `http://${config.host}:${config.port}`,
|
|
41
41
|
description: "Local development server",
|
|
42
42
|
},
|
|
43
43
|
],
|
|
@@ -45,7 +45,7 @@ export class HttpServer {
|
|
|
45
45
|
securitySchemes: {
|
|
46
46
|
apiKey: {
|
|
47
47
|
type: "apiKey",
|
|
48
|
-
name:
|
|
48
|
+
name: CFLT_MCP_API_KEY_HEADER,
|
|
49
49
|
in: "header",
|
|
50
50
|
},
|
|
51
51
|
},
|
|
@@ -64,6 +64,18 @@ export class HttpServer {
|
|
|
64
64
|
},
|
|
65
65
|
staticCSP: true,
|
|
66
66
|
});
|
|
67
|
+
// Register /ping at the server level (not per-transport) so HTTP+SSE configurations
|
|
68
|
+
// don't fail at startup with a duplicate-route error
|
|
69
|
+
this.fastify.post("/ping", {
|
|
70
|
+
schema: {
|
|
71
|
+
tags: ["mcp"],
|
|
72
|
+
summary: "JSON-RPC 2.0 ping endpoint",
|
|
73
|
+
body: pingRequestSchema,
|
|
74
|
+
response: {
|
|
75
|
+
200: pingResponseSchema,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
}, pingHandler());
|
|
67
79
|
this.isSwaggerConfigured = true;
|
|
68
80
|
}
|
|
69
81
|
getInstance() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Transport as SdkTransport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
3
|
+
/** Paired SDK transport + {@link McpServer} representing one MCP session. */
|
|
4
|
+
export interface SessionEntry<T extends SdkTransport = SdkTransport> {
|
|
5
|
+
readonly transport: T;
|
|
6
|
+
readonly server: McpServer;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Registry of {@link SessionEntry} pairs keyed by MCP session id. Multi-client transports need
|
|
10
|
+
* one {@link McpServer} per session because the SDK binds each server to a single transport.
|
|
11
|
+
*
|
|
12
|
+
* {@see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/server/src/simpleStreamableHttp.ts}
|
|
13
|
+
* {@see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#session-management}
|
|
14
|
+
*/
|
|
15
|
+
export declare class SessionRegistry<T extends SdkTransport = SdkTransport> {
|
|
16
|
+
private readonly sessions;
|
|
17
|
+
set(sessionId: string, entry: SessionEntry<T>): void;
|
|
18
|
+
get(sessionId: string): SessionEntry<T> | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Connects {@linkcode server} to {@linkcode transport}; closes both on rejection. The pair
|
|
21
|
+
* is not in the registry yet at this point (the SDK's {@linkcode T.onsessioninitialized}
|
|
22
|
+
* callback fires later, during {@linkcode T.handleRequest}), so failure here is an orphan
|
|
23
|
+
* cleanup, not a registry mutation.
|
|
24
|
+
*/
|
|
25
|
+
bindServer(server: McpServer, transport: T): Promise<void>;
|
|
26
|
+
/** Closes the {@link SessionEntry} for {@linkcode sessionId} (if any) and removes it. */
|
|
27
|
+
closeAndRemove(sessionId: string): Promise<void>;
|
|
28
|
+
/** Closes every registered transport + server pair and clears the registry. */
|
|
29
|
+
closeAll(): Promise<void>;
|
|
30
|
+
/** Closes both halves of {@linkcode entry}, logging (not propagating) any failures. */
|
|
31
|
+
private closeEntry;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=session-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAG/F,6EAA6E;AAC7E,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACjE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,qBAAa,eAAe,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAInD;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE,yFAAyF;IACnF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD,+EAA+E;IACzE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,uFAAuF;YACzE,UAAU;CAYzB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { logger } from "../../logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry of {@link SessionEntry} pairs keyed by MCP session id. Multi-client transports need
|
|
4
|
+
* one {@link McpServer} per session because the SDK binds each server to a single transport.
|
|
5
|
+
*
|
|
6
|
+
* {@see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/server/src/simpleStreamableHttp.ts}
|
|
7
|
+
* {@see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#session-management}
|
|
8
|
+
*/
|
|
9
|
+
export class SessionRegistry {
|
|
10
|
+
sessions = new Map();
|
|
11
|
+
set(sessionId, entry) {
|
|
12
|
+
this.sessions.set(sessionId, entry);
|
|
13
|
+
}
|
|
14
|
+
get(sessionId) {
|
|
15
|
+
return this.sessions.get(sessionId);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Connects {@linkcode server} to {@linkcode transport}; closes both on rejection. The pair
|
|
19
|
+
* is not in the registry yet at this point (the SDK's {@linkcode T.onsessioninitialized}
|
|
20
|
+
* callback fires later, during {@linkcode T.handleRequest}), so failure here is an orphan
|
|
21
|
+
* cleanup, not a registry mutation.
|
|
22
|
+
*/
|
|
23
|
+
async bindServer(server, transport) {
|
|
24
|
+
try {
|
|
25
|
+
await server.connect(transport);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
await this.closeEntry({ transport, server });
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Closes the {@link SessionEntry} for {@linkcode sessionId} (if any) and removes it. */
|
|
33
|
+
async closeAndRemove(sessionId) {
|
|
34
|
+
const entry = this.sessions.get(sessionId);
|
|
35
|
+
if (!entry)
|
|
36
|
+
return;
|
|
37
|
+
// delete first so a re-entrant call from `transport.onclose` is a no-op
|
|
38
|
+
this.sessions.delete(sessionId);
|
|
39
|
+
await this.closeEntry(entry);
|
|
40
|
+
}
|
|
41
|
+
/** Closes every registered transport + server pair and clears the registry. */
|
|
42
|
+
async closeAll() {
|
|
43
|
+
const entries = [...this.sessions.values()];
|
|
44
|
+
this.sessions.clear();
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
await this.closeEntry(entry);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Closes both halves of {@linkcode entry}, logging (not propagating) any failures. */
|
|
50
|
+
async closeEntry(entry) {
|
|
51
|
+
try {
|
|
52
|
+
await entry.transport.close();
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
logger.error({ err }, "transport.close() failed during session cleanup");
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
await entry.server.close();
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
logger.error({ err }, "server.close() failed during session cleanup");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../../src/mcp/transports/session-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAQxC;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/D,GAAG,CAAC,SAAiB,EAAE,KAAsB;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,MAAiB,EAAE,SAAY;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,wEAAwE;QACxE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,uFAAuF;IAC/E,KAAK,CAAC,UAAU,CAAC,KAAsB;QAC7C,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,iDAAiD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8CAA8C,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,13 +2,24 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { HttpServer } from "../../mcp/transports/server.js";
|
|
3
3
|
import { Transport } from "../../mcp/transports/types.js";
|
|
4
4
|
export declare class SseTransport implements Transport {
|
|
5
|
-
private
|
|
5
|
+
private serverFactory;
|
|
6
6
|
private httpServer;
|
|
7
7
|
private sseMcpEndpointPath;
|
|
8
8
|
private sseMcpMessageEndpointPath;
|
|
9
9
|
private sessions;
|
|
10
|
-
constructor(
|
|
10
|
+
constructor(serverFactory: () => McpServer, httpServer: HttpServer, sseMcpEndpointPath?: string, sseMcpMessageEndpointPath?: string);
|
|
11
11
|
connect(): Promise<void>;
|
|
12
12
|
disconnect(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Mints a per-session {@link McpServer} + {@link SSEServerTransport} pair, wires
|
|
15
|
+
* lifecycle callbacks, registers the session, then binds the server. Streamable HTTP gets
|
|
16
|
+
* the sessionId asynchronously via the SDK's {@linkcode onsessioninitialized} callback (which
|
|
17
|
+
* fires inside {@linkcode StreamableHTTPServerTransport.handleRequest}), so it can register
|
|
18
|
+
* lazily and a failed bind leaves no entry. SSE has no such callback — sessionId is known at
|
|
19
|
+
* construction — so we register first and roll back on bind rejection. Without the rollback
|
|
20
|
+
* a fast client could see {@linkcode SSEServerTransport.start}'s endpoint event, POST to
|
|
21
|
+
* {@linkcode sseMcpMessageEndpointPath} and race the {@linkcode sessions.set} call.
|
|
22
|
+
*/
|
|
23
|
+
private createSession;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAkBzD,qBAAa,YAAa,YAAW,SAAS;IAI1C,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,yBAAyB;IANnC,OAAO,CAAC,QAAQ,CAA6C;gBAGnD,aAAa,EAAE,MAAM,SAAS,EAC9B,UAAU,EAAE,UAAU,EACtB,kBAAkB,GAAE,MAAe,EACnC,yBAAyB,GAAE,MAAoB;IAGnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmFxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;;;;;;;;OASG;YACW,aAAa;CA+C5B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sdkTransports } from "../../confluent/node-deps.js";
|
|
2
2
|
import { logger } from "../../logger.js";
|
|
3
|
-
import {
|
|
3
|
+
import { SessionRegistry } from "../../mcp/transports/session-registry.js";
|
|
4
4
|
const sseErrorSchema = {
|
|
5
5
|
type: "object",
|
|
6
6
|
properties: {
|
|
@@ -8,13 +8,13 @@ const sseErrorSchema = {
|
|
|
8
8
|
},
|
|
9
9
|
};
|
|
10
10
|
export class SseTransport {
|
|
11
|
-
|
|
11
|
+
serverFactory;
|
|
12
12
|
httpServer;
|
|
13
13
|
sseMcpEndpointPath;
|
|
14
14
|
sseMcpMessageEndpointPath;
|
|
15
|
-
sessions =
|
|
16
|
-
constructor(
|
|
17
|
-
this.
|
|
15
|
+
sessions = new SessionRegistry();
|
|
16
|
+
constructor(serverFactory, httpServer, sseMcpEndpointPath = "/sse", sseMcpMessageEndpointPath = "/messages") {
|
|
17
|
+
this.serverFactory = serverFactory;
|
|
18
18
|
this.httpServer = httpServer;
|
|
19
19
|
this.sseMcpEndpointPath = sseMcpEndpointPath;
|
|
20
20
|
this.sseMcpMessageEndpointPath = sseMcpMessageEndpointPath;
|
|
@@ -30,25 +30,9 @@ export class SseTransport {
|
|
|
30
30
|
400: sseErrorSchema,
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
|
-
}, async (
|
|
33
|
+
}, async (_request, reply) => {
|
|
34
34
|
try {
|
|
35
|
-
|
|
36
|
-
const transport = new SSEServerTransport(this.sseMcpMessageEndpointPath, reply.raw);
|
|
37
|
-
// Get the session ID from the transport
|
|
38
|
-
const sessionId = transport.sessionId;
|
|
39
|
-
if (!sessionId) {
|
|
40
|
-
throw new Error("Failed to get session ID from transport");
|
|
41
|
-
}
|
|
42
|
-
// Store the session before connecting to ensure it's available for messages
|
|
43
|
-
this.sessions[sessionId] = transport;
|
|
44
|
-
// Set up cleanup on connection close
|
|
45
|
-
reply.raw.on("close", () => {
|
|
46
|
-
logger.info(`SSE connection closed for session ${sessionId}`);
|
|
47
|
-
delete this.sessions[sessionId];
|
|
48
|
-
});
|
|
49
|
-
// Connect the transport to the server
|
|
50
|
-
await this.server.connect(transport);
|
|
51
|
-
logger.info(`New SSE connection established for session ${sessionId}`);
|
|
35
|
+
await this.createSession(reply.raw);
|
|
52
36
|
}
|
|
53
37
|
catch (error) {
|
|
54
38
|
logger.error({ error }, "Failed to establish SSE connection");
|
|
@@ -82,14 +66,13 @@ export class SseTransport {
|
|
|
82
66
|
}, async (request, reply) => {
|
|
83
67
|
try {
|
|
84
68
|
const sessionId = request.query.sessionId;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!transport) {
|
|
69
|
+
const entry = this.sessions.get(sessionId);
|
|
70
|
+
if (!entry) {
|
|
88
71
|
logger.warn(`No transport found for sessionId: ${sessionId}`);
|
|
89
72
|
reply.code(400).send({ error: "No transport found for sessionId" });
|
|
90
73
|
return;
|
|
91
74
|
}
|
|
92
|
-
await transport.handlePostMessage(request.raw, reply.raw, request.body);
|
|
75
|
+
await entry.transport.handlePostMessage(request.raw, reply.raw, request.body);
|
|
93
76
|
}
|
|
94
77
|
catch (error) {
|
|
95
78
|
logger.error({ error }, "Failed to process SSE message");
|
|
@@ -98,29 +81,58 @@ export class SseTransport {
|
|
|
98
81
|
}
|
|
99
82
|
}
|
|
100
83
|
});
|
|
101
|
-
// POST ping endpoint for health checks
|
|
102
|
-
fastify.post("/ping", {
|
|
103
|
-
schema: {
|
|
104
|
-
tags: ["mcp"],
|
|
105
|
-
summary: "JSON-RPC 2.0 ping endpoint",
|
|
106
|
-
body: pingRequestSchema,
|
|
107
|
-
response: {
|
|
108
|
-
200: pingResponseSchema,
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
}, pingHandler());
|
|
112
84
|
logger.info("SSE transport routes registered");
|
|
113
85
|
}
|
|
114
86
|
async disconnect() {
|
|
115
87
|
logger.info("Cleaning up SSE transport sessions...");
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
88
|
+
await this.sessions.closeAll();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Mints a per-session {@link McpServer} + {@link SSEServerTransport} pair, wires
|
|
92
|
+
* lifecycle callbacks, registers the session, then binds the server. Streamable HTTP gets
|
|
93
|
+
* the sessionId asynchronously via the SDK's {@linkcode onsessioninitialized} callback (which
|
|
94
|
+
* fires inside {@linkcode StreamableHTTPServerTransport.handleRequest}), so it can register
|
|
95
|
+
* lazily and a failed bind leaves no entry. SSE has no such callback — sessionId is known at
|
|
96
|
+
* construction — so we register first and roll back on bind rejection. Without the rollback
|
|
97
|
+
* a fast client could see {@linkcode SSEServerTransport.start}'s endpoint event, POST to
|
|
98
|
+
* {@linkcode sseMcpMessageEndpointPath} and race the {@linkcode sessions.set} call.
|
|
99
|
+
*/
|
|
100
|
+
async createSession(rawResponse) {
|
|
101
|
+
const perSessionServer = this.serverFactory();
|
|
102
|
+
const transport = new sdkTransports.SSEServerTransport(this.sseMcpMessageEndpointPath, rawResponse);
|
|
103
|
+
const sessionId = transport.sessionId;
|
|
104
|
+
if (!sessionId) {
|
|
105
|
+
// SDK's SSEServerTransport always assigns a sessionId in its constructor; this branch is
|
|
106
|
+
// defensive. Close the just-created pair before throwing so we don't leak the McpServer
|
|
107
|
+
// and the SSE response stays detached.
|
|
108
|
+
await transport.close();
|
|
109
|
+
await perSessionServer.close();
|
|
110
|
+
throw new Error("Failed to get session ID from transport");
|
|
111
|
+
}
|
|
112
|
+
// fires on every close path (network drop, server-initiated, etc.) so abandoned sessions
|
|
113
|
+
// don't leak; closeAndRemove is idempotent against the not-yet-registered case
|
|
114
|
+
transport.onclose = () => {
|
|
115
|
+
this.sessions.closeAndRemove(sessionId).catch((err) => {
|
|
116
|
+
logger.error({ err, sessionId }, "Failed to close SSE session on transport.onclose");
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
this.sessions.set(sessionId, {
|
|
120
|
+
transport,
|
|
121
|
+
server: perSessionServer,
|
|
123
122
|
});
|
|
123
|
+
try {
|
|
124
|
+
await this.sessions.bindServer(perSessionServer, transport);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
// bindServer already closed both halves via its internal closeEntry; we still call
|
|
128
|
+
// closeAndRemove here because bindServer doesn't know the registry key and the entry
|
|
129
|
+
// is what makes the session reachable to incoming POSTs. The duplicate close is safe:
|
|
130
|
+
// SDK transport.close() and McpServer.close() are both idempotent.
|
|
131
|
+
await this.sessions.closeAndRemove(sessionId);
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
logger.info(`New SSE connection established for session ${sessionId}`);
|
|
135
|
+
return transport;
|
|
124
136
|
}
|
|
125
137
|
}
|
|
126
138
|
//# sourceMappingURL=sse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/mcp/transports/sse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/mcp/transports/sse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAY1E,MAAM,cAAc,GAAG;IACrB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,CAAC;AAEF,MAAM,OAAO,YAAY;IAIb;IACA;IACA;IACA;IANF,QAAQ,GAAG,IAAI,eAAe,EAAsB,CAAC;IAE7D,YACU,aAA8B,EAC9B,UAAsB,EACtB,qBAA6B,MAAM,EACnC,4BAAoC,WAAW;QAH/C,kBAAa,GAAb,aAAa,CAAiB;QAC9B,eAAU,GAAV,UAAU,CAAY;QACtB,uBAAkB,GAAlB,kBAAkB,CAAiB;QACnC,8BAAyB,GAAzB,yBAAyB,CAAsB;IACtD,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAE9C,+CAA+C;QAC/C,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,kBAAkB,EACvB;YACE,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,OAAO,EAAE,gDAAgD;gBACzD,QAAQ,EAAE;oBACR,GAAG,EAAE,cAAc;iBACpB;aACF;SACF,EACD,KAAK,EAAE,QAAwB,EAAE,KAAmB,EAAE,EAAE;YACtD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,oCAAoC,CAAC,CAAC;gBAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK;yBACF,IAAI,CAAC,GAAG,CAAC;yBACT,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC,CACF,CAAC;QAEF,uDAAuD;QACvD,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,yBAAyB,EAC9B;YACE,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,OAAO,EAAE,gCAAgC;gBACzC,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,UAAU,EAAE;wBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;qBAC9C;iBACF;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,IAAI;iBAC3B;gBACD,QAAQ,EAAE;oBACR,GAAG,EAAE,cAAc;iBACpB;aACF;SACF,EACD,KAAK,EACH,OAA0C,EAC1C,KAAmB,EACnB,EAAE;YACF,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;gBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;oBAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;oBACpE,OAAO;gBACT,CAAC;gBAED,MAAM,KAAK,CAAC,SAAS,CAAC,iBAAiB,CACrC,OAAO,CAAC,GAAG,EACX,KAAK,CAAC,GAAG,EACT,OAAO,CAAC,IAAI,CACb,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,+BAA+B,CAAC,CAAC;gBACzD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,aAAa,CACzB,WAA2B;QAE3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,kBAAkB,CACpD,IAAI,CAAC,yBAAyB,EAC9B,WAAW,CACZ,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,yFAAyF;YACzF,wFAAwF;YACxF,uCAAuC;YACvC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,yFAAyF;QACzF,+EAA+E;QAC/E,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpD,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,SAAS,EAAE,EAClB,kDAAkD,CACnD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,SAAS;YACT,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mFAAmF;YACnF,qFAAqF;YACrF,sFAAsF;YACtF,mEAAmE;YACnE,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,8CAA8C,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MCPServerConfiguration } from "./config/index.js";
|
|
2
|
+
import { BaseClientManager } from "./confluent/base-client-manager.js";
|
|
3
|
+
import { OAuthHolder } from "./confluent/oauth/oauth-holder.js";
|
|
4
|
+
/**
|
|
5
|
+
* Aggregate of all runtime state threaded through the server.
|
|
6
|
+
*
|
|
7
|
+
* Carries config and per-connection client managers.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ServerRuntime {
|
|
10
|
+
readonly config: MCPServerConfiguration;
|
|
11
|
+
readonly clientManagers: Record<string, BaseClientManager>;
|
|
12
|
+
/**
|
|
13
|
+
* The active OAuth holder when any connection in the config has `type === "oauth"`.
|
|
14
|
+
* Constructed by {@link ServerRuntime.fromConfig}; `undefined` on api_key paths.
|
|
15
|
+
* Construction is side-effect-free — PKCE runs lazily on the first
|
|
16
|
+
* `holder.ensureLoggedIn()` call, which the MCP tool-call wrapper invokes
|
|
17
|
+
* before any handler that needs Confluent access.
|
|
18
|
+
*/
|
|
19
|
+
readonly oauthHolder: OAuthHolder | undefined;
|
|
20
|
+
constructor(config: MCPServerConfiguration, clientManagers: Record<string, BaseClientManager>, oauthHolder?: OAuthHolder | undefined);
|
|
21
|
+
/**
|
|
22
|
+
* Convenience accessor for the single-connection period.
|
|
23
|
+
* Remove (or make multi-connection-aware) when issue #151 lands.
|
|
24
|
+
*/
|
|
25
|
+
get clientManager(): BaseClientManager;
|
|
26
|
+
static fromConfig(config: MCPServerConfiguration): ServerRuntime;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=server-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-runtime.d.ts","sourceRoot":"","sources":["../src/server-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE;;;;GAIG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;gBAG5C,MAAM,EAAE,sBAAsB,EAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,WAAW,GAAE,WAAW,GAAG,SAAqB;IAOlD;;;OAGG;IACH,IAAI,aAAa,IAAI,iBAAiB,CAarC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,aAAa;CA4CjE"}
|