universal-mcp 0.1.24rc9__tar.gz → 0.1.24rc10__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 (89) hide show
  1. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/PKG-INFO +1 -1
  2. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/pyproject.toml +1 -1
  3. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/__main__.py +3 -5
  4. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/graph.py +17 -24
  5. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/state.py +0 -1
  6. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/base.py +4 -0
  7. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/.gitignore +0 -0
  8. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/LICENSE +0 -0
  9. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/README.md +0 -0
  10. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/__init__.py +0 -0
  11. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/conftest.py +0 -0
  12. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_api_generator.py +0 -0
  13. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_api_integration.py +0 -0
  14. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_applications.py +0 -0
  15. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_localserver.py +0 -0
  16. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_stores.py +0 -0
  17. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_tool.py +0 -0
  18. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_tool_manager.py +0 -0
  19. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/tests/test_zenquotes.py +0 -0
  20. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/__init__.py +0 -0
  21. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/README.md +0 -0
  22. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/__init__.py +0 -0
  23. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/client.py +0 -0
  24. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/integration.py +0 -0
  25. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/registry.py +0 -0
  26. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agentr/server.py +0 -0
  27. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/__init__.py +0 -0
  28. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/auto.py +0 -0
  29. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/__init__.py +0 -0
  30. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/context.py +0 -0
  31. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/prompts.py +0 -0
  32. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/studio.py +0 -0
  33. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/autoagent/utils.py +0 -0
  34. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/cli.py +0 -0
  35. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/codeact/__init__.py +0 -0
  36. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/codeact/sandbox.py +0 -0
  37. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/codeact/test.py +0 -0
  38. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/codeact/utils.py +0 -0
  39. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/hil.py +0 -0
  40. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/llm.py +0 -0
  41. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/react.py +0 -0
  42. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/simple.py +0 -0
  43. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/tools.py +0 -0
  44. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/agents/utils.py +0 -0
  45. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/analytics.py +0 -0
  46. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/applications/__init__.py +0 -0
  47. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/applications/application.py +0 -0
  48. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/applications/sample/app.py +0 -0
  49. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/cli.py +0 -0
  50. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/client/oauth.py +0 -0
  51. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/client/token_store.py +0 -0
  52. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/client/transport.py +0 -0
  53. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/config.py +0 -0
  54. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/exceptions.py +0 -0
  55. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/integrations/__init__.py +0 -0
  56. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/integrations/integration.py +0 -0
  57. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/logger.py +0 -0
  58. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/py.typed +0 -0
  59. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/servers/__init__.py +0 -0
  60. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/servers/server.py +0 -0
  61. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/stores/__init__.py +0 -0
  62. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/stores/store.py +0 -0
  63. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/__init__.py +0 -0
  64. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/adapters.py +0 -0
  65. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/docstring_parser.py +0 -0
  66. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/func_metadata.py +0 -0
  67. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/manager.py +0 -0
  68. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/registry.py +0 -0
  69. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/tools/tools.py +0 -0
  70. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/types.py +0 -0
  71. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/__init__.py +0 -0
  72. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/common.py +0 -0
  73. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/installation.py +0 -0
  74. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/__inti__.py +0 -0
  75. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/api_generator.py +0 -0
  76. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/api_splitter.py +0 -0
  77. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/cli.py +0 -0
  78. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/docgen.py +0 -0
  79. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/filters.py +0 -0
  80. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/openapi.py +0 -0
  81. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/postprocessor.py +0 -0
  82. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/preprocessor.py +0 -0
  83. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/readme.py +0 -0
  84. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/openapi/test_generator.py +0 -0
  85. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/prompts.py +0 -0
  86. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/singleton.py +0 -0
  87. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/templates/README.md.j2 +0 -0
  88. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/src/universal_mcp/utils/templates/api_client.py.j2 +0 -0
  89. {universal_mcp-0.1.24rc9 → universal_mcp-0.1.24rc10}/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.24rc9
