open-edison 0.1.16__tar.gz → 0.1.19__tar.gz

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 (38) hide show
  1. {open_edison-0.1.16 → open_edison-0.1.19}/.gitignore +2 -1
  2. {open_edison-0.1.16 → open_edison-0.1.19}/PKG-INFO +92 -22
  3. {open_edison-0.1.16 → open_edison-0.1.19}/README.md +91 -21
  4. {open_edison-0.1.16 → open_edison-0.1.19}/config.json +14 -0
  5. {open_edison-0.1.16 → open_edison-0.1.19}/pyproject.toml +7 -4
  6. {open_edison-0.1.16 → open_edison-0.1.19}/src/middleware/data_access_tracker.py +31 -2
  7. {open_edison-0.1.16 → open_edison-0.1.19}/src/middleware/session_tracking.py +1 -1
  8. {open_edison-0.1.16 → open_edison-0.1.19}/src/server.py +115 -144
  9. {open_edison-0.1.16 → open_edison-0.1.19}/src/single_user_mcp.py +95 -112
  10. {open_edison-0.1.16 → open_edison-0.1.19}/src/telemetry.py +17 -1
  11. {open_edison-0.1.16 → open_edison-0.1.19}/tool_permissions.json +79 -0
  12. open_edison-0.1.16/frontend/configurations/prompt_permissions.json +0 -14
  13. open_edison-0.1.16/frontend/configurations/resource_permissions.json +0 -14
  14. open_edison-0.1.16/frontend/configurations/tool_permissions.json +0 -170
  15. open_edison-0.1.16/src/frontend_dist/assets/index-_NTxjOfh.js +0 -51
  16. open_edison-0.1.16/src/frontend_dist/assets/index-h6k8aL6h.css +0 -1
  17. open_edison-0.1.16/src/frontend_dist/index.html +0 -21
  18. open_edison-0.1.16/src/mcp_manager.py +0 -137
  19. {open_edison-0.1.16 → open_edison-0.1.19}/LICENSE +0 -0
  20. {open_edison-0.1.16 → open_edison-0.1.19}/desktop_ext/README.md +0 -0
  21. {open_edison-0.1.16 → open_edison-0.1.19}/docs/README.md +0 -0
  22. {open_edison-0.1.16 → open_edison-0.1.19}/docs/architecture/single_user_design.md +0 -0
  23. {open_edison-0.1.16 → open_edison-0.1.19}/docs/core/configuration.md +0 -0
  24. {open_edison-0.1.16 → open_edison-0.1.19}/docs/core/project_structure.md +0 -0
  25. {open_edison-0.1.16 → open_edison-0.1.19}/docs/core/proxy_usage.md +0 -0
  26. {open_edison-0.1.16 → open_edison-0.1.19}/docs/deployment/docker.md +0 -0
  27. {open_edison-0.1.16 → open_edison-0.1.19}/docs/deployment/local.md +0 -0
  28. {open_edison-0.1.16 → open_edison-0.1.19}/docs/development/contributing.md +0 -0
  29. {open_edison-0.1.16 → open_edison-0.1.19}/docs/development/development_guide.md +0 -0
  30. {open_edison-0.1.16 → open_edison-0.1.19}/docs/development/testing.md +0 -0
  31. {open_edison-0.1.16 → open_edison-0.1.19}/docs/quick-reference/api_reference.md +0 -0
  32. {open_edison-0.1.16 → open_edison-0.1.19}/docs/quick-reference/config_quick_start.md +0 -0
  33. {open_edison-0.1.16 → open_edison-0.1.19}/prompt_permissions.json +0 -0
  34. {open_edison-0.1.16 → open_edison-0.1.19}/resource_permissions.json +0 -0
  35. {open_edison-0.1.16 → open_edison-0.1.19}/src/__init__.py +0 -0
  36. {open_edison-0.1.16 → open_edison-0.1.19}/src/__main__.py +0 -0
  37. {open_edison-0.1.16 → open_edison-0.1.19}/src/cli.py +0 -0
  38. {open_edison-0.1.16 → open_edison-0.1.19}/src/config.py +0 -0
