arbiter-suite 0.9.0.dev1__py3-none-any.whl
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,214 @@
|
|
|
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).
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
arbiter_suite-0.9.0.dev1.dist-info/licenses/LICENSE,sha256=ST_rvt7qx4STtCAHrAnsFw__U069PncLT_bsVxMvKuU,1067
|
|
2
|
+
arbiter_suite-0.9.0.dev1.dist-info/METADATA,sha256=hpPEXwGPL_WQb7EXZXZvGxLo25Ms5jMKezd_HK4__Hs,7628
|
|
3
|
+
arbiter_suite-0.9.0.dev1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
4
|
+
arbiter_suite-0.9.0.dev1.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
5
|
+
arbiter_suite-0.9.0.dev1.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
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.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|