3
+ Version: 0.1.24rc10
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-rc9"
7
+ version = "0.1.24-rc10"
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 = [
@@ -8,13 +8,11 @@ async def main():
8
8
  agent = AutoAgent(
9
9
  name="autoagent",
10
10
  instructions="You are a helpful assistant that can use tools to help the user.",
11
- model="anthropic/claude-4-sonnet-20250514",
11
+ model="azure/gpt-4.1",
12
12
  tool_registry=AgentrRegistry(),
13
13
  )
14
- result = await agent.invoke(
15
- user_input="Send an email to Manoj from my google mail account, manoj@agentr.dev, with the subject 'Hello from auto agent' and the body 'testing'"
16
- )
17
- print(result)
14
+ await agent.run_interactive()
15
+ # print(result)
18
16
 
19
17
 
20
18
  if __name__ == "__main__":
@@ -33,12 +33,11 @@ async def build_graph(tool_registry: ToolRegistry, instructions: str = ""):
33
33
  """Ask the user a question. Use this tool to ask the user for any missing information for performing a task, or when you have multiple apps to choose from for performing a task."""
34
34
  full_question = question
35
35
  return f"ASKING_USER: {full_question}"
36
-
36
+
37
37
  @tool()
38
38
  async def load_tools(tools: list[str]) -> list[str]:
39
39
  """Choose the tools you want to use by passing their tool ids. Loads the tools for the chosen tools and returns the tool ids."""
40
40
  return tools
41
-
42
41
 
43
42
  async def call_model(
44
43
  state: State,
@@ -48,28 +47,26 @@ async def build_graph(tool_registry: ToolRegistry, instructions: str = ""):
48
47
  app_ids = await tool_registry.list_all_apps()
49
48
  connections = tool_registry.client.list_my_connections()
50
49
  connection_ids = set([connection["app_id"] for connection in connections])
51
- connected_apps = [app['id'] for app in app_ids if app["id"] in connection_ids]
52
- unconnected_apps = [app['id'] for app in app_ids if app["id"] not in connection_ids]
53
- app_id_descriptions = "These are the apps connected to the user's account:\n" + "\n".join([f"{app}" for app in connected_apps])
50
+ connected_apps = [app["id"] for app in app_ids if app["id"] in connection_ids]
51
+ unconnected_apps = [app["id"] for app in app_ids if app["id"] not in connection_ids]
52
+ app_id_descriptions = "These are the apps connected to the user's account:\n" + "\n".join(
53
+ [f"{app}" for app in connected_apps]
54
+ )
54
55
  if unconnected_apps:
55
- app_id_descriptions += "\n\nOther (not connected) apps: " + "\n".join([f"{app}" for app in unconnected_apps])
56
+ app_id_descriptions += "\n\nOther (not connected) apps: " + "\n".join(
57
+ [f"{app}" for app in unconnected_apps]
58
+ )
56
59
  print(app_id_descriptions)
57
60
  system_prompt = system_prompt.format(system_time=datetime.now(tz=UTC).isoformat(), app_ids=app_id_descriptions)
58
-
61
+
59
62
  messages = [{"role": "system", "content": system_prompt + "\n" + instructions}, *state["messages"]]
60
63
  model = load_chat_model(runtime.context.model)
61
64
  # Load tools from tool registry
62
65
  loaded_tools = await tool_registry.export_tools(tools=state["selected_tool_ids"], format=ToolFormat.LANGCHAIN)
63
66
  model_with_tools = model.bind_tools([search_tools, ask_user, load_tools, *loaded_tools], tool_choice="auto")
64
67
  response_raw = model_with_tools.invoke(messages)
65
- token_usage = state.get("token_usage", {})
66
- for key in ["input_tokens", "output_tokens", "total_tokens"]:
67
- if key in token_usage:
68
- token_usage[key] += response_raw.usage_metadata[key]
69
- else:
70
- token_usage[key] = response_raw.usage_metadata[key]
71
- response = cast(AIMessage, response_raw)
72
- return {"messages": [response], "token_usage": token_usage}
68
+ response = cast(AIMessage, response_raw)
69
+ return {"messages": [response]}
73
70
 
74
71
  # Define the conditional edge that determines whether to continue or not
75
72
  def should_continue(state: State):
@@ -108,12 +105,12 @@ async def build_graph(tool_registry: ToolRegistry, instructions: str = ""):
108
105
  tools = await search_tools.ainvoke(tool_call["args"])
109
106
  outputs.append(
110
107
  ToolMessage(
111
- content=json.dumps(tools)+"\n\nUse the load_tools tool to load the tools you want to use.",
108
+ content=json.dumps(tools) + "\n\nUse the load_tools tool to load the tools you want to use.",
112
109
  name=tool_call["name"],
113
110
  tool_call_id=tool_call["id"],
114
111
  )
115
112
  )
116
-
113
+
117
114
  elif tool_call["name"] == load_tools.name:
118
115
  tool_ids = await load_tools.ainvoke(tool_call["args"])
119
116
  print(tool_ids)
@@ -132,23 +129,19 @@ async def build_graph(tool_registry: ToolRegistry, instructions: str = ""):
132
129
  ToolMessage(
133
130
  content=json.dumps(tool_result),
134
131
  name=tool_call["name"],
135
- tool_call_id=tool_call["id"],
136
- )
132
+ tool_call_id=tool_call["id"],
137
133
  )
134
+ )
138
135
  except Exception as e:
139
136
  outputs.append(
140
137
  ToolMessage(
141
- content=json.dumps("Error: "+str(e)),
138
+ content=json.dumps("Error: " + str(e)),
142
139
  name=tool_call["name"],
143
140
  tool_call_id=tool_call["id"],
144
141
  )
145
142
  )
146
143
  return {"messages": outputs, "selected_tool_ids": tool_ids}
147
144
 
148
-
149
-
150
-
151
-
152
145
  builder = StateGraph(State, context_schema=Context)
153
146
 
154
147
  builder.add_node("agent", call_model)
@@ -25,4 +25,3 @@ def _enqueue(left: list, right: list) -> list:
25
25
 
26
26
  class State(AgentState):
27
27
  selected_tool_ids: Annotated[list[str], _enqueue]
28
- token_usage: dict[str, int]
@@ -33,6 +33,7 @@ class BaseAgent:
33
33
  async for event, _ in self._graph.astream(
34
34
  {"messages": [{"role": "user", "content": user_input}]},
35
35
  config={"configurable": {"thread_id": thread_id}},
36
+ context={"system_prompt": self.instructions, "model": self.model},
36
37
  stream_mode="messages",
37
38
  ):
38
39
  event = cast(AIMessageChunk, event)
@@ -101,4 +102,7 @@ class BaseAgent:
101
102
  self.cli.display_info("\nGoodbye! 👋")
102
103
  break
103
104
  except Exception as e:
105
+ import traceback
106
+
107
+ traceback.print_exc()
104
108
  self.cli.display_error(f"An error occurred: {str(e)}")