@@ -215,4 +215,5 @@ test.db
215
215
  src/frontend_dist/
216
216
  frontend_dist/
217
217
  frontend/node_modules/
218
- frontend/package-lock.json
218
+ frontend/package-lock.json
219
+ .vscode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-edison
3
- Version: 0.1.16
3
+ Version: 0.1.19
4
4
  Summary: Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy.
5
5
  Author-email: Hugo Berg <hugo@edison.watch>
6
6
  License-File: LICENSE
@@ -27,15 +27,7 @@ Description-Content-Type: text/markdown
27
27
 
28
28
  # OpenEdison
29
29
 
30
- Open-source MCP security gateway that prevents data exfiltration—via direct access or tool chaining—with full monitoring for local single‑user deployments. Provides core functionality of <https://edison.watch> for local, single-user use.
31
-
32
- Just want to run it?
33
-
34
- ```bash
35
- curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
36
- ```
37
-
38
- Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
30
+ Open-source single-user MCP security gateway that prevents data exfiltration—via direct access or tool chaining—with full monitoring for local single‑user deployments. Provides core functionality of <https://edison.watch> for local use.
39
31
 
40
32
  <div align="center">
41
33
  <h2>📧 Interested in connecting AI to your business software with proper access controls? <a href="mailto:hello@edison.watch">Contact us</a> to discuss.</h2>
@@ -52,7 +44,40 @@ Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
52
44
 
53
45
  ## Quick Start
54
46
 
