Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to the Metorial Python SDK will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.4.1] - 2026-09-27

### Changed

- Hardened how the Autogen integration builds tools. `create_autogen_tools()` now constructs each tool wrapper from an explicit `inspect.Signature` instead of assembling and compiling a source string, so tool metadata returned by an MCP server (name, description, and JSON-schema property names) is only ever handled as data. Tool and parameter names are also validated (`^[A-Za-z_][A-Za-z0-9_]{0,63}$`, excluding Python keywords and reserved names); a tool with an unusable name is skipped with a logged warning. Behavior is unchanged for well-formed tools.

## [2.4.0] - 2026-07-05

This release contains breaking API and packaging changes.
Expand Down
20 changes: 20 additions & 0 deletions src/metorial/_generated/magnetar/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,13 @@
# DashboardOrganizationsApiKeysRotateOutput
# DashboardOrganizationsApiKeysUpdateBody
# DashboardOrganizationsApiKeysUpdateOutput
# DashboardOrganizationsEventDeliveriesGetOutput
# DashboardOrganizationsEventDeliveriesListOutput
# DashboardOrganizationsEventDeliveriesListQuery
# DashboardOrganizationsEventDeliveriesRetryOutput
# DashboardOrganizationsEventDeliveryAttemptsGetOutput
# DashboardOrganizationsEventDeliveryAttemptsListOutput
# DashboardOrganizationsEventDeliveryAttemptsListQuery
# DashboardOrganizationsEventDestinationListenersCreateBody
# DashboardOrganizationsEventDestinationListenersCreateOutput
# DashboardOrganizationsEventDestinationListenersDeleteOutput
Expand All @@ -837,6 +844,7 @@
# DashboardOrganizationsEventDestinationsGetOutput
# DashboardOrganizationsEventDestinationsListOutput
# DashboardOrganizationsEventDestinationsListQuery
# DashboardOrganizationsEventDestinationsPingOutput
# DashboardOrganizationsEventDestinationsRotateWebhookSecretOutput
# DashboardOrganizationsEventDestinationsUpdateBody
# DashboardOrganizationsEventDestinationsUpdateOutput
Expand Down Expand Up @@ -867,6 +875,8 @@
# DashboardOrganizationsWebhookEventsListOutput
# InstancesGetOutput
# InstancesListOutput
# ManagementInstanceProvidersTriggersListOutput
# ManagementInstanceProvidersTriggersListQuery
# TestHelpersConsumerOauthAuthorizationsCreateBody
# TestHelpersConsumerOauthAuthorizationsCreateOutput
# TokenGetOutput
Expand Down Expand Up @@ -1689,6 +1699,13 @@
# mapDashboardOrganizationsApiKeysRotateOutput
# mapDashboardOrganizationsApiKeysUpdateBody
# mapDashboardOrganizationsApiKeysUpdateOutput
# mapDashboardOrganizationsEventDeliveriesGetOutput
# mapDashboardOrganizationsEventDeliveriesListOutput
# mapDashboardOrganizationsEventDeliveriesListQuery
# mapDashboardOrganizationsEventDeliveriesRetryOutput
# mapDashboardOrganizationsEventDeliveryAttemptsGetOutput
# mapDashboardOrganizationsEventDeliveryAttemptsListOutput
# mapDashboardOrganizationsEventDeliveryAttemptsListQuery
# mapDashboardOrganizationsEventDestinationListenersCreateBody
# mapDashboardOrganizationsEventDestinationListenersCreateOutput
# mapDashboardOrganizationsEventDestinationListenersDeleteOutput
Expand All @@ -1703,6 +1720,7 @@
# mapDashboardOrganizationsEventDestinationsGetOutput
# mapDashboardOrganizationsEventDestinationsListOutput
# mapDashboardOrganizationsEventDestinationsListQuery
# mapDashboardOrganizationsEventDestinationsPingOutput
# mapDashboardOrganizationsEventDestinationsRotateWebhookSecretOutput
# mapDashboardOrganizationsEventDestinationsUpdateBody
# mapDashboardOrganizationsEventDestinationsUpdateOutput
Expand Down Expand Up @@ -1733,6 +1751,8 @@
# mapDashboardOrganizationsWebhookEventsListOutput
# mapInstancesGetOutput
# mapInstancesListOutput
# mapManagementInstanceProvidersTriggersListOutput
# mapManagementInstanceProvidersTriggersListQuery
# mapTestHelpersConsumerOauthAuthorizationsCreateBody
# mapTestHelpersConsumerOauthAuthorizationsCreateOutput
# mapTokenGetOutput
Expand Down
4 changes: 4 additions & 0 deletions src/metorial/_generated/magnetar/endpoints/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@
from .dashboard_instance_stores_permissions import *
from .dashboard_instance_tool_calls import *
from .dashboard_organizations_api_keys import *
from .dashboard_organizations_event_deliveries import *
from .dashboard_organizations_event_delivery_attempts import *
from .dashboard_organizations_event_destination_listeners import *
from .dashboard_organizations_event_destinations import *
from .dashboard_organizations_events import *
Expand Down Expand Up @@ -347,6 +349,8 @@
from .management_instance_stores_permissions import *
from .management_instance_tool_calls import *
from .management_organization_api_keys import *
from .management_organization_event_deliveries import *
from .management_organization_event_delivery_attempts import *
from .management_organization_event_destination_listeners import *
from .management_organization_event_destinations import *
from .management_organization_events import *
Expand Down
5 changes: 4 additions & 1 deletion src/metorial/_generated/magnetar/endpoints/callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class MetorialCallbacksEndpoint(BaseMetorialEndpoint):
def __init__(self, config: MetorialEndpointManager):
super().__init__(config)

