@priyanshumit/macos-terminal-mcp 0.3.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,213 @@
1
+ import { z } from "zod";
2
+ import { appendAudit } from "../safety/audit.js";
3
+ import { confirmWithUser, isWriteToolsEnabled, writeToolsDisabledMessage, } from "../safety/confirm.js";
4
+ import { loadSafetyConfig, saveSafetyConfig, } from "../safety/patterns.js";
5
+ const LEVEL_VALUES = ["safe", "requires_approval", "forbidden"];
6
+ function isValidRegex(pattern) {
7
+ try {
8
+ new RegExp(pattern);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function asTextResult(text, isError = false) {
16
+ return { content: [{ type: "text", text }], ...(isError ? { isError } : {}) };
17
+ }
18
+ function describeLevel(level) {
19
+ switch (level) {
20
+ case "safe":
21
+ return "safe (auto-run, no confirmation)";
22
+ case "requires_approval":
23
+ return "requires_approval (dialog confirm)";
24
+ case "forbidden":
25
+ return "forbidden (refused outright)";
26
+ }
27
+ }
28
+ function registerList(server) {
29
+ server.registerTool("safety_list", {
30
+ description: "List the current safety policy patterns. Each entry has {pattern, level, description?}. Levels: safe (auto-run), requires_approval (confirm dialog), forbidden (refused outright). Read-only — does not require WRITE_TOOLS_ENABLED.",
31
+ annotations: { readOnlyHint: true, idempotentHint: true },
32
+ }, async () => {
33
+ const config = await loadSafetyConfig();
34
+ return asTextResult(JSON.stringify(config.patterns, null, 2));
35
+ });
36
+ }
37
+ function registerAdd(server) {
38
+ server.registerTool("safety_add", {
39
+ description: "Add a new pattern to the safety policy. The model proposes a regex + level + (optional) description; the user is shown a confirmation dialog and decides whether to persist it. Persisted to ~/.config/macos-terminal-mcp/safety.json. Requires WRITE_TOOLS_ENABLED=1.",
40
+ inputSchema: {
41
+ pattern: z
42
+ .string()
43
+ .min(1)
44
+ .max(500)
45
+ .describe("Regex pattern (JavaScript syntax) to match against commands"),
46
+ level: z.enum(LEVEL_VALUES).describe("Safety level: safe, requires_approval, or forbidden"),
47
+ description: z
48
+ .string()
49
+ .max(500)
50
+ .optional()
51
+ .describe("Human-readable note about why this pattern exists"),
52
+ },
53
+ }, async ({ pattern, level, description }) => {
54
+ if (!isWriteToolsEnabled()) {
55
+ return asTextResult(writeToolsDisabledMessage("safety_add"), true);
56
+ }
57
+ if (!isValidRegex(pattern)) {
58
+ return asTextResult(`Refused: "${pattern}" is not a valid regex.`, true);
59
+ }
60
+ const config = await loadSafetyConfig();
61
+ const existing = config.patterns.find((p) => p.pattern === pattern);
62
+ if (existing) {
63
+ return asTextResult(`Pattern already exists with level "${existing.level}". Use safety_set_level to change it.`, true);
64
+ }
65
+ const descLine = description ? `\nDescription: ${description}` : "";
66
+ const allowed = await confirmWithUser({
67
+ title: "macos-terminal-mcp · safety_add",
68
+ message: `Add safety pattern?\n\n` +
69
+ `Pattern: ${pattern}\n` +
70
+ `Level: ${describeLevel(level)}` +
71
+ descLine,
72
+ });
73
+ if (!allowed) {
74
+ await appendAudit({
75
+ tool: "safety_add",
76
+ outcome: "denied",
77
+ pattern,
78
+ level,
79
+ source: "dialog",
80
+ });
81
+ return asTextResult("User denied the safety policy change.", true);
82
+ }
83
+ const newEntry = { pattern, level, ...(description ? { description } : {}) };
84
+ const updated = { patterns: [...config.patterns, newEntry] };
85
+ await saveSafetyConfig(updated);
86
+ await appendAudit({
87
+ tool: "safety_add",
88
+ outcome: "success",
89
+ pattern,
90
+ level,
91
+ source: "dialog",
92
+ });
93
+ return asTextResult(`Added pattern "${pattern}" with level ${level}. ${updated.patterns.length} patterns total.`);
94
+ });
95
+ }
96
+ function registerRemove(server) {
97
+ server.registerTool("safety_remove", {
98
+ description: "Remove a safety pattern by its exact regex string. Triggers a confirmation dialog; if the pattern is currently forbidden, the dialog displays a prominent warning since removal weakens safety. Requires WRITE_TOOLS_ENABLED=1.",
99
+ inputSchema: {
100
+ pattern: z
101
+ .string()
102
+ .min(1)
103
+ .describe("The exact pattern string to remove. Use safety_list to look up patterns."),
104
+ },
105
+ }, async ({ pattern }) => {
106
+ if (!isWriteToolsEnabled()) {
107
+ return asTextResult(writeToolsDisabledMessage("safety_remove"), true);
108
+ }
109
+ const config = await loadSafetyConfig();
110
+ const existing = config.patterns.find((p) => p.pattern === pattern);
111
+ if (!existing) {
112
+ return asTextResult(`No pattern found with value "${pattern}".`, true);
113
+ }
114
+ const warning = existing.level === "forbidden"
115
+ ? "⚠ WARNING: this pattern is currently FORBIDDEN. Removing it weakens safety.\n\n"
116
+ : "";
117
+ const descLine = existing.description ? `\nDescription: ${existing.description}` : "";
118
+ const allowed = await confirmWithUser({
119
+ title: "macos-terminal-mcp · safety_remove",
120
+ message: `${warning}Remove safety pattern?\n\n` +
121
+ `Pattern: ${pattern}\n` +
122
+ `Current level: ${describeLevel(existing.level)}` +
123
+ descLine,
124
+ });
125
+ if (!allowed) {
126
+ await appendAudit({
127
+ tool: "safety_remove",
128
+ outcome: "denied",
129
+ pattern,
130
+ level: existing.level,
131
+ source: "dialog",
132
+ });
133
+ return asTextResult("User denied the safety policy change.", true);
134
+ }
135
+ const updated = {
136
+ patterns: config.patterns.filter((p) => p.pattern !== pattern),
137
+ };
138
+ await saveSafetyConfig(updated);
139
+ await appendAudit({
140
+ tool: "safety_remove",
141
+ outcome: "success",
142
+ pattern,
143
+ level: existing.level,
144
+ source: "dialog",
145
+ });
146
+ return asTextResult(`Removed pattern "${pattern}". ${updated.patterns.length} patterns remain.`);
147
+ });
148
+ }
149
+ function registerSetLevel(server) {
150
+ server.registerTool("safety_set_level", {
151
+ description: "Change the safety level of an existing pattern. Triggers a confirmation dialog. If the change is a downgrade from forbidden, the dialog displays a prominent warning. Requires WRITE_TOOLS_ENABLED=1.",
152
+ inputSchema: {
153
+ pattern: z.string().min(1).describe("The exact pattern string"),
154
+ level: z
155
+ .enum(LEVEL_VALUES)
156
+ .describe("New safety level: safe, requires_approval, or forbidden"),
157
+ },
158
+ }, async ({ pattern, level }) => {
159
+ if (!isWriteToolsEnabled()) {
160
+ return asTextResult(writeToolsDisabledMessage("safety_set_level"), true);
161
+ }
162
+ const config = await loadSafetyConfig();
163
+ const existing = config.patterns.find((p) => p.pattern === pattern);
164
+ if (!existing) {
165
+ return asTextResult(`No pattern found with value "${pattern}".`, true);
166
+ }
167
+ if (existing.level === level) {
168
+ return asTextResult(`Pattern "${pattern}" is already at level ${level}. No change.`);
169
+ }
170
+ const downgrading = existing.level === "forbidden" && level !== "forbidden";
171
+ const warning = downgrading
172
+ ? "⚠ WARNING: downgrading from FORBIDDEN. This pattern will no longer be refused outright.\n\n"
173
+ : "";
174
+ const allowed = await confirmWithUser({
175
+ title: "macos-terminal-mcp · safety_set_level",
176
+ message: `${warning}Change pattern level?\n\n` +
177
+ `Pattern: ${pattern}\n` +
178
+ `From: ${describeLevel(existing.level)}\n` +
179
+ `To: ${describeLevel(level)}`,
180
+ });
181
+ if (!allowed) {
182
+ await appendAudit({
183
+ tool: "safety_set_level",
184
+ outcome: "denied",
185
+ pattern,
186
+ level,
187
+ source: "dialog",
188
+ details: { from: existing.level, to: level },
189
+ });
190
+ return asTextResult("User denied the safety policy change.", true);
191
+ }
192
+ const updated = {
193
+ patterns: config.patterns.map((p) => (p.pattern === pattern ? { ...p, level } : p)),
194
+ };
195
+ await saveSafetyConfig(updated);
196
+ await appendAudit({
197
+ tool: "safety_set_level",
198
+ outcome: "success",
199
+ pattern,
200
+ level,
201
+ source: "dialog",
202
+ details: { from: existing.level, to: level },
203
+ });
204
+ return asTextResult(`Changed "${pattern}" from ${existing.level} to ${level}.`);
205
+ });
206
+ }
207
+ export function register(server) {
208
+ registerList(server);
209
+ registerAdd(server);
210
+ registerRemove(server);
211
+ registerSetLevel(server);
212
+ }
213
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/tools/safety.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@priyanshumit/macos-terminal-mcp",
3
+ "version": "0.3.0",
4
+ "description": "MCP server exposing macOS Terminal.app to AI agents via AppleScript / JXA. List windows, read scrollback, execute commands, clear buffers — with three-tier safety patterns and confirmation dialogs.",
5
+ "type": "module",
6
+ "bin": {
7
+ "macos-terminal-mcp": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc && chmod +x dist/index.js",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx src/index.ts",
18
+ "typecheck": "tsc --noEmit",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "lint": "biome check",
22
+ "lint:fix": "biome check --write",
23
+ "format": "biome format --write",
24
+ "prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build"
25
+ },
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.28.0",
28
+ "zod": "^3.23.0"
29
+ },
30
+ "devDependencies": {
31
+ "@biomejs/biome": "^2.4.15",
32
+ "@types/node": "^22.0.0",
33
+ "tsx": "^4.19.0",
34
+ "typescript": "^5.6.0",
35
+ "vitest": "^4.1.7"
36
+ },
37
+ "engines": {
38
+ "node": ">=20"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "keywords": [
44
+ "mcp",
45
+ "model-context-protocol",
46
+ "terminal",
47
+ "macos",
48
+ "applescript",
49
+ "jxa",
50
+ "claude",
51
+ "ai",
52
+ "automation"
53
+ ],
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/priyanshumit/macos-terminal-mcp.git"
57
+ },
58
+ "homepage": "https://github.com/priyanshumit/macos-terminal-mcp#readme",
59
+ "bugs": {
60
+ "url": "https://github.com/priyanshumit/macos-terminal-mcp/issues"
61
+ },
62
+ "author": "Priyanshu Mittal",
63
+ "license": "MIT"
64
+ }