55
- ### Install from PyPI
47
+ The fastest way to get started:
48
+
49
+ ```bash
50
+ # Installs uv (via Astral installer) and launches open-edison with uvx.
51
+ # Note: This does NOT install Node/npx. Install Node if you plan to use npx-based tools like mcp-remote.
52
+ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
53
+ ```
54
+
55
+ Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
56
+
57
+ <details>
58
+ <summary>Install Node.js/npm (optional for MCP tools)</summary>
59
+
60
+ If you need `npx` (for Node-based MCP tools like `mcp-remote`), install Node.js as well:
61
+
62
+ ![macOS](https://img.shields.io/badge/mac%20os-000000?style=for-the-badge&logo=apple&logoColor=white)
63
+
64
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
65
+ - Node/npx: `brew install node`
66
+
67
+ ![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)
68
+
69
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
70
+ - Node/npx: `sudo apt-get update && sudo apt-get install -y nodejs npm`
71
+
72
+ ![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)
73
+
74
+ - uv: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
75
+ - Node/npx: `winget install -e --id OpenJS.NodeJS`
76
+
77
+ After installation, ensure that `npx` is available on PATH.
78
+
79
+ <details>
80
+ <summary><img src="https://img.shields.io/badge/pypi-3775A9?style=for-the-badge&logo=pypi&logoColor=white" alt="PyPI"> Install from PyPI</summary>
56
81
 
57
82
  #### Prerequisites
58
83
 
@@ -75,7 +100,10 @@ open-edison run --config-dir ~/edison-config
75
100
  OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
76
101
  ```
77
102
 
78
- ### Run with Docker
103
+ </details>
104
+
105
+ <details>
106
+ <summary><img src="https://img.shields.io/badge/Docker-2CA5E0?style=for-the-badge&logo=docker&logoColor=white" alt="Docker"> Run with Docker</summary>
79
107
 
80
108
  There is a dockerfile for simple local setup.
81
109
 
@@ -94,7 +122,10 @@ make docker_run
94
122
 
95
123
  The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
96
124
 
97
- ### Run from source
125
+ </details>
126
+
127
+ <details>
128
+ <summary>⚙️ Run from source</summary>
98
129
 
99
130
  1. Clone the repository:
100
131
 
@@ -116,7 +147,7 @@ make setup
116
147
  "server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
117
148
  "logging": { "level": "INFO", "database_path": "sessions.db" },
118
149
  "mcp_servers": [
119
- { "name": "filesystem", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], "enabled": true },
150
+ { "name": "filesystem", "command": "uvx", "args": ["mcp-server-filesystem", "/tmp"], "enabled": true },
120
151
  { "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
121
152
  ]
122
153
  }
@@ -132,9 +163,12 @@ open-edison run
132
163
 
133
164
  The server will be available at `http://localhost:3000`.
134
165
 
135
- ## MCP Connection
166
+ </details>
136
167
 
137
- Connect any MCP client to Open Edison:
168
+ <details>
169
+ <summary>MCP Connection</summary>
170
+
171
+ Connect any MCP client to Open Edison (requires Node.js/npm for `npx`):
138
172
 
139
173
  ```bash
140
174
  npx -y mcp-remote http://localhost:3000/mcp/ --http-only --header "Authorization: Bearer your-api-key"
@@ -153,13 +187,17 @@ Or add to your MCP client config:
153
187
  }
154
188
  ```
155
189
 
156
- ## Usage
190
+ </details>
191
+
192
+ <details>
193
+ <summary>Usage</summary>
157
194
 
158
195
  ### API Endpoints
159
196
 
160
197
  See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
161
198
 
162
- ## Development
199
+ <details>
200
+ <summary>Development</summary>
163
201
 
164
202
  ### Setup
165
203
 
@@ -181,6 +219,11 @@ We expect `make ci` to return cleanly.
181
219
  make ci
182
220
  ```
183
221
 
222
+ </details>
223
+
224
+ <details>
225
+ <summary>⚙️ Configuration (config.json)</summary>
226
+
184
227
  ## Configuration
185
228
 
186
229
  The `config.json` file contains all configuration:
@@ -199,14 +242,23 @@ Each MCP server configuration includes:
199
242
  - `env` - Environment variables (optional)
200
243
  - `enabled` - Whether to auto-start this server
201
244
 
202
- ## Security & Permissions System
245
+ </details>
246
+
247
+ </details>
203
248
 
204
- Open Edison includes a comprehensive security monitoring system that tracks the "lethal trifecta" of AI agent risks:
249
+ <details>
250
+ <summary>Security & Permissions System</summary>
251
+
252
+ Open Edison includes a comprehensive security monitoring system that tracks the "lethal trifecta" of AI agent risks, as described in [Simon Willison's blog post](https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/):
253
+
254
+ <img src="media/lethal-trifecta.png" alt="The lethal trifecta diagram showing the three key AI agent security risks" width="30%">
205
255
 
206
256
  1. **Private data access** - Access to sensitive local files/data
207
257
  2. **Untrusted content exposure** - Exposure to external/web content
208
258
  3. **External communication** - Ability to write/send data externally
209
259
 
260
+ <img src="media/pam-diagram.png" alt="Privileged Access Management (PAM) example showing the lethal trifecta in action" width="60%">
261
+
210
262
  The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
211
263
 
212
264
  In addition to trifecta, we track Access Control Level (ACL) for each tool call,
@@ -230,6 +282,9 @@ Defines security classifications for MCP tools. See full file: [tool_permissions
230
282
  }
231
283
  ```
232
284
 
285
+ <details>
286
+ <summary>Resource Permissions (`resource_permissions.json`)</summary>
287
+
233
288
  ### Resource Permissions (`resource_permissions.json`)
234
289
 
235
290
  Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
@@ -241,6 +296,11 @@ Defines security classifications for resource access patterns. See full file: [r
241
296
  }
242
297
  ```
243
298
 
299
+ </details>
300
+
301
+ <details>
302
+ <summary>Prompt Permissions (`prompt_permissions.json`)</summary>
303
+
244
304
  ### Prompt Permissions (`prompt_permissions.json`)
245
305
 
246
306
  Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
@@ -252,6 +312,8 @@ Defines security classifications for prompt types. See full file: [prompt_permis
252
312
  }
253
313
  ```
254
314
 
315
+ </details>
316
+
255
317
  ### Wildcard Patterns
256
318
 
257
319
  All permission types support wildcard patterns:
@@ -266,7 +328,10 @@ All permission types support wildcard patterns:
266
328
 
267
329
  Use the `get_security_status` tool to monitor your session's current risk level and see which capabilities have been accessed. When the lethal trifecta is achieved (all three risk flags set), further potentially dangerous operations are blocked.
268
330
 
269
- ## Documentation
331
+ </details>
332
+
333
+ <details>
334
+ <summary>Documentation</summary>
270
335
 
271
336
  📚 **Complete documentation available in [`docs/`](docs/)**
272
337
 
@@ -275,6 +340,11 @@ Use the `get_security_status` tool to monitor your session's current risk level
275
340
  - **[API Reference](docs/quick-reference/api_reference.md)** - REST API documentation
276
341
  - **[Development Guide](docs/development/development_guide.md)** - Contributing and development
277
342
 
278
- ## License
343
+ </details>
344
+
345
+ <details>
346
+ <summary>License</summary>
279
347
 
280
348
  GPL-3.0 License - see [LICENSE](LICENSE) for details.
349
+
350
+ </details>
@@ -1,14 +1,6 @@
1
1
  # OpenEdison
2
2
 
3
- Open-source MCP security gateway that prevents data exfiltration—via direct access or tool chaining—with full monitoring for local single‑user deployments. Provides core functionality of <https://edison.watch> for local, single-user use.
4
-
5
- Just want to run it?
6
-
7
- ```bash
8
- curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
9
- ```
10
-
11
- Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
3
+ Open-source single-user MCP security gateway that prevents data exfiltration—via direct access or tool chaining—with full monitoring for local single‑user deployments. Provides core functionality of <https://edison.watch> for local use.
12
4
 
13
5
  <div align="center">
14
6
  <h2>📧 Interested in connecting AI to your business software with proper access controls? <a href="mailto:hello@edison.watch">Contact us</a> to discuss.</h2>
@@ -25,7 +17,40 @@ Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
25
17
 
26
18
  ## Quick Start
27
19
 
28
- ### Install from PyPI
20
+ The fastest way to get started:
21
+
22
+ ```bash
23
+ # Installs uv (via Astral installer) and launches open-edison with uvx.
24
+ # Note: This does NOT install Node/npx. Install Node if you plan to use npx-based tools like mcp-remote.
25
+ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
26
+ ```
27
+
28
+ Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
29
+
30
+ <details>
31
+ <summary>Install Node.js/npm (optional for MCP tools)</summary>
32
+
33
+ If you need `npx` (for Node-based MCP tools like `mcp-remote`), install Node.js as well:
34
+
35
+ ![macOS](https://img.shields.io/badge/mac%20os-000000?style=for-the-badge&logo=apple&logoColor=white)
36
+
37
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
38
+ - Node/npx: `brew install node`
39
+
40
+ ![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)
41
+
42
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
43
+ - Node/npx: `sudo apt-get update && sudo apt-get install -y nodejs npm`
44
+
45
+ ![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)
46
+
47
+ - uv: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
48
+ - Node/npx: `winget install -e --id OpenJS.NodeJS`
49
+
50
+ After installation, ensure that `npx` is available on PATH.
51
+
52
+ <details>
53
+ <summary><img src="https://img.shields.io/badge/pypi-3775A9?style=for-the-badge&logo=pypi&logoColor=white" alt="PyPI"> Install from PyPI</summary>
29
54
 
30
55
  #### Prerequisites
31
56
 
@@ -48,7 +73,10 @@ open-edison run --config-dir ~/edison-config
48
73
  OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
49
74
  ```
50
75
 
51
- ### Run with Docker
76
+ </details>
77
+
78
+ <details>
79
+ <summary><img src="https://img.shields.io/badge/Docker-2CA5E0?style=for-the-badge&logo=docker&logoColor=white" alt="Docker"> Run with Docker</summary>
52
80
 
53
81
  There is a dockerfile for simple local setup.
54
82
 
@@ -67,7 +95,10 @@ make docker_run
67
95
 
68
96
  The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
69
97
 
70
- ### Run from source
98
+ </details>
99
+
100
+ <details>
101
+ <summary>⚙️ Run from source</summary>
71
102
 
72
103
  1. Clone the repository:
73
104
 
@@ -89,7 +120,7 @@ make setup
89
120
  "server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
90
121
  "logging": { "level": "INFO", "database_path": "sessions.db" },
91
122
  "mcp_servers": [
92
- { "name": "filesystem", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], "enabled": true },
123
+ { "name": "filesystem", "command": "uvx", "args": ["mcp-server-filesystem", "/tmp"], "enabled": true },
93
124
  { "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
94
125
  ]
95
126
  }
@@ -105,9 +136,12 @@ open-edison run
105
136
 
106
137
  The server will be available at `http://localhost:3000`.
107
138
 
108
- ## MCP Connection
139
+ </details>
109
140
 
110
- Connect any MCP client to Open Edison:
141
+ <details>
142
+ <summary>MCP Connection</summary>
143
+
144
+ Connect any MCP client to Open Edison (requires Node.js/npm for `npx`):
111
145
 
112
146
  ```bash
113
147
  npx -y mcp-remote http://localhost:3000/mcp/ --http-only --header "Authorization: Bearer your-api-key"
@@ -126,13 +160,17 @@ Or add to your MCP client config:
126
160
  }
127
161
  ```
128
162
 
129
- ## Usage
163
+ </details>
164
+
165
+ <details>
166
+ <summary>Usage</summary>
130
167
 
131
168
  ### API Endpoints
132
169
 
133
170
  See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
134
171
 
135
- ## Development
172
+ <details>
173
+ <summary>Development</summary>
136
174
 
137
175
  ### Setup
138
176
 
@@ -154,6 +192,11 @@ We expect `make ci` to return cleanly.
154
192
  make ci
155
193
  ```
156
194
 
195
+ </details>
196
+
197
+ <details>
198
+ <summary>⚙️ Configuration (config.json)</summary>
199
+
157
200
  ## Configuration
158
201
 
159
202
  The `config.json` file contains all configuration:
@@ -172,14 +215,23 @@ Each MCP server configuration includes:
172
215
  - `env` - Environment variables (optional)
173
216
  - `enabled` - Whether to auto-start this server
174
217
 
175
- ## Security & Permissions System
218
+ </details>
219
+
220
+ </details>
176
221
 
177
- Open Edison includes a comprehensive security monitoring system that tracks the "lethal trifecta" of AI agent risks:
222
+ <details>
223
+ <summary>Security & Permissions System</summary>
224
+
225
+ Open Edison includes a comprehensive security monitoring system that tracks the "lethal trifecta" of AI agent risks, as described in [Simon Willison's blog post](https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/):
226
+
227
+ <img src="media/lethal-trifecta.png" alt="The lethal trifecta diagram showing the three key AI agent security risks" width="30%">
178
228
 
179
229
  1. **Private data access** - Access to sensitive local files/data
180
230
  2. **Untrusted content exposure** - Exposure to external/web content
181
231
  3. **External communication** - Ability to write/send data externally
182
232
 
233
+ <img src="media/pam-diagram.png" alt="Privileged Access Management (PAM) example showing the lethal trifecta in action" width="60%">
234
+
183
235
  The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
184
236
 
185
237
  In addition to trifecta, we track Access Control Level (ACL) for each tool call,
@@ -203,6 +255,9 @@ Defines security classifications for MCP tools. See full file: [tool_permissions
203
255
  }
204
256
  ```
205
257
 
258
+ <details>
259
+ <summary>Resource Permissions (`resource_permissions.json`)</summary>
260
+
206
261
  ### Resource Permissions (`resource_permissions.json`)
207
262
 
208
263
  Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
@@ -214,6 +269,11 @@ Defines security classifications for resource access patterns. See full file: [r
214
269
  }
215
270
  ```
216
271
 
272
+ </details>
273
+
274
+ <details>
275
+ <summary>Prompt Permissions (`prompt_permissions.json`)</summary>
276
+
217
277
  ### Prompt Permissions (`prompt_permissions.json`)
218
278
 
219
279
  Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
@@ -225,6 +285,8 @@ Defines security classifications for prompt types. See full file: [prompt_permis
225
285
  }
226
286
  ```
227
287
 
288
+ </details>
289
+
228
290
  ### Wildcard Patterns
229
291
 
230
292
  All permission types support wildcard patterns:
@@ -239,7 +301,10 @@ All permission types support wildcard patterns:
239
301
 
240
302
  Use the `get_security_status` tool to monitor your session's current risk level and see which capabilities have been accessed. When the lethal trifecta is achieved (all three risk flags set), further potentially dangerous operations are blocked.
241
303
 
242
- ## Documentation
304
+ </details>
305
+
306
+ <details>
307
+ <summary>Documentation</summary>
243
308
 
244
309
  📚 **Complete documentation available in [`docs/`](docs/)**
245
310
 
@@ -248,6 +313,11 @@ Use the `get_security_status` tool to monitor your session's current risk level
248
313
  - **[API Reference](docs/quick-reference/api_reference.md)** - REST API documentation
249
314
  - **[Development Guide](docs/development/development_guide.md)** - Contributing and development
250
315
 
251
- ## License
316
+ </details>
317
+
318
+ <details>
319
+ <summary>License</summary>
252
320
 
253
321
  GPL-3.0 License - see [LICENSE](LICENSE) for details.
322
+
323
+ </details>
@@ -4,10 +4,12 @@
4
4
  "port": 3000,
5
5
  "api_key": "dev-api-key-change-me"
6
6
  },
7
+ "autoconfig_url": "https://api.edison.watch/api/config-perms",
7
8
  "logging": {
8
9
  "level": "INFO",
9
10
  "database_path": "sessions.db"
10
11
  },
12
+ "edison-watch-api-key": "change-me",
11
13
  "mcp_servers": [
12
14
  {
13
15
  "name": "filesystem",
@@ -90,6 +92,18 @@
90
92
  ],
91
93
  "env": {},
92
94
  "enabled": false
95
+ },
96
+ {
97
+ "name": "zapier",
98
+ "command": "npx",
99
+ "args": [
100
+ "-y",
101
+ "mcp-remote",
102
+ "https://mcp.zapier.com/api/mcp/s/{access_token}/mcp"
103
+ ],
104
+ "env": {},
105
+ "enabled": false,
106
+ "roots": []
93
107
  }
94
108
  ]
