@grindfree/guard 0.0.0-stage → 0.2.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.
@@ -0,0 +1,53 @@
1
+ /**
2
+ * MCP client wrapper: evaluate ToolGuard before client.callTool, and
3
+ * CommandGuard when the tool looks like a shell/SQL execution.
4
+ *
5
+ * No MCP SDK dependency. Pass any client with callTool().
6
+ * export X402_PRIVATE_KEY=0xYOUR_BASE_USDC_PRIVATE_KEY
7
+ */
8
+ import { createGuard } from "./guard.js";
9
+ import { GuardDenied, GuardReviewRequired } from "./errors.js";
10
+ const DEFAULT_COMMAND_TOOLS = ["shell", "bash", "sh", "terminal", "run_command", "execute_command", "command"];
11
+ const DEFAULT_SQL_TOOLS = ["sql", "query", "execute_sql", "run_sql"];
12
+ function nameOf(tool) {
13
+ return typeof tool === "string" ? tool : tool.name ?? "tool";
14
+ }
15
+ function looksLike(name, list) {
16
+ const n = name.toLowerCase();
17
+ return list.some((t) => n === t || n.endsWith(`.${t}`) || n.endsWith(`_${t}`) || n.includes(t));
18
+ }
19
+ /**
20
+ * Wrap an MCP client so every callTool is screened first. The original
21
+ * client is returned for chaining; callTool is replaced in place.
22
+ */
23
+ export function wrapMcpClient(client, opts = {}) {
24
+ const guard = opts.guard ?? createGuard({ policy: opts.policy });
25
+ const commandTools = opts.commandTools ?? DEFAULT_COMMAND_TOOLS;
26
+ const sqlTools = opts.sqlTools ?? DEFAULT_SQL_TOOLS;
27
+ const original = client.callTool.bind(client);
28
+ client.callTool = async (params, ...rest) => {
29
+ const toolName = nameOf(params ?? {});
30
+ const args = (params?.arguments ?? {});
31
+ try {
32
+ if (looksLike(toolName, commandTools) && typeof (args.command ?? args.cmd ?? args.input) === "string") {
33
+ const command = String(args.command ?? args.cmd ?? args.input);
34
+ await guard.guardCommand({ command }, async () => undefined);
35
+ }
36
+ else if (looksLike(toolName, sqlTools) && typeof (args.sql ?? args.query ?? args.statement) === "string") {
37
+ const sql = String(args.sql ?? args.query ?? args.statement);
38
+ await guard.guardSql({ sql }, async () => undefined);
39
+ }
40
+ else {
41
+ await guard.guardToolCall({ tool: `mcp.${toolName}`, arg_classes: Object.keys(args) }, async () => undefined);
42
+ }
43
+ }
44
+ catch (err) {
45
+ if (err instanceof GuardDenied || err instanceof GuardReviewRequired)
46
+ throw err;
47
+ throw err;
48
+ }
49
+ return original(params, ...rest);
50
+ };
51
+ return client;
52
+ }
53
+ //# sourceMappingURL=wrap-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-mcp.js","sourceRoot":"","sources":["../src/wrap-mcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@grindfree/guard",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "Drop-in x402 guards that screen PromptShield, CrawlSafe, ToolGuard, CommandGuard, MemoryGuard, WireShield, DocShield and SafeRead before an agent acts. Caller wallet only; never embeds keys.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "engines": {
20
+ "node": ">=20"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "test": "tsx --test test/*.test.ts",
25
+ "prepublishOnly": "npm test && npm run build",
26
+ "prepare": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "x402",
30
+ "agents",
31
+ "security",
32
+ "guardrail",
33
+ "toolguard",
34
+ "commandguard",
35
+ "promptshield",
36
+ "mcp",
37
+ "langchain",
38
+ "openai-agents"
39
+ ],
40
+ "license": "MIT",
41
+ "author": "GrindFree",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/ronin93/grindfree-guard.git"
45
+ },
46
+ "homepage": "https://github.com/ronin93/grindfree-guard#readme",
47
+ "bugs": {
48
+ "url": "https://github.com/ronin93/grindfree-guard/issues"
49
+ },
50
+ "dependencies": {
51
+ "@x402/evm": "^2.29.0",
52
+ "@x402/fetch": "^2.29.0",
53
+ "viem": "^2.57.16"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.10.0",
57
+ "tsx": "^4.19.2",
58
+ "typescript": "^5.7.2"
59
+ }
60
+ }