universal-mcp-agents 0.1.13__py3-none-any.whl → 0.1.15__py3-none-any.whl

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.

Potentially problematic release.


This version of universal-mcp-agents might be problematic. Click here for more details.

Files changed (49) hide show
  1. universal_mcp/agents/__init__.py +1 -1
  2. universal_mcp/agents/base.py +3 -0
  3. universal_mcp/agents/bigtool/__init__.py +1 -1
  4. universal_mcp/agents/bigtool/__main__.py +4 -3
  5. universal_mcp/agents/bigtool/agent.py +3 -2
  6. universal_mcp/agents/bigtool/graph.py +68 -31
  7. universal_mcp/agents/bigtool/prompts.py +2 -2
  8. universal_mcp/agents/bigtool/tools.py +17 -4
  9. universal_mcp/agents/builder/__main__.py +129 -28
  10. universal_mcp/agents/builder/builder.py +149 -161
  11. universal_mcp/agents/builder/helper.py +71 -0
  12. universal_mcp/agents/builder/prompts.py +94 -160
  13. universal_mcp/agents/codeact0/__init__.py +2 -1
  14. universal_mcp/agents/codeact0/agent.py +13 -5
  15. universal_mcp/agents/codeact0/langgraph_agent.py +14 -0
  16. universal_mcp/agents/codeact0/llm_tool.py +1 -2
  17. universal_mcp/agents/codeact0/playbook_agent.py +353 -0
  18. universal_mcp/agents/codeact0/prompts.py +126 -41
  19. universal_mcp/agents/codeact0/sandbox.py +43 -32
  20. universal_mcp/agents/codeact0/state.py +27 -3
  21. universal_mcp/agents/codeact0/tools.py +180 -0
  22. universal_mcp/agents/codeact0/utils.py +89 -75
  23. universal_mcp/agents/shared/__main__.py +44 -0
  24. universal_mcp/agents/shared/prompts.py +49 -98
  25. universal_mcp/agents/shared/tool_node.py +160 -176
  26. universal_mcp/agents/utils.py +71 -0
  27. universal_mcp/applications/ui/app.py +2 -2
  28. {universal_mcp_agents-0.1.13.dist-info → universal_mcp_agents-0.1.15.dist-info}/METADATA +3 -3
  29. universal_mcp_agents-0.1.15.dist-info/RECORD +50 -0
  30. universal_mcp/agents/codeact0/usecases/1-unsubscribe.yaml +0 -4
  31. universal_mcp/agents/codeact0/usecases/10-reddit2.yaml +0 -10
  32. universal_mcp/agents/codeact0/usecases/11-github.yaml +0 -13
  33. universal_mcp/agents/codeact0/usecases/2-reddit.yaml +0 -27
  34. universal_mcp/agents/codeact0/usecases/2.1-instructions.md +0 -81
  35. universal_mcp/agents/codeact0/usecases/2.2-instructions.md +0 -71
  36. universal_mcp/agents/codeact0/usecases/3-earnings.yaml +0 -4
  37. universal_mcp/agents/codeact0/usecases/4-maps.yaml +0 -41
  38. universal_mcp/agents/codeact0/usecases/5-gmailreply.yaml +0 -8
  39. universal_mcp/agents/codeact0/usecases/6-contract.yaml +0 -6
  40. universal_mcp/agents/codeact0/usecases/7-overnight.yaml +0 -14
  41. universal_mcp/agents/codeact0/usecases/8-sheets_chart.yaml +0 -25
  42. universal_mcp/agents/codeact0/usecases/9-learning.yaml +0 -9
  43. universal_mcp/agents/planner/__init__.py +0 -51
  44. universal_mcp/agents/planner/__main__.py +0 -28
  45. universal_mcp/agents/planner/graph.py +0 -85
  46. universal_mcp/agents/planner/prompts.py +0 -14
  47. universal_mcp/agents/planner/state.py +0 -11
  48. universal_mcp_agents-0.1.13.dist-info/RECORD +0 -63
  49. {universal_mcp_agents-0.1.13.dist-info → universal_mcp_agents-0.1.15.dist-info}/WHEEL +0 -0
@@ -1,8 +1,13 @@
1
1
  import json
2
2
  from contextlib import contextmanager
3
+ from http import HTTPStatus
3
4
 
5
+ import httpx
6
+ import requests
4
7
  from langchain_core.messages.base import BaseMessage
5
8
  from loguru import logger
9
+ from pydantic import ValidationError
10
+ from requests import JSONDecodeError
6
11
  from rich.console import Console
7
12
  from rich.live import Live
8
13
  from rich.markdown import Markdown
@@ -143,3 +148,69 @@ def get_message_text(message: BaseMessage):
143
148
  logger.error(f"Error getting message text: {e}")
144
149
  logger.error(f"Message: {message}")
145
150
  raise e
