@confluentinc/mcp-confluent 1.1.0 → 1.2.1
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 +507 -342
- package/dist/build-config.d.ts +2 -0
- package/dist/build-config.d.ts.map +1 -0
- package/dist/build-config.js +2 -0
- package/dist/build-config.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/confluent/client-manager.d.ts +9 -0
- package/dist/confluent/client-manager.d.ts.map +1 -1
- package/dist/confluent/client-manager.js +35 -4
- package/dist/confluent/client-manager.js.map +1 -1
- package/dist/confluent/middleware.d.ts +3 -2
- package/dist/confluent/middleware.d.ts.map +1 -1
- package/dist/confluent/middleware.js +9 -2
- package/dist/confluent/middleware.js.map +1 -1
- package/dist/confluent/node-deps.d.ts +63 -0
- package/dist/confluent/node-deps.d.ts.map +1 -0
- package/dist/confluent/node-deps.js +14 -0
- package/dist/confluent/node-deps.js.map +1 -0
- package/dist/confluent/telemetry.d.ts +18 -0
- package/dist/confluent/telemetry.d.ts.map +1 -0
- package/dist/confluent/telemetry.js +101 -0
- package/dist/confluent/telemetry.js.map +1 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +174 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +77 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +136 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +111 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +110 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +74 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +81 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +90 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js +131 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +248 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +88 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +443 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +398 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +23 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js +133 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js +72 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -0
- 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 +20 -3
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js +1 -1
- 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 +11 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +193 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +224 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +10 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +71 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +1 -5
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
- package/dist/confluent/tools/tool-factory.d.ts.map +1 -1
- package/dist/confluent/tools/tool-factory.js +26 -0
- package/dist/confluent/tools/tool-factory.js.map +1 -1
- package/dist/confluent/tools/tool-name.d.ts +14 -1
- package/dist/confluent/tools/tool-name.d.ts.map +1 -1
- package/dist/confluent/tools/tool-name.js +13 -0
- package/dist/confluent/tools/tool-name.js.map +1 -1
- package/dist/env-schema.d.ts +7 -0
- package/dist/env-schema.d.ts.map +1 -1
- package/dist/env-schema.js +37 -2
- package/dist/env-schema.js.map +1 -1
- package/dist/env.d.ts +7 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index.js +67 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/transports/auth.d.ts +55 -0
- package/dist/mcp/transports/auth.d.ts.map +1 -0
- package/dist/mcp/transports/auth.js +127 -0
- package/dist/mcp/transports/auth.js.map +1 -0
- package/dist/mcp/transports/index.d.ts +1 -0
- package/dist/mcp/transports/index.d.ts.map +1 -1
- package/dist/mcp/transports/index.js +1 -0
- package/dist/mcp/transports/index.js.map +1 -1
- package/dist/mcp/transports/manager.d.ts +13 -1
- package/dist/mcp/transports/manager.d.ts.map +1 -1
- package/dist/mcp/transports/manager.js +20 -2
- package/dist/mcp/transports/manager.js.map +1 -1
- package/dist/mcp/transports/server.d.ts +10 -1
- package/dist/mcp/transports/server.d.ts.map +1 -1
- package/dist/mcp/transports/server.js +12 -2
- package/dist/mcp/transports/server.js.map +1 -1
- package/package.json +16 -7
package/dist/env-schema.js
CHANGED
|
@@ -10,8 +10,8 @@ const envSchema = z.object({
|
|
|
10
10
|
.default(8080),
|
|
11
11
|
HTTP_HOST: z
|
|
12
12
|
.string()
|
|
13
|
-
.describe("Host to bind for HTTP transport.
|
|
14
|
-
.default("
|
|
13
|
+
.describe("Host to bind for HTTP transport. Defaults to localhost only for security.")
|
|
14
|
+
.default("127.0.0.1"),
|
|
15
15
|
HTTP_MCP_ENDPOINT_PATH: z
|
|
16
16
|
.string()
|
|
17
17
|
.describe("HTTP endpoint path for MCP transport (e.g., '/mcp')")
|
|
@@ -28,6 +28,25 @@ const envSchema = z.object({
|
|
|
28
28
|
.preprocess((val) => (typeof val === "string" ? val.toLowerCase() : val), z.enum(Object.keys(logLevels)))
|
|
29
29
|
.describe("Log level for application logging (trace, debug, info, warn, error, fatal)")
|
|
30
30
|
.default("info"),
|
|
31
|
+
MCP_API_KEY: z
|
|
32
|
+
.string()
|
|
33
|
+
.describe("API key for HTTP/SSE authentication. Not required when authentication is disabled.")
|
|
34
|
+
.trim()
|
|
35
|
+
.min(32, "API key must be at least 32 characters for security")
|
|
36
|
+
.optional(),
|
|
37
|
+
MCP_AUTH_DISABLED: z
|
|
38
|
+
.preprocess((val) => val === "true" || val === "1", z.boolean())
|
|
39
|
+
.describe("Disable authentication for HTTP/SSE transports. WARNING: Only use in development environments.")
|
|
40
|
+
.default(false),
|
|
41
|
+
DO_NOT_TRACK: z
|
|
42
|
+
.preprocess((val) => val === "true" || val === "1", z.boolean())
|
|
43
|
+
.describe("Disable telemetry analytics.")
|
|
44
|
+
.default(false),
|
|
45
|
+
MCP_ALLOWED_HOSTS: z
|
|
46
|
+
.string()
|
|
47
|
+
.describe("Comma-separated list of allowed Host header values for DNS rebinding protection.")
|
|
48
|
+
.default("localhost,127.0.0.1")
|
|
49
|
+
.transform((val) => val.split(",").map((h) => h.trim().toLowerCase())),
|
|
31
50
|
BOOTSTRAP_SERVERS: z
|
|
32
51
|
.string()
|
|
33
52
|
.describe("List of Kafka broker addresses in the format host1:port1,host2:port2 used to establish initial connection to the Kafka cluster")
|
|
@@ -153,6 +172,22 @@ const configSchema = z
|
|
|
153
172
|
.describe("REST API endpoint for Kafka cluster management and administration")
|
|
154
173
|
.trim()
|
|
155
174
|
.url(),
|
|
175
|
+
TELEMETRY_ENDPOINT: z
|
|
176
|
+
.string()
|
|
177
|
+
.describe("Base URL for Confluent Cloud Telemetry API (metrics)")
|
|
178
|
+
.trim()
|
|
179
|
+
.url()
|
|
180
|
+
.default("https://api.telemetry.confluent.cloud"),
|
|
181
|
+
TELEMETRY_API_KEY: z
|
|
182
|
+
.string()
|
|
183
|
+
.describe("Optional API key for telemetry access with basic read permissions. Falls back to CONFLUENT_CLOUD_API_KEY if not set.")
|
|
184
|
+
.trim()
|
|
185
|
+
.min(1),
|
|
186
|
+
TELEMETRY_API_SECRET: z
|
|
187
|
+
.string()
|
|
188
|
+
.describe("Optional API secret paired with TELEMETRY_API_KEY. Falls back to CONFLUENT_CLOUD_API_SECRET if not set.")
|
|
189
|
+
.trim()
|
|
190
|
+
.min(1),
|
|
156
191
|
})
|
|
157
192
|
.partial();
|
|
158
193
|
export const combinedSchema = envSchema.merge(configSchema);
|
package/dist/env-schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-schema.js","sourceRoot":"","sources":["../src/env-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,2EAA2E;AAC3E,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM;SAChB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;SAC1C,OAAO,CAAC,IAAI,CAAC;IAChB,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"env-schema.js","sourceRoot":"","sources":["../src/env-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,2EAA2E;AAC3E,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM;SAChB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;SAC1C,OAAO,CAAC,IAAI,CAAC;IAChB,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CACP,2EAA2E,CAC5E;SACA,OAAO,CAAC,WAAW,CAAC;IACvB,sBAAsB,EAAE,CAAC;SACtB,MAAM,EAAE;SACR,QAAQ,CAAC,qDAAqD,CAAC;SAC/D,OAAO,CAAC,MAAM,CAAC;IAClB,qBAAqB,EAAE,CAAC;SACrB,MAAM,EAAE;SACR,QAAQ,CACP,8EAA8E,CAC/E;SACA,OAAO,CAAC,MAAM,CAAC;IAClB,6BAA6B,EAAE,CAAC;SAC7B,MAAM,EAAE;SACR,QAAQ,CACP,0FAA0F,CAC3F;SACA,OAAO,CAAC,WAAW,CAAC;IACvB,SAAS,EAAE,CAAC;SACT,UAAU,CACT,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAC5D,CAAC,CAAC,IAAI,CACJ,MAAM,CAAC,IAAI,CAAC,SAAS,CAGpB,CACF,CACF;SACA,QAAQ,CACP,4EAA4E,CAC7E;SACA,OAAO,CAAC,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,CACP,oFAAoF,CACrF;SACA,IAAI,EAAE;SACN,GAAG,CAAC,EAAE,EAAE,qDAAqD,CAAC;SAC9D,QAAQ,EAAE;IACb,iBAAiB,EAAE,CAAC;SACjB,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/D,QAAQ,CACP,gGAAgG,CACjG;SACA,OAAO,CAAC,KAAK,CAAC;IACjB,YAAY,EAAE,CAAC;SACZ,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/D,QAAQ,CAAC,8BAA8B,CAAC;SACxC,OAAO,CAAC,KAAK,CAAC;IACjB,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,CACP,kFAAkF,CACnF;SACA,OAAO,CAAC,qBAAqB,CAAC;SAC9B,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACxE,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,CACP,gIAAgI,CACjI;SACA,IAAI,EAAE;SACN,QAAQ,EAAE;IACb,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,CACP,qGAAqG,CACtG;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CACP,gGAAgG,CACjG;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,CACP,yHAAyH,CAC1H;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CACP,qGAAqG,CACtG;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,uBAAuB,EAAE,CAAC;SACvB,MAAM,EAAE;SACR,QAAQ,CACP,uHAAuH,CACxH;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,0BAA0B,EAAE,CAAC;SAC1B,MAAM,EAAE;SACR,QAAQ,CACP,iHAAiH,CAClH;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,uBAAuB,EAAE,CAAC;SACvB,MAAM,EAAE;SACR,QAAQ,CACP,+FAA+F,CAChG;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,0BAA0B,EAAE,CAAC;SAC1B,MAAM,EAAE;SACR,QAAQ,CACP,6FAA6F,CAC9F;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,CACP,uEAAuE,CACxE;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,CACP,iFAAiF,CAClF;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CACP,4EAA4E,CAC7E;SACA,IAAI,EAAE;SACN,UAAU,CAAC,MAAM,CAAC;IACrB,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CACP,8EAA8E,CAC/E;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;IACT,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,CACP,4GAA4G,CAC7G;SACA,IAAI,EAAE;SACN,GAAG,EAAE;IACR,qBAAqB,EAAE,CAAC;SACrB,MAAM,EAAE;SACR,QAAQ,CACP,8EAA8E,CAC/E;SACA,IAAI,EAAE;SACN,UAAU,CAAC,OAAO,CAAC;IACtB,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,CACP,4FAA4F,CAC7F;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;IACT,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,CACP,2FAA2F,CAC5F;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;IACT,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CACP,0EAA0E,CAC3E;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;IACT,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CACP,yEAAyE,CAC1E;SACA,IAAI,EAAE;SACN,UAAU,CAAC,MAAM,CAAC;IACrB,6BAA6B,EAAE,CAAC;SAC7B,MAAM,EAAE;SACR,QAAQ,CAAC,kDAAkD,CAAC;SAC5D,IAAI,EAAE;SACN,GAAG,EAAE;SACL,OAAO,CAAC,6BAA6B,CAAC;IACzC,wBAAwB,EAAE,CAAC;SACxB,MAAM,EAAE;SACR,QAAQ,CACP,4EAA4E,CAC7E;SACA,IAAI,EAAE;SACN,GAAG,EAAE;IACR,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,CACP,mEAAmE,CACpE;SACA,IAAI,EAAE;SACN,GAAG,EAAE;IACR,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,CAAC,sDAAsD,CAAC;SAChE,IAAI,EAAE;SACN,GAAG,EAAE;SACL,OAAO,CAAC,uCAAuC,CAAC;IACnD,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,CACP,sHAAsH,CACvH;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;IACT,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,CACP,yGAAyG,CAC1G;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;CACV,CAAC;KACD,OAAO,EAAE,CAAC;AAEb,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC"}
|
package/dist/env.d.ts
CHANGED
|
@@ -17,6 +17,10 @@ declare const env: {
|
|
|
17
17
|
SSE_MCP_ENDPOINT_PATH: string;
|
|
18
18
|
SSE_MCP_MESSAGE_ENDPOINT_PATH: string;
|
|
19
19
|
LOG_LEVEL: "info" | "fatal" | "error" | "warn" | "debug" | "trace";
|
|
20
|
+
MCP_AUTH_DISABLED: boolean;
|
|
21
|
+
DO_NOT_TRACK: boolean;
|
|
22
|
+
MCP_ALLOWED_HOSTS: string[];
|
|
23
|
+
MCP_API_KEY?: string | undefined;
|
|
20
24
|
BOOTSTRAP_SERVERS?: string | undefined;
|
|
21
25
|
KAFKA_API_KEY?: string | undefined;
|
|
22
26
|
KAFKA_API_SECRET?: string | undefined;
|
|
@@ -39,6 +43,9 @@ declare const env: {
|
|
|
39
43
|
CONFLUENT_CLOUD_REST_ENDPOINT?: string | undefined;
|
|
40
44
|
SCHEMA_REGISTRY_ENDPOINT?: string | undefined;
|
|
41
45
|
KAFKA_REST_ENDPOINT?: string | undefined;
|
|
46
|
+
TELEMETRY_ENDPOINT?: string | undefined;
|
|
47
|
+
TELEMETRY_API_KEY?: string | undefined;
|
|
48
|
+
TELEMETRY_API_SECRET?: string | undefined;
|
|
42
49
|
};
|
|
43
50
|
export default env;
|
|
44
51
|
//# sourceMappingURL=env.d.ts.map
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMzD;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,CAQpD;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,CAMpD;AAGD,QAAA,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMzD;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,CAQpD;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,CAMpD;AAGD,QAAA,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASP,CAAC;AAEH,eAAe,GAAG,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,23 @@ import { getFilteredToolNames, getPackageVersion, parseCliArgs, } from "./cli.js
|
|
|
4
4
|
import { DefaultClientManager } from "./confluent/client-manager.js";
|
|
5
5
|
import { ToolFactory } from "./confluent/tools/tool-factory.js";
|
|
6
6
|
import { ToolName } from "./confluent/tools/tool-name.js";
|
|
7
|
+
import { TelemetryEvent, TelemetryService } from "./confluent/telemetry.js";
|
|
7
8
|
import { initEnv } from "./env.js";
|
|
8
9
|
import { logger, setLogLevel } from "./logger.js";
|
|
9
|
-
import { TransportManager } from "./mcp/transports/index.js";
|
|
10
|
+
import { generateApiKey, TransportManager } from "./mcp/transports/index.js";
|
|
10
11
|
// Parse command line arguments and load environment variables if --env-file is specified
|
|
11
12
|
const cliOptions = parseCliArgs();
|
|
13
|
+
// Handle --generate-key early (before any other initialization)
|
|
14
|
+
if (cliOptions.generateKey) {
|
|
15
|
+
const apiKey = generateApiKey();
|
|
16
|
+
console.log("\nGenerated MCP API Key:");
|
|
17
|
+
console.log("=".repeat(64));
|
|
18
|
+
console.log(apiKey);
|
|
19
|
+
console.log("=".repeat(64));
|
|
20
|
+
console.log("\nAdd this to your .env file:");
|
|
21
|
+
console.log(`MCP_API_KEY=${apiKey}\n`);
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
12
24
|
async function main() {
|
|
13
25
|
try {
|
|
14
26
|
// Initialize environment after CLI args are processed
|
|
@@ -39,6 +51,7 @@ async function main() {
|
|
|
39
51
|
flink: env.FLINK_REST_ENDPOINT,
|
|
40
52
|
schemaRegistry: env.SCHEMA_REGISTRY_ENDPOINT,
|
|
41
53
|
kafka: env.KAFKA_REST_ENDPOINT,
|
|
54
|
+
telemetry: env.TELEMETRY_ENDPOINT ?? "https://api.telemetry.confluent.cloud",
|
|
42
55
|
},
|
|
43
56
|
auth: {
|
|
44
57
|
cloud: {
|
|
@@ -61,6 +74,11 @@ async function main() {
|
|
|
61
74
|
apiKey: env.KAFKA_API_KEY,
|
|
62
75
|
apiSecret: env.KAFKA_API_SECRET,
|
|
63
76
|
},
|
|
77
|
+
telemetry: {
|
|
78
|
+
apiKey: (env.TELEMETRY_API_KEY ?? env.CONFLUENT_CLOUD_API_KEY),
|
|
79
|
+
apiSecret: (env.TELEMETRY_API_SECRET ??
|
|
80
|
+
env.CONFLUENT_CLOUD_API_SECRET),
|
|
81
|
+
},
|
|
64
82
|
},
|
|
65
83
|
});
|
|
66
84
|
const filteredToolNames = getFilteredToolNames(cliOptions);
|
|
@@ -102,24 +120,68 @@ async function main() {
|
|
|
102
120
|
logger.warn(`Tool ${toolName} disabled due to missing environment variables: ${missingVars.join(", ")}`);
|
|
103
121
|
}
|
|
104
122
|
});
|
|
123
|
+
const serverVersion = getPackageVersion();
|
|
105
124
|
const server = new McpServer({
|
|
106
125
|
name: "confluent",
|
|
107
|
-
version:
|
|
126
|
+
version: serverVersion,
|
|
127
|
+
});
|
|
128
|
+
TelemetryService.getInstance().setCommonProperties({
|
|
129
|
+
serverVersion,
|
|
130
|
+
transportType: cliOptions.transports.join(","),
|
|
108
131
|
});
|
|
132
|
+
// Capture MCP client info when the handshake completes.
|
|
133
|
+
server.server.oninitialized = () => {
|
|
134
|
+
const clientInfo = server.server.getClientVersion();
|
|
135
|
+
TelemetryService.getInstance().setCommonProperties({
|
|
136
|
+
clientName: clientInfo?.name,
|
|
137
|
+
clientVersion: clientInfo?.version,
|
|
138
|
+
});
|
|
139
|
+
};
|
|
109
140
|
toolHandlers.forEach((handler, name) => {
|
|
110
141
|
const config = handler.getToolConfig();
|
|
111
|
-
server.
|
|
142
|
+
server.registerTool(name, { description: config.description, inputSchema: config.inputSchema }, async (args, context) => {
|
|
112
143
|
const sessionId = context?.sessionId;
|
|
113
|
-
|
|
144
|
+
const startTime = Date.now();
|
|
145
|
+
try {
|
|
146
|
+
const result = await handler.handle(clientManager, args, sessionId);
|
|
147
|
+
TelemetryService.getInstance().track(TelemetryEvent.TOOL_CALL, {
|
|
148
|
+
toolName: name,
|
|
149
|
+
durationMs: Date.now() - startTime,
|
|
150
|
+
status: result.isError ? "error" : "success",
|
|
151
|
+
});
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
TelemetryService.getInstance().track(TelemetryEvent.TOOL_CALL, {
|
|
156
|
+
toolName: name,
|
|
157
|
+
durationMs: Date.now() - startTime,
|
|
158
|
+
status: "error",
|
|
159
|
+
});
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
114
162
|
});
|
|
115
163
|
});
|
|
116
|
-
|
|
164
|
+
// Prepare auth configuration
|
|
165
|
+
const disableAuth = cliOptions.disableAuth || env.MCP_AUTH_DISABLED;
|
|
166
|
+
const allowedHosts = cliOptions.allowedHosts || env.MCP_ALLOWED_HOSTS;
|
|
167
|
+
const apiKey = env.MCP_API_KEY;
|
|
168
|
+
// Warn if auth is disabled
|
|
169
|
+
if (disableAuth) {
|
|
170
|
+
logger.warn("Authentication is DISABLED for HTTP/SSE transports. " +
|
|
171
|
+
"This should only be used in development environments.");
|
|
172
|
+
}
|
|
173
|
+
const transportManager = new TransportManager(server, {
|
|
174
|
+
disableAuth,
|
|
175
|
+
allowedHosts,
|
|
176
|
+
apiKey,
|
|
177
|
+
});
|
|
117
178
|
// Start all transports with a single call
|
|
118
179
|
logger.info(`Starting transports: ${cliOptions.transports.join(", ")}`);
|
|
119
180
|
await transportManager.start(cliOptions.transports, env.HTTP_PORT, env.HTTP_HOST, env.HTTP_MCP_ENDPOINT_PATH, env.SSE_MCP_ENDPOINT_PATH, env.SSE_MCP_MESSAGE_ENDPOINT_PATH);
|
|
120
181
|
// Set up cleanup handlers
|
|
121
182
|
const performCleanup = async () => {
|
|
122
183
|
logger.info("Shutting down...");
|
|
184
|
+
await TelemetryService.getInstance().shutdown();
|
|
123
185
|
await transportManager.stop();
|
|
124
186
|
await clientManager.disconnect();
|
|
125
187
|
await server.close();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FastifyReply, FastifyRequest } from "fastify";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for MCP server authentication
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthConfig {
|
|
6
|
+
/** API key for authentication */
|
|
7
|
+
apiKey: string;
|
|
8
|
+
/** Whether authentication is enabled */
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
/** List of allowed Host header values for DNS rebinding protection */
|
|
11
|
+
allowedHosts: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generates a cryptographically secure random API key
|
|
15
|
+
* @returns 64-character hex string
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateApiKey(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Creates Fastify onRequest hook for authentication and host validation
|
|
20
|
+
* @param config Authentication configuration
|
|
21
|
+
* @returns Fastify hook function
|
|
22
|
+
*/
|
|
23
|
+
export declare function createAuthHook(config: AuthConfig): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Error response schemas for OpenAPI documentation
|
|
26
|
+
*/
|
|
27
|
+
export declare const authErrorSchemas: {
|
|
28
|
+
unauthorized: {
|
|
29
|
+
type: string;
|
|
30
|
+
properties: {
|
|
31
|
+
error: {
|
|
32
|
+
type: string;
|
|
33
|
+
example: string;
|
|
34
|
+
};
|
|
35
|
+
message: {
|
|
36
|
+
type: string;
|
|
37
|
+
example: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
forbidden: {
|
|
42
|
+
type: string;
|
|
43
|
+
properties: {
|
|
44
|
+
error: {
|
|
45
|
+
type: string;
|
|
46
|
+
example: string;
|
|
47
|
+
};
|
|
48
|
+
message: {
|
|
49
|
+
type: string;
|
|
50
|
+
example: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAiED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,IAE7C,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CA6CjB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;CAe5B,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { randomBytes, timingSafeEqual } from "crypto";
|
|
2
|
+
import { logger } from "../../logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* Generates a cryptographically secure random API key
|
|
5
|
+
* @returns 64-character hex string
|
|
6
|
+
*/
|
|
7
|
+
export function generateApiKey() {
|
|
8
|
+
return randomBytes(32).toString("hex");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Timing-safe comparison of API keys to prevent timing attacks
|
|
12
|
+
*/
|
|
13
|
+
function secureCompare(a, b) {
|
|
14
|
+
const bufA = Buffer.from(a, "utf8");
|
|
15
|
+
const bufB = Buffer.from(b, "utf8");
|
|
16
|
+
// If lengths differ, still do comparison to prevent timing leak
|
|
17
|
+
if (bufA.length !== bufB.length) {
|
|
18
|
+
// Compare against self to maintain constant time
|
|
19
|
+
timingSafeEqual(bufA, bufA);
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return timingSafeEqual(bufA, bufB);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extracts hostname from Host header using URL parsing
|
|
26
|
+
* Handles IPv4, IPv6, and regular hostnames correctly
|
|
27
|
+
*/
|
|
28
|
+
function parseHostname(hostHeader) {
|
|
29
|
+
try {
|
|
30
|
+
// Prepend dummy protocol since URL requires one
|
|
31
|
+
const url = new URL(`http://${hostHeader}`);
|
|
32
|
+
return url.hostname.toLowerCase();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Invalid host header format
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Validates the Host header against allowed hosts list
|
|
41
|
+
* Used for DNS rebinding protection
|
|
42
|
+
*/
|
|
43
|
+
function isHostAllowed(hostHeader, allowedHosts) {
|
|
44
|
+
if (!hostHeader) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const hostname = parseHostname(hostHeader);
|
|
48
|
+
if (!hostname) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return allowedHosts.some((allowed) => {
|
|
52
|
+
const allowedLower = allowed.toLowerCase();
|
|
53
|
+
// Exact match on hostname (e.g., "localhost" matches "localhost:8080")
|
|
54
|
+
if (hostname === allowedLower) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Allow matching with port in allowed list (e.g., "localhost:8080")
|
|
58
|
+
if (hostHeader.toLowerCase() === allowedLower) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates Fastify onRequest hook for authentication and host validation
|
|
66
|
+
* @param config Authentication configuration
|
|
67
|
+
* @returns Fastify hook function
|
|
68
|
+
*/
|
|
69
|
+
export function createAuthHook(config) {
|
|
70
|
+
return async (request, reply) => {
|
|
71
|
+
// 1. ALWAYS validate Host header (DNS rebinding protection)
|
|
72
|
+
// This runs regardless of whether API key auth is enabled
|
|
73
|
+
const hostHeader = request.headers.host;
|
|
74
|
+
if (!isHostAllowed(hostHeader, config.allowedHosts)) {
|
|
75
|
+
logger.warn({ host: hostHeader }, "Request rejected: Invalid Host header");
|
|
76
|
+
reply.status(403).send({
|
|
77
|
+
error: "Forbidden",
|
|
78
|
+
message: "Invalid Host header",
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// 2. Skip API key auth if disabled
|
|
83
|
+
if (!config.enabled) {
|
|
84
|
+
logger.debug("API key authentication disabled, skipping API key check");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// 3. Validate API Key (header names are lowercased by Fastify)
|
|
88
|
+
const apiKey = request.headers["cflt-mcp-api-key"];
|
|
89
|
+
if (!apiKey || typeof apiKey !== "string") {
|
|
90
|
+
logger.warn("Request rejected: Missing cflt-mcp-api-Key header");
|
|
91
|
+
reply.status(401).send({
|
|
92
|
+
error: "Unauthorized",
|
|
93
|
+
message: "Missing cflt-mcp-api-Key header",
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!secureCompare(apiKey, config.apiKey)) {
|
|
98
|
+
logger.warn("Request rejected: Invalid API key");
|
|
99
|
+
reply.status(401).send({
|
|
100
|
+
error: "Unauthorized",
|
|
101
|
+
message: "Invalid API key",
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
logger.debug("Request authenticated successfully");
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Error response schemas for OpenAPI documentation
|
|
110
|
+
*/
|
|
111
|
+
export const authErrorSchemas = {
|
|
112
|
+
unauthorized: {
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: {
|
|
115
|
+
error: { type: "string", example: "Unauthorized" },
|
|
116
|
+
message: { type: "string", example: "Missing cflt-mcp-api-Key header" },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
forbidden: {
|
|
120
|
+
type: "object",
|
|
121
|
+
properties: {
|
|
122
|
+
error: { type: "string", example: "Forbidden" },
|
|
123
|
+
message: { type: "string", example: "Invalid Host header" },
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/transports/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAcxC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEpC,gEAAgE;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,iDAAiD;QACjD,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,UAAkB;IACvC,IAAI,CAAC;QACH,gDAAgD;QAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;QAC5C,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,UAA8B,EAC9B,YAAsB;IAEtB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,uEAAuE;QACvE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,oEAAoE;QACpE,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,OAAO,KAAK,EACV,OAAuB,EACvB,KAAmB,EACJ,EAAE;QACjB,4DAA4D;QAC5D,0DAA0D;QAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,uCAAuC,CACxC,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACjE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iCAAiC;aAC3C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACjD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;YAClD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;SACxE;KACF;IACD,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE;YAC/C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE;SAC5D;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { TransportType } from "../../mcp/transports/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for the transport manager
|
|
5
|
+
*/
|
|
6
|
+
export interface TransportManagerConfig {
|
|
7
|
+
/** Disable authentication for HTTP/SSE transports */
|
|
8
|
+
disableAuth?: boolean;
|
|
9
|
+
/** List of allowed Host header values for DNS rebinding protection */
|
|
10
|
+
allowedHosts?: string[];
|
|
11
|
+
/** API key for authentication (required when auth is enabled) */
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
}
|
|
3
14
|
export declare class TransportManager {
|
|
4
15
|
private server;
|
|
16
|
+
private config?;
|
|
5
17
|
private transports;
|
|
6
18
|
private httpServer;
|
|
7
|
-
constructor(server: McpServer);
|
|
19
|
+
constructor(server: McpServer, config?: TransportManagerConfig | undefined);
|
|
8
20
|
start(types: TransportType[], port?: number, host?: string, httpMcpEndpointPath?: string, sseMcpEndpointPath?: string, sseMcpMessageEndpointPath?: string): Promise<void>;
|
|
9
21
|
stop(): Promise<void>;
|
|
10
22
|
private createTransport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,OAAO,EAAa,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM,CAAC;IALjB,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,UAAU,CAA2B;gBAGnC,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,sBAAsB,YAAA;IAGnC,KAAK,CACT,KAAK,EAAE,aAAa,EAAE,EACtB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,EAC5B,kBAAkB,CAAC,EAAE,MAAM,EAC3B,yBAAyB,CAAC,EAAE,MAAM,GACjC,OAAO,CAAC,IAAI,CAAC;IAsEV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,eAAe;CAgC9B"}
|
|
@@ -6,18 +6,36 @@ import { StdioTransport } from "../../mcp/transports/stdio.js";
|
|
|
6
6
|
import { TransportType } from "../../mcp/transports/types.js";
|
|
7
7
|
export class TransportManager {
|
|
8
8
|
server;
|
|
9
|
+
config;
|
|
9
10
|
transports = new Map();
|
|
10
11
|
httpServer = null;
|
|
11
|
-
constructor(server) {
|
|
12
|
+
constructor(server, config) {
|
|
12
13
|
this.server = server;
|
|
14
|
+
this.config = config;
|
|
13
15
|
}
|
|
14
16
|
async start(types, port, host, httpMcpEndpointPath, sseMcpEndpointPath, sseMcpMessageEndpointPath) {
|
|
15
17
|
try {
|
|
16
18
|
const needsHttpServer = types.some((type) => type === TransportType.HTTP || type === TransportType.SSE);
|
|
17
19
|
// Initialize and prepare HTTP server if needed
|
|
18
20
|
if (needsHttpServer) {
|
|
19
|
-
|
|
21
|
+
// Prepare auth configuration
|
|
22
|
+
const authEnabled = !this.config?.disableAuth;
|
|
23
|
+
const apiKey = this.config?.apiKey;
|
|
24
|
+
// Require API key when auth is enabled
|
|
25
|
+
if (authEnabled && !apiKey) {
|
|
26
|
+
throw new Error("MCP_API_KEY is required when authentication is enabled for HTTP/SSE transports. " +
|
|
27
|
+
"Generate a key using: npx mcp-confluent --generate-key");
|
|
28
|
+
}
|
|
29
|
+
const authConfig = {
|
|
30
|
+
apiKey: apiKey || "",
|
|
31
|
+
enabled: authEnabled,
|
|
32
|
+
allowedHosts: this.config?.allowedHosts || ["localhost", "127.0.0.1"],
|
|
33
|
+
};
|
|
34
|
+
this.httpServer = new HttpServer({ auth: authConfig });
|
|
20
35
|
await this.httpServer.prepare();
|
|
36
|
+
if (authEnabled) {
|
|
37
|
+
logger.info("MCP Server authentication enabled");
|
|
38
|
+
}
|
|
21
39
|
}
|
|
22
40
|
// Create and connect all transports
|
|
23
41
|
await Promise.all(types.map(async (type) => {
|
|
@@ -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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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
import { AuthConfig } from "../../mcp/transports/auth.js";
|
|
1
2
|
import { ServerConfig } from "../../mcp/transports/types.js";
|
|
2
3
|
import { FastifyInstance } from "fastify";
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for the HTTP server
|
|
6
|
+
*/
|
|
7
|
+
export interface HttpServerConfig {
|
|
8
|
+
/** Authentication configuration */
|
|
9
|
+
auth?: AuthConfig;
|
|
10
|
+
}
|
|
3
11
|
export declare class HttpServer {
|
|
4
12
|
private fastify;
|
|
5
13
|
private isSwaggerConfigured;
|
|
6
|
-
|
|
14
|
+
private authConfig;
|
|
15
|
+
constructor(config?: HttpServerConfig);
|
|
7
16
|
prepare(): Promise<void>;
|
|
8
17
|
getInstance(): FastifyInstance;
|
|
9
18
|
start(config: ServerConfig): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAGL,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAS
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAkB,MAAM,6BAA6B,CAAC;AACzE,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,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD9B,WAAW,IAAI,eAAe;IAIxB,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAS5B"}
|
|
@@ -2,21 +2,31 @@ import fastifySwagger from "@fastify/swagger";
|
|
|
2
2
|
import fastifySwaggerUi from "@fastify/swagger-ui";
|
|
3
3
|
import env from "../../env.js";
|
|
4
4
|
import { logger } from "../../logger.js";
|
|
5
|
+
import { createAuthHook } from "../../mcp/transports/auth.js";
|
|
5
6
|
import { default as Fastify, } from "fastify";
|
|
6
7
|
export class HttpServer {
|
|
7
8
|
fastify;
|
|
8
9
|
isSwaggerConfigured = false;
|
|
9
|
-
|
|
10
|
+
authConfig = null;
|
|
11
|
+
constructor(config) {
|
|
10
12
|
this.fastify = Fastify({
|
|
11
13
|
loggerInstance: logger,
|
|
12
14
|
// Useful for when ongoing http/sse connections are present
|
|
13
15
|
forceCloseConnections: true,
|
|
14
16
|
});
|
|
17
|
+
if (config?.auth) {
|
|
18
|
+
this.authConfig = config.auth;
|
|
19
|
+
}
|
|
15
20
|
}
|
|
16
21
|
async prepare() {
|
|
17
22
|
if (this.isSwaggerConfigured) {
|
|
18
23
|
return;
|
|
19
24
|
}
|
|
25
|
+
// Register authentication hook BEFORE routes are registered
|
|
26
|
+
if (this.authConfig) {
|
|
27
|
+
this.fastify.addHook("onRequest", createAuthHook(this.authConfig));
|
|
28
|
+
logger.info({ enabled: this.authConfig.enabled }, "Authentication hook registered");
|
|
29
|
+
}
|
|
20
30
|
// Configure Swagger before any routes are registered
|
|
21
31
|
await this.fastify.register(fastifySwagger, {
|
|
22
32
|
openapi: {
|
|
@@ -35,7 +45,7 @@ export class HttpServer {
|
|
|
35
45
|
securitySchemes: {
|
|
36
46
|
apiKey: {
|
|
37
47
|
type: "apiKey",
|
|
38
|
-
name: "
|
|
48
|
+
name: "cflt-mcp-api-Key",
|
|
39
49
|
in: "header",
|
|
40
50
|
},
|
|
41
51
|
},
|