@guardiojs/guardio 0.0.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.
Files changed (91) hide show
  1. package/README.md +213 -0
  2. package/bin/guardio.mjs +2 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +74 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/PluginManager.d.ts +40 -0
  8. package/dist/config/PluginManager.d.ts.map +1 -0
  9. package/dist/config/PluginManager.js +130 -0
  10. package/dist/config/PluginManager.js.map +1 -0
  11. package/dist/config/index.d.ts +5 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +2 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/config/types.d.ts +37 -0
  16. package/dist/config/types.d.ts.map +1 -0
  17. package/dist/config/types.js +2 -0
  18. package/dist/config/types.js.map +1 -0
  19. package/dist/core/GuardioCore.d.ts +19 -0
  20. package/dist/core/GuardioCore.d.ts.map +1 -0
  21. package/dist/core/GuardioCore.js +115 -0
  22. package/dist/core/GuardioCore.js.map +1 -0
  23. package/dist/core/index.d.ts +3 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +2 -0
  26. package/dist/core/index.js.map +1 -0
  27. package/dist/core/types.d.ts +29 -0
  28. package/dist/core/types.d.ts.map +1 -0
  29. package/dist/core/types.js +2 -0
  30. package/dist/core/types.js.map +1 -0
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/interfaces/InterventionPluginInterface.d.ts +20 -0
  36. package/dist/interfaces/InterventionPluginInterface.d.ts.map +1 -0
  37. package/dist/interfaces/InterventionPluginInterface.js +2 -0
  38. package/dist/interfaces/InterventionPluginInterface.js.map +1 -0
  39. package/dist/interfaces/InterventionTypes.d.ts +8 -0
  40. package/dist/interfaces/InterventionTypes.d.ts.map +1 -0
  41. package/dist/interfaces/InterventionTypes.js +2 -0
  42. package/dist/interfaces/InterventionTypes.js.map +1 -0
  43. package/dist/interfaces/NotificationPluginInterface.d.ts +13 -0
  44. package/dist/interfaces/NotificationPluginInterface.d.ts.map +1 -0
  45. package/dist/interfaces/NotificationPluginInterface.js +2 -0
  46. package/dist/interfaces/NotificationPluginInterface.js.map +1 -0
  47. package/dist/interfaces/PolicyPluginInterface.d.ts +16 -0
  48. package/dist/interfaces/PolicyPluginInterface.d.ts.map +1 -0
  49. package/dist/interfaces/PolicyPluginInterface.js +2 -0
  50. package/dist/interfaces/PolicyPluginInterface.js.map +1 -0
  51. package/dist/interfaces/PolicyTypes.d.ts +12 -0
  52. package/dist/interfaces/PolicyTypes.d.ts.map +1 -0
  53. package/dist/interfaces/PolicyTypes.js +2 -0
  54. package/dist/interfaces/PolicyTypes.js.map +1 -0
  55. package/dist/interfaces/index.d.ts +6 -0
  56. package/dist/interfaces/index.d.ts.map +1 -0
  57. package/dist/interfaces/index.js +2 -0
  58. package/dist/interfaces/index.js.map +1 -0
  59. package/dist/plugins/intervention/DefaultInterventionPlugin.d.ts +12 -0
  60. package/dist/plugins/intervention/DefaultInterventionPlugin.d.ts.map +1 -0
  61. package/dist/plugins/intervention/DefaultInterventionPlugin.js +14 -0
  62. package/dist/plugins/intervention/DefaultInterventionPlugin.js.map +1 -0
  63. package/dist/plugins/intervention/HttpInterventionPlugin.d.ts +22 -0
  64. package/dist/plugins/intervention/HttpInterventionPlugin.d.ts.map +1 -0
  65. package/dist/plugins/intervention/HttpInterventionPlugin.js +99 -0
  66. package/dist/plugins/intervention/HttpInterventionPlugin.js.map +1 -0
  67. package/dist/plugins/intervention/index.d.ts +3 -0
  68. package/dist/plugins/intervention/index.d.ts.map +1 -0
  69. package/dist/plugins/intervention/index.js +3 -0
  70. package/dist/plugins/intervention/index.js.map +1 -0
  71. package/dist/plugins/notification/DefaultNotificationPlugin.d.ts +8 -0
  72. package/dist/plugins/notification/DefaultNotificationPlugin.d.ts.map +1 -0
  73. package/dist/plugins/notification/DefaultNotificationPlugin.js +9 -0
  74. package/dist/plugins/notification/DefaultNotificationPlugin.js.map +1 -0
  75. package/dist/plugins/notification/index.d.ts +2 -0
  76. package/dist/plugins/notification/index.d.ts.map +1 -0
  77. package/dist/plugins/notification/index.js +2 -0
  78. package/dist/plugins/notification/index.js.map +1 -0
  79. package/dist/plugins/policy/DefaultPolicyPlugin.d.ts +16 -0
  80. package/dist/plugins/policy/DefaultPolicyPlugin.d.ts.map +1 -0
  81. package/dist/plugins/policy/DefaultPolicyPlugin.js +21 -0
  82. package/dist/plugins/policy/DefaultPolicyPlugin.js.map +1 -0
  83. package/dist/plugins/policy/RegexPolicyPlugin.d.ts +38 -0
  84. package/dist/plugins/policy/RegexPolicyPlugin.d.ts.map +1 -0
  85. package/dist/plugins/policy/RegexPolicyPlugin.js +65 -0
  86. package/dist/plugins/policy/RegexPolicyPlugin.js.map +1 -0
  87. package/dist/plugins/policy/index.d.ts +3 -0
  88. package/dist/plugins/policy/index.d.ts.map +1 -0
  89. package/dist/plugins/policy/index.js +3 -0
  90. package/dist/plugins/policy/index.js.map +1 -0
  91. package/package.json +41 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,yBAAyB;IACxC,qFAAqF;IACrF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,qBAAqB;IAC/D,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;gBAE/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAY3C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAItD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Default policy plugin: block calls by tool name.
