codeocean-mcp-server 0.8.2__tar.gz → 0.9.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.
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/CHANGELOG.md +5 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/PKG-INFO +2 -2
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/pyproject.toml +2 -2
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/capsules.py +7 -2
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/computations.py +27 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/test_tool_calling.py +73 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/uv.lock +5 -5
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/.gitignore +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/.python-version +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/LICENSE +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/README.md +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/RELEASE.md +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/__init__.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/file_utils.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/logging_config.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/models.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/search.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/server.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/__init__.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/custom_metadata.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/data_assets.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/bedrock_call.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/bedrock_tools_converter.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/conftest.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/mcp_client.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/test_multi_tool_calling.py +0 -0
- {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/test_search.py +0 -0
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
CHANGELOG
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
## 0.9.0 (2026-01-30)
|
|
5
|
+
|
|
6
|
+
- [#29](https://github.com/codeocean/codeocean-mcp-server/pull/29) feat: upgrade codeocean SDK to v0.14.0
|
|
7
|
+
- **Minimum Code Ocean platform version updated to `4.2.0`.**
|
|
8
|
+
|
|
4
9
|
## 0.8.2 (2026-01-29)
|
|
5
10
|
|
|
6
11
|
- [#27](https://github.com/codeocean/codeocean-mcp-server/pull/27) fix: update documentation for search results to include pagination details
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codeocean-mcp-server
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.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,7 +12,7 @@ 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.
|
|
15
|
+
Requires-Dist: codeocean<0.15.0,>=0.14.0
|
|
16
16
|
Requires-Dist: mcp<1.13.0,>=1.12.0
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "codeocean-mcp-server"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.9.0"
|
|
4
4
|
authors = [{ name = "Code Ocean", email = "dev@codeocean.com" }]
|
|
5
5
|
description = "Code Ocean MCP Server"
|
|
6
6
|
readme = "README.md"
|
|
@@ -11,7 +11,7 @@ classifiers = [
|
|
|
11
11
|
"Operating System :: OS Independent",
|
|
12
12
|
]
|
|
13
13
|
dependencies = [
|
|
14
|
-
"codeocean>=0.
|
|
14
|
+
"codeocean>=0.14.0,<0.15.0",
|
|
15
15
|
"mcp>=1.12.0,<1.13.0",
|
|
16
16
|
]
|
|
17
17
|
license = "MIT"
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/capsules.py
RENAMED
|
@@ -30,14 +30,14 @@ def add_tools(mcp: FastMCP, client: CodeOcean):
|
|
|
30
30
|
results = client.capsules.search_capsules(params)
|
|
31
31
|
return CapsuleSearchResults.from_sdk_results(results, include_field_names)
|
|
32
32
|
|
|
33
|
-
@mcp.tool(description=(str(client.
|
|
33
|
+
@mcp.tool(description=(str(client.pipelines.search_pipelines.__doc__) + " " + str(CapsuleSearchResults.__doc__)))
|
|
34
34
|
def search_pipelines(
|
|
35
35
|
search_params: CapsuleSearchParamsModel,
|
|
36
36
|
include_field_names: bool = False,
|
|
37
37
|
) -> CapsuleSearchResults:
|
|
38
38
|
"""Search for pipelines matching specified criteria."""
|
|
39
39
|
params = CapsuleSearchParams(**search_params.model_dump(exclude_none=True))
|
|
40
|
-
results = client.
|
|
40
|
+
results = client.pipelines.search_pipelines(params)
|
|
41
41
|
return CapsuleSearchResults.from_sdk_results(results, include_field_names)
|
|
42
42
|
|
|
43
43
|
@mcp.tool(
|
|
@@ -74,3 +74,8 @@ def add_tools(mcp: FastMCP, client: CodeOcean):
|
|
|
74
74
|
def get_capsule_app_panel(capsule_id: str, version: int | None = None) -> AppPanelModel:
|
|
75
75
|
"""Retrieve the app panel for a capsule, optionally for a specific version."""
|
|
76
76
|
return client.capsules.get_capsule_app_panel(capsule_id, version)
|
|
77
|
+
|
|
78
|
+
@mcp.tool(description=client.capsules.detach_data_assets.__doc__)
|
|
79
|
+
def detach_data_assets(capsule_id: str, data_assets: list[str]) -> None:
|
|
80
|
+
"""Remove attached data assets from a capsule."""
|
|
81
|
+
client.capsules.detach_data_assets(capsule_id, data_assets)
|
|
@@ -5,12 +5,14 @@ from codeocean.computation import (
|
|
|
5
5
|
Folder,
|
|
6
6
|
RunParams,
|
|
7
7
|
)
|
|
8
|
+
from codeocean.data_asset import DataAssetAttachParams, DataAssetAttachResults
|
|
8
9
|
from mcp.server.fastmcp import FastMCP
|
|
9
10
|
|
|
10
11
|
from codeocean_mcp_server.file_utils import download_and_read_file
|
|
11
12
|
from codeocean_mcp_server.models import dataclass_to_pydantic
|
|
12
13
|
|
|
13
14
|
RunParamsModel = dataclass_to_pydantic(RunParams)
|
|
15
|
+
DataAssetAttachParamsModel = dataclass_to_pydantic(DataAssetAttachParams)
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
def add_tools(mcp: FastMCP, client: CodeOcean):
|
|
@@ -59,3 +61,28 @@ def add_tools(mcp: FastMCP, client: CodeOcean):
|
|
|
59
61
|
"""Download a file using the provided URL and return its content."""
|
|
60
62
|
file_urls = client.computations.get_result_file_urls(computation_id, file_path)
|
|
61
63
|
return download_and_read_file(file_urls.download_url)
|
|
64
|
+
|
|
65
|
+
@mcp.tool(description=client.computations.rename_computation.__doc__)
|
|
66
|
+
def rename_computation(computation_id: str, name: str) -> None:
|
|
67
|
+
"""Rename an existing computation."""
|
|
68
|
+
client.computations.rename_computation(computation_id, name)
|
|
69
|
+
|
|
70
|
+
@mcp.tool(
|
|
71
|
+
description=(
|
|
72
|
+
str(client.computations.attach_data_assets.__doc__)
|
|
73
|
+
+ " Accepts a list of parameter objects (e.g. [{'id': '...'}]). "
|
|
74
|
+
"Use for cloud workstation sessions."
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
def attach_computation_data_assets(
|
|
78
|
+
computation_id: str,
|
|
79
|
+
attach_params: list[DataAssetAttachParamsModel],
|
|
80
|
+
) -> list[DataAssetAttachResults]:
|
|
81
|
+
"""Attach data assets to a cloud workstation session."""
|
|
82
|
+
params = [DataAssetAttachParams(**p.model_dump(exclude_none=True)) for p in attach_params]
|
|
83
|
+
return client.computations.attach_data_assets(computation_id, params)
|
|
84
|
+
|
|
85
|
+
@mcp.tool(description=client.computations.detach_data_assets.__doc__)
|
|
86
|
+
def detach_computation_data_assets(computation_id: str, data_assets: list[str]) -> None:
|
|
87
|
+
"""Detach data assets from a cloud workstation session."""
|
|
88
|
+
client.computations.detach_data_assets(computation_id, data_assets)
|
|
@@ -427,6 +427,79 @@ test_response = [
|
|
|
427
427
|
},
|
|
428
428
|
},
|
|
429
429
|
},
|
|
430
|
+
# =================================================================
|
|
431
|
+
# Pipeline tests
|
|
432
|
+
# --------------------------------------------------------------
|
|
433
|
+
# search_pipelines
|
|
434
|
+
{
|
|
435
|
+
"id": "search_pipelines",
|
|
436
|
+
"prompt": "search for pipelines with query 'analysis' and return the first 5 results",
|
|
437
|
+
"expected": {
|
|
438
|
+
"name": "search_pipelines",
|
|
439
|
+
"input": {
|
|
440
|
+
"search_params": {
|
|
441
|
+
"query": "analysis",
|
|
442
|
+
"limit": 5,
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
# =================================================================
|
|
448
|
+
# Capsule detach tests
|
|
449
|
+
# --------------------------------------------------------------
|
|
450
|
+
# detach_data_assets from capsule
|
|
451
|
+
{
|
|
452
|
+
"id": "detach_data_assets",
|
|
453
|
+
"prompt": "detach data assets with ids: asset123, asset456 from capsule with id: capsule789",
|
|
454
|
+
"expected": {
|
|
455
|
+
"name": "detach_data_assets",
|
|
456
|
+
"input": {
|
|
457
|
+
"capsule_id": "capsule789",
|
|
458
|
+
"data_assets": ["asset123", "asset456"],
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
# =================================================================
|
|
463
|
+
# Computation management tests
|
|
464
|
+
# --------------------------------------------------------------
|
|
465
|
+
# rename_computation
|
|
466
|
+
{
|
|
467
|
+
"id": "rename_computation",
|
|
468
|
+
"prompt": "rename computation with id: comp123 to 'Analysis Run 2024'",
|
|
469
|
+
"expected": {
|
|
470
|
+
"name": "rename_computation",
|
|
471
|
+
"input": {
|
|
472
|
+
"computation_id": "comp123",
|
|
473
|
+
"name": "Analysis Run 2024",
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
# --------------------------------------------------------------
|
|
478
|
+
# attach_computation_data_assets
|
|
479
|
+
{
|
|
480
|
+
"id": "attach_computation_data_assets",
|
|
481
|
+
"prompt": "attach data assets with ids: data789, data101 to cloud workstation computation with id: ws_comp456",
|
|
482
|
+
"expected": {
|
|
483
|
+
"name": "attach_computation_data_assets",
|
|
484
|
+
"input": {
|
|
485
|
+
"computation_id": "ws_comp456",
|
|
486
|
+
"attach_params": [{"id": "data789"}, {"id": "data101"}],
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
# --------------------------------------------------------------
|
|
491
|
+
# detach_computation_data_assets
|
|
492
|
+
{
|
|
493
|
+
"id": "detach_computation_data_assets",
|
|
494
|
+
"prompt": "detach data assets with ids: data222, data333 from cloud workstation with id: ws_comp789",
|
|
495
|
+
"expected": {
|
|
496
|
+
"name": "detach_computation_data_assets",
|
|
497
|
+
"input": {
|
|
498
|
+
"computation_id": "ws_comp789",
|
|
499
|
+
"data_assets": ["data222", "data333"],
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
},
|
|
430
503
|
]
|
|
431
504
|
|
|
432
505
|
|
|
@@ -514,7 +514,7 @@ wheels = [
|
|
|
514
514
|
|
|
515
515
|
[[package]]
|
|
516
516
|
name = "codeocean"
|
|
517
|
-
version = "0.
|
|
517
|
+
version = "0.14.0"
|
|
518
518
|
source = { registry = "https://pypi.org/simple" }
|
|
519
519
|
dependencies = [
|
|
520
520
|
{ name = "backports-strenum", marker = "python_full_version < '3.11'" },
|
|
@@ -522,14 +522,14 @@ dependencies = [
|
|
|
522
522
|
{ name = "requests" },
|
|
523
523
|
{ name = "requests-toolbelt" },
|
|
524
524
|
]
|
|
525
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
525
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c2/de/5d0ed25123b5e903eec6325249c23d3ae76d1ad5aceff000c9544e242700/codeocean-0.14.0.tar.gz", hash = "sha256:90d2a58a9c8d05edc53becc0b63773c5b8cd44423de19afa3b0ce1d82ebfadc6", size = 21461, upload-time = "2026-01-29T23:11:34.016Z" }
|
|
526
526
|
wheels = [
|
|
527
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
527
|
+
{ url = "https://files.pythonhosted.org/packages/f8/d1/ef0027ce1a17eedd8c671495d780fffa0590d017061337e4ff86a0a0054e/codeocean-0.14.0-py3-none-any.whl", hash = "sha256:33ea9cde80df0c7d986e493a88edbe00f13b5d0cf92cfaed8a518f7314dbf4e1", size = 25201, upload-time = "2026-01-29T23:11:36.219Z" },
|
|
528
528
|
]
|
|
529
529
|
|
|
530
530
|
[[package]]
|
|
531
531
|
name = "codeocean-mcp-server"
|
|
532
|
-
version = "0.
|
|
532
|
+
version = "0.9.0"
|
|
533
533
|
source = { editable = "." }
|
|
534
534
|
dependencies = [
|
|
535
535
|
{ name = "codeocean" },
|
|
@@ -548,7 +548,7 @@ dev = [
|
|
|
548
548
|
|
|
549
549
|
[package.metadata]
|
|
550
550
|
requires-dist = [
|
|
551
|
-
{ name = "codeocean", specifier = ">=0.
|
|
551
|
+
{ name = "codeocean", specifier = ">=0.14.0,<0.15.0" },
|
|
552
552
|
{ name = "mcp", specifier = ">=1.12.0,<1.13.0" },
|
|
553
553
|
]
|
|
554
554
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/__init__.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/file_utils.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/logging_config.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/models.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/search.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/server.py
RENAMED
|
File without changes
|
{codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|