mcp-beaker 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. mcp_beaker-0.1.0/.gitignore +31 -0
  2. mcp_beaker-0.1.0/PKG-INFO +218 -0
  3. mcp_beaker-0.1.0/README.md +191 -0
  4. mcp_beaker-0.1.0/pyproject.toml +103 -0
  5. mcp_beaker-0.1.0/src/mcp_beaker/__init__.py +235 -0
  6. mcp_beaker-0.1.0/src/mcp_beaker/client.py +393 -0
  7. mcp_beaker-0.1.0/src/mcp_beaker/config.py +88 -0
  8. mcp_beaker-0.1.0/src/mcp_beaker/exceptions.py +36 -0
  9. mcp_beaker-0.1.0/src/mcp_beaker/models/__init__.py +0 -0
  10. mcp_beaker-0.1.0/src/mcp_beaker/models/distro.py +19 -0
  11. mcp_beaker-0.1.0/src/mcp_beaker/models/job.py +104 -0
  12. mcp_beaker-0.1.0/src/mcp_beaker/models/system.py +59 -0
  13. mcp_beaker-0.1.0/src/mcp_beaker/servers/__init__.py +63 -0
  14. mcp_beaker-0.1.0/src/mcp_beaker/servers/distros.py +115 -0
  15. mcp_beaker-0.1.0/src/mcp_beaker/servers/general.py +59 -0
  16. mcp_beaker-0.1.0/src/mcp_beaker/servers/jobs.py +588 -0
  17. mcp_beaker-0.1.0/src/mcp_beaker/servers/prompts.py +95 -0
  18. mcp_beaker-0.1.0/src/mcp_beaker/servers/resources.py +306 -0
  19. mcp_beaker-0.1.0/src/mcp_beaker/servers/systems.py +313 -0
  20. mcp_beaker-0.1.0/src/mcp_beaker/servers/tasks.py +68 -0
  21. mcp_beaker-0.1.0/src/mcp_beaker/utils/__init__.py +0 -0
  22. mcp_beaker-0.1.0/src/mcp_beaker/utils/bkr_cli.py +192 -0
  23. mcp_beaker-0.1.0/src/mcp_beaker/utils/diagnosis.py +337 -0
  24. mcp_beaker-0.1.0/src/mcp_beaker/utils/formatting.py +242 -0
  25. mcp_beaker-0.1.0/src/mcp_beaker/utils/parsing.py +56 -0
  26. mcp_beaker-0.1.0/src/mcp_beaker/utils/xml_validation.py +468 -0
  27. mcp_beaker-0.1.0/tests/__init__.py +0 -0
  28. mcp_beaker-0.1.0/tests/conftest.py +129 -0
  29. mcp_beaker-0.1.0/tests/test_tools_distros.py +70 -0
  30. mcp_beaker-0.1.0/tests/test_tools_general.py +46 -0
  31. mcp_beaker-0.1.0/tests/test_tools_jobs.py +387 -0
  32. mcp_beaker-0.1.0/tests/test_tools_systems.py +252 -0
  33. mcp_beaker-0.1.0/tests/test_tools_tasks.py +47 -0
  34. mcp_beaker-0.1.0/uv.lock +1753 -0
