@launchdarkly/mcp-server 0.6.1 → 0.7.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.
Files changed (192) hide show
  1. package/FUNCTIONS.md +3 -3
  2. package/README.md +21 -13
  3. package/bin/mcp-server.js +1499 -339
  4. package/bin/mcp-server.js.map +41 -25
  5. package/dist/commonjs/funcs/auditLogListEntries.d.ts +21 -0
  6. package/dist/commonjs/funcs/auditLogListEntries.d.ts.map +1 -0
  7. package/dist/commonjs/funcs/auditLogListEntries.js +128 -0
  8. package/dist/commonjs/funcs/auditLogListEntries.js.map +1 -0
  9. package/dist/commonjs/lib/config.d.ts +2 -2
  10. package/dist/commonjs/lib/config.js +2 -2
  11. package/dist/commonjs/mcp-server/cli/start/command.d.ts.map +1 -1
  12. package/dist/commonjs/mcp-server/cli/start/command.js +12 -0
  13. package/dist/commonjs/mcp-server/cli/start/command.js.map +1 -1
  14. package/dist/commonjs/mcp-server/cli/start/impl.d.ts +2 -0
  15. package/dist/commonjs/mcp-server/cli/start/impl.d.ts.map +1 -1
  16. package/dist/commonjs/mcp-server/cli/start/impl.js +60 -20
  17. package/dist/commonjs/mcp-server/cli/start/impl.js.map +1 -1
  18. package/dist/commonjs/mcp-server/cli/start/sse-security.d.ts +5 -0
  19. package/dist/commonjs/mcp-server/cli/start/sse-security.d.ts.map +1 -0
  20. package/dist/commonjs/mcp-server/cli/start/sse-security.js +26 -0
  21. package/dist/commonjs/mcp-server/cli/start/sse-security.js.map +1 -0
  22. package/dist/commonjs/mcp-server/mcp-server.js +1 -1
  23. package/dist/commonjs/mcp-server/server.d.ts.map +1 -1
  24. package/dist/commonjs/mcp-server/server.js +3 -1
  25. package/dist/commonjs/mcp-server/server.js.map +1 -1
  26. package/dist/commonjs/mcp-server/tools/auditLogListEntries.d.ts +8 -0
  27. package/dist/commonjs/mcp-server/tools/auditLogListEntries.d.ts.map +1 -0
  28. package/dist/commonjs/mcp-server/tools/auditLogListEntries.js +64 -0
  29. package/dist/commonjs/mcp-server/tools/auditLogListEntries.js.map +1 -0
  30. package/dist/commonjs/models/components/auditlogentrylistingrep.d.ts +93 -0
  31. package/dist/commonjs/models/components/auditlogentrylistingrep.d.ts.map +1 -0
  32. package/dist/commonjs/models/components/auditlogentrylistingrep.js +113 -0
  33. package/dist/commonjs/models/components/auditlogentrylistingrep.js.map +1 -0
  34. package/dist/commonjs/models/components/auditlogentrylistingrepcollection.d.ts +31 -0
  35. package/dist/commonjs/models/components/auditlogentrylistingrepcollection.d.ts.map +1 -0
  36. package/dist/commonjs/models/components/auditlogentrylistingrepcollection.js +71 -0
  37. package/dist/commonjs/models/components/auditlogentrylistingrepcollection.js.map +1 -0
  38. package/dist/commonjs/models/components/authorizedappdatarep.d.ts +42 -0
  39. package/dist/commonjs/models/components/authorizedappdatarep.d.ts.map +1 -0
  40. package/dist/commonjs/models/components/authorizedappdatarep.js +78 -0
  41. package/dist/commonjs/models/components/authorizedappdatarep.js.map +1 -0
  42. package/dist/commonjs/models/components/index.d.ts +9 -0
  43. package/dist/commonjs/models/components/index.d.ts.map +1 -1
  44. package/dist/commonjs/models/components/index.js +9 -0
  45. package/dist/commonjs/models/components/index.js.map +1 -1
  46. package/dist/commonjs/models/components/memberdatarep.d.ts +42 -0
  47. package/dist/commonjs/models/components/memberdatarep.d.ts.map +1 -0
  48. package/dist/commonjs/models/components/memberdatarep.js +78 -0
  49. package/dist/commonjs/models/components/memberdatarep.js.map +1 -0
  50. package/dist/commonjs/models/components/parentresourcerep.d.ts +32 -0
  51. package/dist/commonjs/models/components/parentresourcerep.d.ts.map +1 -0
  52. package/dist/commonjs/models/components/parentresourcerep.js +72 -0
  53. package/dist/commonjs/models/components/parentresourcerep.js.map +1 -0
  54. package/dist/commonjs/models/components/resourceaccess.d.ts +19 -0
  55. package/dist/commonjs/models/components/resourceaccess.d.ts.map +1 -0
  56. package/dist/commonjs/models/components/resourceaccess.js +60 -0
  57. package/dist/commonjs/models/components/resourceaccess.js.map +1 -0
  58. package/dist/commonjs/models/components/subjectdatarep.d.ts +32 -0
  59. package/dist/commonjs/models/components/subjectdatarep.d.ts.map +1 -0
  60. package/dist/commonjs/models/components/subjectdatarep.js +72 -0
  61. package/dist/commonjs/models/components/subjectdatarep.js.map +1 -0
  62. package/dist/commonjs/models/components/targetresourcerep.d.ts +32 -0
  63. package/dist/commonjs/models/components/targetresourcerep.d.ts.map +1 -0
  64. package/dist/commonjs/models/components/targetresourcerep.js +72 -0
  65. package/dist/commonjs/models/components/targetresourcerep.js.map +1 -0
  66. package/dist/commonjs/models/components/tokensummary.d.ts +39 -0
  67. package/dist/commonjs/models/components/tokensummary.d.ts.map +1 -0
  68. package/dist/commonjs/models/components/tokensummary.js +78 -0
  69. package/dist/commonjs/models/components/tokensummary.js.map +1 -0
  70. package/dist/commonjs/models/operations/getauditlogentries.d.ts +40 -0
  71. package/dist/commonjs/models/operations/getauditlogentries.d.ts.map +1 -0
  72. package/dist/commonjs/models/operations/getauditlogentries.js +66 -0
  73. package/dist/commonjs/models/operations/getauditlogentries.js.map +1 -0
  74. package/dist/commonjs/models/operations/index.d.ts +1 -0
  75. package/dist/commonjs/models/operations/index.d.ts.map +1 -1
  76. package/dist/commonjs/models/operations/index.js +1 -0
  77. package/dist/commonjs/models/operations/index.js.map +1 -1
  78. package/dist/commonjs/sdk/auditlog.d.ts +15 -0
  79. package/dist/commonjs/sdk/auditlog.d.ts.map +1 -0
  80. package/dist/commonjs/sdk/auditlog.js +24 -0
  81. package/dist/commonjs/sdk/auditlog.js.map +1 -0
  82. package/dist/commonjs/sdk/sdk.d.ts +3 -0
  83. package/dist/commonjs/sdk/sdk.d.ts.map +1 -1
  84. package/dist/commonjs/sdk/sdk.js +4 -0
  85. package/dist/commonjs/sdk/sdk.js.map +1 -1
  86. package/dist/esm/funcs/auditLogListEntries.d.ts +21 -0
  87. package/dist/esm/funcs/auditLogListEntries.d.ts.map +1 -0
  88. package/dist/esm/funcs/auditLogListEntries.js +92 -0
  89. package/dist/esm/funcs/auditLogListEntries.js.map +1 -0
  90. package/dist/esm/lib/config.d.ts +2 -2
  91. package/dist/esm/lib/config.js +2 -2
  92. package/dist/esm/mcp-server/cli/start/command.d.ts.map +1 -1
  93. package/dist/esm/mcp-server/cli/start/command.js +12 -0
  94. package/dist/esm/mcp-server/cli/start/command.js.map +1 -1
  95. package/dist/esm/mcp-server/cli/start/impl.d.ts +2 -0
  96. package/dist/esm/mcp-server/cli/start/impl.d.ts.map +1 -1
  97. package/dist/esm/mcp-server/cli/start/impl.js +60 -20
  98. package/dist/esm/mcp-server/cli/start/impl.js.map +1 -1
  99. package/dist/esm/mcp-server/cli/start/sse-security.d.ts +5 -0
  100. package/dist/esm/mcp-server/cli/start/sse-security.d.ts.map +1 -0
  101. package/dist/esm/mcp-server/cli/start/sse-security.js +21 -0
  102. package/dist/esm/mcp-server/cli/start/sse-security.js.map +1 -0
  103. package/dist/esm/mcp-server/mcp-server.js +1 -1
  104. package/dist/esm/mcp-server/server.d.ts.map +1 -1
  105. package/dist/esm/mcp-server/server.js +3 -1
  106. package/dist/esm/mcp-server/server.js.map +1 -1
  107. package/dist/esm/mcp-server/tools/auditLogListEntries.d.ts +8 -0
  108. package/dist/esm/mcp-server/tools/auditLogListEntries.d.ts.map +1 -0
  109. package/dist/esm/mcp-server/tools/auditLogListEntries.js +28 -0
  110. package/dist/esm/mcp-server/tools/auditLogListEntries.js.map +1 -0
  111. package/dist/esm/models/components/auditlogentrylistingrep.d.ts +93 -0
  112. package/dist/esm/models/components/auditlogentrylistingrep.d.ts.map +1 -0
  113. package/dist/esm/models/components/auditlogentrylistingrep.js +75 -0
  114. package/dist/esm/models/components/auditlogentrylistingrep.js.map +1 -0
  115. package/dist/esm/models/components/auditlogentrylistingrepcollection.d.ts +31 -0
  116. package/dist/esm/models/components/auditlogentrylistingrepcollection.d.ts.map +1 -0
  117. package/dist/esm/models/components/auditlogentrylistingrepcollection.js +33 -0
  118. package/dist/esm/models/components/auditlogentrylistingrepcollection.js.map +1 -0
  119. package/dist/esm/models/components/authorizedappdatarep.d.ts +42 -0
  120. package/dist/esm/models/components/authorizedappdatarep.d.ts.map +1 -0
  121. package/dist/esm/models/components/authorizedappdatarep.js +40 -0
  122. package/dist/esm/models/components/authorizedappdatarep.js.map +1 -0
  123. package/dist/esm/models/components/index.d.ts +9 -0
  124. package/dist/esm/models/components/index.d.ts.map +1 -1
  125. package/dist/esm/models/components/index.js +9 -0
  126. package/dist/esm/models/components/index.js.map +1 -1
  127. package/dist/esm/models/components/memberdatarep.d.ts +42 -0
  128. package/dist/esm/models/components/memberdatarep.d.ts.map +1 -0
  129. package/dist/esm/models/components/memberdatarep.js +40 -0
  130. package/dist/esm/models/components/memberdatarep.js.map +1 -0
  131. package/dist/esm/models/components/parentresourcerep.d.ts +32 -0
  132. package/dist/esm/models/components/parentresourcerep.d.ts.map +1 -0
  133. package/dist/esm/models/components/parentresourcerep.js +34 -0
  134. package/dist/esm/models/components/parentresourcerep.js.map +1 -0
  135. package/dist/esm/models/components/resourceaccess.d.ts +19 -0
  136. package/dist/esm/models/components/resourceaccess.d.ts.map +1 -0
  137. package/dist/esm/models/components/resourceaccess.js +22 -0
  138. package/dist/esm/models/components/resourceaccess.js.map +1 -0
  139. package/dist/esm/models/components/subjectdatarep.d.ts +32 -0
  140. package/dist/esm/models/components/subjectdatarep.d.ts.map +1 -0
  141. package/dist/esm/models/components/subjectdatarep.js +34 -0
  142. package/dist/esm/models/components/subjectdatarep.js.map +1 -0
  143. package/dist/esm/models/components/targetresourcerep.d.ts +32 -0
  144. package/dist/esm/models/components/targetresourcerep.d.ts.map +1 -0
  145. package/dist/esm/models/components/targetresourcerep.js +34 -0
  146. package/dist/esm/models/components/targetresourcerep.js.map +1 -0
  147. package/dist/esm/models/components/tokensummary.d.ts +39 -0
  148. package/dist/esm/models/components/tokensummary.d.ts.map +1 -0
  149. package/dist/esm/models/components/tokensummary.js +40 -0
  150. package/dist/esm/models/components/tokensummary.js.map +1 -0
  151. package/dist/esm/models/operations/getauditlogentries.d.ts +40 -0
  152. package/dist/esm/models/operations/getauditlogentries.d.ts.map +1 -0
  153. package/dist/esm/models/operations/getauditlogentries.js +28 -0
  154. package/dist/esm/models/operations/getauditlogentries.js.map +1 -0
  155. package/dist/esm/models/operations/index.d.ts +1 -0
  156. package/dist/esm/models/operations/index.d.ts.map +1 -1
  157. package/dist/esm/models/operations/index.js +1 -0
  158. package/dist/esm/models/operations/index.js.map +1 -1
  159. package/dist/esm/sdk/auditlog.d.ts +15 -0
  160. package/dist/esm/sdk/auditlog.d.ts.map +1 -0
  161. package/dist/esm/sdk/auditlog.js +20 -0
  162. package/dist/esm/sdk/auditlog.js.map +1 -0
  163. package/dist/esm/sdk/sdk.d.ts +3 -0
  164. package/dist/esm/sdk/sdk.d.ts.map +1 -1
  165. package/dist/esm/sdk/sdk.js +4 -0
  166. package/dist/esm/sdk/sdk.js.map +1 -1
  167. package/examples/{codeReferencesListRepositories.example.ts → auditLogListEntries.example.ts} +2 -2
  168. package/jsr.json +1 -1
  169. package/package.json +2 -1
  170. package/src/funcs/auditLogListEntries.ts +192 -0
  171. package/src/lib/config.ts +2 -2
  172. package/src/mcp-server/cli/start/command.ts +14 -0
  173. package/src/mcp-server/cli/start/impl.ts +69 -20
  174. package/src/mcp-server/cli/start/sse-security.ts +31 -0
  175. package/src/mcp-server/mcp-server.ts +1 -1
  176. package/src/mcp-server/server.ts +3 -1
  177. package/src/mcp-server/tools/auditLogListEntries.ts +38 -0
  178. package/src/models/components/auditlogentrylistingrep.ts +210 -0
  179. package/src/models/components/auditlogentrylistingrepcollection.ts +84 -0
  180. package/src/models/components/authorizedappdatarep.ts +96 -0
  181. package/src/models/components/index.ts +9 -0
  182. package/src/models/components/memberdatarep.ts +92 -0
  183. package/src/models/components/parentresourcerep.ts +80 -0
  184. package/src/models/components/resourceaccess.ts +51 -0
  185. package/src/models/components/subjectdatarep.ts +76 -0
  186. package/src/models/components/targetresourcerep.ts +80 -0
  187. package/src/models/components/tokensummary.ts +89 -0
  188. package/src/models/operations/getauditlogentries.ts +82 -0
  189. package/src/models/operations/index.ts +1 -0
  190. package/src/sdk/auditlog.ts +30 -0
  191. package/src/sdk/sdk.ts +6 -0
  192. package/test/sse-security.test.mjs +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auditlog.js","sourceRoot":"","sources":["../../../src/sdk/auditlog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,OAAO,QAAS,SAAQ,SAAS;IACrC;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CACf,OAA6C,EAC7C,OAAwB;QAExB,OAAO,WAAW,CAAC,mBAAmB,CACpC,IAAI,EACJ,OAAO,EACP,OAAO,CACR,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,9 +1,12 @@
