mcp-rubber-duck 1.8.0 → 1.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/.github/workflows/semantic-release.yml +12 -1
  2. package/.releaserc.json +6 -1
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +158 -1
  5. package/audit-ci.json +3 -1
  6. package/dist/config/config.d.ts +2 -0
  7. package/dist/config/config.d.ts.map +1 -1
  8. package/dist/config/config.js +144 -1
  9. package/dist/config/config.js.map +1 -1
  10. package/dist/config/types.d.ts +1084 -2
  11. package/dist/config/types.d.ts.map +1 -1
  12. package/dist/config/types.js +59 -0
  13. package/dist/config/types.js.map +1 -1
  14. package/dist/guardrails/context.d.ts +10 -0
  15. package/dist/guardrails/context.d.ts.map +1 -0
  16. package/dist/guardrails/context.js +35 -0
  17. package/dist/guardrails/context.js.map +1 -0
  18. package/dist/guardrails/errors.d.ts +26 -0
  19. package/dist/guardrails/errors.d.ts.map +1 -0
  20. package/dist/guardrails/errors.js +42 -0
  21. package/dist/guardrails/errors.js.map +1 -0
  22. package/dist/guardrails/index.d.ts +6 -0
  23. package/dist/guardrails/index.d.ts.map +1 -0
  24. package/dist/guardrails/index.js +11 -0
  25. package/dist/guardrails/index.js.map +1 -0
  26. package/dist/guardrails/plugins/base-plugin.d.ts +35 -0
  27. package/dist/guardrails/plugins/base-plugin.d.ts.map +1 -0
  28. package/dist/guardrails/plugins/base-plugin.js +70 -0
  29. package/dist/guardrails/plugins/base-plugin.js.map +1 -0
  30. package/dist/guardrails/plugins/index.d.ts +6 -0
  31. package/dist/guardrails/plugins/index.d.ts.map +1 -0
  32. package/dist/guardrails/plugins/index.js +6 -0
  33. package/dist/guardrails/plugins/index.js.map +1 -0
  34. package/dist/guardrails/plugins/pattern-blocker.d.ts +27 -0
  35. package/dist/guardrails/plugins/pattern-blocker.d.ts.map +1 -0
  36. package/dist/guardrails/plugins/pattern-blocker.js +140 -0
  37. package/dist/guardrails/plugins/pattern-blocker.js.map +1 -0
  38. package/dist/guardrails/plugins/pii-redactor/detectors.d.ts +40 -0
  39. package/dist/guardrails/plugins/pii-redactor/detectors.d.ts.map +1 -0
  40. package/dist/guardrails/plugins/pii-redactor/detectors.js +134 -0
  41. package/dist/guardrails/plugins/pii-redactor/detectors.js.map +1 -0
  42. package/dist/guardrails/plugins/pii-redactor/index.d.ts +28 -0
  43. package/dist/guardrails/plugins/pii-redactor/index.d.ts.map +1 -0
  44. package/dist/guardrails/plugins/pii-redactor/index.js +157 -0
  45. package/dist/guardrails/plugins/pii-redactor/index.js.map +1 -0
  46. package/dist/guardrails/plugins/pii-redactor/pseudonymizer.d.ts +33 -0
  47. package/dist/guardrails/plugins/pii-redactor/pseudonymizer.d.ts.map +1 -0
  48. package/dist/guardrails/plugins/pii-redactor/pseudonymizer.js +70 -0
  49. package/dist/guardrails/plugins/pii-redactor/pseudonymizer.js.map +1 -0
  50. package/dist/guardrails/plugins/rate-limiter.d.ts +28 -0
  51. package/dist/guardrails/plugins/rate-limiter.d.ts.map +1 -0
  52. package/dist/guardrails/plugins/rate-limiter.js +91 -0
  53. package/dist/guardrails/plugins/rate-limiter.js.map +1 -0
  54. package/dist/guardrails/plugins/token-limiter.d.ts +30 -0
  55. package/dist/guardrails/plugins/token-limiter.d.ts.map +1 -0
  56. package/dist/guardrails/plugins/token-limiter.js +98 -0
  57. package/dist/guardrails/plugins/token-limiter.js.map +1 -0
  58. package/dist/guardrails/service.d.ts +38 -0
  59. package/dist/guardrails/service.d.ts.map +1 -0
  60. package/dist/guardrails/service.js +183 -0
  61. package/dist/guardrails/service.js.map +1 -0
  62. package/dist/guardrails/types.d.ts +96 -0
  63. package/dist/guardrails/types.d.ts.map +1 -0
  64. package/dist/guardrails/types.js +2 -0
  65. package/dist/guardrails/types.js.map +1 -0
  66. package/dist/providers/duck-provider-enhanced.d.ts +2 -1
  67. package/dist/providers/duck-provider-enhanced.d.ts.map +1 -1
  68. package/dist/providers/duck-provider-enhanced.js +55 -6
  69. package/dist/providers/duck-provider-enhanced.js.map +1 -1
  70. package/dist/providers/enhanced-manager.d.ts +2 -1
  71. package/dist/providers/enhanced-manager.d.ts.map +1 -1
  72. package/dist/providers/enhanced-manager.js +3 -3
  73. package/dist/providers/enhanced-manager.js.map +1 -1
  74. package/dist/providers/manager.d.ts +3 -1
  75. package/dist/providers/manager.d.ts.map +1 -1
  76. package/dist/providers/manager.js +4 -2
  77. package/dist/providers/manager.js.map +1 -1
  78. package/dist/providers/provider.d.ts +3 -1
  79. package/dist/providers/provider.d.ts.map +1 -1
  80. package/dist/providers/provider.js +43 -3
  81. package/dist/providers/provider.js.map +1 -1
  82. package/dist/server.d.ts +1 -0
  83. package/dist/server.d.ts.map +1 -1
  84. package/dist/server.js +28 -6
  85. package/dist/server.js.map +1 -1
  86. package/dist/services/function-bridge.d.ts +3 -1
  87. package/dist/services/function-bridge.d.ts.map +1 -1
  88. package/dist/services/function-bridge.js +40 -1
  89. package/dist/services/function-bridge.js.map +1 -1
  90. package/package.json +5 -1
  91. package/src/config/config.ts +187 -1
  92. package/src/config/types.ts +73 -0
  93. package/src/guardrails/context.ts +37 -0
  94. package/src/guardrails/errors.ts +46 -0
  95. package/src/guardrails/index.ts +20 -0
  96. package/src/guardrails/plugins/base-plugin.ts +103 -0
  97. package/src/guardrails/plugins/index.ts +5 -0
  98. package/src/guardrails/plugins/pattern-blocker.ts +190 -0
  99. package/src/guardrails/plugins/pii-redactor/detectors.ts +200 -0
  100. package/src/guardrails/plugins/pii-redactor/index.ts +203 -0
  101. package/src/guardrails/plugins/pii-redactor/pseudonymizer.ts +91 -0
  102. package/src/guardrails/plugins/rate-limiter.ts +142 -0
  103. package/src/guardrails/plugins/token-limiter.ts +155 -0
  104. package/src/guardrails/service.ts +209 -0
  105. package/src/guardrails/types.ts +120 -0
  106. package/src/providers/duck-provider-enhanced.ts +76 -7
  107. package/src/providers/enhanced-manager.ts +5 -3
  108. package/src/providers/manager.ts +6 -3
  109. package/src/providers/provider.ts +57 -6
  110. package/src/server.ts +32 -6
  111. package/src/services/function-bridge.ts +53 -2
  112. package/tests/guardrails/config.test.ts +267 -0
  113. package/tests/guardrails/errors.test.ts +109 -0
  114. package/tests/guardrails/plugins/pattern-blocker.test.ts +309 -0
  115. package/tests/guardrails/plugins/pii-redactor.test.ts +1004 -0
  116. package/tests/guardrails/plugins/rate-limiter.test.ts +310 -0
  117. package/tests/guardrails/plugins/token-limiter.test.ts +216 -0
  118. package/tests/guardrails/service.test.ts +911 -0
  119. package/tests/mcp-bridge.test.ts +248 -0
  120. package/tests/providers.test.ts +739 -0