95
109
  }
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "open-edison"
3
- version = "0.1.16"
3
+ version = "0.1.19"
4
4
  description = "Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -34,11 +34,13 @@ build-backend = "hatchling.build"
34
34
 
35
35
  [tool.rye]
36
36
  managed = true
37
+ python = "3.12"
37
38
  dev-dependencies = [
38
39
  "basedpyright>=1.21.0",
39
40
  "ruff>=0.12.3",
40
41
  "pytest>=8.3.3",
41
42
  "pytest-asyncio>=1.0.0",
43
+ "vulture>=2.11",
42
44
  "twine>=5.1.1",
43
45
  ]
44
46
 
@@ -76,11 +78,9 @@ include = [
76
78
  "prompt_permissions.json",
77
79
  "src/**",
78
80
  "docs/**",
79
- ]
80
- exclude = [
81
+ # Ensure packaged dashboard assets are present when building from sdist
81
82
  "src/frontend_dist/**",
82
83
  ]
83
- force-include = { "src/frontend_dist" = "src/frontend_dist" }
84
84
 
85
85
  [tool.ruff]
86
86
  line-length = 100
@@ -112,3 +112,6 @@ reportMissingTypeStubs = true
112
112
  reportUnusedFunction = false # Disable unused function warnings since we have many dynamically registered functions
