codeocean-mcp-server 0.3.0__tar.gz → 0.5.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 (23) hide show
  1. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/CHANGELOG.md +10 -0
  2. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/PKG-INFO +35 -12
  3. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/README.md +32 -9
  4. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/pyproject.toml +3 -3
  5. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/server.py +9 -4
  6. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/tools/capsules.py +7 -0
  7. codeocean_mcp_server-0.5.0/src/codeocean_mcp_server/tools/custom_metadata.py +16 -0
  8. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/uv.lock +35 -79
  9. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/.gitignore +0 -0
  10. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/.python-version +0 -0
  11. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/LICENSE +0 -0
  12. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/RELEASE.md +0 -0
  13. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/__init__.py +0 -0
  14. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/file_utils.py +0 -0
  15. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/models.py +0 -0
  16. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/tools/__init__.py +0 -0
  17. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/tools/computations.py +0 -0
  18. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/src/codeocean_mcp_server/tools/data_assets.py +0 -0
  19. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/tests/bedrock_call.py +0 -0
  20. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/tests/bedrock_tools_converter.py +0 -0
  21. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/tests/mcp_client.py +0 -0
  22. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/tests/test_multi_tool_calling.py +0 -0
  23. {codeocean_mcp_server-0.3.0 → codeocean_mcp_server-0.5.0}/tests/test_tool_calling.py +0 -0