3
+ * Config is required: { blockedTools: ["tool_a", "tool_b"] }. No default block list.
4
+ */
5
+ export class DefaultPolicyPlugin {
6
+ name = "default";
7
+ blockedTools;
8
+ constructor(config) {
9
+ const { blockedTools } = config;
10
+ if (!Array.isArray(blockedTools)) {
11
+ throw new Error("DefaultPolicyPlugin requires config.blockedTools (array of tool names)");
12
+ }
13
+ this.blockedTools = new Set(blockedTools.filter((t) => typeof t === "string"));
14
+ }
15
+ evaluate(context) {
16
+ if (this.blockedTools.has(context.toolName))
17
+ return "blocked";
18
+ return "allowed";
19
+ }
20
+ }
21
+ //# sourceMappingURL=DefaultPolicyPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,SAAS,CAAC;IAET,YAAY,CAAc;IAE3C,YAAY,MAA+B;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,MAA8C,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CACzB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAA6B;QACpC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { PolicyPluginInterface, PolicyRequestContext, PolicyResult } from "../../interfaces/index.js";
2
+ /**
3
+ * Result when a rule's regex matches. Maps to PolicyResult.
4
+ */
5
+ export type RegexPolicyRuleResult = "blocked" | "require_approval";
6
+ /**
7
+ * One rule: apply regex when the tool name matches; optionally restrict to a specific argument.
8
+ */
9
+ export interface RegexPolicyRule {
10
+ /** Tool name this rule applies to (exact match, e.g. "get_weather"). */
11
+ name: string;
12
+ /** If set, the regex is applied to this argument's value; otherwise to the tool name. */
13
+ parameter_name?: string;
14
+ /** Regex pattern. When it matches the target string, the rule's result is applied. */
15
+ regex: string;
16
+ /** Optional RegExp flags (e.g. "i" for case-insensitive). */
17
+ flags?: string;
18
+ /** Policy result when the regex matches. Default "blocked". */
19
+ result?: RegexPolicyRuleResult;
20
+ }
21
+ export interface RegexPolicyPluginConfig {
22
+ /** List of rules. When a rule matches, its result (blocked or require_approval) is returned. */
23
+ rules: RegexPolicyRule[];
24
+ }
25
+ /**
26
+ * Policy plugin that blocks tool calls based on rules aligned to the tools/call schema.
27
+ * Each rule targets a tool by name and optionally a parameter; the regex is run on
28
+ * that parameter's value (or the tool name). If any rule matches, the call is blocked.
29
+ *
30
+ * Config: { rules: [ { name: "get_weather", parameter_name: "location", regex: "...", flags?: "i" }, ... ], debug?: boolean }
31
+ */
32
+ export declare class RegexPolicyPlugin implements PolicyPluginInterface {
33
+ readonly name = "regex";
34
+ private readonly rules;
35
+ constructor(config?: Record<string, unknown>);
36
+ evaluate(context: PolicyRequestContext): PolicyResult;
37
+ }
38
+ //# sourceMappingURL=RegexPolicyPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegexPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAsBD;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,qBAAqB;IAC7D,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMnB;gBAES,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAiChD,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAYtD"}
@@ -0,0 +1,65 @@
1
+ function getStringToTest(context, parameterName) {
2
+ if (parameterName == null || parameterName === "") {
3
+ return context.toolName;
4
+ }
5
+ const args = context.args;
6
+ const value = args?.[parameterName];
7
+ if (value === undefined || value === null) {
8
+ return "";
9
+ }
10
+ if (typeof value === "string")
11
+ return value;
12
+ if (typeof value === "number" || typeof value === "boolean")
13
+ return String(value);
14
+ return JSON.stringify(value);
15
+ }
16
+ const LOG_PREFIX = "[RegexPolicyPlugin]";
17
+ /**
18
+ * Policy plugin that blocks tool calls based on rules aligned to the tools/call schema.
19
+ * Each rule targets a tool by name and optionally a parameter; the regex is run on
20
+ * that parameter's value (or the tool name). If any rule matches, the call is blocked.
21
+ *
22
+ * Config: { rules: [ { name: "get_weather", parameter_name: "location", regex: "...", flags?: "i" }, ... ], debug?: boolean }
23
+ */
24
+ export class RegexPolicyPlugin {
25
+ name = "regex";
26
+ rules;
27
+ constructor(config = {}) {
28
+ const { rules } = config;
29
+ if (!Array.isArray(rules) || rules.length === 0) {
30
+ throw new Error("RegexPolicyPlugin requires config.rules (non-empty array of { name, regex, result?, parameter_name?, flags? })");
31
+ }
32
+ this.rules = rules.map((rule, i) => {
33
+ if (typeof rule.name !== "string" || !rule.name) {
34
+ throw new Error(`RegexPolicyPlugin rules[${i}].name must be a non-empty string`);
35
+ }
36
+ if (typeof rule.regex !== "string" || !rule.regex) {
37
+ throw new Error(`RegexPolicyPlugin rules[${i}].regex must be a non-empty string`);
38
+ }
39
+ const result = rule.result === "require_approval" ? "require_approval" : "blocked";
40
+ return {
41
+ name: rule.name,
42
+ parameterName: typeof rule.parameter_name === "string"
43
+ ? rule.parameter_name
44
+ : undefined,
45
+ regex: new RegExp(rule.regex, rule.flags ?? ""),
46
+ pattern: rule.regex,
47
+ result,
48
+ };
49
+ });
50
+ }
51
+ evaluate(context) {
52
+ for (let i = 0; i < this.rules.length; i++) {
53
+ const rule = this.rules[i];
54
+ if (context.toolName !== rule.name)
55
+ continue;
56
+ const str = getStringToTest(context, rule.parameterName);
57
+ const matched = rule.regex.test(str);
58
+ if (matched) {
59
+ return rule.result;
60
+ }
61
+ }
62
+ return "allowed";
63
+ }
64
+ }
65
+ //# sourceMappingURL=RegexPolicyPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegexPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DefaultPolicyPlugin, type DefaultPolicyPluginConfig, } from "./DefaultPolicyPlugin.js";
2
+ export { RegexPolicyPlugin, type RegexPolicyPluginConfig, type RegexPolicyRule, type RegexPolicyRuleResult, } from "./RegexPolicyPlugin.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,GAC/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { DefaultPolicyPlugin, } from "./DefaultPolicyPlugin.js";
2
+ export { RegexPolicyPlugin, } from "./RegexPolicyPlugin.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,GAIlB,MAAM,wBAAwB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@guardiojs/guardio",
3
+ "version": "0.0.1",
4
+ "description": "Security layer for MCP servers and AI Agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "guardio": "./bin/guardio.mjs"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin"
13
+ ],
14
+ "scripts": {
15
+ "prepublishOnly": "pnpm run build",
16
+ "build": "tsc",
17
+ "start": "node dist/index.js",
18
+ "dev": "tsx watch src/index.ts",
19
+ "guardio": "node bin/guardio.mjs",
20
+ "create": "node create-guardio/index.mjs"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "security",
25
+ "guardio",
26
+ "ai",
27
+ "agents"
28
+ ],
29
+ "author": "Radoslaw Szymkiewicz",
30
+ "license": "Apache-2.0",
31
+ "dependencies": {
32
+ "fastify": "^5.1.0",
33
+ "pino": "^9.5.0",
34
+ "pino-pretty": "^13.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "tsx": "^4.19.0",
39
+ "typescript": "^5.6.0"
40
+ }
41
+ }