arbiter-suite 0.9.0.dev1__tar.gz → 0.9.2.dev1__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.
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.4
2
+ Name: arbiter-suite
3
+ Version: 0.9.2.dev1
4
+ Summary: Policy-controlled access to configured services for agents
5
+ Author-email: Omry Yadan <omry@yadan.net>
6
+ Maintainer-email: Omry Yadan <omry@yadan.net>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/omry/arbiter
9
+ Project-URL: Repository, https://github.com/omry/arbiter
10
+ Keywords: agent,policy,mcp,access-control,smtp,imap,security
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Communications :: Email
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Requires-Python: <3.15,>=3.10
23
+ Description-Content-Type: text/markdown
24
+ Requires-Dist: arbiter-server==0.9.2.dev1
25
+ Requires-Dist: arbiter-client==0.9.2.dev1
26
+ Requires-Dist: arbiter-smtp==0.9.2.dev1
27
+ Requires-Dist: arbiter-imap==0.9.2.dev1
28
+
29
+ Arbiter suite meta package.
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.4
2
+ Name: arbiter-suite
3
+ Version: 0.9.2.dev1
4
+ Summary: Policy-controlled access to configured services for agents
5
+ Author-email: Omry Yadan <omry@yadan.net>
6
+ Maintainer-email: Omry Yadan <omry@yadan.net>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/omry/arbiter
9
+ Project-URL: Repository, https://github.com/omry/arbiter
10
+ Keywords: agent,policy,mcp,access-control,smtp,imap,security
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Communications :: Email
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Requires-Python: <3.15,>=3.10
23
+ Description-Content-Type: text/markdown
24
+ Requires-Dist: arbiter-server==0.9.2.dev1
25
+ Requires-Dist: arbiter-client==0.9.2.dev1
26
+ Requires-Dist: arbiter-smtp==0.9.2.dev1
27
+ Requires-Dist: arbiter-imap==0.9.2.dev1
28
+
29
+ Arbiter suite meta package.
@@ -1,5 +1,3 @@
1
- LICENSE
2
- README.md
3
1
  pyproject.toml
4
2
  arbiter_suite.egg-info/PKG-INFO
5
3
  arbiter_suite.egg-info/SOURCES.txt
@@ -0,0 +1,4 @@
1
+ arbiter-server==0.9.2.dev1
2
+ arbiter-client==0.9.2.dev1
3
+ arbiter-smtp==0.9.2.dev1
4
+ arbiter-imap==0.9.2.dev1
@@ -4,9 +4,9 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "arbiter-suite"
7
- version = "0.9.0.dev1"
7
+ version = "0.9.2.dev1"
8
8
  description = "Policy-controlled access to configured services for agents"