@@ -0,0 +1,31 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ *.egg
9
+
10
+ # Virtual environments
11
+ .venv/
12
+ venv/
13
+
14
+ # IDE
15
+ .idea/
16
+ .vscode/
17
+ *.swp
18
+ *.swo
19
+
20
+ # Caches
21
+ .ruff_cache/
22
+ .mypy_cache/
23
+ .pytest_cache/
24
+
25
+ # Environment
26
+ .env
27
+ *.env.local
28
+
29
+ # OS
30
+ .DS_Store
31
+ Thumbs.db
@@ -0,0 +1,218 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-beaker
3
+ Version: 0.1.0
4
+ Summary: MCP server for Beaker lab automation — system provisioning, job management, distro discovery, and failure diagnosis
5
+ Project-URL: Homepage, https://github.com/faizbawa/mcp-beaker
6
+ Project-URL: Repository, https://github.com/faizbawa/mcp-beaker
7
+ Project-URL: Issues, https://github.com/faizbawa/mcp-beaker/issues
8
+ Author: faizbawa
9
+ License-Expression: Apache-2.0
10
+ Keywords: ai,beaker,lab-automation,llm,mcp,testing
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Software Development :: Testing
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: click>=8.1.7
21
+ Requires-Dist: fastmcp<4,>=3.0.0
22
+ Requires-Dist: httpx>=0.28.0
23
+ Requires-Dist: pydantic<3.0,>=2.10.0
24
+ Requires-Dist: python-dotenv>=1.0.1
25
+ Requires-Dist: uvicorn>=0.27.1
26
+ Description-Content-Type: text/markdown
27
+
28
+ # mcp-beaker
29
+
30
+ MCP server for [Beaker](https://beaker-project.org/) lab automation -- system provisioning, job management, distro discovery, and failure diagnosis.
31
+
32
+ Works with any Beaker server instance. Built on [FastMCP v3](https://gofastmcp.com/) and designed for use with AI coding assistants (Cursor, Claude Desktop, etc.).
33
+
34
+ ## Features
35
+
36
+ - **23 tools** covering the full Beaker lifecycle: systems, jobs, distros, tasks
37
+ - **Dual auth**: Kerberos (via `bkr` CLI) and password (via XML-RPC)
38
+ - **Job XML validation**: auto-fills missing fields, infers distro families
39
+ - **Failure diagnosis**: deep analysis with auto-retry on correctable failures
40
+ - **10 documentation topics** exposed as MCP resources
41
+ - **2 workflow prompts** for common tasks (reserve system, diagnose job)
42
+ - **Generic**: works with any Beaker URL, configurable SSL/CA settings
43
+
44
+ ## Installation
45
+
46
+ ```bash
47
+ # Using uv (recommended)
48
+ pip install uv
49
+ uvx mcp-beaker
50
+
51
+ # Using pip
52
+ pip install mcp-beaker
53
+ mcp-beaker
54
+
55
+ # Local development
56
+ uv run --directory /path/to/mcp-beaker mcp-beaker
57
+ ```
58
+
59
+ ## Configuration
60
+
61
+ ### Cursor / VS Code
62
+
63
+ Add to your `.cursor/mcp.json` (or `.vscode/mcp.json`):
64
+
65
+ ```json
66
+ {
67
+ "mcpServers": {
68
+ "beaker": {
69
+ "command": "uvx",
70
+ "args": ["mcp-beaker"],
71
+ "env": {
72
+ "BEAKER_URL": "https://beaker.example.com",
73
+ "BEAKER_AUTH_METHOD": "kerberos"
74
+ }
75
+ }
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### Streamable HTTP mode
81
+
82
+ ```bash
83
+ uvx mcp-beaker --transport streamable-http --port 8000
84
+ ```
85
+
86
+ ```json
87
+ {
88
+ "mcpServers": {
89
+ "beaker": {
90
+ "url": "http://localhost:8000/mcp",
91
+ "type": "streamableHttp"
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## Environment Variables
98
+
99
+ | Variable | Required | Default | Description |
100
+ |----------|----------|---------|-------------|
101
+ | `BEAKER_URL` | Yes | -- | Base URL of your Beaker server |
102
+ | `BEAKER_AUTH_METHOD` | No | `kerberos` | `kerberos` or `password` |
103
+ | `BEAKER_USERNAME` | For password auth | -- | Beaker username |
104
+ | `BEAKER_PASSWORD` | For password auth | -- | Beaker password |
105
+ | `BEAKER_OWNER` | No | `$USER` | Default owner for job queries |
106
+ | `BEAKER_SSL_VERIFY` | No | `true` | Verify SSL certificates |
107
+ | `BEAKER_CA_CERT` | No | -- | Path to CA certificate bundle |
108
+
109
+ ## CLI Options
110
+
111
+ ```
112
+ mcp-beaker [OPTIONS]
113
+
114
+ Options:
115
+ --transport [stdio|sse|streamable-http] Transport type (default: stdio)
116
+ --port INTEGER Port for HTTP transports (default: 8000)
117
+ --host TEXT Host for HTTP transports (default: 0.0.0.0)
118
+ --path TEXT Path for streamable-http (default: /mcp)
119
+ --beaker-url TEXT Beaker server URL
120
+ --ssl-verify / --no-ssl-verify Verify SSL certs (default: verify)
121
+ --ca-cert TEXT CA certificate bundle path
122
+ --auth-method [kerberos|password] Authentication method
123
+ --read-only Disable all write tools
124
+ --enabled-tools TEXT Comma-separated tools to enable
125
+ -v, --verbose Increase verbosity (-v info, -vv debug)
126
+ --version Show version
127
+ --help Show this message
128
+ ```
129
+
130
+ ## Tools
131
+
132
+ ### Read Tools (13)
133
+
134
+ | Tool | Description |
135
+ |------|-------------|
136
+ | `list_systems` | List systems by availability (all/available/free) |
137
+ | `get_system_details` | Hardware specs, ownership, status for a system |
138
+ | `get_system_history` | Activity history for a system |
139
+ | `get_system_arches` | Supported OS families and architectures |
140
+ | `list_jobs` | Filter jobs by owner, status, whiteboard |
141
+ | `get_job_status` | Job status with failure diagnosis |
142
+ | `get_job_results_xml` | Export job results as XML |
143
+ | `get_job_logs` | List log files for a job/recipe/task |
144
+ | `list_distro_trees` | Search distros by name, family, arch, tags |
145
+ | `list_os_families` | List all known OS families |
146
+ | `whoami` | Show authenticated user info |
147
+ | `list_lab_controllers` | List all lab controllers |
148
+ | `search_tasks` | Search the task library |
149
+
150
+ ### Write Tools (10)
151
+
152
+ | Tool | Description |
153
+ |------|-------------|
154
+ | `submit_job` | Submit a job from XML (with validation and auto-fill) |
155
+ | `clone_job` | Clone and resubmit an existing job |
156
+ | `cancel_job` | Cancel a running/queued job |
157
+ | `watch_job` | Poll until completion with failure analysis and auto-retry |
158
+ | `reserve_system` | Manually reserve a system |
159
+ | `release_system` | Release a manually reserved system |
160
+ | `power_system` | Power on/off/reboot a system |
161
+ | `provision_system` | Provision a reserved system with a distro |
162
+ | `extend_watchdog` | Extend a running task's watchdog timer |
163
+ | `set_job_response` | Ack/nak (waive) a recipe set result |
164
+
165
+ ## Authentication
166
+
167
+ ### Kerberos (recommended)
168
+
169
+ Ensure you have a valid ticket:
170
+
171
+ ```bash
172
+ kinit your-username@YOUR.REALM
173
+ ```
174
+
175
+ The server uses the `bkr` CLI for authenticated operations, which picks up the Kerberos ticket automatically.
176
+
177
+ ### Password
178
+
179
+ Set `BEAKER_AUTH_METHOD=password` along with `BEAKER_USERNAME` and `BEAKER_PASSWORD`. The server authenticates via the XML-RPC `auth.login_password()` method.
180
+
181
+ ## Architecture
182
+
183
+ ```
184
+ src/mcp_beaker/
185
+ __init__.py # Click CLI entry point
186
+ config.py # BeakerConfig dataclass
187
+ exceptions.py # Custom exceptions
188
+ client.py # BeakerClient (XML-RPC + REST)
189
+ models/ # Pydantic response models
190
+ servers/
191
+ __init__.py # FastMCP server, lifespan, DI helper
192
+ systems.py # System tools (4 read + 4 write)
193
+ jobs.py # Job tools (4 read + 6 write)
194
+ distros.py # Distro tools (2 read)
195
+ tasks.py # Task tools (1 read)
196
+ general.py # General tools (2 read)
197
+ prompts.py # Workflow prompt templates
198
+ resources.py # Beaker documentation resources
199
+ utils/
200
+ xml_validation.py # Job XML validation/auto-fill
201
+ diagnosis.py # Failure analysis engine
202
+ formatting.py # Human-readable formatters
203
+ bkr_cli.py # bkr CLI helpers
204
+ parsing.py # ID parsing utilities
205
+ ```
206
+
207
+ ## Development
208
+
209
+ ```bash
210
+ cd mcp-beaker
211
+ uv sync --dev
212
+ uv run pytest
213
+ uv run ruff check src/
214
+ ```
215
+
216
+ ## License
217
+
218
+ Apache-2.0
@@ -0,0 +1,191 @@
1
+ # mcp-beaker
2
+
3
+ MCP server for [Beaker](https://beaker-project.org/) lab automation -- system provisioning, job management, distro discovery, and failure diagnosis.
4
+
5
+ Works with any Beaker server instance. Built on [FastMCP v3](https://gofastmcp.com/) and designed for use with AI coding assistants (Cursor, Claude Desktop, etc.).
6
+
7
+ ## Features
8
+
9
+ - **23 tools** covering the full Beaker lifecycle: systems, jobs, distros, tasks
10
+ - **Dual auth**: Kerberos (via `bkr` CLI) and password (via XML-RPC)
11
+ - **Job XML validation**: auto-fills missing fields, infers distro families
12
+ - **Failure diagnosis**: deep analysis with auto-retry on correctable failures
13
+ - **10 documentation topics** exposed as MCP resources
14
+ - **2 workflow prompts** for common tasks (reserve system, diagnose job)
15
+ - **Generic**: works with any Beaker URL, configurable SSL/CA settings
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ # Using uv (recommended)
21
+ pip install uv
22
+ uvx mcp-beaker
23
+
24
+ # Using pip
25
+ pip install mcp-beaker
26
+ mcp-beaker
27
+
28
+ # Local development
29
+ uv run --directory /path/to/mcp-beaker mcp-beaker
30
+ ```
31
+
32
+ ## Configuration
33
+
34
+ ### Cursor / VS Code
35
+
36
+ Add to your `.cursor/mcp.json` (or `.vscode/mcp.json`):
37
+
38
+ ```json
39
+ {
40
+ "mcpServers": {
41
+ "beaker": {
42
+ "command": "uvx",
43
+ "args": ["mcp-beaker"],
44
+ "env": {
45
+ "BEAKER_URL": "https://beaker.example.com",
46
+ "BEAKER_AUTH_METHOD": "kerberos"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ### Streamable HTTP mode
54
+
55
+ ```bash
56
+ uvx mcp-beaker --transport streamable-http --port 8000
57
+ ```
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "beaker": {
63
+ "url": "http://localhost:8000/mcp",
64
+ "type": "streamableHttp"
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Environment Variables
71
+
72
+ | Variable | Required | Default | Description |
73
+ |----------|----------|---------|-------------|
74
+ | `BEAKER_URL` | Yes | -- | Base URL of your Beaker server |
75
+ | `BEAKER_AUTH_METHOD` | No | `kerberos` | `kerberos` or `password` |
76
+ | `BEAKER_USERNAME` | For password auth | -- | Beaker username |
77
+ | `BEAKER_PASSWORD` | For password auth | -- | Beaker password |
78
+ | `BEAKER_OWNER` | No | `$USER` | Default owner for job queries |
79
+ | `BEAKER_SSL_VERIFY` | No | `true` | Verify SSL certificates |
80
+ | `BEAKER_CA_CERT` | No | -- | Path to CA certificate bundle |
81
+
82
+ ## CLI Options
83
+
84
+ ```
85
+ mcp-beaker [OPTIONS]
86
+
87
+ Options:
88
+ --transport [stdio|sse|streamable-http] Transport type (default: stdio)
89
+ --port INTEGER Port for HTTP transports (default: 8000)
90
+ --host TEXT Host for HTTP transports (default: 0.0.0.0)
91
+ --path TEXT Path for streamable-http (default: /mcp)
92
+ --beaker-url TEXT Beaker server URL
93
+ --ssl-verify / --no-ssl-verify Verify SSL certs (default: verify)
94
+ --ca-cert TEXT CA certificate bundle path
95
+ --auth-method [kerberos|password] Authentication method
96
+ --read-only Disable all write tools
97
+ --enabled-tools TEXT Comma-separated tools to enable
98
+ -v, --verbose Increase verbosity (-v info, -vv debug)
99
+ --version Show version
100
+ --help Show this message
101
+ ```
102
+
103
+ ## Tools
104
+
105
+ ### Read Tools (13)
106
+
107
+ | Tool | Description |
108
+ |------|-------------|
109
+ | `list_systems` | List systems by availability (all/available/free) |
110
+ | `get_system_details` | Hardware specs, ownership, status for a system |
111
+ | `get_system_history` | Activity history for a system |
112
+ | `get_system_arches` | Supported OS families and architectures |
113
+ | `list_jobs` | Filter jobs by owner, status, whiteboard |
114
+ | `get_job_status` | Job status with failure diagnosis |
115
+ | `get_job_results_xml` | Export job results as XML |
116
+ | `get_job_logs` | List log files for a job/recipe/task |
117
+ | `list_distro_trees` | Search distros by name, family, arch, tags |
118
+ | `list_os_families` | List all known OS families |
119
+ | `whoami` | Show authenticated user info |
120
+ | `list_lab_controllers` | List all lab controllers |
121
+ | `search_tasks` | Search the task library |
122
+
123
+ ### Write Tools (10)
124
+
125
+ | Tool | Description |
126
+ |------|-------------|
127
+ | `submit_job` | Submit a job from XML (with validation and auto-fill) |
128
+ | `clone_job` | Clone and resubmit an existing job |
129
+ | `cancel_job` | Cancel a running/queued job |
130
+ | `watch_job` | Poll until completion with failure analysis and auto-retry |
131
+ | `reserve_system` | Manually reserve a system |
132
+ | `release_system` | Release a manually reserved system |
133
+ | `power_system` | Power on/off/reboot a system |
134
+ | `provision_system` | Provision a reserved system with a distro |
135
+ | `extend_watchdog` | Extend a running task's watchdog timer |
136
+ | `set_job_response` | Ack/nak (waive) a recipe set result |
137
+
138
+ ## Authentication
139
+
140
+ ### Kerberos (recommended)
141
+
142
+ Ensure you have a valid ticket:
143
+
144
+ ```bash
145
+ kinit your-username@YOUR.REALM
146
+ ```
147
+
148
+ The server uses the `bkr` CLI for authenticated operations, which picks up the Kerberos ticket automatically.
149
+
150
+ ### Password
151
+
152
+ Set `BEAKER_AUTH_METHOD=password` along with `BEAKER_USERNAME` and `BEAKER_PASSWORD`. The server authenticates via the XML-RPC `auth.login_password()` method.
153
+
154
+ ## Architecture
155
+
156
+ ```
157
+ src/mcp_beaker/
158
+ __init__.py # Click CLI entry point
159
+ config.py # BeakerConfig dataclass
160
+ exceptions.py # Custom exceptions
161
+ client.py # BeakerClient (XML-RPC + REST)
162
+ models/ # Pydantic response models
163
+ servers/
164
+ __init__.py # FastMCP server, lifespan, DI helper
165
+ systems.py # System tools (4 read + 4 write)
166
+ jobs.py # Job tools (4 read + 6 write)
167
+ distros.py # Distro tools (2 read)
168
+ tasks.py # Task tools (1 read)
169
+ general.py # General tools (2 read)
170
+ prompts.py # Workflow prompt templates
171
+ resources.py # Beaker documentation resources
172
+ utils/
173
+ xml_validation.py # Job XML validation/auto-fill
174
+ diagnosis.py # Failure analysis engine
175
+ formatting.py # Human-readable formatters
176
+ bkr_cli.py # bkr CLI helpers
177
+ parsing.py # ID parsing utilities
178
+ ```
179
+
180
+ ## Development
181
+
182
+ ```bash
183
+ cd mcp-beaker
184
+ uv sync --dev
185
+ uv run pytest
186
+ uv run ruff check src/
187
+ ```
188
+
189
+ ## License
190
+
191
+ Apache-2.0
@@ -0,0 +1,103 @@
1
+ [project]
2
+ name = "mcp-beaker"
3
+ version = "0.1.0"
4
+ description = "MCP server for Beaker lab automation — system provisioning, job management, distro discovery, and failure diagnosis"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ license = "Apache-2.0"
8
+ keywords = ["mcp", "beaker", "testing", "lab-automation", "ai", "llm"]
9
+ classifiers = [
10
+ "Development Status :: 4 - Beta",
11
+ "Intended Audience :: Developers",
12
+ "License :: OSI Approved :: Apache Software License",
13
+ "Programming Language :: Python :: 3",
14
+ "Programming Language :: Python :: 3.11",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Programming Language :: Python :: 3.13",
17
+ "Topic :: Software Development :: Testing",
18
+ ]
19
+ dependencies = [
20
+ "fastmcp>=3.0.0,<4",
21
+ "httpx>=0.28.0",
22
+ "pydantic>=2.10.0,<3.0",
23
+ "click>=8.1.7",
24
+ "uvicorn>=0.27.1",
25
+ "python-dotenv>=1.0.1",
26
+ ]
27
+
28
+ [[project.authors]]
29
+ name = "faizbawa"
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/faizbawa/mcp-beaker"
33
+ Repository = "https://github.com/faizbawa/mcp-beaker"
34
+ Issues = "https://github.com/faizbawa/mcp-beaker/issues"
35
+
36
+ [project.scripts]
37
+ mcp-beaker = "mcp_beaker:main"
38
+
39
+ [build-system]
40
+ requires = ["hatchling"]
41
+ build-backend = "hatchling.build"
42
+
43
+ [tool.hatch.build.targets.wheel]
44
+ packages = ["src/mcp_beaker"]
45
+
46
+ [tool.uv]
47
+ package = true
48
+
49
+ [dependency-groups]
50
+ dev = [
51
+ "pytest>=8.0.0",
52
+ "pytest-cov>=4.1.0",
53
+ "pytest-asyncio>=0.23.0",
54
+ "ruff>=0.3.0",
55
+ "mypy>=1.8.0",
56
+ ]
57
+
58
+ [tool.pytest.ini_options]
59
+ testpaths = ["tests"]
60
+ asyncio_mode = "auto"
61
+
62
+ [tool.ruff]
63
+ line-length = 100
64
+ indent-width = 4
65
+ target-version = "py311"
66
+
67
+ [tool.ruff.lint]
68
+ select = ["E", "F", "B", "W", "I", "N", "UP", "ANN", "S", "C4", "ICN", "EM"]
69
+ ignore = [
70
+ "ANN401",
71
+ "EM101",
72
+ "EM102",
73
+ "S101",
74
+ ]
75
+ fixable = ["ALL"]
76
+
77
+ [tool.ruff.lint.per-file-ignores]
78
+ "tests/**/*.py" = ["S", "ANN"]
79
+ "src/mcp_beaker/__init__.py" = ["E402", "S104"]
80
+ "src/mcp_beaker/utils/bkr_cli.py" = ["S603", "S607"]
81
+ "src/mcp_beaker/client.py" = ["S603", "S607"]
82
+ "src/mcp_beaker/utils/xml_validation.py" = ["S314"]
83
+ "src/mcp_beaker/utils/diagnosis.py" = ["S314"]
84
+ "src/mcp_beaker/servers/systems.py" = ["S314"]
85
+ "src/mcp_beaker/servers/__init__.py" = ["E402"]
86
+
87
+ [tool.ruff.format]
88
+ quote-style = "double"
89
+ indent-style = "space"
90
+
91
+ [tool.mypy]
92
+ python_version = "3.11"
93
+ warn_return_any = true
94
+ warn_unused_configs = true
95
+ disallow_untyped_defs = true
96
+ check_untyped_defs = true
97
+ no_implicit_optional = true
98
+ warn_redundant_casts = true
99
+ strict_equality = true
100
+
101
+ [[tool.mypy.overrides]]
102
+ module = "tests.*"
103
+ disallow_untyped_defs = false