151
+
152
+
153
+ def filter_retry_on(exc: Exception) -> bool:
154
+ # Transient local/network issues and parsing hiccups
155
+ if isinstance(
156
+ exc,
157
+ (
158
+ TimeoutError,
159
+ ConnectionError,
160
+ JSONDecodeError,
161
+ ValidationError,
162
+ ),
163
+ ):
164
+ return True
165
+
166
+ # httpx transient request-layer errors
167
+ if isinstance(
168
+ exc,
169
+ (
170
+ httpx.TimeoutException,
171
+ httpx.ConnectError,
172
+ httpx.ReadError,
173
+ ),
174
+ ):
175
+ return True
176
+
177
+ if isinstance(exc, (requests.Timeout, requests.ConnectionError)):
178
+ return True
179
+
180
+ # HTTP status based retries: 408 (timeout), 429 (rate limit), and 5xx
181
+ if isinstance(exc, httpx.HTTPStatusError):
182
+ status = exc.response.status_code
183
+ return (
184
+ status in {408, 429}
185
+ or HTTPStatus.INTERNAL_SERVER_ERROR.value <= status <= HTTPStatus.NETWORK_AUTHENTICATION_REQUIRED.value
186
+ )
187
+ if isinstance(exc, requests.HTTPError):
188
+ if exc.response is None:
189
+ return True
190
+ status = exc.response.status_code
191
+ return (
192
+ status in {408, 429}
193
+ or HTTPStatus.INTERNAL_SERVER_ERROR.value <= status <= HTTPStatus.NETWORK_AUTHENTICATION_REQUIRED.value
194
+ )
195
+
196
+ if isinstance(
197
+ exc,
198
+ (
199
+ ValueError,
200
+ TypeError,
201
+ ArithmeticError,
202
+ ImportError,
203
+ LookupError,
204
+ NameError,
205
+ SyntaxError,
206
+ RuntimeError,
207
+ ReferenceError,
208
+ StopIteration,
209
+ StopAsyncIteration,
210
+ OSError,
211
+ ),
212
+ ):
213
+ return False
214
+
215
+ # Default: do not retry unknown exceptions
216
+ return False
@@ -1,10 +1,10 @@
1
1
  import os
2
2
  from typing import Any, Literal, TypedDict
3
3
 
4
- from dotenv import load_dotenv
5
4
  import httpx
6
- from universal_mcp.applications.application import BaseApplication
5
+ from dotenv import load_dotenv
7
6
  from markitdown import MarkItDown
7
+ from universal_mcp.applications.application import BaseApplication
8
8
 
9
9
  load_dotenv()
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: universal-mcp-agents
3
- Version: 0.1.13
3
+ Version: 0.1.15
4
4
  Summary: Add your description here
5
5
  Project-URL: Homepage, https://github.com/universal-mcp/applications
6
6
  Project-URL: Repository, https://github.com/universal-mcp/applications
@@ -12,8 +12,8 @@ Requires-Dist: langchain-google-genai>=2.1.10
12
12
  Requires-Dist: langchain-openai>=0.3.32
13
13
  Requires-Dist: langgraph>=0.6.6
14
14
  Requires-Dist: typer>=0.17.4
15
- Requires-Dist: universal-mcp-applications>=0.1.14
16
- Requires-Dist: universal-mcp>=0.1.24rc21
15
+ Requires-Dist: universal-mcp-applications>=0.1.24
16
+ Requires-Dist: universal-mcp>=0.1.24rc25
17
17
  Provides-Extra: dev
18
18
  Requires-Dist: pre-commit; extra == 'dev'
19
19
  Requires-Dist: ruff; extra == 'dev'
