From b0fad503bde3ad7c472e6aac71073a01e92b7a6a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:17:58 +0000 Subject: [PATCH 1/4] chore(ci): bump uv version --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 323e11f11..8c652335f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - name: Install uv uses: runloopai/setup-uv@main with: - version: '0.9.13' + version: '0.10.2' - name: Install dependencies run: uv sync --all-extras @@ -46,7 +46,7 @@ jobs: - name: Install uv uses: runloopai/setup-uv@main with: - version: '0.9.13' + version: '0.10.2' - name: Install dependencies run: uv sync --all-extras @@ -80,7 +80,7 @@ jobs: - name: Install uv uses: runloopai/setup-uv@main with: - version: '0.9.13' + version: '0.10.2' - name: Bootstrap run: ./scripts/bootstrap From 01f4b3dc66f20126adf6737554e42ce1a1b19fe0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 20:03:53 +0000 Subject: [PATCH 2/4] fix: switching to MCP definition to specify a secret name per MCP server (#7715) --- .stats.yml | 4 ++-- .../resources/devboxes/devboxes.py | 22 ++++++++++--------- .../types/devbox_create_params.py | 9 ++++---- src/runloop_api_client/types/devbox_view.py | 10 ++++----- tests/api_resources/test_devboxes.py | 12 +++++----- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/.stats.yml b/.stats.yml index 342cea69b..8789b2016 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 118 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-439b1a08248ef3bc7457c7b0a9a6218149732535a9f0dd541501fc35e2a3f8c2.yml -openapi_spec_hash: 35b12a086d98484417ce3d2543c47929 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-132ed160716591bdcd9231c00da8c506d9451a5486b165fc27b2a01d93202082.yml +openapi_spec_hash: c2b44d9e9cda56e32141a7ea3794bbba config_hash: cbda3692cb48ab8582a0df1674b9e5c8 diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py index 8a1c699d3..516c1fd01 100644 --- a/src/runloop_api_client/resources/devboxes/devboxes.py +++ b/src/runloop_api_client/resources/devboxes/devboxes.py @@ -191,7 +191,7 @@ def create( file_mounts: Optional[Dict[str, str]] | Omit = omit, gateways: Optional[Dict[str, devbox_create_params.Gateways]] | Omit = omit, launch_parameters: Optional[LaunchParameters] | Omit = omit, - mcp: Optional[Iterable[devbox_create_params.Mcp]] | Omit = omit, + mcp: Optional[Dict[str, devbox_create_params.Mcp]] | Omit = omit, metadata: Optional[Dict[str, str]] | Omit = omit, mounts: Optional[Iterable[Mount]] | Omit = omit, name: Optional[str] | Omit = omit, @@ -242,10 +242,11 @@ def create( launch_parameters: Parameters to configure the resources and launch time behavior of the Devbox. - mcp: [Beta] (Optional) MCP specifications for MCP server access. Each spec links an - MCP config to a secret. The devbox will receive environment variables - (RL_MCP_URL, RL_MCP_TOKEN) for accessing MCP servers through the MCP hub. - Example: [{'mcp_config': 'github-readonly', 'secret': 'MY_GITHUB_TOKEN'}] + mcp: [Beta] (Optional) MCP specifications for MCP server access. Map key is the + environment variable name for the MCP token envelope. Each spec links an MCP + config to a secret. The devbox will also receive RL_MCP_URL for the MCP hub + endpoint. Example: {'MCP_SECRET': {'mcp_config': 'github-readonly', 'secret': + 'MY_GITHUB_TOKEN'}} metadata: User defined metadata to attach to the devbox for organization. @@ -1869,7 +1870,7 @@ async def create( file_mounts: Optional[Dict[str, str]] | Omit = omit, gateways: Optional[Dict[str, devbox_create_params.Gateways]] | Omit = omit, launch_parameters: Optional[LaunchParameters] | Omit = omit, - mcp: Optional[Iterable[devbox_create_params.Mcp]] | Omit = omit, + mcp: Optional[Dict[str, devbox_create_params.Mcp]] | Omit = omit, metadata: Optional[Dict[str, str]] | Omit = omit, mounts: Optional[Iterable[Mount]] | Omit = omit, name: Optional[str] | Omit = omit, @@ -1920,10 +1921,11 @@ async def create( launch_parameters: Parameters to configure the resources and launch time behavior of the Devbox. - mcp: [Beta] (Optional) MCP specifications for MCP server access. Each spec links an - MCP config to a secret. The devbox will receive environment variables - (RL_MCP_URL, RL_MCP_TOKEN) for accessing MCP servers through the MCP hub. - Example: [{'mcp_config': 'github-readonly', 'secret': 'MY_GITHUB_TOKEN'}] + mcp: [Beta] (Optional) MCP specifications for MCP server access. Map key is the + environment variable name for the MCP token envelope. Each spec links an MCP + config to a secret. The devbox will also receive RL_MCP_URL for the MCP hub + endpoint. Example: {'MCP_SECRET': {'mcp_config': 'github-readonly', 'secret': + 'MY_GITHUB_TOKEN'}} metadata: User defined metadata to attach to the devbox for organization. diff --git a/src/runloop_api_client/types/devbox_create_params.py b/src/runloop_api_client/types/devbox_create_params.py index 5690cd305..c72820259 100644 --- a/src/runloop_api_client/types/devbox_create_params.py +++ b/src/runloop_api_client/types/devbox_create_params.py @@ -49,12 +49,13 @@ class DevboxBaseCreateParams(TypedDict, total=False): launch_parameters: Optional[LaunchParameters] """Parameters to configure the resources and launch time behavior of the Devbox.""" - mcp: Optional[Iterable[Mcp]] + mcp: Optional[Dict[str, Mcp]] """[Beta] (Optional) MCP specifications for MCP server access. - Each spec links an MCP config to a secret. The devbox will receive environment - variables (RL_MCP_URL, RL_MCP_TOKEN) for accessing MCP servers through the MCP - hub. Example: [{'mcp_config': 'github-readonly', 'secret': 'MY_GITHUB_TOKEN'}] + Map key is the environment variable name for the MCP token envelope. Each spec + links an MCP config to a secret. The devbox will also receive RL_MCP_URL for the + MCP hub endpoint. Example: {'MCP_SECRET': {'mcp_config': 'github-readonly', + 'secret': 'MY_GITHUB_TOKEN'}} """ metadata: Optional[Dict[str, str]] diff --git a/src/runloop_api_client/types/devbox_view.py b/src/runloop_api_client/types/devbox_view.py index 50bec1075..cdd37cf1f 100644 --- a/src/runloop_api_client/types/devbox_view.py +++ b/src/runloop_api_client/types/devbox_view.py @@ -7,7 +7,7 @@ from .tunnel_view import TunnelView from .shared.launch_parameters import LaunchParameters -__all__ = ["DevboxView", "StateTransition", "GatewaySpecs", "McpSpec"] +__all__ = ["DevboxView", "StateTransition", "GatewaySpecs", "McpSpecs"] class StateTransition(BaseModel): @@ -39,7 +39,7 @@ class GatewaySpecs(BaseModel): """The ID of the secret containing the credential.""" -class McpSpec(BaseModel): +class McpSpecs(BaseModel): mcp_config_id: str """The ID of the MCP config (e.g., mcp_123abc).""" @@ -107,11 +107,11 @@ class DevboxView(BaseModel): initiator_type: Optional[Literal["unknown", "api", "scenario", "scoring_validation"]] = None """The type of initiator that created the Devbox.""" - mcp_specs: Optional[List[McpSpec]] = None + mcp_specs: Optional[Dict[str, McpSpecs]] = None """[Beta] MCP specifications configured for this devbox. - Each spec links an MCP config to a secret for MCP server access through the MCP - hub. + Map key is the environment variable name for the MCP token envelope. Each spec + links an MCP config to a secret for MCP server access through the MCP hub. """ name: Optional[str] = None diff --git a/tests/api_resources/test_devboxes.py b/tests/api_resources/test_devboxes.py index c6f6625e3..7f83732a0 100644 --- a/tests/api_resources/test_devboxes.py +++ b/tests/api_resources/test_devboxes.py @@ -93,12 +93,12 @@ def test_method_create_with_all_params(self, client: Runloop) -> None: "username": "username", }, }, - mcp=[ - { + mcp={ + "foo": { "mcp_config": "mcp_config", "secret": "secret", } - ], + }, metadata={"foo": "string"}, mounts=[ { @@ -1761,12 +1761,12 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) - "username": "username", }, }, - mcp=[ - { + mcp={ + "foo": { "mcp_config": "mcp_config", "secret": "secret", } - ], + }, metadata={"foo": "string"}, mounts=[ { From 2296fa2503a3f68ce038b567ef5f80ddfea5a92a Mon Sep 17 00:00:00 2001 From: Alexander Dines Date: Fri, 27 Feb 2026 12:30:50 -0800 Subject: [PATCH 3/4] cp dines --- src/runloop_api_client/resources/devboxes/devboxes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py index 516c1fd01..de809b855 100644 --- a/src/runloop_api_client/resources/devboxes/devboxes.py +++ b/src/runloop_api_client/resources/devboxes/devboxes.py @@ -508,7 +508,7 @@ def create_and_await_running( file_mounts: Optional[Dict[str, str]] | Omit = omit, gateways: Optional[Dict[str, devbox_create_params.Gateways]] | Omit = omit, launch_parameters: Optional[LaunchParameters] | Omit = omit, - mcp: Optional[Iterable[devbox_create_params.Mcp]] | Omit = omit, + mcp: Optional[Dict[str, devbox_create_params.Mcp]] | Omit = omit, metadata: Optional[Dict[str, str]] | Omit = omit, mounts: Optional[Iterable[Mount]] | Omit = omit, name: Optional[str] | Omit = omit, @@ -2034,7 +2034,7 @@ async def create_and_await_running( file_mounts: Optional[Dict[str, str]] | Omit = omit, gateways: Optional[Dict[str, devbox_create_params.Gateways]] | Omit = omit, launch_parameters: Optional[LaunchParameters] | Omit = omit, - mcp: Optional[Iterable[devbox_create_params.Mcp]] | Omit = omit, + mcp: Optional[Dict[str, devbox_create_params.Mcp]] | Omit = omit, metadata: Optional[Dict[str, str]] | Omit = omit, mounts: Optional[Iterable[Mount]] | Omit = omit, name: Optional[str] | Omit = omit, From 7f4bd9c09bcb5a80c896ce04763cd9cff9adc72a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 20:31:09 +0000 Subject: [PATCH 4/4] release: 1.10.3 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ pyproject.toml | 2 +- src/runloop_api_client/_version.py | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9bd8fad44..083df00ef 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.10.2" + ".": "1.10.3" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 250518817..bb2c9f22c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 1.10.3 (2026-02-27) + +Full Changelog: [v1.10.2...v1.10.3](https://github.com/runloopai/api-client-python/compare/v1.10.2...v1.10.3) + +### Bug Fixes + +* switching to MCP definition to specify a secret name per MCP server ([#7715](https://github.com/runloopai/api-client-python/issues/7715)) ([01f4b3d](https://github.com/runloopai/api-client-python/commit/01f4b3dc66f20126adf6737554e42ce1a1b19fe0)) + + +### Chores + +* **ci:** bump uv version ([b0fad50](https://github.com/runloopai/api-client-python/commit/b0fad503bde3ad7c472e6aac71073a01e92b7a6a)) + ## 1.10.2 (2026-02-26) Full Changelog: [v1.10.1...v1.10.2](https://github.com/runloopai/api-client-python/compare/v1.10.1...v1.10.2) diff --git a/pyproject.toml b/pyproject.toml index a51fa883b..dfd204508 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "runloop_api_client" -version = "1.10.2" +version = "1.10.3" description = "The official Python library for the runloop API" dynamic = ["readme"] license = "MIT" diff --git a/src/runloop_api_client/_version.py b/src/runloop_api_client/_version.py index 8db51c16e..8592b7e83 100644 --- a/src/runloop_api_client/_version.py +++ b/src/runloop_api_client/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "runloop_api_client" -__version__ = "1.10.2" # x-release-please-version +__version__ = "1.10.3" # x-release-please-version