Skip to content

Commit 79d05c0

Browse files
feat: adding MCP Config routes (#7331)
1 parent ab903f5 commit 79d05c0

20 files changed

Lines changed: 1400 additions & 544 deletions

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 113
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-37187e72e61b850045924e6cb40207159ab794114add75a2bf36c87915326306.yml
3-
openapi_spec_hash: 33510c114bef0847855cdaf8f55c0774
4-
config_hash: 9f86425631c30497276e58b744dd3654
1+
configured_endpoints: 116
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-eb90951855ef91c431a7b07ea6a42c1c470c1a0c905e19e4926b48e8039bf4cb.yml
3+
openapi_spec_hash: e98232f95d6fd27f1200e354cee0059a
4+
config_hash: eb28692edd68a6ae95cf92af931c9976

api.md

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,21 +297,17 @@ Types:
297297

298298
```python
299299
from runloop_api_client.types.scenarios import (
300-
ScorerCreateResponse,
301300
ScorerRetrieveResponse,
302301
ScorerUpdateResponse,
303302
ScorerListResponse,
304-
ScorerValidateResponse,
305303
)
306304
```
307305

308306
Methods:
309307

310-
- <code title="post /v1/scenarios/scorers">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">create</a>(\*\*<a href="src/runloop_api_client/types/scenarios/scorer_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_create_response.py">ScorerCreateResponse</a></code>
311308
- <code title="get /v1/scenarios/scorers/{id}">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/scenarios/scorer_retrieve_response.py">ScorerRetrieveResponse</a></code>
312309
- <code title="post /v1/scenarios/scorers/{id}">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/scenarios/scorer_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_update_response.py">ScorerUpdateResponse</a></code>
313310
- <code title="get /v1/scenarios/scorers">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenarios/scorer_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_list_response.py">SyncScenarioScorersCursorIDPage[ScorerListResponse]</a></code>
314-
- <code title="post /v1/scenarios/scorers/{id}/validate">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">validate</a>(id, \*\*<a href="src/runloop_api_client/types/scenarios/scorer_validate_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_validate_response.py">ScorerValidateResponse</a></code>
315311

316312
# Objects
317313

@@ -422,3 +418,24 @@ Methods:
422418
- <code title="post /v1/gateway-configs/{id}">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/gateway_config_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">GatewayConfigView</a></code>
423419
- <code title="get /v1/gateway-configs">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">list</a>(\*\*<a href="src/runloop_api_client/types/gateway_config_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">SyncGatewayConfigsCursorIDPage[GatewayConfigView]</a></code>
424420
- <code title="post /v1/gateway-configs/{id}/delete">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">GatewayConfigView</a></code>
421+
422+
# McpConfigs
423+
424+
Types:
425+
426+
```python
427+
from runloop_api_client.types import (
428+
McpConfigCreateParameters,
429+
McpConfigListView,
430+
McpConfigUpdateParameters,
431+
McpConfigView,
432+
)
433+
```
434+
435+
Methods:
436+
437+
- <code title="post /v1/mcp-configs">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">create</a>(\*\*<a href="src/runloop_api_client/types/mcp_config_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
438+
- <code title="get /v1/mcp-configs/{id}">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
439+
- <code title="post /v1/mcp-configs/{id}">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/mcp_config_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
440+
- <code title="get /v1/mcp-configs">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">list</a>(\*\*<a href="src/runloop_api_client/types/mcp_config_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">SyncMcpConfigsCursorIDPage[McpConfigView]</a></code>
441+
- <code title="post /v1/mcp-configs/{id}/delete">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>

src/runloop_api_client/_client.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
scenarios,
4040
benchmarks,
4141
blueprints,
42+
mcp_configs,
4243
repositories,
4344
benchmark_jobs,
4445
benchmark_runs,
@@ -50,6 +51,7 @@
5051
from .resources.secrets import SecretsResource, AsyncSecretsResource
5152
from .resources.benchmarks import BenchmarksResource, AsyncBenchmarksResource
5253
from .resources.blueprints import BlueprintsResource, AsyncBlueprintsResource
54+
from .resources.mcp_configs import McpConfigsResource, AsyncMcpConfigsResource
5355
from .resources.repositories import RepositoriesResource, AsyncRepositoriesResource
5456
from .resources.benchmark_jobs import BenchmarkJobsResource, AsyncBenchmarkJobsResource
5557
from .resources.benchmark_runs import BenchmarkRunsResource, AsyncBenchmarkRunsResource
@@ -190,6 +192,12 @@ def gateway_configs(self) -> GatewayConfigsResource:
190192

191193
return GatewayConfigsResource(self)
192194

195+
@cached_property
196+
def mcp_configs(self) -> McpConfigsResource:
197+
from .resources.mcp_configs import McpConfigsResource
198+
199+
return McpConfigsResource(self)
200+
193201
@cached_property
194202
def with_raw_response(self) -> RunloopWithRawResponse:
195203
return RunloopWithRawResponse(self)
@@ -432,6 +440,12 @@ def gateway_configs(self) -> AsyncGatewayConfigsResource:
432440

433441
return AsyncGatewayConfigsResource(self)
434442

443+
@cached_property
444+
def mcp_configs(self) -> AsyncMcpConfigsResource:
445+
from .resources.mcp_configs import AsyncMcpConfigsResource
446+
447+
return AsyncMcpConfigsResource(self)
448+
435449
@cached_property
436450
def with_raw_response(self) -> AsyncRunloopWithRawResponse:
437451
return AsyncRunloopWithRawResponse(self)
@@ -623,6 +637,12 @@ def gateway_configs(self) -> gateway_configs.GatewayConfigsResourceWithRawRespon
623637

624638
return GatewayConfigsResourceWithRawResponse(self._client.gateway_configs)
625639

640+
@cached_property
641+
def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithRawResponse:
642+
from .resources.mcp_configs import McpConfigsResourceWithRawResponse
643+
644+
return McpConfigsResourceWithRawResponse(self._client.mcp_configs)
645+
626646

627647
class AsyncRunloopWithRawResponse:
628648
_client: AsyncRunloop
@@ -702,6 +722,12 @@ def gateway_configs(self) -> gateway_configs.AsyncGatewayConfigsResourceWithRawR
702722

703723
return AsyncGatewayConfigsResourceWithRawResponse(self._client.gateway_configs)
704724

725+
@cached_property
726+
def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithRawResponse:
727+
from .resources.mcp_configs import AsyncMcpConfigsResourceWithRawResponse
728+
729+
return AsyncMcpConfigsResourceWithRawResponse(self._client.mcp_configs)
730+
705731

706732
class RunloopWithStreamedResponse:
707733
_client: Runloop
@@ -781,6 +807,12 @@ def gateway_configs(self) -> gateway_configs.GatewayConfigsResourceWithStreaming
781807

782808
return GatewayConfigsResourceWithStreamingResponse(self._client.gateway_configs)
783809

810+
@cached_property
811+
def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithStreamingResponse:
812+
from .resources.mcp_configs import McpConfigsResourceWithStreamingResponse
813+
814+
return McpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
815+
784816

785817
class AsyncRunloopWithStreamedResponse:
786818
_client: AsyncRunloop
@@ -860,6 +892,12 @@ def gateway_configs(self) -> gateway_configs.AsyncGatewayConfigsResourceWithStre
860892

861893
return AsyncGatewayConfigsResourceWithStreamingResponse(self._client.gateway_configs)
862894

895+
@cached_property
896+
def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithStreamingResponse:
897+
from .resources.mcp_configs import AsyncMcpConfigsResourceWithStreamingResponse
898+
899+
return AsyncMcpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
900+
863901

864902
Client = Runloop
865903

src/runloop_api_client/pagination.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
"AsyncNetworkPoliciesCursorIDPage",
3333
"SyncGatewayConfigsCursorIDPage",
3434
"AsyncGatewayConfigsCursorIDPage",
35+
"SyncMcpConfigsCursorIDPage",
36+
"AsyncMcpConfigsCursorIDPage",
3537
]
3638