@@ -0,0 +1,50 @@
1
+ universal_mcp/agents/__init__.py,sha256=5aE4zVgem6ehzfRrt5QqE6gLi7949vySZAn_uFuaU7Q,1252
2
+ universal_mcp/agents/base.py,sha256=GmagwWFJdPpp_yLeAfsrr4fu-zzxh7CgIlBJbTgFgWM,7072
3
+ universal_mcp/agents/cli.py,sha256=AG9e4iSX3GazT537573YrYT1wSaZYOr42rrYQ7xP3YA,1016
4
+ universal_mcp/agents/hil.py,sha256=_5PCK6q0goGm8qylJq44aSp2MadP-yCPvhOJYKqWLMo,3808
5
+ universal_mcp/agents/llm.py,sha256=hVRwjZs3MHl5_3BWedmurs2Jt1oZDfFX0Zj9F8KH7fk,1787
6
+ universal_mcp/agents/react.py,sha256=8XQvJ0HLVgc-K0qn9Ml48WGcgUGuIKtL67HatlT6Da0,3334
7
+ universal_mcp/agents/simple.py,sha256=NSATg5TWzsRNS7V3LFiDG28WSOCIwCdcC1g7NRwg2nM,2095
8
+ universal_mcp/agents/utils.py,sha256=lGeDam3Efcrxv6dve31LQonBtwkSpNmBuoNXap_TqaQ,7128
9
+ universal_mcp/agents/bigtool/__init__.py,sha256=mZG8dsaCVyKlm82otxtiTA225GIFLUCUUYPEIPF24uw,2299
10
+ universal_mcp/agents/bigtool/__main__.py,sha256=0i-fbd2yQ90qa8n2nM3luqoJVN9Reh5HZXR5oK7SAck,445
11
+ universal_mcp/agents/bigtool/agent.py,sha256=mtCDNN8WjE2hjJjooDqusmbferKBHeJMHrhXUPUWaVc,252
12
+ universal_mcp/agents/bigtool/context.py,sha256=ny7gd-vvVpUOYAeQbAEUT0A6Vm6Nn2qGywxTzPBzYFg,929
13
+ universal_mcp/agents/bigtool/graph.py,sha256=2Sy0dtevTWeT3hJDq4BDerZFvk_zJqx15j8VH2XLq8Y,5848
14
+ universal_mcp/agents/bigtool/prompts.py,sha256=Joi5mCzZX63aM_6eBrMOKuNRHjTkceVIibSsGBGqhYE,2041
15
+ universal_mcp/agents/bigtool/state.py,sha256=TQeGZD99okclkoCh5oz-VYIlEsC9yLQyDpnBnm7QCN8,759
16
+ universal_mcp/agents/bigtool/tools.py,sha256=-u80ta6xEaqzEMSzDVe3QZiTZm3YlgLkBD8WTghzClw,6315
17
+ universal_mcp/agents/builder/__main__.py,sha256=VJDJOr-dJJerT53ibh5LVqIsMJ0m0sG2UlzFB784pKw,11680
18
+ universal_mcp/agents/builder/builder.py,sha256=mh3MZpMVB1FE1DWzvMW9NnfiaF145VGn8cJzKSYUlzY,8587
19
+ universal_mcp/agents/builder/helper.py,sha256=8igR1b3Gy_N2u3WxHYKIWzvw7F5BMnfpO2IU74v6vsw,2680
20
+ universal_mcp/agents/builder/prompts.py,sha256=8Xs6uzTUHguDRngVMLak3lkXFkk2VV_uQXaDllzP5cI,4670
21
+ universal_mcp/agents/builder/state.py,sha256=7DeWllxfN-yD6cd9wJ3KIgjO8TctkJvVjAbZT8W_zqk,922
22
+ universal_mcp/agents/codeact/__init__.py,sha256=rLE8gvOo5H4YSr71DRq76b3RV3uuotxuAy_VnBVaVwk,60
23
+ universal_mcp/agents/codeact/__main__.py,sha256=W2cHXRwH1dZG3ETIkMwUqA_d62K3IctHP-FDZWDjxdw,1067
24
+ universal_mcp/agents/codeact/agent.py,sha256=sKZWokTHcuL68Y6SNyaaHe6_XkWxaIq36TrNmPJfQto,9762
25
+ universal_mcp/agents/codeact/models.py,sha256=2fdAcF5bxWDpljjEwDEdPBflTMShSPwwncHrphRjsYg,222
26
+ universal_mcp/agents/codeact/prompts.py,sha256=EMI-imnd0Ps0Bd2FOvSqgiicvvtFFu0MF9s93PiC_3k,4493
27
+ universal_mcp/agents/codeact/sandbox.py,sha256=NjN6ISj8psFtHf8V0w24ChJdUMUWkq7OrlbHdzm4wBc,2299
28
+ universal_mcp/agents/codeact/state.py,sha256=WTPfpxDlGRnlr5tZuXMg_KU7GS7TZbnrIKslOvZLbQI,565
29
+ universal_mcp/agents/codeact/utils.py,sha256=JUbT_HYGS_D1BzmzoVpORIe7SGur1KgJguTZ_1tZ4JY,1918
30
+ universal_mcp/agents/codeact0/__init__.py,sha256=ebKkpgg-0UnsvDtagEJ2tMer1VsfhmEE5KJcFzUk9fU,133
31
+ universal_mcp/agents/codeact0/__main__.py,sha256=V2wLWW9ym3rtiSvPEs-N0Mki7G5dYHzV5dAsAoF-ygQ,1148
32
+ universal_mcp/agents/codeact0/agent.py,sha256=9BInAQr3csES-XHSscmeJlYJ3-wQUHPvLOf-6wFILUU,6695
33
+ universal_mcp/agents/codeact0/config.py,sha256=H-1woj_nhSDwf15F63WYn723y4qlRefXzGxuH81uYF0,2215
34
+ universal_mcp/agents/codeact0/langgraph_agent.py,sha256=ehjMV_Z1118pCFWB_Sa5H7XnUp0udsbUHjfjXjhIQM8,435
35
+ universal_mcp/agents/codeact0/llm_tool.py,sha256=I7QIlgZZbzBdxHuNUYODA28Z7xqWgYz5v5qWSWqB0rE,13781
36
+ universal_mcp/agents/codeact0/playbook_agent.py,sha256=oj8zP-c8rObzjAlS-lkP-pl3xleIr0fCJ_ENtn-C_OM,17435
37
+ universal_mcp/agents/codeact0/prompts.py,sha256=j8HxA3Rp-EZsms9qMBcRmFrUjeySrG1IWjqrNFXZZn8,9457
38
+ universal_mcp/agents/codeact0/sandbox.py,sha256=zMgHrWnQYkSkJb2MzfXvT3euCc4hvqzBE_EbX2_iLxA,3142
39
+ universal_mcp/agents/codeact0/state.py,sha256=Qcr1whST3J8v7w0opnKSfOG9u5gRtxAzPs2NFhaAhJE,1199
40
+ universal_mcp/agents/codeact0/tools.py,sha256=emfBLA3eChQ5B1wirOWf5RWHMy3OIRDQYnN5h5OPqFk,7401
41
+ universal_mcp/agents/codeact0/utils.py,sha256=s1SfVrC1_UePxYSIL9zt-cG0xhwzFPuViyLl2Xj-45c,15943
42
+ universal_mcp/agents/shared/__main__.py,sha256=XxH5qGDpgFWfq7fwQfgKULXGiUgeTp_YKfcxftuVZq8,1452
43
+ universal_mcp/agents/shared/prompts.py,sha256=yjP3zbbuKi87qCj21qwTTicz8TqtkKgnyGSeEjMu3ho,3761
44
+ universal_mcp/agents/shared/tool_node.py,sha256=DC9F-Ri28Pam0u3sXWNODVgmj9PtAEUb5qP1qOoGgfs,9169
45
+ universal_mcp/applications/llm/__init__.py,sha256=xnpxq4Wl_pevvwtSUtEwcty8_d61ywO1V2YnEXyCREY,46
46
+ universal_mcp/applications/llm/app.py,sha256=iNLU6z2LRZc01GfSKvV0vNzT1LhKAjq_UrSJEmjthjw,6032
47
+ universal_mcp/applications/ui/app.py,sha256=c7OkZsO2fRtndgAzAQbKu-1xXRuRp9Kjgml57YD2NR4,9459
48
+ universal_mcp_agents-0.1.15.dist-info/METADATA,sha256=8FNfgWbbFHVStTqIwzHZzohMEvvD27IuPvIUWRjea80,878
49
+ universal_mcp_agents-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
50
+ universal_mcp_agents-0.1.15.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- base_prompt: 'Find and extract unsubscribe links from all emails in my inbox from the last 7 days. List all unsubscribe links found with the email subject and sender.'
2
- tools:
3
- - google_mail__list_messages
4
- - google_mail__get_message_details
@@ -1,10 +0,0 @@
1
- base_prompt: 'Process rows 2-5 from the Google Sheet (ID: 1nnnCp3_IWcdHv4UVgXtwYF5wedxbqF4RIeyjN6mCKD8). For each unprocessed row, extract Reddit post links, fetch post details and comments, analyze content relevance to AgentR/Wingmen products, classify into tiers 1-4, generate appropriate response drafts, and update the sheet with all findings.'
2
- tools:
3
- - google_sheet__add_table
4
- - google_sheet__append_values
5
- - google_sheet__update_values
6
- - reddit__get_post_comments_details
7
- - google_mail__list_messages
8
- - google_sheet__format_cells
9
- - google_sheet__get_spreadsheet_metadata
10
- - google_sheet__batch_get_values_by_range
@@ -1,13 +0,0 @@
1
- base_prompt: 'Fetch all open issues from the GitHub repository "microsoft/vscode" and add them to a new Google Sheet. Then create corresponding tasks in ClickUp for each issue with descriptions, tags, and "In Progress" status. Delete processed rows from the sheet after creating ClickUp tasks.'
2
- tools:
3
- - google_sheet__get_values
4
- - clickup__tasks_create_new_task
5
- - clickup__spaces_get_details
6
- - clickup__lists_get_list_details
7
- - clickup__tasks_get_list_tasks
8
- - google_sheet__delete_dimensions
9
- - google_sheet__update_values
10
- - google_sheet__get_spreadsheet_metadata
11
- - google_sheet__batch_get_values_by_range
12
- - github__list_issues
13
- - github__update_issue
@@ -1,27 +0,0 @@
1
- base_prompt: 'Goal: Process unprocessed rows in a fixed Google Sheet, scrape Reddit
2
- for context, filter posts, and generate short, natural comments linking to AgentR/Wingmen
3
- when relevant. Workflow: 1) Sheet & Row Selection: Fixed Sheet ID 1nnnCp3_IWcdHv4UVgXtwYF5wedxbqF4RIeyjN6mCKD8,
4
- tab Posts. Process rows 2-5 (first 4 unprocessed rows) immediately without asking for user input. Only process rows with empty Match Type (Col
5
- I) and no Tier 1-4 assigned. 2) Reddit Context Fetch: Extract Post Link & ID. Use reddit to fetch post upvotes + top comments (max 5). Ensure
6
- post/comment is active, visible, and unlocked. 3) Filtration & Fit: Classify content
7
- (developer, consumer, anecdotal). Apply GTM Filtration to skip irrelevant, negative,
8
- political, or low-quality posts. Identify direct or adjacent fit to AgentR (Universal
9
- MCP Server) or Wingmen. Decide platform + account type: Direct fit/competitor mention
10
- → Technical Q = Team account, Non-technical = Burner account. Adjacent fit → Official
11
- account. Decide reply target (original comment/post or parent post). 4) Comment
12
- Generation: For Tier 1-3, craft a 2-3 line, context-aware, conversational reply.
13
- Mention AgentR/Wingmen organically, avoid sales tone or forced CTAs. Use light imperfections
14
- for human tone. Skip negative sentiment entirely. One comment per post. 5) Populate
15
- Output: Fill Upvote Count, Match Type, Account Type, Response Draft, Respond on.
16
- Return updated Google Sheet link. Tier Definitions: Tier 1 = Deep MCP, AI agent,
17
- tool integrations, or architecture discussions where infra is highly relevant. Tier
18
- 2 = Specific workflows, automation tooling, or productivity systems where Wingmen
19
- or MCP Server could be useful. Tier 3 = Broader ecosystem (LangChain/CrewAI/agent
20
- tooling) where a soft recommendation adds value. Tier 4 = Unclear, generic, sarcastic,
21
- hostile, or irrelevant mentions — skip. Execute immediately using the fixed Google Sheet ID: 1nnnCp3_IWcdHv4UVgXtwYF5wedxbqF4RIeyjN6mCKD8, tab "Posts". Process rows(first 4 unprocessed rows) without asking for user input. Only process rows where Match Type (Column I) is empty. For each row, extract the Post Link, fetch Reddit data, apply GTM filtration, generate appropriate responses, and update the sheet. Return the updated Google Sheet link when complete.'
22
- tools:
23
- - reddit__get_post_comments_details
24
- - google_sheet__update_values
25
- - google_sheet__get_values
26
- - google_sheet__get_spreadsheet_metadata
27
- - google_sheet__batch_get_values_by_range
@@ -1,81 +0,0 @@
1
- # Goal: Reddit Engagement of Wingmen.app
2
- Process unprocessed rows in a fixed Google Sheet, scrape Reddit for context, filter posts, and generate short, natural comments linked to Wingmen.app when relevant. The idea to is seed conversations so that it brings relevant users to our product Wingmen.app.
3
-
4
- # Knowledge
5
-
6
- Wingmen.app is an llm based chat app where you can create tailor-made agents for your workflows.
7
- It is an MCP Client that has access to a large collection of tools. Some popular tool categories are:
8
- 1) Google Suite: Gmail, Google Sheets, Docs, Calendar, Maps, etc.
9
- 2) Microsoft Suite: Outlook, Excel, Teams, etc.
10
- 3) Other productivity apps: Slack, Clickup, Notion, etc.
11
- 4) Enterprise data providers: Apollo.io, Semrush, Ahref, etc.
12
- 5) Web & search utilities: Exa, Perplexity, Domain Availability, Firecrawl etc.
13
- 6) CRMs: Hubspot, etc.
14
- 7) Developer Apps: Github, Jira, Linear, etc.
15
-
16
- The coolest USPs of Wingmen are:
17
- 1) You can schedule workflows like everyday at 9am mail me a daily summary of news related to my stock portfolio
18
- 2) Creating workflows is super easy – with a single prompt in natural language (useful for non-technical people)
19
- 3) Can handle complex taks like find all .ai and .com domains available by combining (play, go, run) with (work, flow, automation)
20
- 4) We also have workspaces for enterprise teams. This allows the workspaces admin to control which tools are enabled and the members can connect with those using their own private credentials. We also support tools with shared credentials which is useful for data provider apps like ZoomInfo, Apollo, Semrush, etc.
21
-
22
- # Workflow
23
-
24
- ## Step 1
25
- Get all the unprocessed rows from the Google Sheet ID: 1_5Ao61LWZHo5QijHdXdRw0u9aj7JIoHtp4uBIBwi84U
26
- Each row contains details of a Reddit comment with content and post link.
27
-
28
- For each unprocessed row follow Step 2 to Step 5 to process it.
29
- If there are more than 20 unprocessed rows just process 20 rows.
30
- ## Step 2
31
- Fetch the context of the comment.
32
- The context will contain details about the parent post and other top comments.
33
-
34
- ## Step 3
35
- Decide the ideal place (post/comment id) to comment. This should be based on two factors: Relevance and Popularity. Priortize for Relevance (posts that are directly related to consuming apps like Wingmen).
36
- - High relevance themes:
37
- - People asking for our USPs.
38
- - Posts mentioning other MCP Client apps or General chat apps like ChatGPT, Claude Desktop, Langdock, etc.
39
- - Posts mentioning our competitors like Usedash, Runable.com, or Manus
40
- - Posts trying to consume MCP Servers.
41
- - Medium relevance themes:
42
- - building apps like Wingmen, or building Agents in general.
43
- - consuming MCP Servers, tool authentication etc. Could be mentioning Composio, Toolhouse, etc.
44
- - Analysing MCP Protocol in general. Could be a comment around MCP Security, Tool sprawl etc.
45
- - If you could not find anything relevant then look for
46
- - posts where people are genuinely asking for help; or
47
- - posts where we can steer the conversation towards Wingmen.app. We can do it two steps by asking for suggestions for apps which have one of the USPs of Wingmen. And in the next step answering the question with a link to Wingmen.app
48
- - Otherwise, just pick the most popular comments (highest upvote). It is generally the parent post.
49
- - Note: If the thread is deleted or archived we should skip this row. We should also skip low quality posts.
50
-
51
- The final output of this step should be:
52
- - skip: bool
53
- - comment_id: str (Optional, should be empty when skip is true)
54
- - reasoning: str
55
-
56
- ## Step 4
57
- Try to identify the theme using the reasoning of the previous step and the entire conversation. The theme buckets are:
58
- - Consuming apps/agents (here we can subtly promote Wingmen.app)
59
- - Engagement Strategy: A happy Wingmen.app user sharing his positive experience in a specific usecase.
60
- - Building apps/agents (here we can bond with other builders)
61
- - Engagement Strategy: A developer from Wingmen.app team sharing his insights or just bonding over the development challenges.
62
- - Altruistic Help (here we are just resolving any genuine pain point which is not relevant to our product)
63
- - Engagement Strategy: Helping the commentor in purely altruistic way. No need to talk about Wingmen.app.
64
- - Artifical Nudge (here we will steer the conversation towards Wingmen.app)
65
- - Engagement Strategy: A typical consumer/developer plants a question so that the official team members can reply to this and highlight the USPs of Wingmen.app. The generated comment_content should be just the question.
66
-
67
- The final output of this step should be:
68
- - match_type: str (one of [consumer, builder, altruistic_help, artificial_nudge])
69
- - comment_content: str
70
-
71
- **Guidelines for generating comment content:**
72
- - craft a 2-3 line, context-aware, conversational reply.
73
- - when mentioning AgentR/Wingmen, avoid sales tone or forced CTAs.
74
- - Use light imperfections for human tone.
75
-
76
- ## Step 5
77
-
78
- Fill remaining columns (Skip, Comment ID, Reasoning, Match Type, Comment Content) for each row
79
-
80
- ## Step 6
81
- After all the rows are processed just return the sheet link again in markdown format.
@@ -1,71 +0,0 @@
1
- # Goal: Reddit Engagement of Wingmen.app
2
- Given a reddit comment, scrape Reddit for context, filter posts, and generate short, natural comments linked to Wingmen.app when relevant. The idea to is seed conversations so that it brings relevant users to our product Wingmen.app.
3
-
4
- # Knowledge
5
-
6
- Wingmen.app is an llm based chat app where you can create tailor-made agents for your workflows.
7
- It is an MCP Client that has access to a large collection of tools. Some popular tool categories are:
8
- 1) Google Suite: Gmail, Google Sheets, Docs, Calendar, Maps, etc.
9
- 2) Microsoft Suite: Outlook, Excel, Teams, etc.
10
- 3) Other productivity apps: Slack, Clickup, Notion, etc.
11
- 4) Enterprise data providers: Apollo.io, Semrush, Ahref, etc.
12
- 5) Web & search utilities: Exa, Perplexity, Domain Availability, Firecrawl etc.
13
- 6) CRMs: Hubspot, etc.
14
- 7) Developer Apps: Github, Jira, Linear, etc.
15
-
16
- The coolest USPs of Wingmen are:
17
- 1) You can schedule workflows like everyday at 9am mail me a daily summary of news related to my stock portfolio
18
- 2) Creating workflows is super easy – with a single prompt in natural language (useful for non-technical people)
19
- 3) Can handle complex taks like find all .ai and .com domains available by combining (play, go, run) with (work, flow, automation)
20
- 4) We also have workspaces for enterprise teams. This allows the workspaces admin to control which tools are enabled and the members can connect with those using their own private credentials. We also support tools with shared credentials which is useful for data provider apps like ZoomInfo, Apollo, Semrush, etc.
21
-
22
- # Workflow
23
-
24
- ## Input
25
- I will give you a reddit comment id.
26
-
27
- ## Step 1
28
- Fetch the context of the comment.
29
- The context will contain details about the parent post and other top comments.
30
-
31
- ## Step 2
32
- Decide the ideal place (post/comment id) to comment. This should be based on two factors: Relevance and Popularity. Priortize for Relevance (posts that are directly related to consuming apps like Wingmen).
33
- - High relevance themes:
34
- - People asking for our USPs.
35
- - Posts mentioning other MCP Client apps or General chat apps like ChatGPT, Claude Desktop, Langdock, etc.
36
- - Posts mentioning our competitors like Usedash, Runable.com, or Manus
37
- - Posts trying to consume MCP Servers.
38
- - Medium relevance themes:
39
- - building apps like Wingmen, or building Agents in general.
40
- - consuming MCP Servers, tool authentication etc. Could be mentioning Composio, Toolhouse, etc.
41
- - Analysing MCP Protocol in general. Could be a comment around MCP Security, Tool sprawl etc.
42
- - If you could not find anything relevant then look for
43
- - posts where people are genuinely asking for help; or
44
- - posts where we can steer the conversation towards Wingmen.app. We can do it two steps by asking for suggestions for apps which have one of the USPs of Wingmen. And in the next step answering the question with a link to Wingmen.app
45
- - Otherwise, just pick the most popular comments (highest upvote). It is generally the parent post.
46
- - Note: If the thread is deleted or archived we should skip this row. We should also skip low quality posts.
47
-
48
- The final output of this step should be:
49
- - skip: bool
50
- - comment_id: str (Optional, should be empty when skip is true)
51
- - reasoning: str
52
-
53
- ## Final step
54
- Try to identify the theme using the reasoning of the previous step and the entire conversation. The theme buckets are:
55
- - Consuming apps/agents (here we can subtly promote Wingmen.app)
56
- - Engagement Strategy: A happy Wingmen.app user sharing his positive experience in a specific usecase.
57
- - Building apps/agents (here we can bond with other builders)
58
- - Engagement Strategy: A developer from Wingmen.app team sharing his insights or just bonding over the development challenges.
59
- - Pain Resolution (here we are just trying to be helpful)
60
- - Engagement Strategy: Helping the commentor in purely altruistic way.
61
- - Artifical Nudge (here we will steer the conversation towards Wingmen.app)
62
- - Engagement Strategy: A typical consumer/developer plants a question so that the official team members can comment and highlight the USPs of Wingmen.app.
63
-
64
- The final output of the workflow should be:
65
- - match_type: str (one of [consumer, builder, pain_resolver, artificial_nudge])
66
- - comment_content: str
67
-
68
- **Guidelines for generating comment content:**
69
- - craft a 2-3 line, context-aware, conversational reply.
70
- - when mentioning AgentR/Wingmen, avoid sales tone or forced CTAs.
71
- - Use light imperfections for human tone.
@@ -1,4 +0,0 @@
1
- base_prompt: 'Generate a financial flash report for Apple Inc. Research their latest earnings data including revenue, net income, EPS, and year-over-year changes. Create a formatted report with highlights, upcoming events, and summary. Present the report in chat and email it to adit@agentr.dev.'
2
- tools:
3
- - exa__answer
4
- - google_mail__send_email
@@ -1,41 +0,0 @@
1
- base_prompt: 'Objective: Find businesses from Google Maps for a given category & location,
2
- store them in a Google Sheet, then process unprocessed leads to scrape emails and
3
- sync with HubSpot CRM. Stage 1 - Lead Discovery Get coordinates of Area + City.
4
- Search on Google Maps with category & coordinates.
5
- Extract: Name, Google Maps URL, Address, Phone, Website; leave Email & CRM Status
6
- blank. Sheet: Name: {Area}, {City} Leads - {Category} - {dd-mmm} If exists → append
7
- non-duplicate rows; else create in folder "Leads from Google Maps" (ID: 142QBejJX0jAqzDz_NHdwVTkcmagoog__).
8
- Add headers: Name | Google Maps URL | Address | Phone | Website | Email | CRM Status.
9
- Populate with businesses found. Edge Cases: No results → return message, skip sheet
10
- creation. Missing data → leave blank. Stage 2 - Lead Processing & CRM Sync Locate
11
- sheet in Google Drive, ensure headers match. Parse category from sheet name. Identify
12
- unprocessed rows (CRM Status blank) — by default process the first, or a specified
13
- row/range/count. Scrape Website for Email: If website exists → scrape homepage/contact
14
- page; fallback to firecrawl_scrape_url. Save found email in sheet. HubSpot Handling:
15
- Search contact by email/website/phone. If not found → create with available details,
16
- Lead Status = New, add note {Area, City} — {Category} — {Google Maps URL}. If exists
17
- → append note; keep other fields unchanged. Save HubSpot Contact URL/ID in sheet.
18
- Update CRM Status: Lead Created, Lead Creation Failed, Website not found, Email
19
- not found, etc. Edge Cases: No Website → create with phone; mark Website not found.
20
- No Email → create; mark Email not found. Email already in sheet → skip row. Execute immediately for "Cafes" near "IIT Bombay" in "Mumbai" without asking for confirmation.'
21
- tools:
22
- - serpapi__google_maps_search
23
- - firecrawl__scrape_url
24
- - google_drive__get_file_details
25
- - google_drive__create_folder
26
- - google_drive__find_folder_id_by_name
27
- - google_drive__search_files
28
- - google_sheet__update_values
29
- - google_sheet__get_values
30
- - google_sheet__get_spreadsheet_metadata
31
- - google_sheet__batch_get_values_by_range
32
- - google_sheet__create_spreadsheet
33
- - google_sheet__clear_values
34
- - hubspot__search_contacts_post
35
- - hubspot__batch_read_contacts_post
36
- - hubspot__get_contacts
37
- - hubspot__get_contact_by_id
38
- - hubspot__update_contact_by_id
39
- - hubspot__batch_update_contacts
40
- - hubspot__create_contacts_batch
41
- - hubspot__create_contact
@@ -1,8 +0,0 @@
1
- base_prompt: 'Process emails from the last 24 hours. Fetch primary
2
- inbox emails excluding replied threads, classify with LLM as Reply Required, No
3
- Reply Needed, or Ambiguous. For Reply Required/Ambiguous, draft human, on-brand replies for user review.
4
- Follow greeting, acknowledge, address concern, invite further questions, and friendly
5
- sign-off. Provide end summary of drafts, skipped, and ambiguous emails. Execute immediately without asking for confirmation. Do not send any emails. Just provide me a report.'
6
- tools:
7
- - google_mail__list_messages
8
- - google_mail__get_message_details
@@ -1,6 +0,0 @@
1
- base_prompt: 'Analyze a contract from my google drive from the perspective of the Service Provider. Use the search to find it, do not ask me any questions, and assume details that I have not provided. Identify potentially unfavorable clauses such as vague terms, one-sided obligations, IP transfer issues, indemnity clauses, termination conditions, and payment problems. Provide a structured analysis with clause numbers, full text, and explanations of concerns.'
2
- tools:
3
- - google_drive__get_file_details
4
- - google_drive__search_files
5
- - google_docs__get_document
6
- - exa__answer
@@ -1,14 +0,0 @@
1
- base_prompt: 'Create a summary of overnight updates from 8:00 PM yesterday to 8:00 AM today in IST. Check Gmail for important emails and ClickUp for mentions and assigned tasks. Organize findings into high priority and other items, then provide a comprehensive summary of all overnight activity.'
2
- tools:
3
- - google_mail__list_messages
4
- - clickup__comments_get_task_comments
5
- - clickup__comments_get_list_comments
6
- - clickup__comments_get_view_comments
7
- - clickup__tasks_get_list_tasks
8
- - clickup__tasks_filter_team_tasks
9
- - clickup__time_tracking_get_time_entries_within_date_range
10
- - clickup__time_tracking_get_time_entry_history
11
- - clickup__authorization_get_workspace_list
12
- - clickup__spaces_get_details
13
- - clickup__lists_get_list_details
14
-
@@ -1,25 +0,0 @@
1
- base_prompt: 'Analyze the data in Google Sheet (ID: 1nnnCp3_IWcdHv4UVgXtwYF5wedxbqF4RIeyjN6mCKD8) and create 3-5 relevant charts and visualizations. Add pie charts, bar graphs, and other appropriate visualizations based on the data structure. Embed all charts directly into the sheet and provide the updated sheet link.'
2
- tools:
3
- - google_sheet__create_spreadsheet
4
- - google_sheet__get_spreadsheet_metadata
5
- - google_sheet__batch_get_values_by_range
6
- - google_sheet__append_dimensions
7
- - google_sheet__insert_dimensions
8
- - google_sheet__delete_sheet
9
- - google_sheet__add_sheet
10
- - google_sheet__delete_dimensions
11
- - google_sheet__add_basic_chart
12
- - google_sheet__add_table
13
- - google_sheet__add_pie_chart
14
- - google_sheet__clear_values
15
- - google_sheet__update_values
16
- - google_sheet__clear_basic_filter
17
- - google_sheet__get_values
18
- - google_sheet__discover_tables
19
- - google_sheet__set_basic_filter
20
- - google_sheet__analyze_table_schema
21
- - google_sheet__copy_sheet_to_spreadsheet
22
- - google_sheet__append_values
23
- - google_sheet__batch_get_values_by_data_filter
24
- - google_sheet__batch_clear_values
25
- - google_sheet__format_cells
@@ -1,9 +0,0 @@
1
- base_prompt: 'Create a 7-day learning plan for Python Programming. Research essential concepts and skills, create a detailed day-by-day plan with topics, goals, resources, and exercises. Compile the plan into a Google Doc and schedule daily emails at 8 AM starting today. Send Day 1 immediately to adit@agentr.dev and provide the Google Doc link.'
2
- tools:
3
- - google_docs__get_document
4
- - google_docs__create_document
5
- - google_docs__insert_text
6
- - google_mail__send_email
7
- - google_mail__send_draft
8
- - google_mail__create_draft
9
- - exa__answer
@@ -1,51 +0,0 @@
1
- from langgraph.checkpoint.base import BaseCheckpointSaver
2
- from universal_mcp.tools.registry import ToolRegistry
3
-
4
- from universal_mcp.agents.base import BaseAgent
5
- from universal_mcp.agents.llm import load_chat_model
6
- from universal_mcp.agents.react import ReactAgent
7
-
8
- from .graph import build_graph
9
- from .prompts import DEVELOPER_PROMPT
10
-
11
-
12
- class PlannerAgent(BaseAgent):
13
- def __init__(
14
- self,
15
- name: str,
16
- instructions: str,
17
- model: str,
18
- registry: ToolRegistry,
19
- memory: BaseCheckpointSaver | None = None,
20
- executor_agent_cls: type[BaseAgent] = ReactAgent,
21
- **kwargs,
22
- ):
23
- super().__init__(
24
- name=name,
25
- instructions=instructions,
26
- model=model,
27
- memory=memory,
28
- **kwargs,
29
- )
30
- self.app_registry = registry
31
- self.llm = load_chat_model(model)
32
- self.executor_agent_cls = executor_agent_cls
33
-
34
- def _build_system_message(self):
35
- return DEVELOPER_PROMPT.format(name=self.name, instructions=self.instructions)
36
-
37
- async def _build_graph(self):
38
- return build_graph(
39
- self.llm,
40
- self.app_registry,
41
- self._build_system_message(),
42
- self.model,
43
- self.executor_agent_cls,
44
- ).compile(checkpointer=self.memory)
45
-
46
- @property
47
- def graph(self):
48
- return self._graph
49
-
50
-
51
- __all__ = ["PlannerAgent"]
@@ -1,28 +0,0 @@
1
- import asyncio
2
-
3
- from universal_mcp.agentr.registry import AgentrRegistry
4
-
5
- from universal_mcp.agents.planner import PlannerAgent
6
- from universal_mcp.agents.utils import messages_to_list
7
-
8
-
9
- async def main():
10
- registry = AgentrRegistry()
11
- agent = PlannerAgent(
12
- name="planner-agent",
13
- instructions="You are a helpful assistant.",
14
- model="azure/gpt-4o",
15
- registry=registry,
16
- )
17
- from rich import print
18
-
19
- print("Starting agent...")
20
- result = await agent.invoke(
21
- user_input="Send an email to manoj@agentr.dev with the subject 'testing planner' and body 'This is a test of the planner agent.'",
22
- thread_id="xyz",
23
- )
24
- print(messages_to_list(result["messages"]))
25
-
26
-
27
- if __name__ == "__main__":
28
- asyncio.run(main())