open-edison 0.1.15__tar.gz → 0.1.17__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.15 → open_edison-0.1.17}/PKG-INFO +82 -121
  2. {open_edison-0.1.15 → open_edison-0.1.17}/README.md +81 -120
  3. {open_edison-0.1.15 → open_edison-0.1.17}/config.json +1 -1
  4. {open_edison-0.1.15 → open_edison-0.1.17}/pyproject.toml +6 -4
  5. {open_edison-0.1.15 → open_edison-0.1.17}/src/middleware/session_tracking.py +2 -2
  6. {open_edison-0.1.15 → open_edison-0.1.17}/src/server.py +41 -145
  7. {open_edison-0.1.15 → open_edison-0.1.17}/src/single_user_mcp.py +5 -22
  8. {open_edison-0.1.15 → open_edison-0.1.17}/src/telemetry.py +17 -1
  9. open_edison-0.1.15/src/frontend_dist/assets/index-_NTxjOfh.js +0 -51
  10. open_edison-0.1.15/src/frontend_dist/assets/index-h6k8aL6h.css +0 -1
  11. open_edison-0.1.15/src/frontend_dist/index.html +0 -21
  12. open_edison-0.1.15/src/mcp_manager.py +0 -137
  13. {open_edison-0.1.15 → open_edison-0.1.17}/.gitignore +0 -0
  14. {open_edison-0.1.15 → open_edison-0.1.17}/LICENSE +0 -0
  15. {open_edison-0.1.15 → open_edison-0.1.17}/desktop_ext/README.md +0 -0
  16. {open_edison-0.1.15 → open_edison-0.1.17}/docs/README.md +0 -0
  17. {open_edison-0.1.15 → open_edison-0.1.17}/docs/architecture/single_user_design.md +0 -0
  18. {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/configuration.md +0 -0
  19. {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/project_structure.md +0 -0
  20. {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/proxy_usage.md +0 -0
  21. {open_edison-0.1.15 → open_edison-0.1.17}/docs/deployment/docker.md +0 -0
  22. {open_edison-0.1.15 → open_edison-0.1.17}/docs/deployment/local.md +0 -0
  23. {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/contributing.md +0 -0
  24. {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/development_guide.md +0 -0
  25. {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/testing.md +0 -0
  26. {open_edison-0.1.15 → open_edison-0.1.17}/docs/quick-reference/api_reference.md +0 -0
  27. {open_edison-0.1.15 → open_edison-0.1.17}/docs/quick-reference/config_quick_start.md +0 -0
  28. {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/prompt_permissions.json +0 -0
  29. {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/resource_permissions.json +0 -0
  30. {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/tool_permissions.json +0 -0
  31. {open_edison-0.1.15 → open_edison-0.1.17}/prompt_permissions.json +0 -0
  32. {open_edison-0.1.15 → open_edison-0.1.17}/resource_permissions.json +0 -0
  33. {open_edison-0.1.15 → open_edison-0.1.17}/src/__init__.py +0 -0
  34. {open_edison-0.1.15 → open_edison-0.1.17}/src/__main__.py +0 -0
  35. {open_edison-0.1.15 → open_edison-0.1.17}/src/cli.py +0 -0
  36. {open_edison-0.1.15 → open_edison-0.1.17}/src/config.py +0 -0
  37. {open_edison-0.1.15 → open_edison-0.1.17}/src/middleware/data_access_tracker.py +0 -0
  38. {open_edison-0.1.15 → open_edison-0.1.17}/tool_permissions.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-edison
3
- Version: 0.1.15
3
+ Version: 0.1.17
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
@@ -25,12 +25,38 @@ Requires-Dist: pytest>=8.3.3; extra == 'dev'
25
25
  Requires-Dist: ruff>=0.12.3; extra == 'dev'
26
26
  Description-Content-Type: text/markdown
27
27
 
28
- # Open Edison
28
+ # OpenEdison
29
29
 
30
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
31
 
32
+ Just want to run it?
33
+
34
+ ```bash
35
+ # Installs uv (via Astral installer) and launches open-edison with uvx.
36
+ # Note: This does NOT install Node/npx. Install Node if you plan to use npx-based tools like mcp-remote.
37
+ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
38
+ ```
39
+
32
40
  Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
33
41
 
42
+ If you need `npx` (for Node-based MCP tools like `mcp-remote`), install Node.js as well:
43
+
44
+ - macOS:
45
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
46
+ - Node/npx: `brew install node`
47
+ - Linux (Debian/Ubuntu):
48
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
49
+ - Node/npx: `sudo apt-get update && sudo apt-get install -y nodejs npm`
50
+ - Windows (PowerShell):
51
+ - uv: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
52
+ - Node/npx: `winget install -e --id OpenJS.NodeJS`
53
+
54
+ After installation, ensure that `npx` is available on PATH.
55
+
56
+ <div align="center">
57
+ <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>
58
+ </div>
59
+
34
60
  ## Features
35
61
 
36
62
  - **Single-user MCP proxy** - No multi-user complexity, just a simple proxy for your MCP servers
@@ -65,6 +91,25 @@ open-edison run --config-dir ~/edison-config
65
91
  OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
66
92
  ```
67
93
 
94
+ ### Run with Docker
95
+
96
+ There is a dockerfile for simple local setup.
97
+
98
+ ```bash
99
+ # Single-line:
100
+ git clone https://github.com/GatlingX/open-edison.git && cd open-edison && make docker_run
101
+
102
+ # Or
103
+ # Clone repo
104
+ git clone https://github.com/GatlingX/open-edison.git
105
+ # Enter repo
106
+ cd open-edison
107
+ # Build and run
108
+ make docker_run
109
+ ```
110
+
111
+ The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
112
+
68
113
  ### Run from source
69
114
 
70
115
  1. Clone the repository:
@@ -74,33 +119,26 @@ git clone https://github.com/GatlingX/open-edison.git
74
119
  cd open-edison
75
120
  ```
76
121
 
77
- 2. Set up the project:
122
+ 1. Set up the project:
78
123
 
79
124
  ```bash
80
125
  make setup
81
126
  ```
82
127
 
83
- 3. Edit `config.json` to configure your MCP servers:
128
+ 1. Edit `config.json` to configure your MCP servers. See the full file: [config.json](config.json), it looks like:
84
129
 
85
130
  ```json
86
131
  {
87
- "server": {
88
- "host": "localhost",
89
- "port": 3000,
90
- "api_key": "your-secure-api-key"
91
- },
132
+ "server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
133
+ "logging": { "level": "INFO", "database_path": "sessions.db" },
92
134
  "mcp_servers": [
93
- {
94
- "name": "filesystem",
95
- "command": "uvx",
96
- "args": ["mcp-server-filesystem", "/path/to/directory"],
97
- "enabled": true
98
- }
135
+ { "name": "filesystem", "command": "uvx", "args": ["mcp-server-filesystem", "/tmp"], "enabled": true },
136
+ { "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
99
137
  ]
100
138
  }
101
139
  ```
102
140
 
103
- 4. Run the server:
141
+ 1. Run the server:
104
142
 
105
143
  ```bash
106
144
  make run
@@ -110,18 +148,9 @@ open-edison run
110
148
 
111
149
  The server will be available at `http://localhost:3000`.
112
150
 
113
- ### Run with Docker
114
-
115
- ```bash
116
- # After cloning the repo
117
- make docker_run
118
- ```
119
-
120
- The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
121
-
122
151
  ## MCP Connection
123
152
 
124
- Connect any MCP client to Open Edison:
153
+ Connect any MCP client to Open Edison (requires Node.js/npm for `npx`):
125
154
 
126
155
  ```bash
127
156
  npx -y mcp-remote http://localhost:3000/mcp/ --http-only --header "Authorization: Bearer your-api-key"
@@ -144,64 +173,28 @@ Or add to your MCP client config:
144
173
 
145
174
  ### API Endpoints
146
175
 
147
- Api is on port 3001 (or configured MCP server port + 1).
148
-
149
- - `GET /health` - Health check
150
- - `GET /mcp/status` - Get status of configured MCP servers
151
- - `POST /mcp/{server_name}/start` - Start a specific MCP server
152
- - `POST /mcp/{server_name}/stop` - Stop a specific MCP server
153
- - `POST /mcp/call` - Proxy MCP calls to running servers
154
- - `GET /sessions` - Get session logs (coming soon)
155
-
156
- All endpoints except `/health` require the `Authorization: Bearer <api_key>` header.
176
+ See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
157
177
 
158
178
  ## Development
159
179
 
160
- ```bash
161
- # Install dependencies
162
- make sync
180
+ ### Setup
163
181
 
164
- # Run with auto-reload
165
- make dev
182
+ Setup from source as above.
166
183
 
167
- # Run tests
168
- make test
184
+ ### Run
169
185
 
170
- # Lint code
171
- make lint
172
-
173
- # Format code
174
- make format
175
- ```
176
-
177
- ### Website (Sessions Dashboard)
178
-
179
- A minimal React + Vite frontend is included at `open-edison/frontend/`.
180
-
181
- Run it with a single command from the repo root or via the CLI:
186
+ Server doesn't have any auto-reload at the moment, so you'll need to run & ctrl-c this during development.
182
187
 
183
188
  ```bash
184
- make website
185
- # or
186
- open-edison website
189
+ make run
187
190
  ```
188
191
 
189
- This will install frontend deps (first run) and start the dev server. Open the URL shown (typically `http://localhost:5173` or `5174`).
192
+ ### Tests/code quality
190
193
 
191
- Notes:
192
-
193
- - The dashboard reads session data directly from the SQLite database `edison.db` in the repo root via sql.js.
194
- - The Configs tab provides JSON editors (with syntax highlighting) for `config.json`, `tool_permissions.json`, `resource_permissions.json`, and `prompt_permissions.json`.
195
- - You can Save changes directly while the dev server is running; writes are constrained to the project root.
196
-
197
- ## Docker
194
+ We expect `make ci` to return cleanly.
198
195
 
199
196
  ```bash
200
- # Build Docker image
201
- make docker_build
202
-
203
- # Run in Docker
204
- make docker_run
197
+ make ci
205
198
  ```
206
199
 
207
200
  ## Configuration
@@ -230,80 +223,48 @@ Open Edison includes a comprehensive security monitoring system that tracks the
230
223
  2. **Untrusted content exposure** - Exposure to external/web content
231
224
  3. **External communication** - Ability to write/send data externally
232
225
 
233
- The system monitors these risks across **tools**, **resources**, and **prompts** using separate configuration files.
226
+ The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
227
+
228
+ In addition to trifecta, we track Access Control Level (ACL) for each tool call,
229
+ that is, each tool has an ACL level (one of PUBLIC, PRIVATE, or SECRET), and we track the highest ACL level for each session.
230
+ If a write operation is attempted to a lower ACL level, it is blocked.
234
231
 
235
232
  ### Tool Permissions (`tool_permissions.json`)
236
233
 
237
- Defines security classifications for MCP tools. Each tool is classified with three boolean flags:
234
+ Defines security classifications for MCP tools. See full file: [tool_permissions.json](tool_permissions.json), it looks like:
238
235
 
239
236
  ```json
240
237
  {
241
- "filesystem_read_file": {
242
- "write_operation": false,
243
- "read_private_data": true,
244
- "read_untrusted_public_data": false
238
+ "_metadata": { "last_updated": "2025-08-07" },
239
+ "builtin": {
240
+ "get_security_status": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false, "acl": "PUBLIC" }
245
241
  },
246
- "sqlite_create_record": {
247
- "write_operation": true,
248
- "read_private_data": true,
249
- "read_untrusted_public_data": false
242
+ "filesystem": {
243
+ "read_file": { "enabled": true, "write_operation": false, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" },
244
+ "write_file": { "enabled": true, "write_operation": true, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" }
250
245
  }
251
246
  }
252
247
  ```
253
248
 
254
249
  ### Resource Permissions (`resource_permissions.json`)
255
250
 
256
- Defines security classifications for resource access patterns. Currently empty - add classifications as needed:
251
+ Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
257
252
 
258
253
  ```json
259
254
  {
260
- "_metadata": {
261
- "description": "Resource security classifications for Open Edison data access tracker",
262
- "last_updated": "2025-08-07"
263
- },
264
- "file:*": {
265
- "write_operation": false,
266
- "read_private_data": true,
267
- "read_untrusted_public_data": false
268
- },
269
- "http:*": {
270
- "write_operation": false,
271
- "read_private_data": false,
272
- "read_untrusted_public_data": true
273
- },
274
- "database:*": {
275
- "write_operation": false,
276
- "read_private_data": true,
277
- "read_untrusted_public_data": false
278
- }
255
+ "_metadata": { "last_updated": "2025-08-07" },
256
+ "builtin": { "config://app": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
279
257
  }
280
258
  ```
281
259
 
282
260
  ### Prompt Permissions (`prompt_permissions.json`)
283
261
 
284
- Defines security classifications for prompt types. Currently empty - add classifications as needed:
262
+ Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
285
263
 
286
264
  ```json
287
265
  {
288
- "_metadata": {
289
- "description": "Prompt security classifications for Open Edison data access tracker",
290
- "last_updated": "2025-08-07"
291
- },
292
- "system": {
293
- "write_operation": false,
294
- "read_private_data": false,
295
- "read_untrusted_public_data": false
296
- },
297
- "external_prompt": {
298
- "write_operation": false,
299
- "read_private_data": false,
300
- "read_untrusted_public_data": true
301
- },
302
- "prompt:file:*": {
303
- "write_operation": false,
304
- "read_private_data": true,
305
- "read_untrusted_public_data": false
306
- }
266
+ "_metadata": { "last_updated": "2025-08-07" },
267
+ "builtin": { "summarize_text": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
307
268
  }
308
269
  ```
309
270
 
@@ -1,9 +1,35 @@
1
- # Open Edison
1
+ # OpenEdison
2
2
 
3
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
4
 
5
+ Just want to run it?
6
+
7
+ ```bash
8
+ # Installs uv (via Astral installer) and launches open-edison with uvx.
9
+ # Note: This does NOT install Node/npx. Install Node if you plan to use npx-based tools like mcp-remote.
10
+ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
11
+ ```
12
+
5
13
  Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
6
14
 
15
+ If you need `npx` (for Node-based MCP tools like `mcp-remote`), install Node.js as well:
16
+
17
+ - macOS:
18
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
19
+ - Node/npx: `brew install node`
20
+ - Linux (Debian/Ubuntu):
21
+ - uv: `curl -fsSL https://astral.sh/uv/install.sh | sh`
22
+ - Node/npx: `sudo apt-get update && sudo apt-get install -y nodejs npm`
23
+ - Windows (PowerShell):
24
+ - uv: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
25
+ - Node/npx: `winget install -e --id OpenJS.NodeJS`
26
+
27
+ After installation, ensure that `npx` is available on PATH.
28
+
29
+ <div align="center">
30
+ <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>
31
+ </div>
32
+
7
33
  ## Features
8
34
 
9
35
  - **Single-user MCP proxy** - No multi-user complexity, just a simple proxy for your MCP servers
@@ -38,6 +64,25 @@ open-edison run --config-dir ~/edison-config
38
64
  OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
39
65
  ```
40
66
 
67
+ ### Run with Docker
68
+
69
+ There is a dockerfile for simple local setup.
70
+
71
+ ```bash
72
+ # Single-line:
73
+ git clone https://github.com/GatlingX/open-edison.git && cd open-edison && make docker_run
74
+
75
+ # Or
76
+ # Clone repo
77
+ git clone https://github.com/GatlingX/open-edison.git
78
+ # Enter repo
79
+ cd open-edison
80
+ # Build and run
81
+ make docker_run
82
+ ```
83
+
84
+ The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
85
+
41
86
  ### Run from source
42
87
 
43
88
  1. Clone the repository:
@@ -47,33 +92,26 @@ git clone https://github.com/GatlingX/open-edison.git
47
92
  cd open-edison
48
93
  ```
49
94
 
50
- 2. Set up the project:
95
+ 1. Set up the project:
51
96
 
52
97
  ```bash
53
98
  make setup
54
99
  ```
55
100
 
56
- 3. Edit `config.json` to configure your MCP servers:
101
+ 1. Edit `config.json` to configure your MCP servers. See the full file: [config.json](config.json), it looks like:
57
102
 
58
103
  ```json
59
104
  {
60
- "server": {
61
- "host": "localhost",
62
- "port": 3000,
63
- "api_key": "your-secure-api-key"
64
- },
105
+ "server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
106
+ "logging": { "level": "INFO", "database_path": "sessions.db" },
65
107
  "mcp_servers": [
66
- {
67
- "name": "filesystem",
68
- "command": "uvx",
69
- "args": ["mcp-server-filesystem", "/path/to/directory"],
70
- "enabled": true
71
- }
108
+ { "name": "filesystem", "command": "uvx", "args": ["mcp-server-filesystem", "/tmp"], "enabled": true },
109
+ { "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
72
110
  ]
73
111
  }
74
112
  ```
75
113
 
76
- 4. Run the server:
114
+ 1. Run the server:
77
115
 
78
116
  ```bash
79
117
  make run
@@ -83,18 +121,9 @@ open-edison run
83
121
 
84
122
  The server will be available at `http://localhost:3000`.
85
123
 
86
- ### Run with Docker
87
-
88
- ```bash
89
- # After cloning the repo
90
- make docker_run
91
- ```
92
-
93
- The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
94
-
95
124
  ## MCP Connection
96
125
 
97
- Connect any MCP client to Open Edison:
126
+ Connect any MCP client to Open Edison (requires Node.js/npm for `npx`):
98
127
 
99
128
  ```bash
100
129
  npx -y mcp-remote http://localhost:3000/mcp/ --http-only --header "Authorization: Bearer your-api-key"
@@ -117,64 +146,28 @@ Or add to your MCP client config:
117
146
 
118
147
  ### API Endpoints
119
148
 
120
- Api is on port 3001 (or configured MCP server port + 1).
121
-
122
- - `GET /health` - Health check
123
- - `GET /mcp/status` - Get status of configured MCP servers
124
- - `POST /mcp/{server_name}/start` - Start a specific MCP server
125
- - `POST /mcp/{server_name}/stop` - Stop a specific MCP server
126
- - `POST /mcp/call` - Proxy MCP calls to running servers
127
- - `GET /sessions` - Get session logs (coming soon)
128
-
129
- All endpoints except `/health` require the `Authorization: Bearer <api_key>` header.
149
+ See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
130
150
 
131
151
  ## Development
132
152
 
133
- ```bash
134
- # Install dependencies
135
- make sync
153
+ ### Setup
136
154
 
137
- # Run with auto-reload
138
- make dev
155
+ Setup from source as above.
139
156
 
140
- # Run tests
141
- make test
157
+ ### Run
142
158
 
143
- # Lint code
144
- make lint
145
-
146
- # Format code
147
- make format
148
- ```
149
-
150
- ### Website (Sessions Dashboard)
151
-
152
- A minimal React + Vite frontend is included at `open-edison/frontend/`.
153
-
154
- Run it with a single command from the repo root or via the CLI:
159
+ Server doesn't have any auto-reload at the moment, so you'll need to run & ctrl-c this during development.
155
160
 
156
161
  ```bash
157
- make website
158
- # or
159
- open-edison website
162
+ make run
160
163
  ```
161
164
 
162
- This will install frontend deps (first run) and start the dev server. Open the URL shown (typically `http://localhost:5173` or `5174`).
165
+ ### Tests/code quality
163
166
 
164
- Notes:
165
-
166
- - The dashboard reads session data directly from the SQLite database `edison.db` in the repo root via sql.js.
167
- - The Configs tab provides JSON editors (with syntax highlighting) for `config.json`, `tool_permissions.json`, `resource_permissions.json`, and `prompt_permissions.json`.
168
- - You can Save changes directly while the dev server is running; writes are constrained to the project root.
169
-
170
- ## Docker
167
+ We expect `make ci` to return cleanly.
171
168
 
172
169
  ```bash
173
- # Build Docker image
174
- make docker_build
175
-
176
- # Run in Docker
177
- make docker_run
170
+ make ci
178
171
  ```
179
172
 
180
173
  ## Configuration
@@ -203,80 +196,48 @@ Open Edison includes a comprehensive security monitoring system that tracks the
203
196
  2. **Untrusted content exposure** - Exposure to external/web content
204
197
  3. **External communication** - Ability to write/send data externally
205
198
 
206
- The system monitors these risks across **tools**, **resources**, and **prompts** using separate configuration files.
199
+ The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
200
+
201
+ In addition to trifecta, we track Access Control Level (ACL) for each tool call,
202
+ that is, each tool has an ACL level (one of PUBLIC, PRIVATE, or SECRET), and we track the highest ACL level for each session.
203
+ If a write operation is attempted to a lower ACL level, it is blocked.
207
204
 
208
205
  ### Tool Permissions (`tool_permissions.json`)
209
206
 
210
- Defines security classifications for MCP tools. Each tool is classified with three boolean flags:
207
+ Defines security classifications for MCP tools. See full file: [tool_permissions.json](tool_permissions.json), it looks like:
211
208
 
212
209
  ```json
213
210
  {
214
- "filesystem_read_file": {
215
- "write_operation": false,
216
- "read_private_data": true,
217
- "read_untrusted_public_data": false
211
+ "_metadata": { "last_updated": "2025-08-07" },
212
+ "builtin": {
213
+ "get_security_status": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false, "acl": "PUBLIC" }
218
214
  },
219
- "sqlite_create_record": {
220
- "write_operation": true,
221
- "read_private_data": true,
222
- "read_untrusted_public_data": false
215
+ "filesystem": {
216
+ "read_file": { "enabled": true, "write_operation": false, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" },
217
+ "write_file": { "enabled": true, "write_operation": true, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" }
223
218
  }
224
219
  }
225
220
  ```
226
221
 
227
222
  ### Resource Permissions (`resource_permissions.json`)
228
223
 
229
- Defines security classifications for resource access patterns. Currently empty - add classifications as needed:
224
+ Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
230
225
 
231
226
  ```json
232
227
  {
233
- "_metadata": {
234
- "description": "Resource security classifications for Open Edison data access tracker",
235
- "last_updated": "2025-08-07"
236
- },
237
- "file:*": {
238
- "write_operation": false,
239
- "read_private_data": true,
240
- "read_untrusted_public_data": false
241
- },
242
- "http:*": {
243
- "write_operation": false,
244
- "read_private_data": false,
245
- "read_untrusted_public_data": true
246
- },
247
- "database:*": {
248
- "write_operation": false,
249
- "read_private_data": true,
250
- "read_untrusted_public_data": false
251
- }
228
+ "_metadata": { "last_updated": "2025-08-07" },
229
+ "builtin": { "config://app": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
252
230
  }
253
231
  ```
254
232
 
255
233
  ### Prompt Permissions (`prompt_permissions.json`)
256
234
 
257
- Defines security classifications for prompt types. Currently empty - add classifications as needed:
235
+ Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
258
236
 
259
237
  ```json
260
238
  {
261
- "_metadata": {
262
- "description": "Prompt security classifications for Open Edison data access tracker",
263
- "last_updated": "2025-08-07"
264
- },
265
- "system": {
266
- "write_operation": false,
267
- "read_private_data": false,
268
- "read_untrusted_public_data": false
269
- },
270
- "external_prompt": {
271
- "write_operation": false,
272
- "read_private_data": false,
273
- "read_untrusted_public_data": true
274
- },
275
- "prompt:file:*": {
276
- "write_operation": false,
277
- "read_private_data": true,
278
- "read_untrusted_public_data": false
279
- }
239
+ "_metadata": { "last_updated": "2025-08-07" },
240
+ "builtin": { "summarize_text": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
280
241
  }
281
242
  ```
282
243
 
@@ -2,7 +2,7 @@
2
2
  "server": {
3
3
  "host": "0.0.0.0",
4
4
  "port": 3000,
5
- "api_key": "dev-api-key-change-me"
5
+ "api_key": "dev-api-key-change-me-2"
6
6
  },
7
7
  "logging": {
8
8
  "level": "INFO",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "open-edison"
3
- version = "0.1.15"
3
+ version = "0.1.17"
4
4
  description = "Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -39,6 +39,7 @@ dev-dependencies = [
39
39
  "ruff>=0.12.3",
40
40
  "pytest>=8.3.3",
41
41
  "pytest-asyncio>=1.0.0",
42
+ "vulture>=2.11",
42
43
  "twine>=5.1.1",
43
44
  ]
44
45
 
@@ -76,11 +77,9 @@ include = [
76
77
  "prompt_permissions.json",
77
78
  "src/**",
78
79
  "docs/**",
79
- ]
80
- exclude = [
80
+ # Ensure packaged dashboard assets are present when building from sdist
81
81
  "src/frontend_dist/**",
82
82
  ]
83
- force-include = { "src/frontend_dist" = "src/frontend_dist" }
84
83
 
85
84
  [tool.ruff]
86
85
  line-length = 100
@@ -112,3 +111,6 @@ reportMissingTypeStubs = true
112
111
  reportUnusedFunction = false # Disable unused function warnings since we have many dynamically registered functions
113
112
  venvPath = ".venv"
114
113
  extraPaths = ["src"]
114
+
115
+ [tool.vulture]
116
+ exclude = ["tests", "src/frontend_dist"]
@@ -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]
@@ -296,7 +296,7 @@ class SessionTrackingMiddleware(Middleware):
296
296
 
297
297
  assert session.data_access_tracker is not None
298
298
  log.debug(f"🔍 Analyzing tool {context.message.name} for security implications")
299
- _ = session.data_access_tracker.add_tool_call(context.message.name)
299
+ session.data_access_tracker.add_tool_call(context.message.name)
300
300
  # Telemetry: record tool call
301
301
  record_tool_call(context.message.name)
302
302