@@ -1,5 +1,6 @@
1
1
  import { logger } from '../utils/logger.js';
2
2
  import Ajv from 'ajv';
3
+ import { GuardrailBlockError } from '../guardrails/errors.js';
3
4
  export class FunctionBridge {
4
5
  mcpManager;
5
6
  approvalService;
@@ -8,13 +9,15 @@ export class FunctionBridge {
8
9
  ajv;
9
10
  toolSchemas = new Map();
10
11
  approvalMode;
11
- constructor(mcpManager, approvalService, trustedTools = [], approvalMode = 'always', trustedToolsByServer = {}) {
12
+ guardrailsService;
13
+ constructor(mcpManager, approvalService, trustedTools = [], approvalMode = 'always', trustedToolsByServer = {}, guardrailsService) {
12
14
  this.mcpManager = mcpManager;
13
15
  this.approvalService = approvalService;
14
16
  this.trustedTools = new Set(trustedTools);
15
17
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
16
18
  this.ajv = new Ajv({ allErrors: true, removeAdditional: 'all' });
17
19
  this.approvalMode = approvalMode;
20
+ this.guardrailsService = guardrailsService;
18
21
  // Initialize per-server trusted tools
19
22
  Object.entries(trustedToolsByServer).forEach(([serverName, tools]) => {
20
23
  this.trustedToolsByServer.set(serverName, new Set(tools));
@@ -178,15 +181,51 @@ export class FunctionBridge {
178
181
  };
179
182
  }
180
183
  }
184
+ // Create guardrail context if service is enabled
185
+ let guardrailContext;
186
+ if (this.guardrailsService?.isEnabled()) {
187
+ guardrailContext = this.guardrailsService.createContext({
188
+ toolName: `${mcpServer}:${mcpTool}`,
189
+ toolArgs: cleanArgs,
190
+ });
191
+ // Execute pre_tool_input guardrails
192
+ const preResult = await this.guardrailsService.execute('pre_tool_input', guardrailContext);
193
+ if (preResult.action === 'block') {
194
+ throw new GuardrailBlockError(preResult.blockedBy || 'unknown', preResult.blockReason || 'Tool input blocked by guardrails');
195
+ }
196
+ // Use potentially modified args (e.g., PII redaction)
197
+ if (preResult.action === 'modify' && guardrailContext.toolArgs) {
198
+ Object.assign(cleanArgs, guardrailContext.toolArgs);
199
+ }
200
+ }
181
201
  // Execute the MCP tool
182
202
  logger.info(`Executing MCP tool ${mcpServer}:${mcpTool} for ${duckName}`);
183
203
  const result = await this.mcpManager.callTool(mcpServer, mcpTool, cleanArgs);
204
+ // Execute post_tool_output guardrails
205
+ if (guardrailContext && this.guardrailsService?.isEnabled()) {
206
+ guardrailContext.toolResult = result;
207
+ const postResult = await this.guardrailsService.execute('post_tool_output', guardrailContext);
208
+ if (postResult.action === 'block') {
209
+ throw new GuardrailBlockError(postResult.blockedBy || 'unknown', postResult.blockReason || 'Tool output blocked by guardrails');
210
+ }
211
+ // Return potentially modified result
212
+ if (postResult.action === 'modify') {
213
+ return {
214
+ success: true,
215
+ data: guardrailContext.toolResult,
216
+ };
217
+ }
218
+ }
184
219
  return {
185
220
  success: true,
186
221
  data: result,
187
222
  };
188
223
  }
189
224
  catch (error) {
225
+ // Re-throw GuardrailBlockError as-is
226
+ if (error instanceof GuardrailBlockError) {
227
+ throw error;
228
+ }
190
229
  const errorMessage = error instanceof Error ? error.message : String(error);
191
230
  logger.error(`Function call failed for ${functionName}:`, errorMessage);
192
231
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"function-bridge.js","sourceRoot":"","sources":["../../src/services/function-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,GAAyB,MAAM,KAAK,CAAC;AAiB5C,MAAM,OAAO,cAAc;IACjB,UAAU,CAAmB;IAC7B,eAAe,CAAkB;IACjC,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IACtC,oBAAoB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC3D,GAAG,CAAU;IACb,WAAW,GAAyC,IAAI,GAAG,EAAE,CAAC;IAC9D,YAAY,CAAiC;IAErD,YACE,UAA4B,EAC5B,eAAgC,EAChC,eAAyB,EAAE,EAC3B,eAA+C,QAAQ,EACvD,uBAAiD,EAAE;QAEnD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,sGAAsG;QACtG,IAAI,CAAC,GAAG,GAAG,IAAK,GAAoD,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,sCAAsC;QACtC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;YACnE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAEtD,MAAM,mBAAmB,GAAyB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACpE,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;gBACxD,uCAAuC;gBACvC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAChD,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,aAAa,mBAAmB,CAAC,MAAM,sCAAsC,CAAC,CAAC;YAC5F,OAAO,mBAAmB,CAAC;QAE7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC;YACvE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,OAAgB;QAC/C,OAAO;YACL,IAAI,EAAE,QAAQ,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,EAAE;YACnD,WAAW,EAAE,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,WAAW,EAAE;YAC7D,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,6CAA6C;oBAC7C,GAAG,CAAE,OAAO,CAAC,WAAwD,EAAE,UAAU,IAAI,EAAE,CAAC;oBAExF,8BAA8B;oBAC9B,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,2BAA2B;wBACxC,OAAO,EAAE,OAAO,CAAC,UAAU;qBAC5B;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yBAAyB;wBACtC,OAAO,EAAE,OAAO,CAAC,IAAI;qBACtB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC;qBACrD;iBACF;gBACD,QAAQ,EAAE,CAAE,OAAO,CAAC,WAAuC,EAAE,QAAQ,IAAI,EAAE,CAAC;aAC7E;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,OAAe,EAAE,IAA6B;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,uCAAuC;QACjE,CAAC;QAED,IAAI,CAAC;YACH,kJAAkJ;YAClJ,MAAM,QAAQ,GAAsB,IAAI,CAAC,GAA0D,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACvC,GAAG,GAAG,CAAC,YAAY,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,kBAAkB,EAAE,CACtE,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAClC,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,GAAG,EAAE,YAAY,CAAC,CAAC;YACvE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,2BAA2B;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,YAAoB,EACpB,IAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,6CAA6C,QAAQ,OAAO,YAAY,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,YAAY,eAAe,YAAY,EAAE,CAAC,CAAC;YAE/E,wCAAwC;YACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;gBAC7D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,0BAA0B,YAAY,EAAE;iBAChD,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAI,IAAI,CAAC,WAAsB,IAAI,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC;YACnG,MAAM,OAAO,GAAI,IAAI,CAAC,SAAoB,IAAI,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;YAC7F,MAAM,UAAU,GAAG,IAAI,CAAC,YAAsB,CAAC;YAE/C,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,sDAAsD,YAAY,EAAE;iBAC5E,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC,WAAW,CAAC;YAC7B,OAAO,SAAS,CAAC,SAAS,CAAC;YAC3B,OAAO,SAAS,CAAC,YAAY,CAAC;YAE9B,yCAAyC;YACzC,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,yBAAyB,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC5E,CAAC;YACJ,CAAC;YAED,qDAAqD;YACrD,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,4CAA4C;YAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,qCAAqC;oBACpE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,iBAAiB;oBACpD,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;gBACvE,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YACvI,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7E,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,2BAA2B,GAAG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAChH,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,YAAY,cAAc,SAAS,sBAAsB,2BAA2B,cAAc,OAAO,aAAa,SAAS,iBAAiB,UAAU,EAAE,CAAC,CAAC;YAE1M,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACnC,0EAA0E;gBAC1E,aAAa,GAAG,CAAC,UAAU,IAAI,CAAC,2BAA2B,CAAC;gBAC5D,MAAM,CAAC,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC3C,0EAA0E;gBAC1E,aAAa,GAAG,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,2BAA2B,CAAC;gBAC1E,MAAM,CAAC,KAAK,CAAC,iCAAiC,aAAa,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACzC,yBAAyB;gBACzB,aAAa,GAAG,KAAK,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,0BAA0B;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxD,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;gBAEF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,aAAa,EAAE,IAAI;oBACnB,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,OAAO,EAAE,0BAA0B,QAAQ,YAAY,SAAS,IAAI,OAAO,iBAAiB,OAAO,CAAC,EAAE,EAAE;iBACzG,CAAC;YACJ,CAAC;YAED,8DAA8D;YAC9D,IAAI,UAAU,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBAChD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAE1E,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,4CAA4C,cAAc,GAAG;qBACrE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,IAAI,OAAO,QAAQ,QAAQ,EAAE,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAE7E,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM;aACb,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,4BAA4B,YAAY,GAAG,EAAE,YAAY,CAAC,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8BAA8B,YAAY,EAAE;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,6BAA6B,CAAC,YAAoB;QACxD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAEO,2BAA2B,CAAC,YAAoB;QACtD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,QAAgB;QACxD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,yBAAyB;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACtD,MAAM,aAAa,GAA8B,EAAE,CAAC;YAEpD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;gBACtC,CAAC;gBACD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAAC;YAC7D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,kBAAkB,CAAC,YAAsB,EAAE,oBAA+C;QACxF,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9F,IAAI,oBAAoB,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;gBACnE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,oCAAoC,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,QAAQ;QAMN,OAAO;YACL,cAAc,EAAE,CAAC,EAAE,0CAA0C;YAC7D,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,MAAM;YACzD,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YACxC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE;SACxD,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"function-bridge.js","sourceRoot":"","sources":["../../src/services/function-bridge.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-rubber-duck",
3
- "version": "1.8.0",
3
+ "version": "1.9.3",
4
4
  "description": "An MCP server that bridges to multiple OpenAI-compatible LLMs - your AI rubber duck debugging panel",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -37,6 +37,10 @@
37
37
  "bugs": {
38
38
  "url": "https://github.com/nesquikm/mcp-rubber-duck/issues"
39
39
  },
40
+ "publishConfig": {
41
+ "provenance": true,
42
+ "access": "public"
43
+ },
40
44
  "dependencies": {
41
45
  "@modelcontextprotocol/sdk": "^1.24.0",
42
46
  "ajv": "^8.17.1",
@@ -1,7 +1,14 @@
1
1
  import { readFileSync, existsSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import * as dotenv from 'dotenv';
4
- import { Config, ConfigSchema, ProviderConfig, MCPBridgeConfig, MCPServerConfig } from './types.js';
4
+ import {
5
+ Config,
6
+ ConfigSchema,
7
+ ProviderConfig,
8
+ MCPBridgeConfig,
9
+ MCPServerConfig,
10
+ GuardrailsConfig,
11
+ } from './types.js';
5
12
  import { logger } from '../utils/logger.js';
6
13
 
7
14
  dotenv.config();
@@ -98,6 +105,9 @@ export class ConfigManager {
98
105
  // Apply MCP bridge configuration from environment
99
106
  merged.mcp_bridge = this.getMCPBridgeConfig(merged.mcp_bridge as Partial<MCPBridgeConfig>);
100
107
 
108
+ // Apply guardrails configuration from environment
109
+ merged.guardrails = this.getGuardrailsConfig(merged.guardrails as Partial<GuardrailsConfig>);
110
+
101
111
  return merged;
102
112
  }
103
113
 
@@ -332,6 +342,182 @@ export class ConfigManager {
332
342
  return servers;
333
343
  }
334
344
 
345
+ private getGuardrailsConfig(
346
+ existingConfig: Partial<GuardrailsConfig> = {}
347
+ ): Partial<GuardrailsConfig> | undefined {
348
+ // Don't override if guardrails is explicitly disabled
349
+ if (existingConfig?.enabled === false) {
350
+ return existingConfig;
351
+ }
352
+
353
+ const guardrailsConfig: Partial<GuardrailsConfig> = { ...existingConfig };
354
+
355
+ // Enable guardrails if environment variable is set
356
+ if (process.env.GUARDRAILS_ENABLED !== undefined) {
357
+ guardrailsConfig.enabled = process.env.GUARDRAILS_ENABLED === 'true';
358
+ }
359
+
360
+ // Global guardrails settings
361
+ if (process.env.GUARDRAILS_LOG_VIOLATIONS !== undefined) {
362
+ guardrailsConfig.log_violations = process.env.GUARDRAILS_LOG_VIOLATIONS === 'true';
363
+ }
364
+ if (process.env.GUARDRAILS_LOG_MODIFICATIONS !== undefined) {
365
+ guardrailsConfig.log_modifications = process.env.GUARDRAILS_LOG_MODIFICATIONS === 'true';
366
+ }
367
+ if (process.env.GUARDRAILS_FAIL_OPEN !== undefined) {
368
+ guardrailsConfig.fail_open = process.env.GUARDRAILS_FAIL_OPEN === 'true';
369
+ }
370
+
371
+ // Initialize plugins object if any plugin env vars are set
372
+ const plugins = this.getGuardrailsPluginsFromEnv(guardrailsConfig.plugins || {});
373
+ if (Object.keys(plugins).length > 0) {
374
+ guardrailsConfig.plugins = plugins;
375
+ // Auto-enable guardrails if any plugin is enabled
376
+ if (!guardrailsConfig.enabled) {
377
+ const anyEnabled = Object.values(plugins).some(
378
+ (p) => p && typeof p === 'object' && 'enabled' in p && (p as { enabled?: boolean }).enabled === true
379
+ );
380
+ if (anyEnabled) {
381
+ guardrailsConfig.enabled = true;
382
+ }
383
+ }
384
+ }
385
+
386
+ return guardrailsConfig.enabled ? guardrailsConfig : undefined;
387
+ }
388
+
389
+ private getGuardrailsPluginsFromEnv(
390
+ existingPlugins: Record<string, unknown>
391
+ ): Record<string, unknown> {
392
+ const plugins: Record<string, unknown> = { ...existingPlugins };
393
+
394
+ // Rate Limiter
395
+ if (
396
+ process.env.GUARDRAILS_RATE_LIMITER_ENABLED !== undefined ||
397
+ existingPlugins.rate_limiter
398
+ ) {
399
+ plugins.rate_limiter = {
400
+ ...(existingPlugins.rate_limiter as object),
401
+ ...(process.env.GUARDRAILS_RATE_LIMITER_ENABLED !== undefined && {
402
+ enabled: process.env.GUARDRAILS_RATE_LIMITER_ENABLED === 'true',
403
+ }),
404
+ ...(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_MINUTE && {
405
+ requests_per_minute: parseInt(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_MINUTE),
406
+ }),
407
+ ...(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_HOUR && {
408
+ requests_per_hour: parseInt(process.env.GUARDRAILS_RATE_LIMITER_REQUESTS_PER_HOUR),
409
+ }),
410
+ ...(process.env.GUARDRAILS_RATE_LIMITER_PER_PROVIDER !== undefined && {
411
+ per_provider: process.env.GUARDRAILS_RATE_LIMITER_PER_PROVIDER === 'true',
412
+ }),
413
+ ...(process.env.GUARDRAILS_RATE_LIMITER_BURST_ALLOWANCE && {
414
+ burst_allowance: parseInt(process.env.GUARDRAILS_RATE_LIMITER_BURST_ALLOWANCE),
415
+ }),
416
+ };
417
+ }
418
+
419
+ // Token Limiter
420
+ if (
421
+ process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED !== undefined ||
422
+ existingPlugins.token_limiter
423
+ ) {
424
+ plugins.token_limiter = {
425
+ ...(existingPlugins.token_limiter as object),
426
+ ...(process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED !== undefined && {
427
+ enabled: process.env.GUARDRAILS_TOKEN_LIMITER_ENABLED === 'true',
428
+ }),
429
+ ...(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_INPUT_TOKENS && {
430
+ max_input_tokens: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_INPUT_TOKENS),
431
+ }),
432
+ ...(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_OUTPUT_TOKENS && {
433
+ max_output_tokens: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_MAX_OUTPUT_TOKENS),
434
+ }),
435
+ ...(process.env.GUARDRAILS_TOKEN_LIMITER_WARN_AT_PERCENTAGE && {
436
+ warn_at_percentage: parseInt(process.env.GUARDRAILS_TOKEN_LIMITER_WARN_AT_PERCENTAGE),
437
+ }),
438
+ };
439
+ }
440
+
441
+ // Pattern Blocker
442
+ if (
443
+ process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED !== undefined ||
444
+ existingPlugins.pattern_blocker
445
+ ) {
446
+ plugins.pattern_blocker = {
447
+ ...(existingPlugins.pattern_blocker as object),
448
+ ...(process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED !== undefined && {
449
+ enabled: process.env.GUARDRAILS_PATTERN_BLOCKER_ENABLED === 'true',
450
+ }),
451
+ ...(process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS && {
452
+ blocked_patterns: process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS.split(',').map((p) =>
453
+ p.trim()
454
+ ),
455
+ }),
456
+ ...(process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS_REGEX && {
457
+ blocked_patterns_regex: process.env.GUARDRAILS_PATTERN_BLOCKER_PATTERNS_REGEX.split(
458
+ ','
459
+ ).map((p) => p.trim()),
460
+ }),
461
+ ...(process.env.GUARDRAILS_PATTERN_BLOCKER_CASE_SENSITIVE !== undefined && {
462
+ case_sensitive: process.env.GUARDRAILS_PATTERN_BLOCKER_CASE_SENSITIVE === 'true',
463
+ }),
464
+ ...(process.env.GUARDRAILS_PATTERN_BLOCKER_ACTION && {
465
+ action_on_match: process.env.GUARDRAILS_PATTERN_BLOCKER_ACTION as
466
+ | 'block'
467
+ | 'warn'
468
+ | 'redact',
469
+ }),
470
+ };
471
+ }
472
+
473
+ // PII Redactor
474
+ if (
475
+ process.env.GUARDRAILS_PII_REDACTOR_ENABLED !== undefined ||
476
+ existingPlugins.pii_redactor
477
+ ) {
478
+ plugins.pii_redactor = {
479
+ ...(existingPlugins.pii_redactor as object),
480
+ ...(process.env.GUARDRAILS_PII_REDACTOR_ENABLED !== undefined && {
481
+ enabled: process.env.GUARDRAILS_PII_REDACTOR_ENABLED === 'true',
482
+ }),
483
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_EMAILS !== undefined && {
484
+ detect_emails: process.env.GUARDRAILS_PII_REDACTOR_DETECT_EMAILS === 'true',
485
+ }),
486
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_PHONES !== undefined && {
487
+ detect_phones: process.env.GUARDRAILS_PII_REDACTOR_DETECT_PHONES === 'true',
488
+ }),
489
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_SSN !== undefined && {
490
+ detect_ssn: process.env.GUARDRAILS_PII_REDACTOR_DETECT_SSN === 'true',
491
+ }),
492
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_API_KEYS !== undefined && {
493
+ detect_api_keys: process.env.GUARDRAILS_PII_REDACTOR_DETECT_API_KEYS === 'true',
494
+ }),
495
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_CREDIT_CARDS !== undefined && {
496
+ detect_credit_cards: process.env.GUARDRAILS_PII_REDACTOR_DETECT_CREDIT_CARDS === 'true',
497
+ }),
498
+ ...(process.env.GUARDRAILS_PII_REDACTOR_DETECT_IP_ADDRESSES !== undefined && {
499
+ detect_ip_addresses: process.env.GUARDRAILS_PII_REDACTOR_DETECT_IP_ADDRESSES === 'true',
500
+ }),
501
+ ...(process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST && {
502
+ allowlist: process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST.split(',').map((a) => a.trim()),
503
+ }),
504
+ ...(process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST_DOMAINS && {
505
+ allowlist_domains: process.env.GUARDRAILS_PII_REDACTOR_ALLOWLIST_DOMAINS.split(',').map(
506
+ (d) => d.trim()
507
+ ),
508
+ }),
509
+ ...(process.env.GUARDRAILS_PII_REDACTOR_RESTORE_ON_RESPONSE !== undefined && {
510
+ restore_on_response: process.env.GUARDRAILS_PII_REDACTOR_RESTORE_ON_RESPONSE === 'true',
511
+ }),
512
+ ...(process.env.GUARDRAILS_PII_REDACTOR_LOG_DETECTIONS !== undefined && {
513
+ log_detections: process.env.GUARDRAILS_PII_REDACTOR_LOG_DETECTIONS === 'true',
514
+ }),
515
+ };
516
+ }
517
+
518
+ return plugins;
519
+ }
520
+
335
521
  getConfig(): Config {
336
522
  return this.config;
337
523
  }
