open-edison 0.1.15__tar.gz → 0.1.16__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.
- {open_edison-0.1.15 → open_edison-0.1.16}/PKG-INFO +65 -120
- {open_edison-0.1.15 → open_edison-0.1.16}/README.md +64 -119
- {open_edison-0.1.15 → open_edison-0.1.16}/pyproject.toml +1 -1
- {open_edison-0.1.15 → open_edison-0.1.16}/src/middleware/session_tracking.py +1 -1
- {open_edison-0.1.15 → open_edison-0.1.16}/.gitignore +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/LICENSE +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/config.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/desktop_ext/README.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/README.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/architecture/single_user_design.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/core/configuration.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/core/project_structure.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/core/proxy_usage.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/deployment/docker.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/deployment/local.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/development/contributing.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/development/development_guide.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/development/testing.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/quick-reference/api_reference.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/docs/quick-reference/config_quick_start.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/frontend/configurations/prompt_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/frontend/configurations/resource_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/frontend/configurations/tool_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/prompt_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/resource_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/__init__.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/__main__.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/cli.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/config.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/frontend_dist/assets/index-_NTxjOfh.js +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/frontend_dist/assets/index-h6k8aL6h.css +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/frontend_dist/index.html +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/mcp_manager.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/middleware/data_access_tracker.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/server.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/single_user_mcp.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/src/telemetry.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.16}/tool_permissions.json +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: open-edison
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.16
|
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,22 @@ 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
|
-
#
|
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
|
+
curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
|
36
|
+
```
|
37
|
+
|
32
38
|
Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
|
33
39
|
|
40
|
+
<div align="center">
|
41
|
+
<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>
|
42
|
+
</div>
|
43
|
+
|
34
44
|
## Features
|
35
45
|
|
36
46
|
- **Single-user MCP proxy** - No multi-user complexity, just a simple proxy for your MCP servers
|
@@ -65,6 +75,25 @@ open-edison run --config-dir ~/edison-config
|
|
65
75
|
OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
66
76
|
```
|
67
77
|
|
78
|
+
### Run with Docker
|
79
|
+
|
80
|
+
There is a dockerfile for simple local setup.
|
81
|
+
|
82
|
+
```bash
|
83
|
+
# Single-line:
|
84
|
+
git clone https://github.com/GatlingX/open-edison.git && cd open-edison && make docker_run
|
85
|
+
|
86
|
+
# Or
|
87
|
+
# Clone repo
|
88
|
+
git clone https://github.com/GatlingX/open-edison.git
|
89
|
+
# Enter repo
|
90
|
+
cd open-edison
|
91
|
+
# Build and run
|
92
|
+
make docker_run
|
93
|
+
```
|
94
|
+
|
95
|
+
The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
|
96
|
+
|
68
97
|
### Run from source
|
69
98
|
|
70
99
|
1. Clone the repository:
|
@@ -74,33 +103,26 @@ git clone https://github.com/GatlingX/open-edison.git
|
|
74
103
|
cd open-edison
|
75
104
|
```
|
76
105
|
|
77
|
-
|
106
|
+
1. Set up the project:
|
78
107
|
|
79
108
|
```bash
|
80
109
|
make setup
|
81
110
|
```
|
82
111
|
|
83
|
-
|
112
|
+
1. Edit `config.json` to configure your MCP servers. See the full file: [config.json](config.json), it looks like:
|
84
113
|
|
85
114
|
```json
|
86
115
|
{
|
87
|
-
"server": {
|
88
|
-
|
89
|
-
"port": 3000,
|
90
|
-
"api_key": "your-secure-api-key"
|
91
|
-
},
|
116
|
+
"server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
|
117
|
+
"logging": { "level": "INFO", "database_path": "sessions.db" },
|
92
118
|
"mcp_servers": [
|
93
|
-
{
|
94
|
-
|
95
|
-
"command": "uvx",
|
96
|
-
"args": ["mcp-server-filesystem", "/path/to/directory"],
|
97
|
-
"enabled": true
|
98
|
-
}
|
119
|
+
{ "name": "filesystem", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], "enabled": true },
|
120
|
+
{ "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
|
99
121
|
]
|
100
122
|
}
|
101
123
|
```
|
102
124
|
|
103
|
-
|
125
|
+
1. Run the server:
|
104
126
|
|
105
127
|
```bash
|
106
128
|
make run
|
@@ -110,15 +132,6 @@ open-edison run
|
|
110
132
|
|
111
133
|
The server will be available at `http://localhost:3000`.
|
112
134
|
|
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
135
|
## MCP Connection
|
123
136
|
|
124
137
|
Connect any MCP client to Open Edison:
|
@@ -144,64 +157,28 @@ Or add to your MCP client config:
|
|
144
157
|
|
145
158
|
### API Endpoints
|
146
159
|
|
147
|
-
|
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.
|
160
|
+
See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
|
157
161
|
|
158
162
|
## Development
|
159
163
|
|
160
|
-
|
161
|
-
# Install dependencies
|
162
|
-
make sync
|
163
|
-
|
164
|
-
# Run with auto-reload
|
165
|
-
make dev
|
164
|
+
### Setup
|
166
165
|
|
167
|
-
|
168
|
-
make test
|
166
|
+
Setup from source as above.
|
169
167
|
|
170
|
-
|
171
|
-
make lint
|
168
|
+
### Run
|
172
169
|
|
173
|
-
|
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:
|
170
|
+
Server doesn't have any auto-reload at the moment, so you'll need to run & ctrl-c this during development.
|
182
171
|
|
183
172
|
```bash
|
184
|
-
make
|
185
|
-
# or
|
186
|
-
open-edison website
|
173
|
+
make run
|
187
174
|
```
|
188
175
|
|
189
|
-
|
190
|
-
|
191
|
-
Notes:
|
176
|
+
### Tests/code quality
|
192
177
|
|
193
|
-
|
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
|
178
|
+
We expect `make ci` to return cleanly.
|
198
179
|
|
199
180
|
```bash
|
200
|
-
|
201
|
-
make docker_build
|
202
|
-
|
203
|
-
# Run in Docker
|
204
|
-
make docker_run
|
181
|
+
make ci
|
205
182
|
```
|
206
183
|
|
207
184
|
## Configuration
|
@@ -230,80 +207,48 @@ Open Edison includes a comprehensive security monitoring system that tracks the
|
|
230
207
|
2. **Untrusted content exposure** - Exposure to external/web content
|
231
208
|
3. **External communication** - Ability to write/send data externally
|
232
209
|
|
233
|
-
The
|
210
|
+
The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
|
211
|
+
|
212
|
+
In addition to trifecta, we track Access Control Level (ACL) for each tool call,
|
213
|
+
that is, each tool has an ACL level (one of PUBLIC, PRIVATE, or SECRET), and we track the highest ACL level for each session.
|
214
|
+
If a write operation is attempted to a lower ACL level, it is blocked.
|
234
215
|
|
235
216
|
### Tool Permissions (`tool_permissions.json`)
|
236
217
|
|
237
|
-
Defines security classifications for MCP tools.
|
218
|
+
Defines security classifications for MCP tools. See full file: [tool_permissions.json](tool_permissions.json), it looks like:
|
238
219
|
|
239
220
|
```json
|
240
221
|
{
|
241
|
-
"
|
242
|
-
|
243
|
-
"
|
244
|
-
"read_untrusted_public_data": false
|
222
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
223
|
+
"builtin": {
|
224
|
+
"get_security_status": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false, "acl": "PUBLIC" }
|
245
225
|
},
|
246
|
-
"
|
247
|
-
"write_operation": true,
|
248
|
-
"read_private_data": true,
|
249
|
-
"read_untrusted_public_data": false
|
226
|
+
"filesystem": {
|
227
|
+
"read_file": { "enabled": true, "write_operation": false, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" },
|
228
|
+
"write_file": { "enabled": true, "write_operation": true, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" }
|
250
229
|
}
|
251
230
|
}
|
252
231
|
```
|
253
232
|
|
254
233
|
### Resource Permissions (`resource_permissions.json`)
|
255
234
|
|
256
|
-
Defines security classifications for resource access patterns.
|
235
|
+
Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
|
257
236
|
|
258
237
|
```json
|
259
238
|
{
|
260
|
-
"_metadata": {
|
261
|
-
|
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
|
-
}
|
239
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
240
|
+
"builtin": { "config://app": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
|
279
241
|
}
|
280
242
|
```
|
281
243
|
|
282
244
|
### Prompt Permissions (`prompt_permissions.json`)
|
283
245
|
|
284
|
-
Defines security classifications for prompt types.
|
246
|
+
Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
|
285
247
|
|
286
248
|
```json
|
287
249
|
{
|
288
|
-
"_metadata": {
|
289
|
-
|
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
|
-
}
|
250
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
251
|
+
"builtin": { "summarize_text": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
|
307
252
|
}
|
308
253
|
```
|
309
254
|
|
@@ -1,9 +1,19 @@
|
|
1
|
-
#
|
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
|
+
curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_pipe_bash.sh | bash
|
9
|
+
```
|
10
|
+
|
5
11
|
Run locally with uvx: `uvx open-edison --config-dir ~/edison-config`
|
6
12
|
|
13
|
+
<div align="center">
|
14
|
+
<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>
|
15
|
+
</div>
|
16
|
+
|
7
17
|
## Features
|
8
18
|
|
9
19
|
- **Single-user MCP proxy** - No multi-user complexity, just a simple proxy for your MCP servers
|
@@ -38,6 +48,25 @@ open-edison run --config-dir ~/edison-config
|
|
38
48
|
OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
39
49
|
```
|
40
50
|
|
51
|
+
### Run with Docker
|
52
|
+
|
53
|
+
There is a dockerfile for simple local setup.
|
54
|
+
|
55
|
+
```bash
|
56
|
+
# Single-line:
|
57
|
+
git clone https://github.com/GatlingX/open-edison.git && cd open-edison && make docker_run
|
58
|
+
|
59
|
+
# Or
|
60
|
+
# Clone repo
|
61
|
+
git clone https://github.com/GatlingX/open-edison.git
|
62
|
+
# Enter repo
|
63
|
+
cd open-edison
|
64
|
+
# Build and run
|
65
|
+
make docker_run
|
66
|
+
```
|
67
|
+
|
68
|
+
The MCP server will be available at `http://localhost:3000` and the api + frontend at `http://localhost:3001`.
|
69
|
+
|
41
70
|
### Run from source
|
42
71
|
|
43
72
|
1. Clone the repository:
|
@@ -47,33 +76,26 @@ git clone https://github.com/GatlingX/open-edison.git
|
|
47
76
|
cd open-edison
|
48
77
|
```
|
49
78
|
|
50
|
-
|
79
|
+
1. Set up the project:
|
51
80
|
|
52
81
|
```bash
|
53
82
|
make setup
|
54
83
|
```
|
55
84
|
|
56
|
-
|
85
|
+
1. Edit `config.json` to configure your MCP servers. See the full file: [config.json](config.json), it looks like:
|
57
86
|
|
58
87
|
```json
|
59
88
|
{
|
60
|
-
"server": {
|
61
|
-
|
62
|
-
"port": 3000,
|
63
|
-
"api_key": "your-secure-api-key"
|
64
|
-
},
|
89
|
+
"server": { "host": "0.0.0.0", "port": 3000, "api_key": "..." },
|
90
|
+
"logging": { "level": "INFO", "database_path": "sessions.db" },
|
65
91
|
"mcp_servers": [
|
66
|
-
{
|
67
|
-
|
68
|
-
"command": "uvx",
|
69
|
-
"args": ["mcp-server-filesystem", "/path/to/directory"],
|
70
|
-
"enabled": true
|
71
|
-
}
|
92
|
+
{ "name": "filesystem", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], "enabled": true },
|
93
|
+
{ "name": "github", "enabled": false, "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "..." } }
|
72
94
|
]
|
73
95
|
}
|
74
96
|
```
|
75
97
|
|
76
|
-
|
98
|
+
1. Run the server:
|
77
99
|
|
78
100
|
```bash
|
79
101
|
make run
|
@@ -83,15 +105,6 @@ open-edison run
|
|
83
105
|
|
84
106
|
The server will be available at `http://localhost:3000`.
|
85
107
|
|
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
108
|
## MCP Connection
|
96
109
|
|
97
110
|
Connect any MCP client to Open Edison:
|
@@ -117,64 +130,28 @@ Or add to your MCP client config:
|
|
117
130
|
|
118
131
|
### API Endpoints
|
119
132
|
|
120
|
-
|
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.
|
133
|
+
See [API Reference](docs/quick-reference/api_reference.md) for full API documentation.
|
130
134
|
|
131
135
|
## Development
|
132
136
|
|
133
|
-
|
134
|
-
# Install dependencies
|
135
|
-
make sync
|
136
|
-
|
137
|
-
# Run with auto-reload
|
138
|
-
make dev
|
137
|
+
### Setup
|
139
138
|
|
140
|
-
|
141
|
-
make test
|
139
|
+
Setup from source as above.
|
142
140
|
|
143
|
-
|
144
|
-
make lint
|
141
|
+
### Run
|
145
142
|
|
146
|
-
|
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:
|
143
|
+
Server doesn't have any auto-reload at the moment, so you'll need to run & ctrl-c this during development.
|
155
144
|
|
156
145
|
```bash
|
157
|
-
make
|
158
|
-
# or
|
159
|
-
open-edison website
|
146
|
+
make run
|
160
147
|
```
|
161
148
|
|
162
|
-
|
163
|
-
|
164
|
-
Notes:
|
149
|
+
### Tests/code quality
|
165
150
|
|
166
|
-
|
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
|
151
|
+
We expect `make ci` to return cleanly.
|
171
152
|
|
172
153
|
```bash
|
173
|
-
|
174
|
-
make docker_build
|
175
|
-
|
176
|
-
# Run in Docker
|
177
|
-
make docker_run
|
154
|
+
make ci
|
178
155
|
```
|
179
156
|
|
180
157
|
## Configuration
|
@@ -203,80 +180,48 @@ Open Edison includes a comprehensive security monitoring system that tracks the
|
|
203
180
|
2. **Untrusted content exposure** - Exposure to external/web content
|
204
181
|
3. **External communication** - Ability to write/send data externally
|
205
182
|
|
206
|
-
The
|
183
|
+
The configuration allows you to classify these risks across **tools**, **resources**, and **prompts** using separate configuration files.
|
184
|
+
|
185
|
+
In addition to trifecta, we track Access Control Level (ACL) for each tool call,
|
186
|
+
that is, each tool has an ACL level (one of PUBLIC, PRIVATE, or SECRET), and we track the highest ACL level for each session.
|
187
|
+
If a write operation is attempted to a lower ACL level, it is blocked.
|
207
188
|
|
208
189
|
### Tool Permissions (`tool_permissions.json`)
|
209
190
|
|
210
|
-
Defines security classifications for MCP tools.
|
191
|
+
Defines security classifications for MCP tools. See full file: [tool_permissions.json](tool_permissions.json), it looks like:
|
211
192
|
|
212
193
|
```json
|
213
194
|
{
|
214
|
-
"
|
215
|
-
|
216
|
-
"
|
217
|
-
"read_untrusted_public_data": false
|
195
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
196
|
+
"builtin": {
|
197
|
+
"get_security_status": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false, "acl": "PUBLIC" }
|
218
198
|
},
|
219
|
-
"
|
220
|
-
"write_operation": true,
|
221
|
-
"read_private_data": true,
|
222
|
-
"read_untrusted_public_data": false
|
199
|
+
"filesystem": {
|
200
|
+
"read_file": { "enabled": true, "write_operation": false, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" },
|
201
|
+
"write_file": { "enabled": true, "write_operation": true, "read_private_data": true, "read_untrusted_public_data": false, "acl": "PRIVATE" }
|
223
202
|
}
|
224
203
|
}
|
225
204
|
```
|
226
205
|
|
227
206
|
### Resource Permissions (`resource_permissions.json`)
|
228
207
|
|
229
|
-
Defines security classifications for resource access patterns.
|
208
|
+
Defines security classifications for resource access patterns. See full file: [resource_permissions.json](resource_permissions.json), it looks like:
|
230
209
|
|
231
210
|
```json
|
232
211
|
{
|
233
|
-
"_metadata": {
|
234
|
-
|
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
|
-
}
|
212
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
213
|
+
"builtin": { "config://app": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
|
252
214
|
}
|
253
215
|
```
|
254
216
|
|
255
217
|
### Prompt Permissions (`prompt_permissions.json`)
|
256
218
|
|
257
|
-
Defines security classifications for prompt types.
|
219
|
+
Defines security classifications for prompt types. See full file: [prompt_permissions.json](prompt_permissions.json), it looks like:
|
258
220
|
|
259
221
|
```json
|
260
222
|
{
|
261
|
-
"_metadata": {
|
262
|
-
|
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
|
-
}
|
223
|
+
"_metadata": { "last_updated": "2025-08-07" },
|
224
|
+
"builtin": { "summarize_text": { "enabled": true, "write_operation": false, "read_private_data": false, "read_untrusted_public_data": false } }
|
280
225
|
}
|
281
226
|
```
|
282
227
|
|
@@ -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
|
-
|
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
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|