universal-mcp 0.1.24rc23__tar.gz → 0.1.24rc25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/PKG-INFO +1 -1
  2. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/pyproject.toml +1 -1
  3. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/registry.py +15 -3
  4. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/adapters.py +3 -1
  5. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/registry.py +4 -1
  6. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/.gitignore +0 -0
  7. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/LICENSE +0 -0
  8. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/README.md +0 -0
  9. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/__init__.py +0 -0
  10. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/conftest.py +0 -0
  11. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_api_generator.py +0 -0
  12. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_apps.py +0 -0
  13. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_local_registry.py +0 -0
  14. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_localserver.py +0 -0
  15. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_stores.py +0 -0
  16. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_tool.py +0 -0
  17. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/tests/test_tool_manager.py +0 -0
  18. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/README.md +0 -0
  19. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/__init__.py +0 -0
  20. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/client.py +0 -0
  21. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/integration.py +0 -0
  22. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/agentr/server.py +0 -0
  23. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/applications/application.py +0 -0
  24. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/applications/sample/app.py +0 -0
  25. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/applications/utils.py +0 -0
  26. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/cli.py +1 -1
  27. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/client/oauth.py +0 -0
  28. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/client/token_store.py +0 -0
  29. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/client/transport.py +0 -0
  30. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/config.py +0 -0
  31. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/exceptions.py +0 -0
  32. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/integrations/__init__.py +0 -0
  33. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/integrations/integration.py +0 -0
  34. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/logger.py +0 -0
  35. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/py.typed +0 -0
  36. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/servers/__init__.py +0 -0
  37. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/servers/server.py +0 -0
  38. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/stores/__init__.py +0 -0
  39. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/stores/store.py +0 -0
  40. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/__init__.py +0 -0
  41. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/docstring_parser.py +0 -0
  42. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/func_metadata.py +0 -0
  43. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/local_registry.py +0 -0
  44. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/manager.py +0 -0
  45. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/tools/tools.py +0 -0
  46. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/types.py +0 -0
  47. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/__init__.py +0 -0
  48. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/installation.py +0 -0
  49. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/__inti__.py +0 -0
  50. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/api_generator.py +0 -0
  51. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/api_splitter.py +0 -0
  52. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/cli.py +0 -0
  53. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/docgen.py +0 -0
  54. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/filters.py +0 -0
  55. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/openapi.py +0 -0
  56. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/postprocessor.py +0 -0
  57. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/preprocessor.py +0 -0
  58. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/readme.py +0 -0
  59. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/openapi/test_generator.py +0 -0
  60. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/prompts.py +0 -0
  61. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/singleton.py +0 -0
  62. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/templates/README.md.j2 +0 -0
  63. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/templates/api_client.py.j2 +0 -0
  64. {universal_mcp-0.1.24rc23 → universal_mcp-0.1.24rc25}/src/universal_mcp/utils/testing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: universal-mcp
3
- Version: 0.1.24rc23
3
+ Version: 0.1.24rc25
4
4
  Summary: Universal MCP acts as a middle ware for your API applications. It can store your credentials, authorize, enable disable apps on the fly and much more.
5
5
  Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "universal-mcp"
7
- version = "0.1.24-rc23"
7
+ version = "0.1.24-rc25"
8
8
  description = "Universal MCP acts as a middle ware for your API applications. It can store your credentials, authorize, enable disable apps on the fly and much more."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  import base64
2
3
  from typing import Any
3
4
 
@@ -161,8 +162,6 @@ class AgentrRegistry(ToolRegistry):
161
162
  from langchain_core.tools import StructuredTool
162
163
 
163
164
  try:
164
- # Clear tools from tool manager before loading new tools
165
- self.tool_manager.clear_tools()
166
165
  logger.info(f"Exporting tools to {format.value} format")
167
166
  if isinstance(tools, dict):
168
167
  self._load_tools_from_tool_config(tools)
@@ -178,6 +177,7 @@ class AgentrRegistry(ToolRegistry):
178
177
 
179
178
  langchain_tools = []
180
179
  for tool in loaded_tools:
180
+ full_docstring = inspect.getdoc(tool.fn)
181
181
 
182
182
  def create_coroutine(t):
183
183
  async def call_tool_wrapper(**arguments: dict[str, Any]):
@@ -190,7 +190,7 @@ class AgentrRegistry(ToolRegistry):
190
190
 
191
191
  langchain_tool = StructuredTool(
192
192
  name=tool.name,
193
- description=tool.description or "",
193
+ description=full_docstring or tool.description or "",
194
194
  coroutine=create_coroutine(tool),
195
195
  response_format="content",
196
196
  args_schema=tool.parameters,
@@ -237,3 +237,15 @@ class AgentrRegistry(ToolRegistry):
237
237
  async def list_connected_apps(self) -> list[dict[str, Any]]:
238
238
  """List all apps that the user has connected."""
239
239
  return self.client.list_my_connections()
240
+
241
+ async def authorise_app(self, app_id: str) -> str:
242
+ """Authorise an app to connect to the user's account.
243
+
244
+ Args:
245
+ app_id: The ID of the app to authorise
246
+
247
+ Returns:
248
+ String containing authorisation url
249
+ """
250
+ url = self.client.get_authorization_url(app_id=app_id)
251
+ return url
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  from typing import Any
2
3
 
3
4
  from loguru import logger
@@ -90,6 +91,7 @@ def convert_tool_to_langchain_tool(
90
91
  """
91
92
 
92
93
  logger.debug(f"Converting tool '{tool.name}' to LangChain format")
94
+ full_docstring = inspect.getdoc(tool.fn)
93
95
 
94
96
  async def call_tool(
95
97
  **arguments: dict[str, Any],
@@ -101,7 +103,7 @@ def convert_tool_to_langchain_tool(
101
103
 
102
104
  langchain_tool = StructuredTool(
103
105
  name=tool.name,
104
- description=tool.description or "",
106
+ description=full_docstring or tool.description or "",
105
107
  coroutine=call_tool,
106
108
  response_format="content",
107
109
  args_schema=tool.parameters,
@@ -16,6 +16,7 @@ class ToolRegistry(ABC):
16
16
 
17
17
  def __init__(self):
18
18
  """Initializes the registry and its internal tool manager."""
19
+ self._app_instances = {}
19
20
  self.tool_manager = ToolManager()
20
21
  logger.debug(f"{self.__class__.__name__} initialized.")
21
22
 
@@ -75,7 +76,9 @@ class ToolRegistry(ABC):
75
76
  """Helper method to load and register tools for an app."""
76
77
  logger.info(f"Loading tools for app '{app_name}' (tools: {tool_names or 'default'})")
77
78
  try:
78
- app_instance = self._create_app_instance(app_name)
79
+ if app_name not in self._app_instances:
80
+ self._app_instances[app_name] = self._create_app_instance(app_name)
81
+ app_instance = self._app_instances[app_name]
79
82
  self.tool_manager.register_tools_from_app(app_instance, tool_names=tool_names)
80
83
  logger.info(f"Successfully registered tools for app: {app_name}")
81
84
  except Exception as e:
@@ -3,8 +3,8 @@ from pathlib import Path
3
3
  import typer
4
4
  from rich.console import Console
5
5
  from rich.panel import Panel
6
-
7
6
  from universal_mcp.agents.cli import app as client_app
7
+
8
8
  from universal_mcp.utils.installation import (
9
9
  get_supported_apps,
10
10
  install_app,