@@ -1,6 +1,15 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
+ ## 0.5.0 (2025-09-01)
5
+
6
+ - [#9](https://github.com/codeocean/codeocean-mcp-server/pull/9) feat: Updates for Code Ocean v3.9
7
+ - **Minimum Code Ocean platform version updated to `3.9.0`.**
8
+
9
+ ## 0.4.0 (2025-08-04)
10
+
11
+ - [#7](https://github.com/codeocean/codeocean-mcp-server/pull/7) fix: pin mcp package dependency
12
+
4
13
  ## 0.3.0 (2025-07-14)
5
14
 
6
15
  - [#5](https://github.com/codeocean/codeocean-mcp-server/pull/5) feat: Add support for AI agent ID in server configuration
@@ -13,3 +22,4 @@ CHANGELOG
13
22
  ## 0.1.0 (2025-07-01)
14
23
 
15
24
  - [#1](https://github.com/codeocean/codeocean-mcp-server/pull/1) Initial version
25
+ - **Minimum Code Ocean platform version updated to `3.6.0`.**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codeocean-mcp-server
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: Code Ocean MCP Server
5
5
  Project-URL: Homepage, https://github.com/codeocean/codeocean-mcp-server
6
6
  Project-URL: Issues, https://github.com/codeocean/codeocean-mcp-server/issues
@@ -12,8 +12,8 @@ Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Requires-Python: >=3.10
15
- Requires-Dist: codeocean<0.9.0,>=0.8.0
16
- Requires-Dist: fastmcp>=2.9.2
15
+ Requires-Dist: codeocean<0.11.0,>=0.10.0
16
+ Requires-Dist: mcp<1.13.0,>=1.12.0
17
17
  Description-Content-Type: text/markdown
18
18
 
19
19
  # Code Ocean MCP Server
@@ -25,6 +25,7 @@ This MCP server provides tools to search and run capsules and pipelines, and man
25
25
  ## Table of Contents
26
26
 
27
27
  - [Prerequisites](#prerequisites)
28
+ - [Code Ocean Platform Version Compatibility](#code-ocean-platform-version-compatibility)
28
29
  - [Installation](#installation)
29
30
  - [Visual Studio Code](#visual-studio-code)
30
31
  - [Claude Desktop](#claude-desktop)
@@ -32,6 +33,7 @@ This MCP server provides tools to search and run capsules and pipelines, and man
32
33
  - [Roo Code](#roo-code)
33
34
  - [Cursor](#cursor)
34
35
  - [Windsurf](#windsurf)
36
+ - [Local Testing](#local-testing)
35
37
 
36
38
  ## Prerequisites
37
39
 
@@ -39,9 +41,16 @@ This MCP server provides tools to search and run capsules and pipelines, and man
39
41
  2. Install Python 3.10 or newer using `uv python install 3.10` (or a more recent version)
40
42
  3. Generate a Code Ocean access token. Follow instructions in the [Code Ocean user guide](https://docs.codeocean.com/user-guide/code-ocean-api/authentication).
41
43
 
44
+ ## Code Ocean Platform Version Compatibility
45
+
46
+ Each release of this Code Ocean MCP Server is tested and verified against a specific minimum version of the Code Ocean platform API.
47
+ Generally, this minimum version is the latest Code Ocean version at the time of the MCP Server release.
48
+ We recommend ensuring your MCP Server dependency is pinned to a version compatible with your Code Ocean deployment.
49
+ For details on when the minimum Code Ocean platform version changes, see the [CHANGELOG](CHANGELOG.md).
50
+
42
51
  ## Installation
43
52
 
44
- ## [Visual Studio Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
53
+ ### [Visual Studio Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
45
54
 
46
55
  Here's an example VS Code MCP server configuration:
47
56
  ```json
@@ -74,7 +83,7 @@ Here's an example VS Code MCP server configuration:
74
83
 
75
84
  ---
76
85
 
77
- ## [Claude Desktop](https://modelcontextprotocol.io/quickstart/user)
86
+ ### [Claude Desktop](https://modelcontextprotocol.io/quickstart/user)
78
87
 
79
88
  1. Open the `claude_desktop_config.json` file:
80
89
  - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
@@ -99,7 +108,7 @@ Here's an example VS Code MCP server configuration:
99
108
 
100
109
  ---
101
110
 
102
- ## [Cline](https://docs.cline.bot/mcp/configuring-mcp-servers)
111
+ ### [Cline](https://docs.cline.bot/mcp/configuring-mcp-servers)
103
112
 
104
113
  Cline stores all of its MCP settings in a JSON file called cline_mcp_settings.json. You can edit this either through the GUI (“Configure MCP Servers” in the MCP Servers pane) or by hand:
105
114
  1. Open Cline and click the MCP Servers icon in the sidebar.
@@ -126,11 +135,11 @@ Cline stores all of its MCP settings in a JSON file called cline_mcp_settings.js
126
135
 
127
136
  ---
128
137
 
129
- ## [Roo Code](https://docs.roocode.com/features/mcp/using-mcp-in-roo/)
138
+ ### [Roo Code](https://docs.roocode.com/features/mcp/using-mcp-in-roo/)
130
139
 
131
140
  Roo Code’s MCP support is configured globally across all workspaces via a JSON settings file or through its dedicated MCP Settings UI
132
141
 
133
- ### Via the MCP Settings UI:
142
+ #### Via the MCP Settings UI:
134
143
  1. Click the MCP icon in Roo Code’s sidebar. 
135
144
  2. Select Edit MCP Settings (opens cline_mcp_settings.json). 
136
145
  3. Under "mcpServers", add:
@@ -152,14 +161,14 @@ Roo Code’s MCP support is configured globally across all workspaces via a JSON
152
161
  ```
153
162
  4. Save and restart Roo Code; your Code Ocean tools will appear automatically.
154
163
 
155
- ### Optional: Manually editing cline_mcp_settings.json
164
+ #### Optional: Manually editing cline_mcp_settings.json
156
165
  1. Locate cline_mcp_settings.json (in your home directory or workspace). 
157
166
  2. Insert the same "codeocean" block under "mcpServers" as above.
158
167
  3. Save and restart.
159
168
 
160
169
  ---
161
170
 
162
- ## [Cursor](https://docs.cursor.com/context/model-context-protocol)
171
+ ### [Cursor](https://docs.cursor.com/context/model-context-protocol)
163
172
 
164
173
  Cursor stores MCP servers in a JSON file at either ~/.cursor/mcp.json (global) or {project}/.cursor/mcp.json (project-specific) .
165
174
  1. Open .cursor/mcp.json (or create it if missing). 
@@ -183,7 +192,7 @@ Cursor stores MCP servers in a JSON file at either ~/.cursor/mcp.json (global) o
183
192
 
184
193
  ---
185
194
 
186
- ## [Windsurf](https://docs.windsurf.com/windsurf/cascade/mcp)
195
+ ### [Windsurf](https://docs.windsurf.com/windsurf/cascade/mcp)
187
196
 
188
197
  Windsurf (Cascade) uses mcp_config.json under ~/.codeium/windsurf/ (or via the Cascade → MCP Servers UI) .
189
198
  1. Open your Windsurf Settings and navigate to Cascade → MCP Servers, then click View Raw Config to open mcp_config.json. 
@@ -204,4 +213,18 @@ Windsurf (Cascade) uses mcp_config.json under ~/.codeium/windsurf/ (or via the C
204
213
  }
205
214
  ```
206
215
 
207
- 3. Save and restart Windsurf (or hit “Refresh” in the MCP panel).
216
+ 3. Save and restart Windsurf (or hit “Refresh” in the MCP panel).
217
+
218
+ ## Local Testing
219
+
220
+ You can test the MCP server locally during development with [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector):
221
+
222
+ ```bash
223
+ npx @modelcontextprotocol/inspector uvx --from . codeocean-mcp-server
224
+ ```
225
+
226
+ This will start a web server where you can:
227
+
228
+ - View available tools and resources
229
+ - Test tool calls interactively
230
+ - See server logs and responses
@@ -7,6 +7,7 @@ This MCP server provides tools to search and run capsules and pipelines, and man
7
7
  ## Table of Contents
8
8
 
9
9
  - [Prerequisites](#prerequisites)
10
+ - [Code Ocean Platform Version Compatibility](#code-ocean-platform-version-compatibility)
10
11
  - [Installation](#installation)
11
12
  - [Visual Studio Code](#visual-studio-code)
12
13
  - [Claude Desktop](#claude-desktop)
@@ -14,6 +15,7 @@ This MCP server provides tools to search and run capsules and pipelines, and man
14
15
  - [Roo Code](#roo-code)
15
16
  - [Cursor](#cursor)
16
17
  - [Windsurf](#windsurf)
18
+ - [Local Testing](#local-testing)
17
19
 
18
20
  ## Prerequisites
19
21
 
@@ -21,9 +23,16 @@ This MCP server provides tools to search and run capsules and pipelines, and man
21
23
  2. Install Python 3.10 or newer using `uv python install 3.10` (or a more recent version)
22
24
  3. Generate a Code Ocean access token. Follow instructions in the [Code Ocean user guide](https://docs.codeocean.com/user-guide/code-ocean-api/authentication).
23
25
 
26
+ ## Code Ocean Platform Version Compatibility
27
+
28
+ Each release of this Code Ocean MCP Server is tested and verified against a specific minimum version of the Code Ocean platform API.
29
+ Generally, this minimum version is the latest Code Ocean version at the time of the MCP Server release.
30
+ We recommend ensuring your MCP Server dependency is pinned to a version compatible with your Code Ocean deployment.
31
+ For details on when the minimum Code Ocean platform version changes, see the [CHANGELOG](CHANGELOG.md).
32
+
24
33
  ## Installation
25
34
 
26
- ## [Visual Studio Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
35
+ ### [Visual Studio Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
27
36
 
28
37
  Here's an example VS Code MCP server configuration:
29
38
  ```json
@@ -56,7 +65,7 @@ Here's an example VS Code MCP server configuration:
56
65
 
57
66
  ---
58
67
 
59
- ## [Claude Desktop](https://modelcontextprotocol.io/quickstart/user)
68
+ ### [Claude Desktop](https://modelcontextprotocol.io/quickstart/user)
60
69
 
61
70
  1. Open the `claude_desktop_config.json` file:
62
71
  - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
@@ -81,7 +90,7 @@ Here's an example VS Code MCP server configuration:
81
90
 
82
91
  ---
83
92
 
84
- ## [Cline](https://docs.cline.bot/mcp/configuring-mcp-servers)
93
+ ### [Cline](https://docs.cline.bot/mcp/configuring-mcp-servers)
85
94
 
86
95
  Cline stores all of its MCP settings in a JSON file called cline_mcp_settings.json. You can edit this either through the GUI (“Configure MCP Servers” in the MCP Servers pane) or by hand:
87
96
  1. Open Cline and click the MCP Servers icon in the sidebar.
@@ -108,11 +117,11 @@ Cline stores all of its MCP settings in a JSON file called cline_mcp_settings.js
108
117
 
109
118
  ---
110
119
 
111
- ## [Roo Code](https://docs.roocode.com/features/mcp/using-mcp-in-roo/)
120
+ ### [Roo Code](https://docs.roocode.com/features/mcp/using-mcp-in-roo/)
112
121
 
113
122
  Roo Code’s MCP support is configured globally across all workspaces via a JSON settings file or through its dedicated MCP Settings UI
114
123
 
115
- ### Via the MCP Settings UI:
124
+ #### Via the MCP Settings UI:
116
125
  1. Click the MCP icon in Roo Code’s sidebar. 
117
126
  2. Select Edit MCP Settings (opens cline_mcp_settings.json). 
118
127
  3. Under "mcpServers", add:
@@ -134,14 +143,14 @@ Roo Code’s MCP support is configured globally across all workspaces via a JSON
134
143
  ```
135
144
  4. Save and restart Roo Code; your Code Ocean tools will appear automatically.
136
145
 
137
- ### Optional: Manually editing cline_mcp_settings.json
146
+ #### Optional: Manually editing cline_mcp_settings.json
138
147
  1. Locate cline_mcp_settings.json (in your home directory or workspace). 
139
148
  2. Insert the same "codeocean" block under "mcpServers" as above.
140
149
  3. Save and restart.
141
150
 
142
151
  ---
143
152
 
144
- ## [Cursor](https://docs.cursor.com/context/model-context-protocol)
153
+ ### [Cursor](https://docs.cursor.com/context/model-context-protocol)
145
154
 
146
155
  Cursor stores MCP servers in a JSON file at either ~/.cursor/mcp.json (global) or {project}/.cursor/mcp.json (project-specific) .
147
156
  1. Open .cursor/mcp.json (or create it if missing). 
@@ -165,7 +174,7 @@ Cursor stores MCP servers in a JSON file at either ~/.cursor/mcp.json (global) o
165
174
 
166
175
  ---
167
176
 
168
- ## [Windsurf](https://docs.windsurf.com/windsurf/cascade/mcp)
177
+ ### [Windsurf](https://docs.windsurf.com/windsurf/cascade/mcp)
169
178
 
170
179
  Windsurf (Cascade) uses mcp_config.json under ~/.codeium/windsurf/ (or via the Cascade → MCP Servers UI) .
171
180
  1. Open your Windsurf Settings and navigate to Cascade → MCP Servers, then click View Raw Config to open mcp_config.json. 
@@ -186,4 +195,18 @@ Windsurf (Cascade) uses mcp_config.json under ~/.codeium/windsurf/ (or via the C
186
195
  }
187
196
  ```
188
197
 
189
- 3. Save and restart Windsurf (or hit “Refresh” in the MCP panel).
198
+ 3. Save and restart Windsurf (or hit “Refresh” in the MCP panel).
199
+
200
+ ## Local Testing
201
+
202
+ You can test the MCP server locally during development with [MCP Inspector](https://modelcontextprotocol.io/legacy/tools/inspector):
203
+
204
+ ```bash
205
+ npx @modelcontextprotocol/inspector uvx --from . codeocean-mcp-server
206
+ ```
207
+
208
+ This will start a web server where you can:
209
+
210
+ - View available tools and resources
211
+ - Test tool calls interactively
212
+ - See server logs and responses
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codeocean-mcp-server"
3
- version = "0.3.0"
3
+ version = "0.5.0"
4
4
  authors = [{ name = "Code Ocean", email = "dev@codeocean.com" }]
5
5
  description = "Code Ocean MCP Server"
6
6
  readme = "README.md"
@@ -11,8 +11,8 @@ classifiers = [
11
11
  "Operating System :: OS Independent",
12
12
  ]
13
13
  dependencies = [
14
- "codeocean>=0.8.0,<0.9.0",
15
- "fastmcp>=2.9.2",
14
+ "codeocean>=0.10.0,<0.11.0",
15
+ "mcp>=1.12.0,<1.13.0",
16
16
  ]
17
17
  license = "MIT"
18
18
 
@@ -3,7 +3,12 @@ import os
3
3
  from codeocean import CodeOcean
4
4
  from mcp.server.fastmcp import FastMCP
5
5
 
6
- from codeocean_mcp_server.tools import capsules, computations, data_assets
6
+ from codeocean_mcp_server.tools import (
7
+ capsules,
8
+ computations,
9
+ custom_metadata,
10
+ data_assets,
11
+ )
7
12
 
8
13
 
9
14
  def main():
@@ -12,15 +17,14 @@ def main():
12
17
  token = os.getenv("CODEOCEAN_TOKEN")
13
18
  if not domain or not token:
14
19
  raise ValueError(
15
- "Environment variables CODEOCEAN_DOMAIN and "
16
- "CODEOCEAN_TOKEN must be set."
20
+ "Environment variables CODEOCEAN_DOMAIN and " "CODEOCEAN_TOKEN must be set."
17
21
  )
18
22
  agent_id = os.getenv("AGENT_ID", "AI Agent")
19
23
  client = CodeOcean(domain=domain, token=token, agent_id=agent_id)
20
24
 
21
25
  mcp = FastMCP(
22
26
  name="Code Ocean",
23
- description=(
27
+ instructions=(
24
28
  f"MCP server for Code Ocean: search & run capsules, "
25
29
  f"pipelines, and assets using Code Ocean domain {domain}."
26
30
  ),
@@ -29,6 +33,7 @@ def main():
29
33
  capsules.add_tools(mcp, client)
30
34
  data_assets.add_tools(mcp, client)
31
35
  computations.add_tools(mcp, client)
36
+ custom_metadata.add_tools(mcp, client)
32
37
 
33
38
  mcp.run()
34
39
 
@@ -1,5 +1,6 @@
1
1
  from codeocean import CodeOcean
2
2
  from codeocean.capsule import (
3
+ AppPanel,
3
4
  Capsule,
4
5
  CapsuleSearchParams,
5
6
  CapsuleSearchResults,
@@ -11,6 +12,7 @@ from mcp.server.fastmcp import FastMCP
11
12
 
12
13
  from codeocean_mcp_server.models import dataclass_to_pydantic
13
14
 
15
+ AppPanelModel = dataclass_to_pydantic(AppPanel)
14
16
  CapsuleSearchParamsModel = dataclass_to_pydantic(CapsuleSearchParams)
15
17
  DataAssetAttachParamsModel = dataclass_to_pydantic(DataAssetAttachParams)
16
18
 
@@ -65,3 +67,8 @@ def add_tools(mcp: FastMCP, client: CodeOcean):
65
67
  def list_computations(capsule_id: str) -> list[Computation]:
66
68
  """List all computations for a capsule."""
67
69
  return client.capsules.list_computations(capsule_id)
70
+
71
+ @mcp.tool(description=client.capsules.get_capsule_app_panel.__doc__)
72
+ def get_capsule_app_panel(capsule_id: str, version: int | None = None) -> AppPanelModel:
73
+ """Retrieve the app panel for a capsule, optionally for a specific version."""
74
+ return client.capsules.get_capsule_app_panel(capsule_id, version)
@@ -0,0 +1,16 @@
1
+ from codeocean import CodeOcean
2
+ from codeocean.custom_metadata import CustomMetadata
3
+ from mcp.server.fastmcp import FastMCP
4
+
5
+ from codeocean_mcp_server.models import dataclass_to_pydantic
6
+
7
+ CustomMetadataModel = dataclass_to_pydantic(CustomMetadata)
8
+
9
+
10
+ def add_tools(mcp: FastMCP, client: CodeOcean):
11
+ """Add custom_metadata tools to the MCP server."""
12
+
13
+ @mcp.tool(description=client.custom_metadata.get_custom_metadata.__doc__)
14
+ def get_custom_metadata() -> CustomMetadataModel:
15
+ """Retrieve custom metadata."""
16
+ return client.custom_metadata.get_custom_metadata()
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 2
2
+ revision = 3
3
3
  requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
@@ -151,18 +151,6 @@ wheels = [
151
151
  { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" },
152
152
  ]
153
153
 
154
- [[package]]
155
- name = "authlib"
156
- version = "1.6.0"
157
- source = { registry = "https://pypi.org/simple" }
158
- dependencies = [
159
- { name = "cryptography" },
160
- ]
161
- sdist = { url = "https://files.pythonhosted.org/packages/a2/9d/b1e08d36899c12c8b894a44a5583ee157789f26fc4b176f8e4b6217b56e1/authlib-1.6.0.tar.gz", hash = "sha256:4367d32031b7af175ad3a323d571dc7257b7099d55978087ceae4a0d88cd3210", size = 158371, upload-time = "2025-05-23T00:21:45.011Z" }
162
- wheels = [
163
- { url = "https://files.pythonhosted.org/packages/84/29/587c189bbab1ccc8c86a03a5d0e13873df916380ef1be461ebe6acebf48d/authlib-1.6.0-py2.py3-none-any.whl", hash = "sha256:91685589498f79e8655e8a8947431ad6288831d643f11c55c2143ffcc738048d", size = 239981, upload-time = "2025-05-23T00:21:43.075Z" },
164
- ]
165
-
166
154
  [[package]]
167
155
  name = "backports-strenum"
168
156
  version = "1.3.1"
@@ -350,7 +338,7 @@ wheels = [
350
338
 
351
339
  [[package]]
352
340
  name = "codeocean"
353
- version = "0.8.0"
341
+ version = "0.10.0"
354
342
  source = { registry = "https://pypi.org/simple" }
355
343
  dependencies = [
356
344
  { name = "backports-strenum", marker = "python_full_version < '3.11'" },
@@ -358,18 +346,18 @@ dependencies = [
358
346
  { name = "requests" },
359
347
  { name = "requests-toolbelt" },
360
348
  ]
361
- sdist = { url = "https://files.pythonhosted.org/packages/e6/66/c947525bd7bdbc8dd337b3ab0badd4be9c47a4869404640c6e000e3ec5a8/codeocean-0.8.0.tar.gz", hash = "sha256:fbbff4de028f034495584731ca3a4830d9a90a97b88839cfe16aeaebb5caa561", size = 15530, upload-time = "2025-07-11T16:50:17.372Z" }
349
+ sdist = { url = "https://files.pythonhosted.org/packages/5b/1a/c7edc172712bf5cf71ed824d554db2d9f076ed54c31449c81955d615897b/codeocean-0.10.0.tar.gz", hash = "sha256:36c7b4a569a8ee538dc85ea46a2392d608f18622e2e5db9db07473e7a0fc5776", size = 19099, upload-time = "2025-09-01T10:06:09.616Z" }
362
350
  wheels = [
363
- { url = "https://files.pythonhosted.org/packages/9e/16/d8a220ef5ea2f938be973394f23687208dcfb3ba737c022e88f3d6a97134/codeocean-0.8.0-py3-none-any.whl", hash = "sha256:73feba7c9c2c03a21ba07feaf0e946e3087d2d29af38efbd61d452dd7a8ef1a5", size = 16365, upload-time = "2025-07-11T16:50:18.622Z" },
351
+ { url = "https://files.pythonhosted.org/packages/ec/79/3fb1d8b67a975992c0628bc30c0e53148391dd8731d919e1e98486bb1755/codeocean-0.10.0-py3-none-any.whl", hash = "sha256:cd6a564af9d46d21d06ad62d836782537d7b8e1e4641a56fd1590cd316d333ea", size = 19923, upload-time = "2025-09-01T10:06:10.349Z" },
364
352
  ]
365
353
 
366
354
  [[package]]
367
355
  name = "codeocean-mcp-server"
368
- version = "0.3.0"
356
+ version = "0.5.0"
369
357
  source = { editable = "." }
370
358
  dependencies = [
371
359
  { name = "codeocean" },
372
- { name = "fastmcp" },
360
+ { name = "mcp" },
373
361
  ]
374
362
 
375
363
  [package.dev-dependencies]
@@ -384,8 +372,8 @@ dev = [
384
372
 
385
373
  [package.metadata]
386
374
  requires-dist = [
387
- { name = "codeocean", specifier = ">=0.8.0,<0.9.0" },
388
- { name = "fastmcp", specifier = ">=2.9.2" },
375
+ { name = "codeocean", specifier = ">=0.10.0,<0.11.0" },
376
+ { name = "mcp", specifier = ">=1.12.0,<1.13.0" },
389
377
  ]
390
378
 
391
379
  [package.metadata.requires-dev]
@@ -416,7 +404,6 @@ dependencies = [
416
404
  ]
417
405
  sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/a2a376a8711c1e11708b9c9972e0c3223f5fc682552c82d8db844393d6ce/cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57", size = 744890, upload-time = "2025-06-10T00:03:51.297Z" }
418
406
  wheels = [
419
- { url = "https://files.pythonhosted.org/packages/cc/1c/92637793de053832523b410dbe016d3f5c11b41d0cf6eef8787aabb51d41/cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069", size = 7055712, upload-time = "2025-06-10T00:02:38.826Z" },
420
407
  { url = "https://files.pythonhosted.org/packages/ba/14/93b69f2af9ba832ad6618a03f8a034a5851dc9a3314336a3d71c252467e1/cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d", size = 4205335, upload-time = "2025-06-10T00:02:41.64Z" },
421
408
  { url = "https://files.pythonhosted.org/packages/67/30/fae1000228634bf0b647fca80403db5ca9e3933b91dd060570689f0bd0f7/cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036", size = 4431487, upload-time = "2025-06-10T00:02:43.696Z" },
422
409
  { url = "https://files.pythonhosted.org/packages/6d/5a/7dffcf8cdf0cb3c2430de7404b327e3db64735747d641fc492539978caeb/cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e", size = 4208922, upload-time = "2025-06-10T00:02:45.334Z" },
@@ -426,9 +413,6 @@ wheels = [
426
413
  { url = "https://files.pythonhosted.org/packages/db/b7/a84bdcd19d9c02ec5807f2ec2d1456fd8451592c5ee353816c09250e3561/cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999", size = 4463623, upload-time = "2025-06-10T00:02:52.542Z" },
427
414
  { url = "https://files.pythonhosted.org/packages/d8/84/69707d502d4d905021cac3fb59a316344e9f078b1da7fb43ecde5e10840a/cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750", size = 4332447, upload-time = "2025-06-10T00:02:54.63Z" },
428
415
  { url = "https://files.pythonhosted.org/packages/f3/ee/d4f2ab688e057e90ded24384e34838086a9b09963389a5ba6854b5876598/cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2", size = 4572830, upload-time = "2025-06-10T00:02:56.689Z" },
429
- { url = "https://files.pythonhosted.org/packages/70/d4/994773a261d7ff98034f72c0e8251fe2755eac45e2265db4c866c1c6829c/cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257", size = 2932769, upload-time = "2025-06-10T00:02:58.467Z" },
430
- { url = "https://files.pythonhosted.org/packages/5a/42/c80bd0b67e9b769b364963b5252b17778a397cefdd36fa9aa4a5f34c599a/cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8", size = 3410441, upload-time = "2025-06-10T00:03:00.14Z" },
431
- { url = "https://files.pythonhosted.org/packages/ce/0b/2488c89f3a30bc821c9d96eeacfcab6ff3accc08a9601ba03339c0fd05e5/cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723", size = 7031836, upload-time = "2025-06-10T00:03:01.726Z" },
432
416
  { url = "https://files.pythonhosted.org/packages/fe/51/8c584ed426093aac257462ae62d26ad61ef1cbf5b58d8b67e6e13c39960e/cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637", size = 4195746, upload-time = "2025-06-10T00:03:03.94Z" },
433
417
  { url = "https://files.pythonhosted.org/packages/5c/7d/4b0ca4d7af95a704eef2f8f80a8199ed236aaf185d55385ae1d1610c03c2/cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d", size = 4424456, upload-time = "2025-06-10T00:03:05.589Z" },
434
418
  { url = "https://files.pythonhosted.org/packages/1d/45/5fabacbc6e76ff056f84d9f60eeac18819badf0cefc1b6612ee03d4ab678/cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee", size = 4198495, upload-time = "2025-06-10T00:03:09.172Z" },
@@ -438,20 +422,14 @@ wheels = [
438
422
  { url = "https://files.pythonhosted.org/packages/3a/c0/85fa358ddb063ec588aed4a6ea1df57dc3e3bc1712d87c8fa162d02a65fc/cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6", size = 4451442, upload-time = "2025-06-10T00:03:16.248Z" },
439
423
  { url = "https://files.pythonhosted.org/packages/33/67/362d6ec1492596e73da24e669a7fbbaeb1c428d6bf49a29f7a12acffd5dc/cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872", size = 4325038, upload-time = "2025-06-10T00:03:18.4Z" },
440
424
  { url = "https://files.pythonhosted.org/packages/53/75/82a14bf047a96a1b13ebb47fb9811c4f73096cfa2e2b17c86879687f9027/cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4", size = 4560964, upload-time = "2025-06-10T00:03:20.06Z" },
441
- { url = "https://files.pythonhosted.org/packages/cd/37/1a3cba4c5a468ebf9b95523a5ef5651244693dc712001e276682c278fc00/cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97", size = 2924557, upload-time = "2025-06-10T00:03:22.563Z" },
442
- { url = "https://files.pythonhosted.org/packages/2a/4b/3256759723b7e66380397d958ca07c59cfc3fb5c794fb5516758afd05d41/cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22", size = 3395508, upload-time = "2025-06-10T00:03:24.586Z" },
443
- { url = "https://files.pythonhosted.org/packages/16/33/b38e9d372afde56906a23839302c19abdac1c505bfb4776c1e4b07c3e145/cryptography-45.0.4-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39", size = 3580103, upload-time = "2025-06-10T00:03:26.207Z" },
444
425
  { url = "https://files.pythonhosted.org/packages/c4/b9/357f18064ec09d4807800d05a48f92f3b369056a12f995ff79549fbb31f1/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507", size = 4143732, upload-time = "2025-06-10T00:03:27.896Z" },
445
426
  { url = "https://files.pythonhosted.org/packages/c4/9c/7f7263b03d5db329093617648b9bd55c953de0b245e64e866e560f9aac07/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0", size = 4385424, upload-time = "2025-06-10T00:03:29.992Z" },
446
427
  { url = "https://files.pythonhosted.org/packages/a6/5a/6aa9d8d5073d5acc0e04e95b2860ef2684b2bd2899d8795fc443013e263b/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b", size = 4142438, upload-time = "2025-06-10T00:03:31.782Z" },
447
428
  { url = "https://files.pythonhosted.org/packages/42/1c/71c638420f2cdd96d9c2b287fec515faf48679b33a2b583d0f1eda3a3375/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58", size = 4384622, upload-time = "2025-06-10T00:03:33.491Z" },
448
- { url = "https://files.pythonhosted.org/packages/ef/ab/e3a055c34e97deadbf0d846e189237d3385dca99e1a7e27384c3b2292041/cryptography-45.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2", size = 3328911, upload-time = "2025-06-10T00:03:35.035Z" },
449
- { url = "https://files.pythonhosted.org/packages/ea/ba/cf442ae99ef363855ed84b39e0fb3c106ac66b7a7703f3c9c9cfe05412cb/cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c", size = 3590512, upload-time = "2025-06-10T00:03:36.982Z" },
450
429
  { url = "https://files.pythonhosted.org/packages/28/9a/a7d5bb87d149eb99a5abdc69a41e4e47b8001d767e5f403f78bfaafc7aa7/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4", size = 4146899, upload-time = "2025-06-10T00:03:38.659Z" },
451
430
  { url = "https://files.pythonhosted.org/packages/17/11/9361c2c71c42cc5c465cf294c8030e72fb0c87752bacbd7a3675245e3db3/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349", size = 4388900, upload-time = "2025-06-10T00:03:40.233Z" },
452
431
  { url = "https://files.pythonhosted.org/packages/c0/76/f95b83359012ee0e670da3e41c164a0c256aeedd81886f878911581d852f/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8", size = 4146422, upload-time = "2025-06-10T00:03:41.827Z" },
453
432
  { url = "https://files.pythonhosted.org/packages/09/ad/5429fcc4def93e577a5407988f89cf15305e64920203d4ac14601a9dc876/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862", size = 4388475, upload-time = "2025-06-10T00:03:43.493Z" },
454
- { url = "https://files.pythonhosted.org/packages/99/49/0ab9774f64555a1b50102757811508f5ace451cf5dc0a2d074a4b9deca6a/cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d", size = 3337594, upload-time = "2025-06-10T00:03:45.523Z" },
455
433
  ]
456
434
 
457
435
  [[package]]
@@ -509,25 +487,6 @@ wheels = [
509
487
  { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
510
488
  ]
511
489
 
512
- [[package]]
513
- name = "fastmcp"
514
- version = "2.9.2"
515
- source = { registry = "https://pypi.org/simple" }
516
- dependencies = [
517
- { name = "authlib" },
518
- { name = "exceptiongroup" },
519
- { name = "httpx" },
520
- { name = "mcp" },
521
- { name = "openapi-pydantic" },
522
- { name = "python-dotenv" },
523
- { name = "rich" },
524
- { name = "typer" },
525
- ]
526
- sdist = { url = "https://files.pythonhosted.org/packages/68/17/d2b5981180717e6e689d0aaa6215d1ddcec6cb065c6f6b45c471ab7d2edb/fastmcp-2.9.2.tar.gz", hash = "sha256:c000eb0a2d50afcc7d26be4c867abf5c995ca0e0119f17417d50f61e2e17347c", size = 2663824, upload-time = "2025-06-26T15:03:15.395Z" }
527
- wheels = [
528
- { url = "https://files.pythonhosted.org/packages/89/60/223e1975e65ed7c6cead0fda947d4cdb4f7ee5ec60a7c8ea3b3787868f67/fastmcp-2.9.2-py3-none-any.whl", hash = "sha256:3626a3d9b1fa6325756273b6d1fe1ec610baafec957ac22f7aa1dc17c1db8b93", size = 162690, upload-time = "2025-06-26T15:03:13.553Z" },
529
- ]
530
-
531
490
  [[package]]
532
491
  name = "filelock"
533
492
  version = "3.18.0"
@@ -1107,22 +1066,24 @@ wheels = [
1107
1066
 
1108
1067
  [[package]]
1109
1068
  name = "mcp"
1110
- version = "1.9.4"
1069
+ version = "1.12.3"
1111
1070
  source = { registry = "https://pypi.org/simple" }
1112
1071
  dependencies = [
1113
1072
  { name = "anyio" },
1114
1073
  { name = "httpx" },
1115
1074
  { name = "httpx-sse" },
1075
+ { name = "jsonschema" },
1116
1076
  { name = "pydantic" },
1117
1077
  { name = "pydantic-settings" },
1118
1078
  { name = "python-multipart" },
1079
+ { name = "pywin32", marker = "sys_platform == 'win32'" },
1119
1080
  { name = "sse-starlette" },
1120
1081
  { name = "starlette" },
1121
1082
  { name = "uvicorn", marker = "sys_platform != 'emscripten'" },
1122
1083
  ]
1123
- sdist = { url = "https://files.pythonhosted.org/packages/06/f2/dc2450e566eeccf92d89a00c3e813234ad58e2ba1e31d11467a09ac4f3b9/mcp-1.9.4.tar.gz", hash = "sha256:cfb0bcd1a9535b42edaef89947b9e18a8feb49362e1cc059d6e7fc636f2cb09f", size = 333294, upload-time = "2025-06-12T08:20:30.158Z" }
1084
+ sdist = { url = "https://files.pythonhosted.org/packages/4d/19/9955e2df5384ff5dd25d38f8e88aaf89d2d3d9d39f27e7383eaf0b293836/mcp-1.12.3.tar.gz", hash = "sha256:ab2e05f5e5c13e1dc90a4a9ef23ac500a6121362a564447855ef0ab643a99fed", size = 427203, upload-time = "2025-07-31T18:36:36.795Z" }
1124
1085
  wheels = [
1125
- { url = "https://files.pythonhosted.org/packages/97/fc/80e655c955137393c443842ffcc4feccab5b12fa7cb8de9ced90f90e6998/mcp-1.9.4-py3-none-any.whl", hash = "sha256:7fcf36b62936adb8e63f89346bccca1268eeca9bf6dfb562ee10b1dfbda9dac0", size = 130232, upload-time = "2025-06-12T08:20:28.551Z" },
1086
+ { url = "https://files.pythonhosted.org/packages/8f/8b/0be74e3308a486f1d127f3f6767de5f9f76454c9b4183210c61cc50999b6/mcp-1.12.3-py3-none-any.whl", hash = "sha256:5483345bf39033b858920a5b6348a303acacf45b23936972160ff152107b850e", size = 158810, upload-time = "2025-07-31T18:36:34.915Z" },
1126
1087
  ]
1127
1088
 
1128
1089
  [[package]]
@@ -1332,18 +1293,6 @@ wheels = [
1332
1293
  { url = "https://files.pythonhosted.org/packages/64/46/a10d9df4673df56f71201d129ba1cb19eaff3366d08c8664d61a7df52e65/openai-1.93.0-py3-none-any.whl", hash = "sha256:3d746fe5498f0dd72e0d9ab706f26c91c0f646bf7459e5629af8ba7c9dbdf090", size = 755038, upload-time = "2025-06-27T21:21:37.532Z" },
1333
1294
  ]
1334
1295
 
1335
- [[package]]
1336
- name = "openapi-pydantic"
1337
- version = "0.5.1"
1338
- source = { registry = "https://pypi.org/simple" }
1339
- dependencies = [
1340
- { name = "pydantic" },
1341
- ]
1342
- sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" }
1343
- wheels = [
1344
- { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" },
1345
- ]
1346
-
1347
1296
  [[package]]
1348
1297
  name = "orderly-set"
1349
1298
  version = "5.4.1"
@@ -1693,6 +1642,28 @@ wheels = [
1693
1642
  { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" },
1694
1643
  ]
1695
1644
 
1645
+ [[package]]
1646
+ name = "pywin32"
1647
+ version = "311"
1648
+ source = { registry = "https://pypi.org/simple" }
1649
+ wheels = [
1650
+ { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" },
1651
+ { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" },
1652
+ { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" },
1653
+ { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" },
1654
+ { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" },
1655
+ { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" },
1656
+ { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" },
1657
+ { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" },
1658
+ { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" },
1659
+ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" },
1660
+ { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" },
1661
+ { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" },
1662
+ { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" },
1663
+ { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" },
1664
+ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" },
1665
+ ]
1666
+
1696
1667
  [[package]]
1697
1668
  name = "pywin32-ctypes"
1698
1669
  version = "0.2.3"
@@ -2210,21 +2181,6 @@ wheels = [
2210
2181
  { url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl", hash = "sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce", size = 14119, upload-time = "2025-05-09T12:04:46.38Z" },
2211
2182
  ]
2212
2183
 
2213
- [[package]]
2214
- name = "typer"
2215
- version = "0.16.0"
2216
- source = { registry = "https://pypi.org/simple" }
2217
- dependencies = [
2218
- { name = "click" },
2219
- { name = "rich" },
2220
- { name = "shellingham" },
2221
- { name = "typing-extensions" },
2222
- ]
2223
- sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" }
2224
- wheels = [
2225
- { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" },
2226
- ]
2227
-
2228
2184
  [[package]]
2229
2185
  name = "typing-extensions"
2230
2186
  version = "4.14.0"