113
113
  venvPath = ".venv"
114
114
  extraPaths = ["src"]
115
+
116
+ [tool.vulture]
117
+ exclude = ["tests", "src/frontend_dist"]
@@ -171,6 +171,12 @@ def _load_tool_permissions_cached() -> dict[str, dict[str, Any]]:
171
171
  return {}
172
172
 
173
173
 
174
+ def clear_tool_permissions_cache() -> None:
175
+ """Clear the tool permissions cache to force reload from file."""
176
+ _load_tool_permissions_cached.cache_clear()
177
+ log.info("Tool permissions cache cleared")
178
+
179
+
174
180
  @cache
175
181
  def _load_resource_permissions_cached() -> dict[str, dict[str, Any]]:
176
182
  """Load resource permissions from JSON configuration file with LRU caching."""
@@ -186,6 +192,12 @@ def _load_resource_permissions_cached() -> dict[str, dict[str, Any]]:
186
192
  return {}
187
193
 
188
194
 
195
+ def clear_resource_permissions_cache() -> None:
196
+ """Clear the resource permissions cache to force reload from file."""
197
+ _load_resource_permissions_cached.cache_clear()
198
+ log.info("Resource permissions cache cleared")
199
+
200
+
189
201
  @cache
190
202
  def _load_prompt_permissions_cached() -> dict[str, dict[str, Any]]:
191
203
  """Load prompt permissions from JSON configuration file with LRU caching."""
@@ -201,6 +213,20 @@ def _load_prompt_permissions_cached() -> dict[str, dict[str, Any]]:
201
213
  return {}
202
214
 
203
215
 
216
+ def clear_prompt_permissions_cache() -> None:
217
+ """Clear the prompt permissions cache to force reload from file."""
218
+ _load_prompt_permissions_cached.cache_clear()
219
+ log.info("Prompt permissions cache cleared")
220
+
221
+
222
+ def clear_all_permissions_caches() -> None:
223
+ """Clear all permission caches to force reload from files."""
224
+ clear_tool_permissions_cache()
225
+ clear_resource_permissions_cache()
226
+ clear_prompt_permissions_cache()
227
+ log.info("All permission caches cleared")
228
+
229
+
204
230
  @cache
205
231
  def _classify_tool_permissions_cached(tool_name: str) -> dict[str, Any]:
206
232
  """Classify tool permissions with LRU caching."""
@@ -351,6 +377,10 @@ class DataAccessTracker:
351
377
  """Load prompt permissions from JSON configuration file with caching."""
352
378
  return _load_prompt_permissions_cached()
353
379
 
380
+ def clear_caches(self) -> None:
381
+ """Clear all permission caches to force reload from configuration files."""
382
+ clear_all_permissions_caches()
383
+
354
384
  def _classify_by_tool_name(self, tool_name: str) -> dict[str, Any]:
355
385
  """Classify permissions based on external JSON configuration only."""
356
386
  return _classify_tool_permissions_cached(tool_name)
@@ -606,6 +636,5 @@ class SecurityError(Exception):
606
636
  ████ ████ ████ ████ ████ ████
607
637
  ██ ████ ████ ████ ████ ████ █
608
638
  ████ ████ ████ ████ ████ ████
609
- {message}
610
- """
639
+ """
611
640
  super().__init__(message)
@@ -102,7 +102,7 @@ def create_db_session() -> Generator[Session, None, None]:
102
102
 
103
103
  # Ensure changes are flushed to the main database file (avoid WAL for sql.js compatibility)
104
104
  @event.listens_for(engine, "connect")
105
- def _set_sqlite_pragmas(dbapi_connection, connection_record): # type: ignore[no-untyped-def]
105
+ def _set_sqlite_pragmas(dbapi_connection, connection_record): # type: ignore[no-untyped-def] # noqa
106
106
  cur = dbapi_connection.cursor() # type: ignore[attr-defined]
107
107
  try:
108
108
  cur.execute("PRAGMA journal_mode=DELETE") # type: ignore[attr-defined]