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.
- universal_mcp/agents/__init__.py +1 -1
- universal_mcp/agents/base.py +3 -0
- universal_mcp/agents/bigtool/__init__.py +1 -1
- universal_mcp/agents/bigtool/__main__.py +4 -3
- universal_mcp/agents/bigtool/agent.py +3 -2
- universal_mcp/agents/bigtool/graph.py +68 -31
- universal_mcp/agents/bigtool/prompts.py +2 -2
- universal_mcp/agents/bigtool/tools.py +17 -4
- universal_mcp/agents/builder/__main__.py +129 -28
- universal_mcp/agents/builder/builder.py +149 -161
- universal_mcp/agents/builder/helper.py +71 -0
- universal_mcp/agents/builder/prompts.py +94 -160
- universal_mcp/agents/codeact0/__init__.py +2 -1
- universal_mcp/agents/codeact0/agent.py +13 -5
- universal_mcp/agents/codeact0/langgraph_agent.py +14 -0
- universal_mcp/agents/codeact0/llm_tool.py +1 -2
- universal_mcp/agents/codeact0/playbook_agent.py +353 -0
- universal_mcp/agents/codeact0/prompts.py +126 -41
- universal_mcp/agents/codeact0/sandbox.py +43 -32
- universal_mcp/agents/codeact0/state.py +27 -3
- universal_mcp/agents/codeact0/tools.py +180 -0
- universal_mcp/agents/codeact0/utils.py +89 -75
- universal_mcp/agents/shared/__main__.py +44 -0
- universal_mcp/agents/shared/prompts.py +49 -98
- universal_mcp/agents/shared/tool_node.py +160 -176
- universal_mcp/agents/utils.py +71 -0
- universal_mcp/applications/ui/app.py +2 -2
- {universal_mcp_agents-0.1.13.dist-info → universal_mcp_agents-0.1.15.dist-info}/METADATA +3 -3
- universal_mcp_agents-0.1.15.dist-info/RECORD +50 -0
- universal_mcp/agents/codeact0/usecases/1-unsubscribe.yaml +0 -4
- universal_mcp/agents/codeact0/usecases/10-reddit2.yaml +0 -10
- universal_mcp/agents/codeact0/usecases/11-github.yaml +0 -13
- universal_mcp/agents/codeact0/usecases/2-reddit.yaml +0 -27
- universal_mcp/agents/codeact0/usecases/2.1-instructions.md +0 -81
- universal_mcp/agents/codeact0/usecases/2.2-instructions.md +0 -71
- universal_mcp/agents/codeact0/usecases/3-earnings.yaml +0 -4
- universal_mcp/agents/codeact0/usecases/4-maps.yaml +0 -41
- universal_mcp/agents/codeact0/usecases/5-gmailreply.yaml +0 -8
- universal_mcp/agents/codeact0/usecases/6-contract.yaml +0 -6
- universal_mcp/agents/codeact0/usecases/7-overnight.yaml +0 -14
- universal_mcp/agents/codeact0/usecases/8-sheets_chart.yaml +0 -25
- universal_mcp/agents/codeact0/usecases/9-learning.yaml +0 -9
- universal_mcp/agents/planner/__init__.py +0 -51
- universal_mcp/agents/planner/__main__.py +0 -28
- universal_mcp/agents/planner/graph.py +0 -85
- universal_mcp/agents/planner/prompts.py +0 -14
- universal_mcp/agents/planner/state.py +0 -11
- universal_mcp_agents-0.1.13.dist-info/RECORD +0 -63
- {universal_mcp_agents-0.1.13.dist-info → universal_mcp_agents-0.1.15.dist-info}/WHEEL +0 -0
universal_mcp/agents/utils.py
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
16
|
-
Requires-Dist: universal-mcp>=0.1.
|
|
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,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())
|