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.
Files changed (27) hide show
  1. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/CHANGELOG.md +5 -0
  2. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/PKG-INFO +2 -2
  3. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/pyproject.toml +2 -2
  4. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/capsules.py +7 -2
  5. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/computations.py +27 -0
  6. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/test_tool_calling.py +73 -0
  7. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/uv.lock +5 -5
  8. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/.gitignore +0 -0
  9. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/.python-version +0 -0
  10. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/LICENSE +0 -0
  11. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/README.md +0 -0
  12. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/RELEASE.md +0 -0
  13. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/__init__.py +0 -0
  14. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/file_utils.py +0 -0
  15. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/logging_config.py +0 -0
  16. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/models.py +0 -0
  17. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/search.py +0 -0
  18. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/server.py +0 -0
  19. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/__init__.py +0 -0
  20. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/custom_metadata.py +0 -0
  21. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/src/codeocean_mcp_server/tools/data_assets.py +0 -0
  22. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/bedrock_call.py +0 -0
  23. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/bedrock_tools_converter.py +0 -0
  24. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/conftest.py +0 -0
  25. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/mcp_client.py +0 -0
  26. {codeocean_mcp_server-0.8.2 → codeocean_mcp_server-0.9.0}/tests/test_multi_tool_calling.py +0 -0
  27. {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.8.2
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.13.0,>=0.12.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.8.2"
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.12.0,<0.13.0",
14
+ "codeocean>=0.14.0,<0.15.0",
15
15
  "mcp>=1.12.0,<1.13.0",
16
16
  ]
17
17
  license = "MIT"
@@ -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.capsules.search_pipelines.__doc__) + " " + str(CapsuleSearchResults.__doc__)))
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.capsules.search_pipelines(params)
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.12.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/1e/87/63203a9bd4c9f160b02d60016c6222e0836a192d74b624445540667a9a34/codeocean-0.12.0.tar.gz", hash = "sha256:f124a0c090dfdecbbce5f2b033673142820cc200a4a4ed12239027e0eff0ada8", size = 19465, upload-time = "2025-10-21T07:28:06.618Z" }
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/0c/67/86aaaa16e089883035cc45e1d93e5861cdf912e98c3f69dfaf7c7fa9b9a9/codeocean-0.12.0-py3-none-any.whl", hash = "sha256:c9135d34d0920dae5298095bb7ad03fffff5b5fd4c5e941a0200c3c38090df1c", size = 20417, upload-time = "2025-10-21T07:28:07.596Z" },
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.8.2"
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.12.0,<0.13.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