9
- readme = "README.md"
9
+ readme = { text = "Arbiter suite meta package.", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10,<3.15"
11
11
  license = { text = "MIT" }
12
12
  authors = [
@@ -30,21 +30,10 @@ classifiers = [
30
30
  "Topic :: Software Development :: Libraries :: Python Modules",
31
31
  ]
32
32
  dependencies = [
33
- "arbiter-core==0.9.0.dev1",
34
- "arbiter-smtp==0.9.0.dev1",
35
- "arbiter-imap==0.9.0.dev1",
36
- ]
37
-
38
- [project.optional-dependencies]
39
- dev = [
40
- "nox[pbs]>=2024.10,<2026.0",
41
- "aiosmtpd>=1.4.6,<2.0",
42
- "black>=25.0,<26.0",
43
- "mypy>=1.11,<2.0",
44
- "pytest>=7.4,<9.0",
45
- "tomli>=2.0,<3.0",
46
- "towncrier>=24.8,<25.0",
47
- "trustme>=1.2,<2.0",
33
+ "arbiter-server==0.9.2.dev1",
34
+ "arbiter-client==0.9.2.dev1",
35
+ "arbiter-smtp==0.9.2.dev1",
36
+ "arbiter-imap==0.9.2.dev1",
48
37
  ]
49
38
 
50
39
  [project.urls]
@@ -54,22 +43,8 @@ Repository = "https://github.com/omry/arbiter"
54
43
  [tool.setuptools]
55
44
  py-modules = []
56
45
 
57
- [tool.pytest.ini_options]
58
- addopts = "--import-mode=importlib"
59
- testpaths = ["core/tests", "smtp/tests", "imap/tests"]
60
- pythonpath = ["core/src", "smtp/src", "imap/src"]
61
-
62
- [tool.mypy]
63
- python_version = "3.10"
64
- strict = true
65
- warn_unreachable = true
66
- mypy_path = "core/src:smtp/src:imap/src"
67
-
68
- [tool.black]
69
- target-version = ["py310"]
70
-
71
46
  [tool.towncrier]
72
47
  name = "Arbiter"
73
48
  filename = "NEWS.md"
74
- directory = "newsfragments"
49
+ directory = "news"
75
50
  issue_format = "#{issue}"
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Omry Yadan
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,214 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: arbiter-suite
3
- Version: 0.9.0.dev1
4
- Summary: Policy-controlled access to configured services for agents
5
- Author-email: Omry Yadan <omry@yadan.net>
6
- Maintainer-email: Omry Yadan <omry@yadan.net>
7
- License: MIT
8
- Project-URL: Homepage, https://github.com/omry/arbiter
9
- Project-URL: Repository, https://github.com/omry/arbiter
10
- Keywords: agent,policy,mcp,access-control,smtp,imap,security
11
- Classifier: Development Status :: 3 - Alpha
12
- Classifier: Intended Audience :: Developers
13
- Classifier: License :: OSI Approved :: MIT License
14
- Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Topic :: Communications :: Email
21
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
- Requires-Python: <3.15,>=3.10
23
- Description-Content-Type: text/markdown
24
- License-File: LICENSE
25
- Requires-Dist: arbiter-core==0.9.0.dev1
26
- Requires-Dist: arbiter-smtp==0.9.0.dev1
27
- Requires-Dist: arbiter-imap==0.9.0.dev1
28
- Provides-Extra: dev
29
- Requires-Dist: nox[pbs]<2026.0,>=2024.10; extra == "dev"
30
- Requires-Dist: aiosmtpd<2.0,>=1.4.6; extra == "dev"
31
- Requires-Dist: black<26.0,>=25.0; extra == "dev"
32
- Requires-Dist: mypy<2.0,>=1.11; extra == "dev"
33
- Requires-Dist: pytest<9.0,>=7.4; extra == "dev"
34
- Requires-Dist: tomli<3.0,>=2.0; extra == "dev"
35
- Requires-Dist: towncrier<25.0,>=24.8; extra == "dev"
36
- Requires-Dist: trustme<2.0,>=1.2; extra == "dev"
37
- Dynamic: license-file
38
-
39
- # Arbiter
40
-
41
- Arbiter is a capability firewall between AI agents and services. Today it exposes policy-controlled access through MCP and a client CLI; additional interfaces may be added later. The current service surface covers sending mail over SMTP and reading IMAP folders through explicit account policies.
42
-
43
- ## Project Status
44
-
45
- Current implementation status:
46
-
47
- - MCP server over stdio, SSE, or streamable HTTP via FastMCP
48
- - capability discovery with SMTP and IMAP account and operation metadata
49
- - SMTP submission with configured sender identity, TLS/auth settings, text/HTML bodies, and Bcc kept out of message headers
50
- - IMAP list/get/search/move/mark-read/delete tools scoped to configured accounts and folders
51
- - `arbiter.account.<service>` and reusable `arbiter.policy.<service>` objects
52
- for per-service account policy
53
- - `arbiter` client CLI and `arbiter-server` server/operator CLI
54
- - Docker deployment files for a standard SMTP gateway and a hardened read-only IMAP variant
55
-
56
- Known open gaps:
57
-
58
- - durable audit storage is parked for post-v1, while startup/runtime logging is
59
- the v1 observability focus
60
- - normalized error-code responses are still a design contract, while the
61
- implementation currently surfaces Python/MCP errors
62
- - the agent-facing skill integration path is intentionally not implemented in
63
- this repository yet
64
-
65
- ## Development
66
-
67
- Create and use the repo-local virtualenv with:
68
-
69
- - `python3 -m venv .venv`
70
- - `.venv/bin/python -m pip install --upgrade pip`
71
- - `.venv/bin/python -m pip install -e ".[dev]" -e core -e smtp -e imap`
72
-
73
- Run the test suite from the repo root with:
74
-
75
- - `.venv/bin/python -m nox -s tests`
76
- - `.venv/bin/python -m nox -s lint`
77
-
78
- The `lint` session runs both `black --check` and the Arbiter `mypy` passes.
79
-
80
- For focused local runs without `nox`, use the same environment directly, for example:
81
-
82
- - `.venv/bin/python -m pytest core/tests/unit/test_config.py`
83
- - `.venv/bin/python -m pytest core/tests/unit/test_app.py`
84
-
85
- The Docusaurus website lives in [website/](website/):
86
-
87
- - `cd website && npm install`
88
- - `cd website && npm run start`
89
- - `cd website && npm run build`
90
-
91
- The design is documented in the `docs/` structure used by the MCP server template:
92
-
93
- - [docs/overview.md](docs/overview.md)
94
- - [docs/architecture.md](docs/architecture.md)
95
- - [docs/BACKLOG.md](docs/BACKLOG.md)
96
- - [docs/config.md](docs/config.md)
97
- - [docs/config_bootstrap.md](docs/config_bootstrap.md)
98
- - [docs/policies.md](docs/policies.md)
99
- - [docs/errors.md](docs/errors.md)
100
- - [docs/todo.md](docs/todo.md)
101
- - [docs/testing_backlog.md](docs/testing_backlog.md)
102
- - [docs/tools/account_summaries.md](docs/tools/account_summaries.md)
103
- - [docs/tools/smtp_send_email.md](docs/tools/smtp_send_email.md)
104
- - [docs/tools/imap.md](docs/tools/imap.md)
105
-
106
- ## Local Streamable HTTP Run
107
-
108
- For local Codex or VS Code integration, run Arbiter as a streamable HTTP MCP
109
- server and point the client at:
110
-
111
- ```text
112
- http://127.0.0.1:8025/mcp
113
- ```
114
-
115
- Arbiter does not ship a runnable service config. Bootstrap a Hydra
116
- config, edit it, then run the server. The default config directory is
117
- `~/.arbiter`; pass `--config-dir <dir>` before a subcommand to use a different
118
- location. `config.local/` is ignored scratchspace for repository-local
119
- development.
120
- Plugin-owned object templates are created by the plugin command surface:
121
-
122
- ```bash
123
- arbiter-server bootstrap arbiter
124
- arbiter-server bootstrap plugin smtp account primary
125
- ```
126
-
127
- `${oc.env:...}` reads the process environment that your shell, supervisor,
128
- container runtime, or secret manager provides. For local runs, the root config
129
- can name one optional dotenv-style file to load before composition.
130
-
131
- See [docs/config_bootstrap.md](docs/config_bootstrap.md) for the generated file
132
- layout and composition flow.
133
-
134
- For local development, a shell-owned env file can be useful:
135
-
136
- ```bash
137
- # ~/.arbiter/local.env
138
- SMTP_PRIMARY_ACCOUNT_USERNAME=agent@example.com
139
- SMTP_PRIMARY_ACCOUNT_PASSWORD=change-me
140
- ARBITER_IMAP_USERNAME=agent@example.com
141
- ARBITER_IMAP_PASSWORD=change-me
142
- ```
143
-
144
- Point the root config at the env file:
145
-
146
- ```yaml
147
- arbiter:
148
- env_file: local.env
149
- ```
150
-
151
- Existing process environment variables take precedence over values from the env
152
- file. Relative paths are resolved from the config directory.
153
-
154
- Build or refresh that file from the active config:
155
-
156
- ```bash
157
- arbiter-server env bootstrap
158
- arbiter-server env check
159
- ```
160
-
161
- `env bootstrap` keeps existing assignments, adds missing config references, and
162
- groups entries under sorted `# arbiter-*` blocks plus `# miscellaneous`.
163
- If `arbiter.env_file` is not set yet, it adds `arbiter.env_file: .env` to the
164
- root config first.
165
-
166
- Then run from this directory:
167
-
168
- ```bash
169
- arbiter-server config check
170
- arbiter-server serve
171
- ```
172
-
173
- `config check` and `serve` require at least one configured service account.
174
-
175
- Use `arbiter-server plugins list` to inspect installed service plugins before
176
- validating a config. Once the server is running, use the client CLI against the
177
- MCP endpoint:
178
-
179
- ```bash
180
- arbiter mcp tools arbiter.mcp_url=http://127.0.0.1:8025/mcp
181
- arbiter cap arbiter.mcp_url=http://127.0.0.1:8025/mcp
182
- arbiter accounts list arbiter.mcp_url=http://127.0.0.1:8025/mcp
183
- ```
184
-
185
- The client can also read the endpoint from a small config file:
186
- `~/.arbiter/arbiter-client.yaml`.
187
-
188
- ```yaml
189
- arbiter:
190
- mcp_url: http://127.0.0.1:8025/mcp
191
- ```
192
-
193
- Override config values with Hydra-style `key=value` arguments after the
194
- command, or bootstrap the client config:
195
-
196
- ```bash
197
- arbiter bootstrap client arbiter.mcp_url=http://127.0.0.1:8025/mcp
198
- ```
199
-
200
- IMAP operations use folder-scoped UIDs returned by `imap:list_messages` and
201
- `imap:search_messages`; pass those ids back to `imap:get_message`,
202
- `imap:move_message`, `imap:mark_message_read`, or `imap:delete_message` with
203
- the same account and folder.
204
-
205
- ## Read-Only Real Inbox Docker Run
206
-
207
- For a hardened Docker setup that reads a single real IMAP folder with Docker
208
- secrets and no SMTP access, see:
209
-
210
- - [deploy/readonly-imap/README.md](deploy/readonly-imap/README.md)
211
-
212
- ## License
213
-
214
- Arbiter is distributed under the MIT License. See [LICENSE](LICENSE).
@@ -1,176 +0,0 @@
1
- # Arbiter
2
-
3
- Arbiter is a capability firewall between AI agents and services. Today it exposes policy-controlled access through MCP and a client CLI; additional interfaces may be added later. The current service surface covers sending mail over SMTP and reading IMAP folders through explicit account policies.
4
-
5
- ## Project Status
6
-
7
- Current implementation status:
8
-
9
- - MCP server over stdio, SSE, or streamable HTTP via FastMCP
10
- - capability discovery with SMTP and IMAP account and operation metadata
11
- - SMTP submission with configured sender identity, TLS/auth settings, text/HTML bodies, and Bcc kept out of message headers
12
- - IMAP list/get/search/move/mark-read/delete tools scoped to configured accounts and folders
13
- - `arbiter.account.<service>` and reusable `arbiter.policy.<service>` objects
14
- for per-service account policy
15
- - `arbiter` client CLI and `arbiter-server` server/operator CLI
16
- - Docker deployment files for a standard SMTP gateway and a hardened read-only IMAP variant
17
-
18
- Known open gaps:
19
-
20
- - durable audit storage is parked for post-v1, while startup/runtime logging is
21
- the v1 observability focus
22
- - normalized error-code responses are still a design contract, while the
23
- implementation currently surfaces Python/MCP errors
24
- - the agent-facing skill integration path is intentionally not implemented in
25
- this repository yet
26
-
27
- ## Development
28
-
29
- Create and use the repo-local virtualenv with:
30
-
31
- - `python3 -m venv .venv`
32
- - `.venv/bin/python -m pip install --upgrade pip`
33
- - `.venv/bin/python -m pip install -e ".[dev]" -e core -e smtp -e imap`
34
-
35
- Run the test suite from the repo root with:
36
-
37
- - `.venv/bin/python -m nox -s tests`
38
- - `.venv/bin/python -m nox -s lint`
39
-
40
- The `lint` session runs both `black --check` and the Arbiter `mypy` passes.
41
-
42
- For focused local runs without `nox`, use the same environment directly, for example:
43
-
44
- - `.venv/bin/python -m pytest core/tests/unit/test_config.py`
45
- - `.venv/bin/python -m pytest core/tests/unit/test_app.py`
46
-
47
- The Docusaurus website lives in [website/](website/):
48
-
49
- - `cd website && npm install`
50
- - `cd website && npm run start`
51
- - `cd website && npm run build`
52
-
53
- The design is documented in the `docs/` structure used by the MCP server template:
54
-
55
- - [docs/overview.md](docs/overview.md)
56
- - [docs/architecture.md](docs/architecture.md)
57
- - [docs/BACKLOG.md](docs/BACKLOG.md)
58
- - [docs/config.md](docs/config.md)
59
- - [docs/config_bootstrap.md](docs/config_bootstrap.md)
60
- - [docs/policies.md](docs/policies.md)
61
- - [docs/errors.md](docs/errors.md)
62
- - [docs/todo.md](docs/todo.md)
63
- - [docs/testing_backlog.md](docs/testing_backlog.md)
64
- - [docs/tools/account_summaries.md](docs/tools/account_summaries.md)
65
- - [docs/tools/smtp_send_email.md](docs/tools/smtp_send_email.md)
66
- - [docs/tools/imap.md](docs/tools/imap.md)
67
-
68
- ## Local Streamable HTTP Run
69
-
70
- For local Codex or VS Code integration, run Arbiter as a streamable HTTP MCP
71
- server and point the client at:
72
-
73
- ```text
74
- http://127.0.0.1:8025/mcp
75
- ```
76
-
77
- Arbiter does not ship a runnable service config. Bootstrap a Hydra
78
- config, edit it, then run the server. The default config directory is
79
- `~/.arbiter`; pass `--config-dir <dir>` before a subcommand to use a different
80
- location. `config.local/` is ignored scratchspace for repository-local
81
- development.
82
- Plugin-owned object templates are created by the plugin command surface:
83
-
84
- ```bash
85
- arbiter-server bootstrap arbiter
86
- arbiter-server bootstrap plugin smtp account primary
87
- ```
88
-
89
- `${oc.env:...}` reads the process environment that your shell, supervisor,
90
- container runtime, or secret manager provides. For local runs, the root config
91
- can name one optional dotenv-style file to load before composition.
92
-
93
- See [docs/config_bootstrap.md](docs/config_bootstrap.md) for the generated file
94
- layout and composition flow.
95
-
96
- For local development, a shell-owned env file can be useful:
97
-
98
- ```bash
99
- # ~/.arbiter/local.env
100
- SMTP_PRIMARY_ACCOUNT_USERNAME=agent@example.com
101
- SMTP_PRIMARY_ACCOUNT_PASSWORD=change-me
102
- ARBITER_IMAP_USERNAME=agent@example.com
103
- ARBITER_IMAP_PASSWORD=change-me
104
- ```
105
-
106
- Point the root config at the env file:
107
-
108
- ```yaml
109
- arbiter:
110
- env_file: local.env
111
- ```
112
-
113
- Existing process environment variables take precedence over values from the env
114
- file. Relative paths are resolved from the config directory.
115
-
116
- Build or refresh that file from the active config:
117
-
118
- ```bash
119
- arbiter-server env bootstrap
120
- arbiter-server env check
121
- ```
122
-
123
- `env bootstrap` keeps existing assignments, adds missing config references, and
124
- groups entries under sorted `# arbiter-*` blocks plus `# miscellaneous`.
125
- If `arbiter.env_file` is not set yet, it adds `arbiter.env_file: .env` to the
126
- root config first.
127
-
128
- Then run from this directory:
129
-
130
- ```bash
131
- arbiter-server config check
132
- arbiter-server serve
133
- ```
134
-
135
- `config check` and `serve` require at least one configured service account.
136
-
137
- Use `arbiter-server plugins list` to inspect installed service plugins before
138
- validating a config. Once the server is running, use the client CLI against the
139
- MCP endpoint:
140
-
141
- ```bash
142
- arbiter mcp tools arbiter.mcp_url=http://127.0.0.1:8025/mcp
143
- arbiter cap arbiter.mcp_url=http://127.0.0.1:8025/mcp
144
- arbiter accounts list arbiter.mcp_url=http://127.0.0.1:8025/mcp
145
- ```
146
-
147
- The client can also read the endpoint from a small config file:
148
- `~/.arbiter/arbiter-client.yaml`.
149
-
150
- ```yaml
151
- arbiter:
152
- mcp_url: http://127.0.0.1:8025/mcp
153
- ```
154
-
155
- Override config values with Hydra-style `key=value` arguments after the
156
- command, or bootstrap the client config:
157
-
158
- ```bash
159
- arbiter bootstrap client arbiter.mcp_url=http://127.0.0.1:8025/mcp
160
- ```
161
-
162
- IMAP operations use folder-scoped UIDs returned by `imap:list_messages` and
163
- `imap:search_messages`; pass those ids back to `imap:get_message`,
164
- `imap:move_message`, `imap:mark_message_read`, or `imap:delete_message` with
165
- the same account and folder.
166
-
167
- ## Read-Only Real Inbox Docker Run
168
-
169
- For a hardened Docker setup that reads a single real IMAP folder with Docker
170
- secrets and no SMTP access, see:
171
-
172
- - [deploy/readonly-imap/README.md](deploy/readonly-imap/README.md)
173
-
174
- ## License
175
-
176
- Arbiter is distributed under the MIT License. See [LICENSE](LICENSE).
@@ -1,214 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: arbiter-suite
3
- Version: 0.9.0.dev1
4
- Summary: Policy-controlled access to configured services for agents
5
- Author-email: Omry Yadan <omry@yadan.net>
6
- Maintainer-email: Omry Yadan <omry@yadan.net>
7
- License: MIT
8
- Project-URL: Homepage, https://github.com/omry/arbiter
9
- Project-URL: Repository, https://github.com/omry/arbiter
10
- Keywords: agent,policy,mcp,access-control,smtp,imap,security
11
- Classifier: Development Status :: 3 - Alpha
12
- Classifier: Intended Audience :: Developers
13
- Classifier: License :: OSI Approved :: MIT License
14
- Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Topic :: Communications :: Email
21
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
- Requires-Python: <3.15,>=3.10
23
- Description-Content-Type: text/markdown
24
- License-File: LICENSE
25
- Requires-Dist: arbiter-core==0.9.0.dev1
26
- Requires-Dist: arbiter-smtp==0.9.0.dev1
27
- Requires-Dist: arbiter-imap==0.9.0.dev1
28
- Provides-Extra: dev
29
- Requires-Dist: nox[pbs]<2026.0,>=2024.10; extra == "dev"
30
- Requires-Dist: aiosmtpd<2.0,>=1.4.6; extra == "dev"
31
- Requires-Dist: black<26.0,>=25.0; extra == "dev"
32
- Requires-Dist: mypy<2.0,>=1.11; extra == "dev"
33
- Requires-Dist: pytest<9.0,>=7.4; extra == "dev"
34
- Requires-Dist: tomli<3.0,>=2.0; extra == "dev"
35
- Requires-Dist: towncrier<25.0,>=24.8; extra == "dev"
36
- Requires-Dist: trustme<2.0,>=1.2; extra == "dev"
37
- Dynamic: license-file
38
-
39
- # Arbiter
40
-
41
- Arbiter is a capability firewall between AI agents and services. Today it exposes policy-controlled access through MCP and a client CLI; additional interfaces may be added later. The current service surface covers sending mail over SMTP and reading IMAP folders through explicit account policies.
42
-
43
- ## Project Status
44
-
45
- Current implementation status:
46
-
47
- - MCP server over stdio, SSE, or streamable HTTP via FastMCP
48
- - capability discovery with SMTP and IMAP account and operation metadata
49
- - SMTP submission with configured sender identity, TLS/auth settings, text/HTML bodies, and Bcc kept out of message headers
50
- - IMAP list/get/search/move/mark-read/delete tools scoped to configured accounts and folders
51
- - `arbiter.account.<service>` and reusable `arbiter.policy.<service>` objects
52
- for per-service account policy
53
- - `arbiter` client CLI and `arbiter-server` server/operator CLI
54
- - Docker deployment files for a standard SMTP gateway and a hardened read-only IMAP variant
55
-
56
- Known open gaps:
57
-
58
- - durable audit storage is parked for post-v1, while startup/runtime logging is
59
- the v1 observability focus
60
- - normalized error-code responses are still a design contract, while the
61
- implementation currently surfaces Python/MCP errors
62
- - the agent-facing skill integration path is intentionally not implemented in
63
- this repository yet
64
-
65
- ## Development
66
-
67
- Create and use the repo-local virtualenv with:
68
-
69
- - `python3 -m venv .venv`
70
- - `.venv/bin/python -m pip install --upgrade pip`
71
- - `.venv/bin/python -m pip install -e ".[dev]" -e core -e smtp -e imap`
72
-
73
- Run the test suite from the repo root with:
74
-
75
- - `.venv/bin/python -m nox -s tests`
76
- - `.venv/bin/python -m nox -s lint`
77
-
78
- The `lint` session runs both `black --check` and the Arbiter `mypy` passes.
79
-
80
- For focused local runs without `nox`, use the same environment directly, for example:
81
-
82
- - `.venv/bin/python -m pytest core/tests/unit/test_config.py`
83
- - `.venv/bin/python -m pytest core/tests/unit/test_app.py`
84
-
85
- The Docusaurus website lives in [website/](website/):
86
-
87
- - `cd website && npm install`
88
- - `cd website && npm run start`
89
- - `cd website && npm run build`
90
-
91
- The design is documented in the `docs/` structure used by the MCP server template:
92
-
93
- - [docs/overview.md](docs/overview.md)
94
- - [docs/architecture.md](docs/architecture.md)
95
- - [docs/BACKLOG.md](docs/BACKLOG.md)
96
- - [docs/config.md](docs/config.md)
97
- - [docs/config_bootstrap.md](docs/config_bootstrap.md)
98
- - [docs/policies.md](docs/policies.md)
99
- - [docs/errors.md](docs/errors.md)
100
- - [docs/todo.md](docs/todo.md)
101
- - [docs/testing_backlog.md](docs/testing_backlog.md)
102
- - [docs/tools/account_summaries.md](docs/tools/account_summaries.md)
103
- - [docs/tools/smtp_send_email.md](docs/tools/smtp_send_email.md)
104
- - [docs/tools/imap.md](docs/tools/imap.md)
105
-
106
- ## Local Streamable HTTP Run
107
-
108
- For local Codex or VS Code integration, run Arbiter as a streamable HTTP MCP
109
- server and point the client at:
110
-
111
- ```text
112
- http://127.0.0.1:8025/mcp
113
- ```
114
-
115
- Arbiter does not ship a runnable service config. Bootstrap a Hydra
116
- config, edit it, then run the server. The default config directory is
117
- `~/.arbiter`; pass `--config-dir <dir>` before a subcommand to use a different
118
- location. `config.local/` is ignored scratchspace for repository-local
119
- development.
120
- Plugin-owned object templates are created by the plugin command surface:
121
-
122
- ```bash
123
- arbiter-server bootstrap arbiter
124
- arbiter-server bootstrap plugin smtp account primary
125
- ```
126
-
127
- `${oc.env:...}` reads the process environment that your shell, supervisor,
128
- container runtime, or secret manager provides. For local runs, the root config
129
- can name one optional dotenv-style file to load before composition.
130
-
131
- See [docs/config_bootstrap.md](docs/config_bootstrap.md) for the generated file
132
- layout and composition flow.
133
-
134
- For local development, a shell-owned env file can be useful:
135
-
136
- ```bash
137
- # ~/.arbiter/local.env
138
- SMTP_PRIMARY_ACCOUNT_USERNAME=agent@example.com
139
- SMTP_PRIMARY_ACCOUNT_PASSWORD=change-me
140
- ARBITER_IMAP_USERNAME=agent@example.com
141
- ARBITER_IMAP_PASSWORD=change-me
142
- ```
143
-
144
- Point the root config at the env file:
145
-
146
- ```yaml
147
- arbiter:
148
- env_file: local.env
149
- ```
150
-
151
- Existing process environment variables take precedence over values from the env
152
- file. Relative paths are resolved from the config directory.
153
-
154
- Build or refresh that file from the active config:
155
-
156
- ```bash
157
- arbiter-server env bootstrap
158
- arbiter-server env check
159
- ```
160
-
161
- `env bootstrap` keeps existing assignments, adds missing config references, and
162
- groups entries under sorted `# arbiter-*` blocks plus `# miscellaneous`.
163
- If `arbiter.env_file` is not set yet, it adds `arbiter.env_file: .env` to the
164
- root config first.
165
-
166
- Then run from this directory:
167
-
168
- ```bash
169
- arbiter-server config check
170
- arbiter-server serve
171
- ```
172
-
173
- `config check` and `serve` require at least one configured service account.
174
-
175
- Use `arbiter-server plugins list` to inspect installed service plugins before
176
- validating a config. Once the server is running, use the client CLI against the
177
- MCP endpoint:
178
-
179
- ```bash
180
- arbiter mcp tools arbiter.mcp_url=http://127.0.0.1:8025/mcp
181
- arbiter cap arbiter.mcp_url=http://127.0.0.1:8025/mcp
182
- arbiter accounts list arbiter.mcp_url=http://127.0.0.1:8025/mcp
183
- ```
184
-
185
- The client can also read the endpoint from a small config file:
186
- `~/.arbiter/arbiter-client.yaml`.
187
-
188
- ```yaml
189
- arbiter:
190
- mcp_url: http://127.0.0.1:8025/mcp
191
- ```
192
-
193
- Override config values with Hydra-style `key=value` arguments after the
194
- command, or bootstrap the client config:
195
-
196
- ```bash
197
- arbiter bootstrap client arbiter.mcp_url=http://127.0.0.1:8025/mcp
198
- ```
199
-
200
- IMAP operations use folder-scoped UIDs returned by `imap:list_messages` and
201
- `imap:search_messages`; pass those ids back to `imap:get_message`,
202
- `imap:move_message`, `imap:mark_message_read`, or `imap:delete_message` with
203
- the same account and folder.
204
-
205
- ## Read-Only Real Inbox Docker Run
206
-
207
- For a hardened Docker setup that reads a single real IMAP folder with Docker
208
- secrets and no SMTP access, see:
209
-
210
- - [deploy/readonly-imap/README.md](deploy/readonly-imap/README.md)
211
-
212
- ## License
213
-
214
- Arbiter is distributed under the MIT License. See [LICENSE](LICENSE).
@@ -1,13 +0,0 @@
1
- arbiter-core==0.9.0.dev1
2
- arbiter-smtp==0.9.0.dev1
3
- arbiter-imap==0.9.0.dev1
4
-
5
- [dev]
6
- nox[pbs]<2026.0,>=2024.10
7
- aiosmtpd<2.0,>=1.4.6
8
- black<26.0,>=25.0
9
- mypy<2.0,>=1.11
10
- pytest<9.0,>=7.4
11
- tomli<3.0,>=2.0
12
- towncrier<25.0,>=24.8
13
- trustme<2.0,>=1.2