@@ -43,6 +43,72 @@ export const PricingConfigSchema = z.record(
43
43
  z.record(z.string(), ModelPricingSchema) // model name -> pricing
44
44
  );
45
45
 
46
+ // Guardrails Plugin Configs
47
+ export const RateLimiterConfigSchema = z.object({
48
+ enabled: z.boolean().default(false),
49
+ priority: z.number().min(0).max(1000).default(10),
50
+ requests_per_minute: z.number().min(1).default(60),
51
+ requests_per_hour: z.number().min(1).default(1000),
52
+ per_provider: z.boolean().default(false),
53
+ burst_allowance: z.number().min(0).default(5),
54
+ });
55
+
56
+ export const TokenLimiterConfigSchema = z.object({
57
+ enabled: z.boolean().default(false),
58
+ priority: z.number().min(0).max(1000).default(20),
59
+ max_input_tokens: z.number().min(1).default(8192),
60
+ max_output_tokens: z.number().min(1).optional(),
61
+ warn_at_percentage: z.number().min(0).max(100).default(80),
62
+ });
63
+
64
+ export const PatternBlockerConfigSchema = z.object({
65
+ enabled: z.boolean().default(false),
66
+ priority: z.number().min(0).max(1000).default(30),
67
+ blocked_patterns: z.array(z.string()).default([]),
68
+ blocked_patterns_regex: z.array(z.string()).default([]),
69
+ case_sensitive: z.boolean().default(false),
70
+ action_on_match: z.enum(['block', 'warn', 'redact']).default('block'),
71
+ });
72
+
73
+ export const PIIRedactorConfigSchema = z.object({
74
+ enabled: z.boolean().default(false),
75
+ priority: z.number().min(0).max(1000).default(25),
76
+ detect_emails: z.boolean().default(true),
77
+ detect_phones: z.boolean().default(true),
78
+ detect_ssn: z.boolean().default(true),
79
+ detect_api_keys: z.boolean().default(true),
80
+ detect_credit_cards: z.boolean().default(true),
81
+ detect_ip_addresses: z.boolean().default(false),
82
+ custom_patterns: z
83
+ .array(
84
+ z.object({
85
+ name: z.string(),
86
+ pattern: z.string(),
87
+ placeholder: z.string(),
88
+ })
89
+ )
90
+ .default([]),
91
+ allowlist: z.array(z.string()).default([]),
92
+ allowlist_domains: z.array(z.string()).default([]),
93
+ restore_on_response: z.boolean().default(false),
94
+ log_detections: z.boolean().default(true),
95
+ });
96
+
97
+ export const GuardrailsPluginsConfigSchema = z.object({
98
+ rate_limiter: RateLimiterConfigSchema.optional(),
99
+ token_limiter: TokenLimiterConfigSchema.optional(),
100
+ pattern_blocker: PatternBlockerConfigSchema.optional(),
101
+ pii_redactor: PIIRedactorConfigSchema.optional(),
102
+ });
103
+
104
+ export const GuardrailsConfigSchema = z.object({
105
+ enabled: z.boolean().default(false),
106
+ log_violations: z.boolean().default(true),
107
+ log_modifications: z.boolean().default(false),
108
+ fail_open: z.boolean().default(false), // If true, allow on plugin errors
109
+ plugins: GuardrailsPluginsConfigSchema.optional(),
110
+ });
111
+
46
112
  export const ConfigSchema = z.object({
47
113
  providers: z.record(z.string(), ProviderConfigSchema),
48
114
  default_provider: z.string().optional(),
@@ -52,6 +118,7 @@ export const ConfigSchema = z.object({
52
118
  log_level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
53
119
  mcp_bridge: MCPBridgeConfigSchema.optional(),
54
120
  pricing: PricingConfigSchema.optional(),
121
+ guardrails: GuardrailsConfigSchema.optional(),
55
122
  });
56
123
 
57
124
  export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
@@ -59,6 +126,12 @@ export type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>;
59
126
  export type MCPBridgeConfig = z.infer<typeof MCPBridgeConfigSchema>;
60
127
  export type ModelPricing = z.infer<typeof ModelPricingSchema>;
61
128
  export type PricingConfig = z.infer<typeof PricingConfigSchema>;
129
+ export type RateLimiterConfig = z.infer<typeof RateLimiterConfigSchema>;
130
+ export type TokenLimiterConfig = z.infer<typeof TokenLimiterConfigSchema>;
131
+ export type PatternBlockerConfig = z.infer<typeof PatternBlockerConfigSchema>;
132
+ export type PIIRedactorConfig = z.infer<typeof PIIRedactorConfigSchema>;
133
+ export type GuardrailsPluginsConfig = z.infer<typeof GuardrailsPluginsConfigSchema>;
134
+ export type GuardrailsConfig = z.infer<typeof GuardrailsConfigSchema>;
62
135
  export type Config = z.infer<typeof ConfigSchema>;
63
136
 
64
137
  export interface ConversationMessage {
@@ -0,0 +1,37 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { GuardrailContext, CreateContextOptions } from './types.js';
3
+
4
+ /**
5
+ * Create a new guardrail context with defaults
6
+ */
7
+ export function createGuardrailContext(options: CreateContextOptions = {}): GuardrailContext {
8
+ return {
9
+ requestId: options.requestId || randomUUID(),
10
+ provider: options.provider || 'unknown',
11
+ model: options.model || 'unknown',
12
+ timestamp: new Date(),
13
+ messages: options.messages || [],
14
+ prompt: options.prompt,
15
+ response: options.response,
16
+ toolName: options.toolName,
17
+ toolArgs: options.toolArgs,
18
+ toolResult: options.toolResult,
19
+ metadata: new Map(),
20
+ violations: [],
21
+ modifications: [],
22
+ };
23
+ }
24
+
25
+ /**
26
+ * Clone a guardrail context (deep copy metadata but shallow copy violations/modifications)
27
+ */
28
+ export function cloneContext(context: GuardrailContext): GuardrailContext {
29
+ return {
30
+ ...context,
31
+ messages: [...context.messages],
32
+ toolArgs: context.toolArgs ? { ...context.toolArgs } : undefined,
33
+ metadata: new Map(context.metadata),
34
+ violations: [...context.violations],
35
+ modifications: [...context.modifications],
36
+ };
37
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Error thrown when a guardrail blocks a request
3
+ */
4
+ export class GuardrailBlockError extends Error {
5
+ public readonly pluginName: string;
6
+ public readonly reason: string;
7
+
8
+ constructor(pluginName: string, reason: string) {
9
+ super(`Request blocked by guardrail '${pluginName}': ${reason}`);
10
+ this.name = 'GuardrailBlockError';
11
+ this.pluginName = pluginName;
12
+ this.reason = reason;
13
+ }
14
+ }
15
+
16
+ /**
17
+ * Error thrown when a guardrail plugin fails to initialize
18
+ */
19
+ export class GuardrailInitError extends Error {
20
+ public readonly pluginName: string;
21
+ public readonly cause: Error | undefined;
22
+
23
+ constructor(pluginName: string, message: string, cause?: Error) {
24
+ super(`Failed to initialize guardrail plugin '${pluginName}': ${message}`);
25
+ this.name = 'GuardrailInitError';
26
+ this.pluginName = pluginName;
27
+ this.cause = cause;
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Error thrown when a guardrail plugin execution fails
33
+ */
34
+ export class GuardrailExecutionError extends Error {
35
+ public readonly pluginName: string;
36
+ public readonly phase: string;
37
+ public readonly cause: Error | undefined;
38
+
39
+ constructor(pluginName: string, phase: string, message: string, cause?: Error) {
40
+ super(`Guardrail plugin '${pluginName}' failed during '${phase}': ${message}`);
41
+ this.name = 'GuardrailExecutionError';
42
+ this.pluginName = pluginName;
43
+ this.phase = phase;
44
+ this.cause = cause;
45
+ }
46
+ }
@@ -0,0 +1,20 @@
1
+ // Core types
2
+ export * from './types.js';
3
+
4
+ // Errors
5
+ export * from './errors.js';
6
+
7
+ // Context
8
+ export { createGuardrailContext, cloneContext } from './context.js';
9
+
10
+ // Service
11
+ export { GuardrailsService } from './service.js';
12
+
13
+ // Plugins
14
+ export {
15
+ BaseGuardrailPlugin,
16
+ RateLimiterPlugin,
17
+ TokenLimiterPlugin,
18
+ PatternBlockerPlugin,
19
+ PIIRedactorPlugin,
20
+ } from './plugins/index.js';
@@ -0,0 +1,103 @@
1
+ import {
2
+ GuardrailPlugin,
3
+ GuardrailPhase,
4
+ GuardrailContext,
5
+ GuardrailResult,
6
+ } from '../types.js';
7
+
8
+ /**
9
+ * Abstract base class for guardrail plugins
10
+ */
11
+ export abstract class BaseGuardrailPlugin implements GuardrailPlugin {
12
+ abstract name: string;
13
+ abstract phases: GuardrailPhase[];
14
+
15
+ enabled: boolean = false;
16
+ priority: number = 100;
17
+
18
+ protected config: Record<string, unknown> = {};
19
+
20
+ initialize(config: Record<string, unknown>): Promise<void> {
21
+ this.config = config;
22
+ this.enabled = true;
23
+ if (typeof config.priority === 'number') {
24
+ this.priority = config.priority;
25
+ }
26
+ return Promise.resolve();
27
+ }
28
+
29
+ abstract execute(phase: GuardrailPhase, context: GuardrailContext): Promise<GuardrailResult>;
30
+
31
+ shutdown(): Promise<void> {
32
+ this.enabled = false;
33
+ return Promise.resolve();
34
+ }
35
+
36
+ /**
37
+ * Helper to create an 'allow' result
38
+ */
39
+ protected allow(context: GuardrailContext): GuardrailResult {
40
+ return { action: 'allow', context };
41
+ }
42
+
43
+ /**
44
+ * Helper to create a 'block' result
45
+ */
46
+ protected block(context: GuardrailContext, reason: string): GuardrailResult {
47
+ return {
48
+ action: 'block',
49
+ context,
50
+ blockedBy: this.name,
51
+ blockReason: reason,
52
+ };
53
+ }
54
+
55
+ /**
56
+ * Helper to create a 'modify' result
57
+ */
58
+ protected modify(context: GuardrailContext): GuardrailResult {
59
+ return { action: 'modify', context };
60
+ }
61
+
62
+ /**
63
+ * Helper to add a violation to context
64
+ */
65
+ protected addViolation(
66
+ context: GuardrailContext,
67
+ phase: GuardrailPhase,
68
+ rule: string,
69
+ severity: 'info' | 'warning' | 'error' | 'critical',
70
+ message: string,
71
+ details?: Record<string, unknown>
72
+ ): void {
73
+ context.violations.push({
74
+ pluginName: this.name,
75
+ phase,
76
+ rule,
77
+ severity,
78
+ message,
79
+ details,
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Helper to add a modification to context
85
+ */
86
+ protected addModification(
87
+ context: GuardrailContext,
88
+ phase: GuardrailPhase,
89
+ field: string,
90
+ reason: string,
91
+ originalValue?: unknown,
92
+ newValue?: unknown
93
+ ): void {
94
+ context.modifications.push({
95
+ pluginName: this.name,
96
+ phase,
97
+ field,
98
+ originalValue,
99
+ newValue,
100
+ reason,
101
+ });
102
+ }
103
+ }
@@ -0,0 +1,5 @@
1
+ export { BaseGuardrailPlugin } from './base-plugin.js';
2
+ export { RateLimiterPlugin } from './rate-limiter.js';
3
+ export { TokenLimiterPlugin } from './token-limiter.js';
4
+ export { PatternBlockerPlugin } from './pattern-blocker.js';
5
+ export { PIIRedactorPlugin } from './pii-redactor/index.js';