From c0b84719f4555f1afb72723f770197b6bf903968 Mon Sep 17 00:00:00 2001 From: Javier Dario VEGA BAEZ <66302636+dario-vega@users.noreply.github.com> Date: Thu, 11 Sep 2025 20:47:15 +0200 Subject: [PATCH 1/2] Update dbtools-mcp-server.py The functions use the OCI SDK's list_compartments method without pagination, which by default returns only the first 100 results. get_compartment_by_name "fails" if the compartment name is not within the initial 100 results (e.g a tenancy with +300 compartments) which raise Compartment '{compartment_name}' not found --- src/dbtools-mcp-server/dbtools-mcp-server.py | 59 ++++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/src/dbtools-mcp-server/dbtools-mcp-server.py b/src/dbtools-mcp-server/dbtools-mcp-server.py index cbda940..d1673d7 100755 --- a/src/dbtools-mcp-server/dbtools-mcp-server.py +++ b/src/dbtools-mcp-server/dbtools-mcp-server.py @@ -40,30 +40,65 @@ ) tenancy_id = os.getenv("TENANCY_ID_OVERRIDE", config['tenancy']) +def list_all_compartments_internal(only_one_page: bool , limit = 100 ): + """Internal function to get List all compartments in a tenancy""" + response = identity_client.list_compartments( + compartment_id=tenancy_id, + compartment_id_in_subtree=True, + access_level="ACCESSIBLE", + lifecycle_state="ACTIVE", + limit = limit + ) + compartments = response.data + compartments.append(identity_client.get_compartment(compartment_id=tenancy_id).data) + if only_one_page : # limiting the number of items returned + return compartments + while response.has_next_page: + response = identity_client.list_compartments( + compartment_id=tenancy_id, + compartment_id_in_subtree=True, + access_level="ACCESSIBLE", + lifecycle_state="ACTIVE", + page=response.next_page, + limit = limit + ) + compartments.extend(response.data) + + return compartments + @mcp.tool() def list_all_compartments() -> str: """List all compartments in a tenancy with clear formatting""" - compartments = identity_client.list_compartments(tenancy_id).data - compartments.append(identity_client.get_compartment(compartment_id=tenancy_id).data) - return str(compartments) + return str(list_all_compartments_internal(True)) def get_compartment_by_name(compartment_name: str): """Internal function to get compartment by name with caching""" - compartments = identity_client.list_compartments( - compartment_id=tenancy_id, - compartment_id_in_subtree=True, - access_level="ACCESSIBLE", - lifecycle_state="ACTIVE" - ) - compartments.data.append(identity_client.get_compartment(compartment_id=tenancy_id).data) - + compartments = list_all_compartments_internal(False) # Search for the compartment by name - for compartment in compartments.data: + for compartment in compartments: if compartment.name.lower() == compartment_name.lower(): return compartment return None +def get_compartment_by_name_v2(compartment_name: str): + """Internal function to get compartment by name using the query API""" + search_details = StructuredSearchDetails( + query=f"query compartment resources where displayName = '{compartment_name}'", + type="Structured", + matching_context_type="NONE" + ) + try: + resp = search_client.search_resources(search_details=search_details, tenant_id=config['tenancy']).data + if not hasattr(resp, 'items') or len(resp.items) == 0: + return None + # being compatible with get_compartment_by_name behavior - retrieving a Compartment + compartment = identity_client.get_compartment( compartment_id= resp.items[0].identifier ) + return compartment.data + + except Exception as e: + return None + @mcp.tool() def get_compartment_by_name_tool(name: str) -> str: """Return a compartment matching the provided name""" From 44398f4018d1aeab0e3a031c149d380da5b7aa36 Mon Sep 17 00:00:00 2001 From: Javier Dario VEGA BAEZ <66302636+dario-vega@users.noreply.github.com> Date: Fri, 12 Sep 2025 07:46:25 +0200 Subject: [PATCH 2/2] Update dbtools-mcp-server.py delete get_compartment_by_name_v2 --- src/dbtools-mcp-server/dbtools-mcp-server.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/dbtools-mcp-server/dbtools-mcp-server.py b/src/dbtools-mcp-server/dbtools-mcp-server.py index d1673d7..69e6e9a 100755 --- a/src/dbtools-mcp-server/dbtools-mcp-server.py +++ b/src/dbtools-mcp-server/dbtools-mcp-server.py @@ -81,24 +81,6 @@ def get_compartment_by_name(compartment_name: str): return None -def get_compartment_by_name_v2(compartment_name: str): - """Internal function to get compartment by name using the query API""" - search_details = StructuredSearchDetails( - query=f"query compartment resources where displayName = '{compartment_name}'", - type="Structured", - matching_context_type="NONE" - ) - try: - resp = search_client.search_resources(search_details=search_details, tenant_id=config['tenancy']).data - if not hasattr(resp, 'items') or len(resp.items) == 0: - return None - # being compatible with get_compartment_by_name behavior - retrieving a Compartment - compartment = identity_client.get_compartment( compartment_id= resp.items[0].identifier ) - return compartment.data - - except Exception as e: - return None - @mcp.tool() def get_compartment_by_name_tool(name: str) -> str: """Return a compartment matching the provided name"""