1
1
  import { ClientSDK } from "../lib/sdks.js";
2
2
  import { AiConfigs } from "./aiconfigs.js";
3
+ import { AuditLog } from "./auditlog.js";
3
4
  import { CodeReferences } from "./codereferences.js";
4
5
  import { Environments } from "./environments.js";
5
6
  import { FeatureFlags } from "./featureflags.js";
6
7
  export declare class LaunchDarkly extends ClientSDK {
8
+ private _auditLog?;
9
+ get auditLog(): AuditLog;
7
10
  private _codeReferences?;
8
11
  get codeReferences(): CodeReferences;
9
12
  private _featureFlags?;
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk/sdk.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,IAAI,SAAS,IAAI,SAAS,CAEzB;CACF"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk/sdk.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,IAAI,SAAS,IAAI,SAAS,CAEzB;CACF"}
@@ -3,10 +3,14 @@
3
3
  */
4
4
  import { ClientSDK } from "../lib/sdks.js";
5
5
  import { AiConfigs } from "./aiconfigs.js";
6
+ import { AuditLog } from "./auditlog.js";
6
7
  import { CodeReferences } from "./codereferences.js";
7
8
  import { Environments } from "./environments.js";
8
9
  import { FeatureFlags } from "./featureflags.js";
9
10
  export class LaunchDarkly extends ClientSDK {
11
+ get auditLog() {
12
+ return (this._auditLog ?? (this._auditLog = new AuditLog(this._options)));
13
+ }
10
14
  get codeReferences() {
11
15
  return (this._codeReferences ?? (this._codeReferences = new CodeReferences(this._options)));
12
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/sdk/sdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,YAAa,SAAQ,SAAS;IAEzC,IAAI,cAAc;QAChB,OAAO,CAAC,IAAI,CAAC,eAAe,KAApB,IAAI,CAAC,eAAe,GAAK,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IACtE,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,CAAC,IAAI,CAAC,aAAa,KAAlB,IAAI,CAAC,aAAa,GAAK,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAClE,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,CAAC,IAAI,CAAC,aAAa,KAAlB,IAAI,CAAC,aAAa,GAAK,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAClE,CAAC;IAGD,IAAI,SAAS;QACX,OAAO,CAAC,IAAI,CAAC,UAAU,KAAf,IAAI,CAAC,UAAU,GAAK,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAC5D,CAAC;CACF"}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/sdk/sdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,YAAa,SAAQ,SAAS;IAEzC,IAAI,QAAQ;QACV,OAAO,CAAC,IAAI,CAAC,SAAS,KAAd,IAAI,CAAC,SAAS,GAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAC1D,CAAC;IAGD,IAAI,cAAc;QAChB,OAAO,CAAC,IAAI,CAAC,eAAe,KAApB,IAAI,CAAC,eAAe,GAAK,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IACtE,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,CAAC,IAAI,CAAC,aAAa,KAAlB,IAAI,CAAC,aAAa,GAAK,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAClE,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,CAAC,IAAI,CAAC,aAAa,KAAlB,IAAI,CAAC,aAAa,GAAK,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAClE,CAAC;IAGD,IAAI,SAAS;QACX,OAAO,CAAC,IAAI,CAAC,UAAU,KAAf,IAAI,CAAC,UAAU,GAAK,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,CAAC;IAC5D,CAAC;CACF"}
@@ -8,7 +8,7 @@ dotenv.config();
8
8
  * Example usage of the @launchdarkly/mcp-server SDK
9
9
  *
10
10
  * To run this example from the examples directory:
11
- * npm run build && npx tsx codeReferencesListRepositories.example.ts
11
+ * npm run build && npx tsx auditLogListEntries.example.ts
12
12
  */
13
13
 
14
14
  import { LaunchDarkly } from "@launchdarkly/mcp-server";
@@ -18,7 +18,7 @@ const launchDarkly = new LaunchDarkly({
18
18
  });
19
19
 
20
20
  async function main() {
21
- const result = await launchDarkly.codeReferences.listRepositories({});
21
+ const result = await launchDarkly.auditLog.listEntries({});
22
22
 
23
23
  console.log(result);
24
24
  }
package/jsr.json CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  {
4
4
  "name": "@launchdarkly/mcp-server",
5
- "version": "0.6.1",
5
+ "version": "0.7.0",
6
6
  "exports": {
7
7
  ".": "./src/index.ts",
8
8
  "./models/errors": "./src/models/errors/index.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@launchdarkly/mcp-server",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "author": "LaunchDarkly",
5
5
  "keywords": [
6
6
  "feature-flags",
@@ -38,6 +38,7 @@
38
38
  "lint": "eslint --cache --max-warnings=0 src",
39
39
  "build:mcp": "bun src/mcp-server/build.mts",
40
40
  "build": "npm run build:mcp && tshy",
41
+ "test:sse-security": "node --test --test-force-exit test/sse-security.test.mjs",
41
42
  "prepublishOnly": "npm run build"
42
43
  },
43
44
  "peerDependencies": {},
@@ -0,0 +1,192 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { LaunchDarklyCore } from "../core.js";
6
+ import { encodeFormQuery } from "../lib/encodings.js";
7
+ import * as M from "../lib/matchers.js";
8
+ import { compactMap } from "../lib/primitives.js";
9
+ import { safeParse } from "../lib/schemas.js";
10
+ import { RequestOptions } from "../lib/sdks.js";
11
+ import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
12
+ import { pathToFunc } from "../lib/url.js";
13
+ import * as components from "../models/components/index.js";
14
+ import {
15
+ ConnectionError,
16
+ InvalidRequestError,
17
+ RequestAbortedError,
18
+ RequestTimeoutError,
19
+ UnexpectedClientError,
20
+ } from "../models/errors/httpclienterrors.js";
21
+ import * as errors from "../models/errors/index.js";
22
+ import { LaunchDarklyError } from "../models/errors/launchdarklyerror.js";
23
+ import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
24
+ import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
25
+ import * as operations from "../models/operations/index.js";
26
+ import { APICall, APIPromise } from "../types/async.js";
27
+ import { Result } from "../types/fp.js";
28
+
29
+ /**
30
+ * List audit log entries
31
+ *
32
+ * @remarks
33
+ * Get a list of all audit log entries. The query parameters let you restrict the results that return by date ranges, resource specifiers, or a full-text search query.
34
+ *
35
+ * LaunchDarkly uses a resource specifier syntax to name resources or collections of resources. To learn more, read [About the resource specifier syntax](https://launchdarkly.com/docs/home/account/role-resources#about-the-resource-specifier-syntax).
36
+ */
37
+ export function auditLogListEntries(
38
+ client: LaunchDarklyCore,
39
+ request: operations.GetAuditLogEntriesRequest,
40
+ options?: RequestOptions,
41
+ ): APIPromise<
42
+ Result<
43
+ components.AuditLogEntryListingRepCollection,
44
+ | errors.InvalidRequestErrorRep
45
+ | errors.UnauthorizedErrorRep
46
+ | errors.ForbiddenErrorRep
47
+ | errors.RateLimitedErrorRep
48
+ | LaunchDarklyError
49
+ | ResponseValidationError
50
+ | ConnectionError
51
+ | RequestAbortedError
52
+ | RequestTimeoutError
53
+ | InvalidRequestError
54
+ | UnexpectedClientError
55
+ | SDKValidationError
56
+ >
57
+ > {
58
+ return new APIPromise($do(
59
+ client,
60
+ request,
61
+ options,
62
+ ));
63
+ }
64
+
65
+ async function $do(
66
+ client: LaunchDarklyCore,
67
+ request: operations.GetAuditLogEntriesRequest,
68
+ options?: RequestOptions,
69
+ ): Promise<
70
+ [
71
+ Result<
72
+ components.AuditLogEntryListingRepCollection,
73
+ | errors.InvalidRequestErrorRep
74
+ | errors.UnauthorizedErrorRep
75
+ | errors.ForbiddenErrorRep
76
+ | errors.RateLimitedErrorRep
77
+ | LaunchDarklyError
78
+ | ResponseValidationError
79
+ | ConnectionError
80
+ | RequestAbortedError
81
+ | RequestTimeoutError
82
+ | InvalidRequestError
83
+ | UnexpectedClientError
84
+ | SDKValidationError
85
+ >,
86
+ APICall,
87
+ ]
88
+ > {
89
+ const parsed = safeParse(
90
+ request,
91
+ (value) => operations.GetAuditLogEntriesRequest$outboundSchema.parse(value),
92
+ "Input validation failed",
93
+ );
94
+ if (!parsed.ok) {
95
+ return [parsed, { status: "invalid" }];
96
+ }
97
+ const payload = parsed.value;
98
+ const body = null;
99
+
100
+ const path = pathToFunc("/api/v2/auditlog")();
101
+
102
+ const query = encodeFormQuery({
103
+ "after": payload.after,
104
+ "before": payload.before,
105
+ "limit": payload.limit,
106
+ "q": payload.q,
107
+ "spec": payload.spec,
108
+ });
109
+
110
+ const headers = new Headers(compactMap({
111
+ Accept: "application/json",
112
+ }));
113
+
114
+ const secConfig = await extractSecurity(client._options.apiKey);
115
+ const securityInput = secConfig == null ? {} : { apiKey: secConfig };
116
+ const requestSecurity = resolveGlobalSecurity(securityInput);
117
+
118
+ const context = {
119
+ options: client._options,
120
+ baseURL: options?.serverURL ?? client._baseURL ?? "",
121
+ operationID: "getAuditLogEntries",
122
+ oAuth2Scopes: null,
123
+
124
+ resolvedSecurity: requestSecurity,
125
+
126
+ securitySource: client._options.apiKey,
127
+ retryConfig: options?.retries
128
+ || client._options.retryConfig
129
+ || { strategy: "none" },
130
+ retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
131
+ };
132
+
133
+ const requestRes = client._createRequest(context, {
134
+ security: requestSecurity,
135
+ method: "GET",
136
+ baseURL: options?.serverURL,
137
+ path: path,
138
+ headers: headers,
139
+ query: query,
140
+ body: body,
141
+ userAgent: client._options.userAgent,
142
+ timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
143
+ }, options);
144
+ if (!requestRes.ok) {
145
+ return [requestRes, { status: "invalid" }];
146
+ }
147
+ const req = requestRes.value;
148
+
149
+ const doResult = await client._do(req, {
150
+ context,
151
+ errorCodes: ["400", "401", "403", "429", "4XX", "5XX"],
152
+ retryConfig: context.retryConfig,
153
+ retryCodes: context.retryCodes,
154
+ });
155
+ if (!doResult.ok) {
156
+ return [doResult, { status: "request-error", request: req }];
157
+ }
158
+ const response = doResult.value;
159
+
160
+ const responseFields = {
161
+ HttpMeta: { Response: response, Request: req },
162
+ };
163
+
164
+ const [result] = await M.match<
165
+ components.AuditLogEntryListingRepCollection,
166
+ | errors.InvalidRequestErrorRep
167
+ | errors.UnauthorizedErrorRep
168
+ | errors.ForbiddenErrorRep
169
+ | errors.RateLimitedErrorRep
170
+ | LaunchDarklyError
171
+ | ResponseValidationError
172
+ | ConnectionError
173
+ | RequestAbortedError
174
+ | RequestTimeoutError
175
+ | InvalidRequestError
176
+ | UnexpectedClientError
177
+ | SDKValidationError
178
+ >(
179
+ M.json(200, components.AuditLogEntryListingRepCollection$inboundSchema),
180
+ M.jsonErr(400, errors.InvalidRequestErrorRep$inboundSchema),
181
+ M.jsonErr(401, errors.UnauthorizedErrorRep$inboundSchema),
182
+ M.jsonErr(403, errors.ForbiddenErrorRep$inboundSchema),
183
+ M.jsonErr(429, errors.RateLimitedErrorRep$inboundSchema),
184
+ M.fail("4XX"),
185
+ M.fail("5XX"),
186
+ )(response, req, { extraFields: responseFields });
187
+ if (!result.ok) {
188
+ return [result, { status: "complete", request: req, response }];
189
+ }
190
+
191
+ return [result, { status: "complete", request: req, response }];
192
+ }
package/src/lib/config.ts CHANGED
@@ -69,8 +69,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
69
69
  export const SDK_METADATA = {
70
70
  language: "typescript",
71
71
  openapiDocVersion: "2.0",
72
- sdkVersion: "0.6.1",
72
+ sdkVersion: "0.7.0",
73
73
  genVersion: "2.845.15",
74
74
  userAgent:
75
- "speakeasy-sdk/typescript 0.6.1 2.845.15 2.0 @launchdarkly/mcp-server",
75
+ "speakeasy-sdk/typescript 0.7.0 2.845.15 2.0 @launchdarkly/mcp-server",
76
76
  } as const;
@@ -27,6 +27,20 @@ export const startCommand = buildCommand({
27
27
  parse: (val: string) =>
28
28
  z.coerce.number().int().gte(0).lt(65536).parse(val),
29
29
  },
30
+ host: {
31
+ kind: "parsed",
32
+ brief:
33
+ "The host to listen on when the SSE transport is enabled. Non-loopback hosts require --auth-token",
34
+ default: "127.0.0.1",
35
+ parse: (value) => z.string().nonempty().parse(value),
36
+ },
37
+ "auth-token": {
38
+ kind: "parsed",
39
+ brief:
40
+ "Bearer token that SSE clients must send in the Authorization header",
41
+ optional: true,
42
+ parse: (value) => z.string().min(16).parse(value),
43
+ },
30
44
  tool: {
31
45
  kind: "parsed",
32
46
  brief: "Specify tools to mount on the server",
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
6
6
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { localhostHostValidation } from "@modelcontextprotocol/sdk/server/middleware/hostHeaderValidation.js";
7
8
  import express from "express";
8
9
  import { SDKOptions } from "../../../lib/config.js";
9
10
  import { LocalContext } from "../../cli.js";
@@ -13,10 +14,17 @@ import {
13
14
  } from "../../console-logger.js";
14
15
  import { MCPScope } from "../../scopes.js";
15
16
  import { createMCPServer } from "../../server.js";
17
+ import {
18
+ assertSafeSSEBind,
19
+ isLoopbackHost,
20
+ requireBearerToken,
21
+ } from "./sse-security.js";
16
22
 
17
23
  interface StartCommandFlags {
18
24
  readonly transport: "stdio" | "sse";
19
25
  readonly port: number;
26
+ readonly host: string;
27
+ readonly "auth-token"?: string | undefined;
20
28
  readonly tool?: string[];
21
29
  readonly scope?: MCPScope[];
22
30
  readonly "api-key"?: string | undefined;
@@ -66,37 +74,78 @@ async function startStdio(flags: StartCommandFlags) {
66
74
 
67
75
  async function startSSE(flags: StartCommandFlags) {
68
76
  const logger = createConsoleLogger(flags["log-level"]);
77
+ const host = flags.host;
78
+ const authToken = flags["auth-token"];
79
+ assertSafeSSEBind(host, authToken);
80
+
69
81
  const app = express();
70
- const mcpServer = createMCPServer({
71
- logger,
72
- allowedTools: flags.tool,
73
- scopes: flags.scope,
74
- ...{ apiKey: flags["api-key"] ?? "" },
75
- serverURL: flags["server-url"],
76
- serverIdx: flags["server-index"],
77
- });
78
- let transport: SSEServerTransport | undefined;
82
+ if (isLoopbackHost(host)) {
83
+ app.use(localhostHostValidation());
84
+ }
85
+ if (authToken) {
86
+ app.use(requireBearerToken(authToken));
87
+ }
88
+
89
+ const sessions = new Map<
90
+ string,
91
+ { transport: SSEServerTransport; server: ReturnType<typeof createMCPServer> }
92
+ >();
79
93
  const controller = new AbortController();
80
94
 
81
95
  app.get("/sse", async (_req, res) => {
82
- transport = new SSEServerTransport("/message", res);
96
+ const server = createMCPServer({
97
+ logger,
98
+ allowedTools: flags.tool,
99
+ scopes: flags.scope,
100
+ ...{ apiKey: flags["api-key"] ?? "" },
101
+ serverURL: flags["server-url"],
102
+ serverIdx: flags["server-index"],
103
+ });
104
+ const transport = new SSEServerTransport("/message", res);
105
+ sessions.set(transport.sessionId, { transport, server });
83
106
 
84
- await mcpServer.connect(transport);
107
+ res.on("close", () => {
108
+ sessions.delete(transport.sessionId);
109
+ void server.close();
110
+ });
85
111
 
86
- mcpServer.server.onclose = async () => {
87
- res.end();
88
- };
112
+ try {
113
+ await server.connect(transport);
114
+ } catch (err) {
115
+ logger.error("Failed to open SSE session", {
116
+ error: err instanceof Error ? err.message : String(err),
117
+ });
118
+ sessions.delete(transport.sessionId);
119
+ void server.close();
120
+ if (!res.headersSent) {
121
+ res.status(500).send("Internal Server Error");
122
+ }
123
+ }
89
124
  });
90
125
 
91
126
  app.post("/message", async (req, res) => {
92
- if (!transport) {
93
- throw new Error("Server transport not initialized");
127
+ const sessionId = typeof req.query["sessionId"] === "string"
128
+ ? req.query["sessionId"]
129
+ : "";
130
+ const session = sessions.get(sessionId);
131
+ if (!session) {
132
+ res.status(404).send("Unknown session");
133
+ return;
94
134
  }
95
135
 
96
- await transport.handlePostMessage(req, res);
136
+ try {
137
+ await session.transport.handlePostMessage(req, res);
138
+ } catch (err) {
139
+ logger.error("Failed to handle SSE message", {
140
+ error: err instanceof Error ? err.message : String(err),
141
+ });
142
+ if (!res.headersSent) {
143
+ res.status(500).send("Internal Server Error");
144
+ }
145
+ }
97
146
  });
98
147
 
99
- const httpServer = app.listen(flags.port, "0.0.0.0", () => {
148
+ const httpServer = app.listen(flags.port, host, () => {
100
149
  const ha = httpServer.address();
101
150
  const host = typeof ha === "string" ? ha : `${ha?.address}:${ha?.port}`;
102
151
  logger.info("MCP HTTP server started", { host });
@@ -110,9 +159,9 @@ async function startSSE(flags: StartCommandFlags) {
110
159
  }
111
160
  closing = true;
112
161
 
113
- logger.info("Shutting down MCP server");
162
+ logger.info("Shutting down MCP servers");
114
163
 
115
- await mcpServer.close();
164
+ await Promise.all([...sessions.values()].map(({ server }) => server.close()));
116
165
 
117
166
  logger.info("Shutting down HTTP server");
118
167
 
@@ -0,0 +1,31 @@
1
+ import type { RequestHandler } from "express";
2
+ import { timingSafeEqual } from "node:crypto";
3
+
4
+ export function isLoopbackHost(host: string): boolean {
5
+ return host === "127.0.0.1" || host === "localhost" || host === "::1";
6
+ }
7
+
8
+ export function assertSafeSSEBind(
9
+ host: string,
10
+ authToken: string | undefined,
11
+ ): void {
12
+ if (!authToken && !isLoopbackHost(host)) {
13
+ throw new Error(
14
+ `--auth-token is required when the SSE transport listens on a non-loopback host (${host})`,
15
+ );
16
+ }
17
+ }
18
+
19
+ export function requireBearerToken(token: string): RequestHandler {
20
+ const expected = Buffer.from(`Bearer ${token}`);
21
+ return (req, res, next) => {
22
+ const actual = Buffer.from(req.headers.authorization ?? "");
23
+ if (
24
+ actual.length !== expected.length || !timingSafeEqual(actual, expected)
25
+ ) {
26
+ res.status(401).send("Unauthorized");
27
+ return;
28
+ }
29
+ next();
30
+ };
31
+ }
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "0.6.1",
22
+ currentVersion: "0.7.0",
23
23
  },
24
24
  });
25
25
 
@@ -24,6 +24,7 @@ import { tool$aiConfigsList } from "./tools/aiConfigsList.js";
24
24
  import { tool$aiConfigsUpdate } from "./tools/aiConfigsUpdate.js";
25
25
  import { tool$aiConfigsUpdateTargeting } from "./tools/aiConfigsUpdateTargeting.js";
26
26
  import { tool$aiConfigsUpdateVariation } from "./tools/aiConfigsUpdateVariation.js";
27
+ import { tool$auditLogListEntries } from "./tools/auditLogListEntries.js";
27
28
  import { tool$codeReferencesListRepositories } from "./tools/codeReferencesListRepositories.js";
28
29
  import { tool$environmentsListByProject } from "./tools/environmentsListByProject.js";
29
30
  import { tool$featureFlagsCreate } from "./tools/featureFlagsCreate.js";
@@ -43,7 +44,7 @@ export function createMCPServer(deps: {
43
44
  }) {
44
45
  const server = new McpServer({
45
46
  name: "LaunchDarkly",
46
- version: "0.6.1",
47
+ version: "0.7.0",
47
48
  });
48
49
 
49
50
  const client = new LaunchDarklyCore({
@@ -73,6 +74,7 @@ export function createMCPServer(deps: {
73
74
  const register = { tool, resource, resourceTemplate, prompt };
74
75
  void register; // suppress unused warnings
75
76
 
77
+ tool(tool$auditLogListEntries);
76
78
  tool(tool$codeReferencesListRepositories);
77
79
  tool(tool$featureFlagsGetStatus);
78
80
  tool(tool$featureFlagsList);
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditLogListEntries } from "../../funcs/auditLogListEntries.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.GetAuditLogEntriesRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditLogListEntries: ToolDefinition<typeof args> = {
14
+ name: "get-audit-log-entries",
15
+ description:
16
+ `Fetches audit log entries for a LaunchDarkly account. Use the \`spec\` parameter with format \`proj/<projectKey>:env/<envKey>:flag/<flagKey>\` to query a specific flag's change history (use \`env/*\` for all environments). The \`before\` and \`after\` parameters accept Unix epoch timestamps in milliseconds for date-range filtering. Returns at most 20 entries per call, ordered newest-first.
17
+ `,
18
+ scopes: ["read"],
19
+ args,
20
+ tool: async (client, args, ctx) => {
21
+ const [result, apiCall] = await auditLogListEntries(
22
+ client,
23
+ args.request,
24
+ { fetchOptions: { signal: ctx.signal } },
25
+ ).$inspect();
26
+
27
+ if (!result.ok) {
28
+ return {
29
+ content: [{ type: "text", text: result.error.message }],
30
+ isError: true,
31
+ };
32
+ }
33
+
34
+ const value = result.value;
35
+
36
+ return formatResult(value, apiCall);
37
+ },
38
+ };