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.
- {open_edison-0.1.15 → open_edison-0.1.17}/PKG-INFO +82 -121
- {open_edison-0.1.15 → open_edison-0.1.17}/README.md +81 -120
- {open_edison-0.1.15 → open_edison-0.1.17}/config.json +1 -1
- {open_edison-0.1.15 → open_edison-0.1.17}/pyproject.toml +6 -4
- {open_edison-0.1.15 → open_edison-0.1.17}/src/middleware/session_tracking.py +2 -2
- {open_edison-0.1.15 → open_edison-0.1.17}/src/server.py +41 -145
- {open_edison-0.1.15 → open_edison-0.1.17}/src/single_user_mcp.py +5 -22
- {open_edison-0.1.15 → open_edison-0.1.17}/src/telemetry.py +17 -1
- open_edison-0.1.15/src/frontend_dist/assets/index-_NTxjOfh.js +0 -51
- open_edison-0.1.15/src/frontend_dist/assets/index-h6k8aL6h.css +0 -1
- open_edison-0.1.15/src/frontend_dist/index.html +0 -21
- open_edison-0.1.15/src/mcp_manager.py +0 -137
- {open_edison-0.1.15 → open_edison-0.1.17}/.gitignore +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/LICENSE +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/desktop_ext/README.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/README.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/architecture/single_user_design.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/configuration.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/project_structure.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/core/proxy_usage.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/deployment/docker.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/deployment/local.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/contributing.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/development_guide.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/development/testing.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/quick-reference/api_reference.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/docs/quick-reference/config_quick_start.md +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/prompt_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/resource_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/frontend/configurations/tool_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/prompt_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/resource_permissions.json +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/src/__init__.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/src/__main__.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/src/cli.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/src/config.py +0 -0
- {open_edison-0.1.15 → open_edison-0.1.17}/src/middleware/data_access_tracker.py +0 -0
- {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.
|
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
|
-
#
|
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
|
-
|
122
|
+
1. Set up the project:
|
78
123
|
|
79
124
|
```bash
|
80
125
|
make setup
|
81
126
|
```
|
82
127
|
|
83
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
161
|
-
# Install dependencies
|
162
|
-
make sync
|
180
|
+
### Setup
|
163
181
|
|
164
|
-
|
165
|
-
make dev
|
182
|
+
Setup from source as above.
|
166
183
|
|
167
|
-
|
168
|
-
make test
|
184
|
+
### Run
|
169
185
|
|
170
|
-
|
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
|
185
|
-
# or
|
186
|
-
open-edison website
|
189
|
+
make run
|
187
190
|
```
|
188
191
|
|
189
|
-
|
192
|
+
### Tests/code quality
|
190
193
|
|
191
|
-
|
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
|
-
|
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
|
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.
|
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
|
-
"
|
242
|
-
|
243
|
-
"
|
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
|
-
"
|
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.
|
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
|
-
|
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.
|
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
|
-
|
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
|
-
#
|
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
|
-
|
95
|
+
1. Set up the project:
|
51
96
|
|
52
97
|
```bash
|
53
98
|
make setup
|
54
99
|
```
|
55
100
|
|
56
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
134
|
-
# Install dependencies
|
135
|
-
make sync
|
153
|
+
### Setup
|
136
154
|
|
137
|
-
|
138
|
-
make dev
|
155
|
+
Setup from source as above.
|
139
156
|
|
140
|
-
|
141
|
-
make test
|
157
|
+
### Run
|
142
158
|
|
143
|
-
|
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
|
158
|
-
# or
|
159
|
-
open-edison website
|
162
|
+
make run
|
160
163
|
```
|
161
164
|
|
162
|
-
|
165
|
+
### Tests/code quality
|
163
166
|
|
164
|
-
|
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
|
-
|
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
|
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.
|
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
|
-
"
|
215
|
-
|
216
|
-
"
|
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
|
-
"
|
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.
|
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
|
-
|
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.
|
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
|
-
|
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
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "open-edison"
|
3
|
-
version = "0.1.
|
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
|
-
|
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
|
|