def list(self, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, id: Optional[Union[str, List[str]]] = None, integration_id: Optional[Union[str, List[str]]] = None, integration_provider_id: Optional[Union[str, List[str]]] = None, provider_id: Optional[Union[str, List[str]]] = None, status: Optional[Union[str, List[str]]] = None, created_at: Optional[Dict[str, Any]] = None, updated_at: Optional[Dict[str, Any]] = None) -> DashboardInstanceCallbacksListOutput:
def list(self, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, id: Optional[Union[str, List[str]]] = None, integration_id: Optional[Union[str, List[str]]] = None, integration_provider_id: Optional[Union[str, List[str]]] = None, provider_id: Optional[Union[str, List[str]]] = None, search: Optional[str] = None, status: Optional[Union[str, List[str]]] = None, created_at: Optional[Dict[str, Any]] = None, updated_at: Optional[Dict[str, Any]] = None) -> DashboardInstanceCallbacksListOutput:
"""
List callbacks
Returns a paginated list of callbacks.
Expand All @@ -22,6 +22,7 @@ def list(self, *, limit: Optional[float] = None, after: Optional[str] = None, be
:param integration_id: Optional[Union[str, List[str]]] (optional)
:param integration_provider_id: Optional[Union[str, List[str]]] (optional)
:param provider_id: Optional[Union[str, List[str]]] (optional)
:param search: Optional[str] (optional)
:param status: Optional[Union[str, List[str]]] (optional)
:param created_at: Optional[Dict[str, Any]] (optional)
:param updated_at: Optional[Dict[str, Any]] (optional)
Expand All @@ -47,6 +48,8 @@ def list(self, *, limit: Optional[float] = None, after: Optional[str] = None, be
query_dict["integration_provider_id"] = integration_provider_id
if provider_id is not None:
query_dict["provider_id"] = provider_id
if search is not None:
query_dict["search"] = search
if status is not None:
query_dict["status"] = status
if created_at is not None:
Expand Down
5 changes: 4 additions & 1 deletion src/metorial/_generated/magnetar/endpoints/chats_channels.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class MetorialChatsChannelsEndpoint(BaseMetorialEndpoint):
def __init__(self, config: MetorialEndpointManager):
super().__init__(config)

def list(self, chat_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, workspace_id: Optional[str] = None, type: Optional[str] = None, search: Optional[str] = None) -> DashboardInstanceChatsChannelsListOutput:
def list(self, chat_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, workspace_id: Optional[str] = None, type: Optional[str] = None, search: Optional[str] = None, has_access: Optional[bool] = None) -> DashboardInstanceChatsChannelsListOutput:
"""
List chat channels
Returns a paginated list of channels for a chat.
Expand All @@ -22,6 +22,7 @@ def list(self, chat_id: str, *, limit: Optional[float] = None, after: Optional[s
:param workspace_id: Optional[str] (optional)
:param type: Optional[str] (optional)
:param search: Optional[str] (optional)
:param has_access: Optional[bool] (optional)
:return: DashboardInstanceChatsChannelsListOutput
"""
# Build query parameters from keyword arguments
Expand All @@ -42,6 +43,8 @@ def list(self, chat_id: str, *, limit: Optional[float] = None, after: Optional[s
query_dict["type"] = type
if search is not None:
query_dict["search"] = search
if has_access is not None:
query_dict["has_access"] = has_access

request = MetorialRequest(
path=['chats', chat_id, 'channels'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class MetorialDashboardInstanceCallbacksEndpoint(BaseMetorialEndpoint):
def __init__(self, config: MetorialEndpointManager):
super().__init__(config)

def list(self, instance_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, id: Optional[Union[str, List[str]]] = None, integration_id: Optional[Union[str, List[str]]] = None, integration_provider_id: Optional[Union[str, List[str]]] = None, provider_id: Optional[Union[str, List[str]]] = None, status: Optional[Union[str, List[str]]] = None, created_at: Optional[Dict[str, Any]] = None, updated_at: Optional[Dict[str, Any]] = None) -> DashboardInstanceCallbacksListOutput:
def list(self, instance_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, id: Optional[Union[str, List[str]]] = None, integration_id: Optional[Union[str, List[str]]] = None, integration_provider_id: Optional[Union[str, List[str]]] = None, provider_id: Optional[Union[str, List[str]]] = None, search: Optional[str] = None, status: Optional[Union[str, List[str]]] = None, created_at: Optional[Dict[str, Any]] = None, updated_at: Optional[Dict[str, Any]] = None) -> DashboardInstanceCallbacksListOutput:
"""
List callbacks
Returns a paginated list of callbacks.
Expand All @@ -23,6 +23,7 @@ def list(self, instance_id: str, *, limit: Optional[float] = None, after: Option
:param integration_id: Optional[Union[str, List[str]]] (optional)
:param integration_provider_id: Optional[Union[str, List[str]]] (optional)
:param provider_id: Optional[Union[str, List[str]]] (optional)
:param search: Optional[str] (optional)
:param status: Optional[Union[str, List[str]]] (optional)
:param created_at: Optional[Dict[str, Any]] (optional)
:param updated_at: Optional[Dict[str, Any]] (optional)
Expand All @@ -48,6 +49,8 @@ def list(self, instance_id: str, *, limit: Optional[float] = None, after: Option
query_dict["integration_provider_id"] = integration_provider_id
if provider_id is not None:
query_dict["provider_id"] = provider_id
if search is not None:
query_dict["search"] = search
if status is not None:
query_dict["status"] = status
if created_at is not None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class MetorialDashboardInstanceChatsChannelsEndpoint(BaseMetorialEndpoint):
def __init__(self, config: MetorialEndpointManager):
super().__init__(config)

def list(self, instance_id: str, chat_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, workspace_id: Optional[str] = None, type: Optional[str] = None, search: Optional[str] = None) -> DashboardInstanceChatsChannelsListOutput:
def list(self, instance_id: str, chat_id: str, *, limit: Optional[float] = None, after: Optional[str] = None, before: Optional[str] = None, cursor: Optional[str] = None, order: Optional[str] = None, workspace_id: Optional[str] = None, type: Optional[str] = None, search: Optional[str] = None, has_access: Optional[bool] = None) -> DashboardInstanceChatsChannelsListOutput:
"""
List chat channels
Returns a paginated list of channels for a chat.
Expand All @@ -23,6 +23,7 @@ def list(self, instance_id: str, chat_id: str, *, limit: Optional[float] = None,
:param workspace_id: Optional[str] (optional)
:param type: Optional[str] (optional)
:param search: Optional[str] (optional)
:param has_access: Optional[bool] (optional)
:return: DashboardInstanceChatsChannelsListOutput
"""
# Build query parameters from keyword arguments
Expand All @@ -43,6 +44,8 @@ def list(self, instance_id: str, chat_id: str, *, limit: Optional[float] = None,
query_dict["type"] = type
if search is not None:
query_dict["search"] = search
if has_access is not None:
query_dict["has_access"] = has_access

request = MetorialRequest(
path=['dashboard', 'instances', instance_id, 'chats', chat_id, 'channels'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def get(self, instance_id: str, integration_id: str) -> DashboardInstanceIntegra
)
return self._get(request).transform(mapDashboardInstanceIntegrationsGetOutput.from_dict)

def create(self, instance_id: str, *, name: str, description: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, use_integration_name_in_tool_names: Optional[bool] = None, can_attach_custom_tool_filters: Optional[bool] = None, can_attach_custom_provider_config: Optional[bool] = None, can_override_tool_filters: Optional[bool] = None) -> DashboardInstanceIntegrationsCreateOutput:
def create(self, instance_id: str, *, name: str, description: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, use_integration_name_in_tool_names: Optional[bool] = None, can_attach_custom_tool_filters: Optional[bool] = None, can_attach_custom_provider_config: Optional[bool] = None, can_override_tool_filters: Optional[bool] = None, enable_callback_tools: Optional[bool] = None) -> DashboardInstanceIntegrationsCreateOutput:
"""
Create integration
Creates a new integration.
Expand All @@ -88,6 +88,7 @@ def create(self, instance_id: str, *, name: str, description: Optional[str] = No
:param can_attach_custom_tool_filters: Optional[bool] (optional)
:param can_attach_custom_provider_config: Optional[bool] (optional)
:param can_override_tool_filters: Optional[bool] (optional)
:param enable_callback_tools: Optional[bool] (optional)
:return: DashboardInstanceIntegrationsCreateOutput
"""
# Build body parameters from keyword arguments
Expand All @@ -105,14 +106,16 @@ def create(self, instance_id: str, *, name: str, description: Optional[str] = No
body_dict["can_attach_custom_provider_config"] = can_attach_custom_provider_config
if can_override_tool_filters is not None:
body_dict["can_override_tool_filters"] = can_override_tool_filters
if enable_callback_tools is not None:
body_dict["enable_callback_tools"] = enable_callback_tools

request = MetorialRequest(
path=['dashboard', 'instances', instance_id, 'integrations'],
body=body_dict
)
return self._post(request).transform(mapDashboardInstanceIntegrationsCreateOutput.from_dict)

def update(self, instance_id: str, integration_id: str, *, name: Optional[str] = None, description: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, use_integration_name_in_tool_names: Optional[bool] = None, can_attach_custom_tool_filters: Optional[bool] = None, can_attach_custom_provider_config: Optional[bool] = None, can_override_tool_filters: Optional[bool] = None) -> DashboardInstanceIntegrationsUpdateOutput:
def update(self, instance_id: str, integration_id: str, *, name: Optional[str] = None, description: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, use_integration_name_in_tool_names: Optional[bool] = None, can_attach_custom_tool_filters: Optional[bool] = None, can_attach_custom_provider_config: Optional[bool] = None, can_override_tool_filters: Optional[bool] = None, enable_callback_tools: Optional[bool] = None) -> DashboardInstanceIntegrationsUpdateOutput:
"""
Update integration
Updates a specific integration.
Expand All @@ -126,6 +129,7 @@ def update(self, instance_id: str, integration_id: str, *, name: Optional[str] =
:param can_attach_custom_tool_filters: Optional[bool] (optional)
:param can_attach_custom_provider_config: Optional[bool] (optional)
:param can_override_tool_filters: Optional[bool] (optional)
:param enable_callback_tools: Optional[bool] (optional)
:return: DashboardInstanceIntegrationsUpdateOutput
"""
# Build body parameters from keyword arguments
Expand All @@ -144,6 +148,8 @@ def update(self, instance_id: str, integration_id: str, *, name: Optional[str] =
body_dict["can_attach_custom_provider_config"] = can_attach_custom_provider_config
if can_override_tool_filters is not None:
body_dict["can_override_tool_filters"] = can_override_tool_filters
if enable_callback_tools is not None:
body_dict["enable_callback_tools"] = enable_callback_tools

request = MetorialRequest(
path=['dashboard', 'instances', instance_id, 'integrations', integration_id],
Expand Down
Loading
Loading