meta_mcp.mcp
============

.. py:module:: meta_mcp.mcp


Attributes
----------

.. autoapisummary::

   meta_mcp.mcp._connect_on_startup
   meta_mcp.mcp._registry_json
   meta_mcp.mcp._registry_mcp_json
   meta_mcp.mcp._registry_mcp_tools_json
   meta_mcp.mcp.mcp


Classes
-------

.. autoapisummary::

   meta_mcp.mcp.MetaFastMCPDynamic


Module Contents
---------------

.. py:class:: MetaFastMCPDynamic(registry_json: str, registry_mcp_json: str, registry_mcp_tools_json: str, connect_on_startup: bool = False, *, name: str = 'meta-mcp', **kwargs: Any)

   Bases: :py:obj:`fastmcp.FastMCP`


   FastMCP subclass that manages shared MCP client sessions with dynamic client management.


   .. py:attribute:: _connect_on_startup
      :value: False



   .. py:attribute:: _registry_config


   .. py:attribute:: _registry_info


   .. py:attribute:: _registry_mcp_tools


   .. py:attribute:: _servers
      :type:  dict[str, dict[str, Any]]


   .. py:attribute:: _tools
      :type:  dict[str, dict[str, dict[str, Any]]]


   .. py:attribute:: _lifespan_clients
      :type:  dict[str, fastmcp.Client]


   .. py:attribute:: _dynamic_clients
      :type:  dict[str, fastmcp.Client]


   .. py:attribute:: _dynamic_client_stacks
      :type:  dict[str, contextlib.AsyncExitStack]


   .. py:method:: _filter_and_setup_registry(registry_df)


   .. py:method:: _update_tools_from_client(server_name: str, client: fastmcp.Client) -> None
      :async:


      Update tool metadata for a server from a connected client.



   .. py:method:: _lifespan(_app: fastmcp.FastMCP)
      :async:



   .. py:method:: add_client(server_name: str, server_config: dict[str, Any]) -> None
      :async:


      Add a new client at runtime.

      Args:
          server_name: Name to identify this server
          server_config: MCP server configuration dict (should have 'mcpServers' key)

      :raises RuntimeError: If clients are not initialized or server already exists:
      :raises Exception: If client connection fails:



   .. py:method:: remove_client(server_name: str) -> None
      :async:


      Remove a dynamically-managed client at runtime.

      Args:
          server_name: Name of the server to remove

      :raises RuntimeError: If server doesn't exist or is lifespan-managed:



   .. py:method:: _cleanup_all_dynamic_clients() -> None
      :async:


      Clean up all dynamically-managed clients.



   .. py:method:: get_client(server_name: str) -> fastmcp.Client

      Get a client by name (from either pool).

      :param server_name: Name of the server.
      :type server_name: str

      :returns: Client instance.
      :rtype: Client

      :raises RuntimeError: If clients are not initialized or server doesn't exist:



   .. py:method:: get_clients() -> dict[str, fastmcp.Client]

      Get all clients (both lifespan and dynamic).

      :returns: Combined dictionary of all clients.
      :rtype: dict[str, Client]

      :raises RuntimeError: If clients are not initialized:



   .. py:method:: get_lifespan_clients() -> dict[str, fastmcp.Client]

      Get only lifespan-managed clients.

      :returns: Dictionary of lifespan-managed clients.
      :rtype: dict[str, Client]

      :raises RuntimeError: If clients are not initialized:



   .. py:method:: get_dynamic_clients() -> dict[str, fastmcp.Client]

      Get only dynamically-managed clients.

      :returns: Dictionary of dynamically-managed clients.
      :rtype: dict[str, Client]



   .. py:method:: connect_to_server(server_name: str) -> None
      :async:


      Connect to a server from the registry.



   .. py:method:: disconnect_from_server(server_name: str) -> None
      :async:


      Disconnect from a dynamically-connected server.



.. py:data:: _connect_on_startup

.. py:data:: _registry_json

.. py:data:: _registry_mcp_json

.. py:data:: _registry_mcp_tools_json

.. py:data:: mcp
   :type:  MetaFastMCPDynamic