3739
_T = TypeVar("_T")
@@ -102,6 +104,11 @@ class GatewayConfigsCursorIDPageItem(Protocol):
102104
id: str
103105

104106

107+
@runtime_checkable
108+
class McpConfigsCursorIDPageItem(Protocol):
109+
id: str
110+
111+
105112
class SyncBlueprintsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
106113
blueprints: List[_T]
107114
has_more: Optional[bool] = None
@@ -984,3 +991,71 @@ def next_page_info(self) -> Optional[PageInfo]:
984991
return None
985992

986993
return PageInfo(params={"starting_after": item.id})
994+
995+
996+
class SyncMcpConfigsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
997+
mcp_configs: List[_T]
998+
has_more: Optional[bool] = None
999+
total_count: Optional[int] = None
1000+
1001+
@override
1002+
def _get_page_items(self) -> List[_T]:
1003+
mcp_configs = self.mcp_configs
1004+
if not mcp_configs:
1005+
return []
1006+
return mcp_configs
1007+
1008+
@override
1009+
def has_next_page(self) -> bool:
1010+
has_more = self.has_more
1011+
if has_more is not None and has_more is False:
1012+
return False
1013+
1014+
return super().has_next_page()
1015+
1016+
@override
1017+
def next_page_info(self) -> Optional[PageInfo]:
1018+
mcp_configs = self.mcp_configs
1019+
if not mcp_configs:
1020+
return None
1021+
1022+
item = cast(Any, mcp_configs[-1])
1023+
if not isinstance(item, McpConfigsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
1024+
# TODO emit warning log
1025+
return None
1026+
1027+
return PageInfo(params={"starting_after": item.id})
1028+
1029+
1030+
class AsyncMcpConfigsCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
1031+
mcp_configs: List[_T]
1032+
has_more: Optional[bool] = None
1033+
total_count: Optional[int] = None
1034+
1035+
@override
1036+
def _get_page_items(self) -> List[_T]:
1037+
mcp_configs = self.mcp_configs
1038+
if not mcp_configs:
1039+
return []
1040+
return mcp_configs
1041+
1042+
@override
1043+
def has_next_page(self) -> bool:
1044+
has_more = self.has_more
1045+
if has_more is not None and has_more is False:
1046+
return False
1047+
1048+
return super().has_next_page()
1049+
1050+
@override
1051+
def next_page_info(self) -> Optional[PageInfo]:
1052+
mcp_configs = self.mcp_configs
1053+
if not mcp_configs:
1054+
return None
1055+
1056+
item = cast(Any, mcp_configs[-1])
1057+
if not isinstance(item, McpConfigsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
1058+
# TODO emit warning log
1059+
return None
1060+
1061+
return PageInfo(params={"starting_after": item.id})

src/runloop_api_client/resources/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@
5656
BlueprintsResourceWithStreamingResponse,
5757
AsyncBlueprintsResourceWithStreamingResponse,
5858
)
59+
from .mcp_configs import (
60+
McpConfigsResource,
61+
AsyncMcpConfigsResource,
62+
McpConfigsResourceWithRawResponse,
63+
AsyncMcpConfigsResourceWithRawResponse,
64+
McpConfigsResourceWithStreamingResponse,
65+
AsyncMcpConfigsResourceWithStreamingResponse,
66+
)
5967
from .repositories import (
6068
RepositoriesResource,
6169
AsyncRepositoriesResource,
@@ -170,4 +178,10 @@
170178
"AsyncGatewayConfigsResourceWithRawResponse",
171179
"GatewayConfigsResourceWithStreamingResponse",
172180
"AsyncGatewayConfigsResourceWithStreamingResponse",
181+
"McpConfigsResource",
182+
"AsyncMcpConfigsResource",
183+
"McpConfigsResourceWithRawResponse",
184+
"AsyncMcpConfigsResourceWithRawResponse",
185+
"McpConfigsResourceWithStreamingResponse",
186+
"AsyncMcpConfigsResourceWithStreamingResponse",
173187
]

0 commit comments

Comments
 (0)