universal-mcp-applications 0.1.21__tar.gz → 0.1.22__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.
Potentially problematic release.
This version of universal-mcp-applications might be problematic. Click here for more details.
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/PKG-INFO +2 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/pyproject.toml +6 -9
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/docgen.py +80 -70
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/prompts.py +1 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/readme.py +13 -12
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/run_docgen.py +7 -9
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/tests/test_applications.py +7 -8
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/BEST_PRACTICES.md +166 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/airtable/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/apollo/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/aws_s3/app.py +40 -39
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/browser_use/README.md +1 -0
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/browser_use/app.py +76 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/calendly/app.py +125 -125
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/canva/app.py +95 -99
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/confluence/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/contentful/app.py +4 -5
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/domain_checker/app.py +11 -15
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/e2b/app.py +4 -4
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/elevenlabs/app.py +18 -15
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/exa/app.py +17 -17
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/falai/app.py +28 -29
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/file_system/app.py +9 -9
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/firecrawl/app.py +36 -36
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fireflies/app.py +55 -56
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/app.py +49 -50
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ghost_content/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/github/app.py +41 -43
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_calendar/app.py +40 -39
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_docs/app.py +56 -56
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_drive/app.py +212 -215
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_gemini/app.py +1 -5
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_mail/app.py +91 -90
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_searchconsole/app.py +29 -29
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_sheet/app.py +115 -115
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hashnode/README.md +6 -3
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hashnode/app.py +174 -25
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/http_tools/app.py +10 -11
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/hubspot/__init__.py +1 -0
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +54 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hubspot/api_segments/crm_api.py +368 -368
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hubspot/api_segments/marketing_api.py +115 -115
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hubspot/app.py +131 -72
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/jira/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/linkedin/app.py +20 -20
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/markitdown/app.py +10 -5
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ms_teams/app.py +123 -123
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/openai/app.py +40 -39
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/outlook/app.py +32 -32
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/perplexity/app.py +4 -4
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/reddit/app.py +69 -70
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/resend/app.py +116 -117
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/rocketlane/app.py +0 -1
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/scraper/__init__.py +1 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/scraper/app.py +80 -81
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/serpapi/app.py +14 -14
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sharepoint/app.py +19 -20
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shopify/app.py +0 -1
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/slack/app.py +48 -48
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/tavily/app.py +4 -4
- universal_mcp_applications-0.1.22/src/universal_mcp/applications/twitter/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/compliance_api.py +13 -15
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +20 -20
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/dm_events_api.py +12 -12
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/likes_api.py +12 -12
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/lists_api.py +37 -39
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/spaces_api.py +24 -24
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/trends_api.py +4 -4
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/tweets_api.py +105 -105
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/usage_api.py +4 -4
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/users_api.py +136 -136
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/app.py +6 -2
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/unipile/app.py +90 -97
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp/app.py +53 -54
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp/audio.py +39 -35
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp/whatsapp.py +176 -154
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp_business/app.py +92 -92
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/yahoo_finance/app.py +105 -63
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/youtube/app.py +193 -196
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/zenquotes/__init__.py +2 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/zenquotes/app.py +3 -3
- universal_mcp_applications-0.1.22/test.py +66 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/uv.lock +19 -2
- universal_mcp_applications-0.1.21/examples/children_story_builder.py +0 -146
- universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/__init__.py +0 -1
- universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -25
- universal_mcp_applications-0.1.21/src/universal_mcp/applications/scraper/__init__.py +0 -1
- universal_mcp_applications-0.1.21/test.py +0 -41
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/.gitignore +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/GEMINI.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/LICENSE +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/bump_and_release.sh +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ahrefs/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ahrefs/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ahrefs/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/airtable/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/airtable/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/apollo/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/apollo/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/asana/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/asana/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/asana/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/aws_s3/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/aws_s3/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/bill/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/bill/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/bill/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/box/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/box/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/box/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/braze/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/braze/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/braze/app.py +0 -0
- {universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/api_segments → universal_mcp_applications-0.1.22/src/universal_mcp/applications/browser_use}/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/cal_com_v2/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/cal_com_v2/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/calendly/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/calendly/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/canva/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/canva/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/clickup/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/clickup/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/clickup/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/coda/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/coda/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/coda/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/confluence/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/confluence/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/contentful/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/contentful/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/crustdata/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/crustdata/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/crustdata/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/dialpad/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/dialpad/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/dialpad/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/digitalocean/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/digitalocean/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/digitalocean/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/domain_checker/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/domain_checker/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/e2b/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/e2b/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/elevenlabs/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/exa/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/exa/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/falai/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/falai/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/figma/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/figma/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/figma/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/file_system/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/file_system/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/firecrawl/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/firecrawl/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fireflies/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fireflies/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/utils/api.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/utils/fixtures.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/utils/helper.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/utils/league_utils.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/fpl/utils/position_utils.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ghost_content/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ghost_content/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/github/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/github/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/gong/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/gong/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/gong/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_calendar/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_calendar/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_docs/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_docs/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_drive/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_drive/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_gemini/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_gemini/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_mail/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_mail/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_searchconsole/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_searchconsole/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_sheet/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_sheet/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/google_sheet/helper.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hashnode/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/heygen/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/heygen/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/heygen/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/http_tools/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/http_tools/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/hubspot/README.md +0 -0
- {universal_mcp_applications-0.1.21/src/universal_mcp/applications/twitter → universal_mcp_applications-0.1.22/src/universal_mcp/applications/hubspot}/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/jira/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/jira/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/klaviyo/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/klaviyo/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/klaviyo/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/linkedin/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/linkedin/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/mailchimp/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/mailchimp/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/markitdown/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/markitdown/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/miro/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/miro/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/miro/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ms_teams/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/ms_teams/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/neon/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/neon/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/neon/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/notion/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/notion/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/notion/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/openai/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/openai/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/outlook/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/outlook/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/perplexity/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/perplexity/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/pipedrive/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/pipedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/pipedrive/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/posthog/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/posthog/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/posthog/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/reddit/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/reddit/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/resend/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/resend/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/retell/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/retell/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/retell/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/rocketlane/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/scraper/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semanticscholar/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semanticscholar/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semanticscholar/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semrush/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semrush/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/semrush/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sendgrid/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sendgrid/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sendgrid/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sentry/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sentry/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sentry/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/serpapi/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/serpapi/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sharepoint/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/sharepoint/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shopify/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shopify/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shortcut/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shortcut/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/shortcut/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/slack/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/slack/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/spotify/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/spotify/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/spotify/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/supabase/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/supabase/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/supabase/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/tavily/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/tavily/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/trello/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/trello/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/trello/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twilio/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twilio/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twilio/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/twitter/api_segments/openapi_json_api.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/unipile/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/unipile/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp_business/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/whatsapp_business/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/wrike/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/wrike/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/wrike/app.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/yahoo_finance/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/yahoo_finance/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/youtube/README.md +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/youtube/__init__.py +0 -0
- {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/universal_mcp/applications/zenquotes/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: universal-mcp-applications
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.22
|
|
4
4
|
Summary: A Universal MCP Application: universal_mcp_applications
|
|
5
5
|
Project-URL: Homepage, https://github.com/universal-mcp/applications
|
|
6
6
|
Project-URL: Repository, https://github.com/universal-mcp/applications
|
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
14
|
Requires-Python: >=3.11
|
|
15
15
|
Requires-Dist: boto3>=1.38.32
|
|
16
|
+
Requires-Dist: browser-use-sdk>=2.0.4
|
|
16
17
|
Requires-Dist: dnspython>=2.4.0
|
|
17
18
|
Requires-Dist: e2b-code-interpreter>=1.2.1
|
|
18
19
|
Requires-Dist: elevenlabs>=2.14.0
|
|
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = "universal-mcp-applications"
|
|
9
|
-
version = "0.1.
|
|
9
|
+
version = "0.1.22"
|
|
10
10
|
description = "A Universal MCP Application: universal_mcp_applications"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
requires-python = ">=3.11"
|
|
@@ -21,6 +21,7 @@ classifiers = [
|
|
|
21
21
|
]
|
|
22
22
|
dependencies = [
|
|
23
23
|
"boto3>=1.38.32",
|
|
24
|
+
"browser-use-sdk>=2.0.4",
|
|
24
25
|
"dnspython>=2.4.0",
|
|
25
26
|
"e2b-code-interpreter>=1.2.1",
|
|
26
27
|
"elevenlabs>=2.14.0",
|
|
@@ -45,7 +46,6 @@ dependencies = [
|
|
|
45
46
|
"universal-mcp>=0.1.24rc21",
|
|
46
47
|
"yfinance>=0.2.66",
|
|
47
48
|
"youtube-transcript-api==1.2.2",
|
|
48
|
-
|
|
49
49
|
]
|
|
50
50
|
|
|
51
51
|
[project.license]
|
|
@@ -77,7 +77,6 @@ test-cov = "pytest --cov-report term-missing --cov-config=pyproject.toml --cov=s
|
|
|
77
77
|
lint = "ruff check . && ruff format --check ."
|
|
78
78
|
format = "ruff format ."
|
|
79
79
|
|
|
80
|
-
|
|
81
80
|
[tool.hatch.build.targets.wheel]
|
|
82
81
|
packages = [
|
|
83
82
|
"src/universal_mcp",
|
|
@@ -85,7 +84,7 @@ packages = [
|
|
|
85
84
|
|
|
86
85
|
[tool.coverage.run]
|
|
87
86
|
source = [
|
|
88
|
-
"src",
|
|
87
|
+
"src",
|
|
89
88
|
]
|
|
90
89
|
branch = true
|
|
91
90
|
|
|
@@ -94,12 +93,11 @@ show_missing = true
|
|
|
94
93
|
fail_under = 70
|
|
95
94
|
|
|
96
95
|
[tool.ruff]
|
|
97
|
-
line-length =
|
|
98
|
-
select = [
|
|
96
|
+
line-length = 140
|
|
97
|
+
lint.select = [
|
|
99
98
|
"E", "W", "F", "I", "UP", "PL", "T20",
|
|
100
99
|
]
|
|
101
|
-
ignore = []
|
|
102
|
-
|
|
100
|
+
lint.ignore = []
|
|
103
101
|
|
|
104
102
|
[tool.ruff.format]
|
|
105
103
|
quote-style = "double"
|
|
@@ -114,4 +112,3 @@ dev = [
|
|
|
114
112
|
"litellm>=1.77.3",
|
|
115
113
|
"universal-mcp-agents>=0.1.13",
|
|
116
114
|
]
|
|
117
|
-
|
{universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/docgen.py
RENAMED
|
@@ -7,12 +7,11 @@ names for Python functions using LLMs with structured output.
|
|
|
7
7
|
import ast
|
|
8
8
|
import json
|
|
9
9
|
import os
|
|
10
|
-
from pathlib import Path
|
|
11
10
|
import re
|
|
12
11
|
import sys
|
|
13
12
|
import time
|
|
14
13
|
import traceback
|
|
15
|
-
from
|
|
14
|
+
from pathlib import Path
|
|
16
15
|
|
|
17
16
|
import typer
|
|
18
17
|
from rich.console import Console
|
|
@@ -29,7 +28,9 @@ from src.scripts.prompts import SYSTEM_PROMPT_TEMPLATE, USER_PROMPT_TEMPLATE
|
|
|
29
28
|
class DescriptionOutput(BaseModel):
|
|
30
29
|
"""Structure for the generated description output."""
|
|
31
30
|
|
|
32
|
-
description: str = Field(
|
|
31
|
+
description: str = Field(
|
|
32
|
+
description="A clear, detailed description of what the function does"
|
|
33
|
+
)
|
|
33
34
|
# suggested_name: Optional[str] = Field(None, description="A better name for the function, if applicable")
|
|
34
35
|
|
|
35
36
|
|
|
@@ -41,17 +42,16 @@ class FunctionExtractor(ast.NodeVisitor):
|
|
|
41
42
|
|
|
42
43
|
def __init__(self, source_code: str):
|
|
43
44
|
self.source_lines = source_code.splitlines(keepends=True)
|
|
44
|
-
self.functions: list[
|
|
45
|
+
self.functions: list[
|
|
46
|
+
tuple[str, str]
|
|
47
|
+
] = [] # Store tuples of (function_name, function_source)
|
|
45
48
|
|
|
46
49
|
def _get_source_segment(self, node: ast.AST) -> str | None:
|
|
47
50
|
"""Safely extracts the source segment for a node using ast.get_source_segment."""
|
|
48
51
|
try:
|
|
49
52
|
source_segment = ast.get_source_segment("".join(self.source_lines), node)
|
|
50
53
|
return source_segment
|
|
51
|
-
except Exception
|
|
52
|
-
print(
|
|
53
|
-
f"Warning: Could not retrieve source for node {getattr(node, 'name', 'unknown')} at line {getattr(node, 'lineno', 'unknown')}: {e}"
|
|
54
|
-
)
|
|
54
|
+
except Exception:
|
|
55
55
|
return None
|
|
56
56
|
|
|
57
57
|
def visit_FunctionDef(self, node: ast.FunctionDef):
|
|
@@ -92,19 +92,15 @@ def extract_functions_from_script(file_path: str) -> list[tuple[str, str]]:
|
|
|
92
92
|
with open(file_path, encoding="utf-8") as f:
|
|
93
93
|
source_code = f.read()
|
|
94
94
|
except FileNotFoundError:
|
|
95
|
-
print(f"Error: File not found at {file_path}")
|
|
96
95
|
raise
|
|
97
|
-
except Exception
|
|
98
|
-
print(f"Error reading file {file_path}: {e}")
|
|
96
|
+
except Exception:
|
|
99
97
|
raise
|
|
100
98
|
|
|
101
99
|
try:
|
|
102
100
|
tree = ast.parse(source_code, filename=file_path)
|
|
103
|
-
except SyntaxError
|
|
104
|
-
print(f"Error: Invalid Python syntax in {file_path} at line {e.lineno}, offset {e.offset}: {e.msg}")
|
|
101
|
+
except SyntaxError:
|
|
105
102
|
raise
|
|
106
|
-
except Exception
|
|
107
|
-
print(f"Error parsing {file_path} into AST: {e}")
|
|
103
|
+
except Exception:
|
|
108
104
|
raise
|
|
109
105
|
|
|
110
106
|
try:
|
|
@@ -112,11 +108,10 @@ def extract_functions_from_script(file_path: str) -> list[tuple[str, str]]:
|
|
|
112
108
|
extractor.visit(tree)
|
|
113
109
|
|
|
114
110
|
if not extractor.functions:
|
|
115
|
-
|
|
111
|
+
pass
|
|
116
112
|
|
|
117
113
|
return extractor.functions
|
|
118
|
-
except Exception
|
|
119
|
-
print(f"Error during function extraction: {e}")
|
|
114
|
+
except Exception:
|
|
120
115
|
import traceback
|
|
121
116
|
|
|
122
117
|
traceback.print_exc()
|
|
@@ -176,7 +171,7 @@ def parse_existing_docstring(docstring: str | None) -> tuple[str, str]:
|
|
|
176
171
|
if not docstring:
|
|
177
172
|
return "", ""
|
|
178
173
|
|
|
179
|
-
lines = docstring.strip().split(
|
|
174
|
+
lines = docstring.strip().split("\n")
|
|
180
175
|
summary_lines = []
|
|
181
176
|
rest_lines = []
|
|
182
177
|
summary_done = False
|
|
@@ -186,15 +181,19 @@ def parse_existing_docstring(docstring: str | None) -> tuple[str, str]:
|
|
|
186
181
|
|
|
187
182
|
for i, line in enumerate(lines):
|
|
188
183
|
stripped_line = line.strip()
|
|
189
|
-
if
|
|
184
|
+
if (
|
|
185
|
+
not summary_done
|
|
186
|
+
and stripped_line
|
|
187
|
+
and not stripped_line.startswith(section_markers)
|
|
188
|
+
):
|
|
190
189
|
summary_lines.append(line.strip())
|
|
191
190
|
elif not summary_done and not stripped_line and summary_lines:
|
|
192
191
|
# This blank line marks the end of the summary
|
|
193
192
|
summary_done = True
|
|
194
|
-
rest_lines = lines[i+1:]
|
|
193
|
+
rest_lines = lines[i + 1 :]
|
|
195
194
|
break
|
|
196
195
|
elif stripped_line.startswith(section_markers):
|
|
197
|
-
|
|
196
|
+
# A section starts immediately after the summary
|
|
198
197
|
summary_done = True
|
|
199
198
|
rest_lines = lines[i:]
|
|
200
199
|
break
|
|
@@ -243,30 +242,30 @@ def generate_description(
|
|
|
243
242
|
try:
|
|
244
243
|
parsed_data = extract_json_from_text(response_text)
|
|
245
244
|
return DescriptionOutput(
|
|
246
|
-
description=parsed_data.get(
|
|
245
|
+
description=parsed_data.get(
|
|
246
|
+
"description", "No description available."
|
|
247
|
+
),
|
|
247
248
|
# suggested_name=parsed_data.get("suggested_name"),
|
|
248
249
|
)
|
|
249
|
-
except ValueError
|
|
250
|
-
print(f" - JSON extraction failed: {e}")
|
|
250
|
+
except ValueError:
|
|
251
251
|
return DescriptionOutput(description="Failed to extract description.")
|
|
252
252
|
|
|
253
253
|
except litellm.InternalServerError as e:
|
|
254
254
|
if attempt < max_retries - 1:
|
|
255
255
|
delay = base_delay * (2**attempt)
|
|
256
|
-
print(
|
|
257
|
-
f" - Server error occurred: {e}. Retrying in {delay} seconds... (Attempt {attempt + 1}/{max_retries})",
|
|
258
|
-
file=sys.stderr,
|
|
259
|
-
)
|
|
260
256
|
time.sleep(delay)
|
|
261
257
|
else:
|
|
262
|
-
|
|
263
|
-
|
|
258
|
+
return DescriptionOutput(
|
|
259
|
+
description=f"Error generating description after {max_retries} retries: {e}"
|
|
260
|
+
)
|
|
264
261
|
|
|
265
262
|
except Exception as e:
|
|
266
|
-
print(f" - An unexpected error occurred: {e}", file=sys.stderr)
|
|
267
263
|
return DescriptionOutput(description=f"An unexpected error occurred: {e}")
|
|
268
264
|
|
|
269
|
-
return DescriptionOutput(
|
|
265
|
+
return DescriptionOutput(
|
|
266
|
+
description="Failed to generate description after all retries."
|
|
267
|
+
)
|
|
268
|
+
|
|
270
269
|
|
|
271
270
|
def insert_docstring_into_function(function_code: str, docstring: str) -> str:
|
|
272
271
|
"""
|
|
@@ -282,7 +281,9 @@ def insert_docstring_into_function(function_code: str, docstring: str) -> str:
|
|
|
282
281
|
try:
|
|
283
282
|
lines = function_code.splitlines(keepends=True)
|
|
284
283
|
tree = ast.parse(function_code)
|
|
285
|
-
if not tree.body or not isinstance(
|
|
284
|
+
if not tree.body or not isinstance(
|
|
285
|
+
tree.body[0], (ast.FunctionDef, ast.AsyncFunctionDef)
|
|
286
|
+
):
|
|
286
287
|
return function_code
|
|
287
288
|
|
|
288
289
|
func_node = tree.body[0]
|
|
@@ -292,7 +293,9 @@ def insert_docstring_into_function(function_code: str, docstring: str) -> str:
|
|
|
292
293
|
if func_node.body:
|
|
293
294
|
# Use the indentation of the first statement in the body (e.g., the old docstring).
|
|
294
295
|
first_body_line_str = lines[func_node.body[0].lineno - 1]
|
|
295
|
-
body_indent = first_body_line_str[
|
|
296
|
+
body_indent = first_body_line_str[
|
|
297
|
+
: len(first_body_line_str) - len(first_body_line_str.lstrip())
|
|
298
|
+
]
|
|
296
299
|
else:
|
|
297
300
|
# Fallback for empty functions: calculate from the 'def' line.
|
|
298
301
|
def_line = lines[func_node.lineno - 1]
|
|
@@ -302,36 +305,41 @@ def insert_docstring_into_function(function_code: str, docstring: str) -> str:
|
|
|
302
305
|
|
|
303
306
|
# Format the new docstring with the determined indentation
|
|
304
307
|
new_docstring_lines_formatted = [f'{body_indent}"""\n']
|
|
305
|
-
new_docstring_lines_formatted.extend(
|
|
308
|
+
new_docstring_lines_formatted.extend(
|
|
309
|
+
[f"{body_indent}{line}\n" for line in docstring.splitlines()]
|
|
310
|
+
)
|
|
306
311
|
new_docstring_lines_formatted.append(f'{body_indent}"""\n')
|
|
307
312
|
|
|
308
313
|
# Check if the first statement is an existing docstring
|
|
309
314
|
existing_docstring_node = None
|
|
310
315
|
if (
|
|
311
|
-
func_node.body
|
|
312
|
-
isinstance(func_node.body[0], ast.Expr)
|
|
313
|
-
isinstance(func_node.body[0].value, ast.Constant)
|
|
314
|
-
isinstance(func_node.body[0].value.value, str)
|
|
316
|
+
func_node.body
|
|
317
|
+
and isinstance(func_node.body[0], ast.Expr)
|
|
318
|
+
and isinstance(func_node.body[0].value, ast.Constant)
|
|
319
|
+
and isinstance(func_node.body[0].value.value, str)
|
|
315
320
|
):
|
|
316
321
|
existing_docstring_node = func_node.body[0]
|
|
317
322
|
|
|
318
323
|
# Splice the code
|
|
319
|
-
insert_idx =
|
|
324
|
+
insert_idx = (
|
|
325
|
+
func_node.body[0].lineno - 1 if func_node.body else func_node.lineno
|
|
326
|
+
)
|
|
320
327
|
pre_insertion_lines = lines[:insert_idx]
|
|
321
328
|
|
|
322
329
|
if existing_docstring_node:
|
|
323
|
-
post_insertion_lines = lines[existing_docstring_node.end_lineno:]
|
|
330
|
+
post_insertion_lines = lines[existing_docstring_node.end_lineno :]
|
|
324
331
|
else:
|
|
325
332
|
post_insertion_lines = lines[insert_idx:]
|
|
326
333
|
|
|
327
|
-
output_lines =
|
|
334
|
+
output_lines = (
|
|
335
|
+
pre_insertion_lines + new_docstring_lines_formatted + post_insertion_lines
|
|
336
|
+
)
|
|
328
337
|
|
|
329
338
|
final_code = "".join(output_lines)
|
|
330
|
-
ast.parse(final_code)
|
|
339
|
+
ast.parse(final_code) # Validate syntax
|
|
331
340
|
return final_code
|
|
332
341
|
|
|
333
|
-
except Exception
|
|
334
|
-
print(f"Error processing function snippet for insertion: {e}", file=sys.stderr)
|
|
342
|
+
except Exception:
|
|
335
343
|
traceback.print_exc(file=sys.stderr)
|
|
336
344
|
return function_code
|
|
337
345
|
|
|
@@ -351,13 +359,14 @@ def rename_function_in_code(function_code: str, old_name: str, new_name: str) ->
|
|
|
351
359
|
# This regex looks for 'def' or 'async def' followed by the old name
|
|
352
360
|
pattern = r"(async\s+def|def)\s+" + re.escape(old_name) + r"(\s*\()"
|
|
353
361
|
replacement = r"\1 " + new_name + r"\2"
|
|
354
|
-
|
|
355
|
-
new_function_code, num_replacements = re.subn(
|
|
362
|
+
|
|
363
|
+
new_function_code, num_replacements = re.subn(
|
|
364
|
+
pattern, replacement, function_code, 1
|
|
365
|
+
)
|
|
356
366
|
|
|
357
367
|
if num_replacements == 0:
|
|
358
|
-
print(f" - Warning: Could not rename function '{old_name}'. Name not found in definition.")
|
|
359
368
|
return function_code
|
|
360
|
-
|
|
369
|
+
|
|
361
370
|
return new_function_code
|
|
362
371
|
|
|
363
372
|
|
|
@@ -383,22 +392,23 @@ def update_list_tools_method(content: str, old_name: str, new_name: str) -> str:
|
|
|
383
392
|
replacement = r"\1" + new_name
|
|
384
393
|
|
|
385
394
|
# First, find the list_tools method definition to narrow the search area
|
|
386
|
-
list_tools_match = re.search(
|
|
387
|
-
|
|
395
|
+
list_tools_match = re.search(
|
|
396
|
+
r"def\s+list_tools\s*\([^)]*\):\s*return\s*\[[^\]]*\]", content, re.DOTALL
|
|
397
|
+
)
|
|
398
|
+
|
|
388
399
|
if not list_tools_match:
|
|
389
|
-
print(" - Warning: `list_tools` method not found or has an unexpected format. Cannot update tool list.")
|
|
390
400
|
return content
|
|
391
401
|
|
|
392
402
|
list_tools_code = list_tools_match.group(0)
|
|
393
|
-
|
|
403
|
+
|
|
394
404
|
# Perform the replacement only within the found method block
|
|
395
|
-
updated_list_tools_code, num_replacements = re.subn(
|
|
405
|
+
updated_list_tools_code, num_replacements = re.subn(
|
|
406
|
+
pattern, replacement, list_tools_code
|
|
407
|
+
)
|
|
396
408
|
|
|
397
409
|
if num_replacements > 0:
|
|
398
|
-
print(f" - Renamed '{old_name}' to '{new_name}' in `list_tools` method.")
|
|
399
410
|
return content.replace(list_tools_code, updated_list_tools_code)
|
|
400
411
|
else:
|
|
401
|
-
print(f" - Warning: Function '{old_name}' not found in `list_tools` method.")
|
|
402
412
|
return content
|
|
403
413
|
|
|
404
414
|
|
|
@@ -421,14 +431,12 @@ def process_file(file_path: str, model: str = "perplexity/sonar") -> int:
|
|
|
421
431
|
|
|
422
432
|
functions = extract_functions_from_script(file_path)
|
|
423
433
|
if not functions:
|
|
424
|
-
print(f"No functions found in {file_path}")
|
|
425
434
|
return 0
|
|
426
435
|
|
|
427
436
|
updated_content = original_content
|
|
428
437
|
count = 0
|
|
429
438
|
|
|
430
439
|
for function_name, function_code in functions:
|
|
431
|
-
print(f"Processing function: {function_name}")
|
|
432
440
|
|
|
433
441
|
try:
|
|
434
442
|
func_tree = ast.parse(function_code)
|
|
@@ -436,7 +444,6 @@ def process_file(file_path: str, model: str = "perplexity/sonar") -> int:
|
|
|
436
444
|
existing_docstring = ast.get_docstring(func_node, clean=True)
|
|
437
445
|
_, rest_of_docstring = parse_existing_docstring(existing_docstring)
|
|
438
446
|
except (SyntaxError, IndexError):
|
|
439
|
-
print(f" - Could not parse function '{function_name}', skipping.")
|
|
440
447
|
continue
|
|
441
448
|
|
|
442
449
|
# 1. Generate new description and check for suggested name
|
|
@@ -445,31 +452,32 @@ def process_file(file_path: str, model: str = "perplexity/sonar") -> int:
|
|
|
445
452
|
# suggested_name = output.suggested_name
|
|
446
453
|
|
|
447
454
|
if not new_description or "Error generating description" in new_description:
|
|
448
|
-
print(f" - Failed to generate description for '{function_name}', skipping.")
|
|
449
455
|
continue
|
|
450
456
|
|
|
451
457
|
# 2. Reconstruct the full docstring content
|
|
452
458
|
reconstructed_docstring = new_description
|
|
453
459
|
if rest_of_docstring:
|
|
454
460
|
reconstructed_docstring += "\n\n" + rest_of_docstring
|
|
455
|
-
|
|
461
|
+
|
|
456
462
|
# 3. Handle function renaming if suggested
|
|
457
463
|
code_to_update = function_code
|
|
458
|
-
is_renamed = False
|
|
459
464
|
# if suggested_name and suggested_name != function_name:
|
|
460
465
|
# print(f" - Renaming function '{function_name}' to '{suggested_name}'")
|
|
461
466
|
# code_to_update = rename_function_in_code(code_to_update, function_name, suggested_name)
|
|
462
467
|
# is_renamed = True
|
|
463
468
|
|
|
464
469
|
# 4. Insert the new docstring back into the (potentially renamed) function code
|
|
465
|
-
updated_function_block = insert_docstring_into_function(
|
|
470
|
+
updated_function_block = insert_docstring_into_function(
|
|
471
|
+
code_to_update, reconstructed_docstring
|
|
472
|
+
)
|
|
466
473
|
|
|
467
474
|
# 5. If any changes were made, update the main content
|
|
468
475
|
if updated_function_block != function_code:
|
|
469
|
-
updated_content = updated_content.replace(
|
|
476
|
+
updated_content = updated_content.replace(
|
|
477
|
+
function_code, updated_function_block
|
|
478
|
+
)
|
|
470
479
|
count += 1
|
|
471
|
-
|
|
472
|
-
|
|
480
|
+
|
|
473
481
|
# 6. If the function was renamed, also update the list_tools method
|
|
474
482
|
# if is_renamed:
|
|
475
483
|
# updated_content = update_list_tools_method(updated_content, function_name, suggested_name)
|
|
@@ -477,14 +485,15 @@ def process_file(file_path: str, model: str = "perplexity/sonar") -> int:
|
|
|
477
485
|
if updated_content != original_content:
|
|
478
486
|
with open(file_path, "w", encoding="utf-8") as f:
|
|
479
487
|
f.write(updated_content)
|
|
480
|
-
print(f"\nUpdated {count} functions in {file_path}")
|
|
481
488
|
else:
|
|
482
|
-
|
|
489
|
+
pass
|
|
483
490
|
|
|
484
491
|
return count
|
|
485
492
|
|
|
486
493
|
|
|
487
494
|
app = typer.Typer()
|
|
495
|
+
|
|
496
|
+
|
|
488
497
|
@app.command()
|
|
489
498
|
def docgen(
|
|
490
499
|
file_path: Path = typer.Argument(..., help="Path to the Python file to process"),
|
|
@@ -512,5 +521,6 @@ def docgen(
|
|
|
512
521
|
console.print(f"[red]Error: {e}[/red]")
|
|
513
522
|
raise typer.Exit(1) from e
|
|
514
523
|
|
|
524
|
+
|
|
515
525
|
if __name__ == "__main__":
|
|
516
|
-
app()
|
|
526
|
+
app()
|
{universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/readme.py
RENAMED
|
@@ -87,29 +87,30 @@ APPS = [
|
|
|
87
87
|
"zenquotes",
|
|
88
88
|
]
|
|
89
89
|
|
|
90
|
+
|
|
90
91
|
def main():
|
|
91
92
|
"""
|
|
92
93
|
Runs the readme generation for a predefined list of applications.
|
|
93
94
|
"""
|
|
94
|
-
base_path = os.path.abspath(
|
|
95
|
-
|
|
95
|
+
base_path = os.path.abspath(
|
|
96
|
+
os.path.join(os.path.dirname(__file__), "..", "universal_mcp", "applications")
|
|
97
|
+
)
|
|
98
|
+
|
|
96
99
|
for app in APPS:
|
|
97
100
|
app_path = os.path.join(base_path, app, "app.py")
|
|
98
101
|
command = ["universal_mcp", "codegen", "readme", app_path]
|
|
99
|
-
|
|
100
|
-
print(f"Running readme codegen for: {app}")
|
|
102
|
+
|
|
101
103
|
try:
|
|
102
104
|
# Using 'uv run' to ensure the command is executed in the correct environment
|
|
103
|
-
|
|
104
|
-
|
|
105
|
+
subprocess.run(
|
|
106
|
+
["uv", "run"] + command, check=True, capture_output=True, text=True
|
|
107
|
+
)
|
|
105
108
|
# print(result.stdout) # Optional: print stdout for more details
|
|
106
|
-
except subprocess.CalledProcessError
|
|
107
|
-
|
|
108
|
-
print(f"Stderr: {e.stderr}")
|
|
109
|
-
print(f"Stdout: {e.stdout}")
|
|
109
|
+
except subprocess.CalledProcessError:
|
|
110
|
+
pass
|
|
110
111
|
except FileNotFoundError:
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
pass
|
|
113
|
+
|
|
113
114
|
|
|
114
115
|
if __name__ == "__main__":
|
|
115
116
|
main()
|
{universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.22}/src/scripts/run_docgen.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
import os
|
|
3
2
|
import subprocess
|
|
4
3
|
|
|
@@ -14,26 +13,25 @@ APPS = [
|
|
|
14
13
|
"outlook",
|
|
15
14
|
]
|
|
16
15
|
|
|
16
|
+
|
|
17
17
|
def main():
|
|
18
18
|
"""
|
|
19
19
|
Runs the docgen.py script for a predefined list of applications.
|
|
20
20
|
"""
|
|
21
21
|
script_path = "src/scripts/docgen.py"
|
|
22
22
|
base_path = "/Users/ankitranjan/Work/applications/src/universal_mcp/applications"
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
for app in APPS:
|
|
25
25
|
app_path = os.path.join(base_path, app, "app.py")
|
|
26
26
|
command = ["python", script_path, app_path]
|
|
27
|
-
|
|
28
|
-
print(f"Running docgen for: {app}")
|
|
27
|
+
|
|
29
28
|
try:
|
|
30
29
|
subprocess.run(command, check=True)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
print(f"Error generating docs for {app}: {e}")
|
|
30
|
+
except subprocess.CalledProcessError:
|
|
31
|
+
pass
|
|
34
32
|
except FileNotFoundError:
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
pass
|
|
34
|
+
|
|
37
35
|
|
|
38
36
|
if __name__ == "__main__":
|
|
39
37
|
main()
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import pytest
|
|
2
|
-
|
|
3
2
|
from universal_mcp.applications.utils import app_from_slug
|
|
4
3
|
from universal_mcp.utils.testing import check_application_instance
|
|
5
4
|
|
|
@@ -9,18 +8,18 @@ ALL_APPS = [
|
|
|
9
8
|
"apollo",
|
|
10
9
|
"asana",
|
|
11
10
|
"aws_s3",
|
|
12
|
-
"bill",
|
|
11
|
+
"bill", # not seeded
|
|
13
12
|
"box",
|
|
14
13
|
"braze",
|
|
15
|
-
#"cal_com_v2", # not seeded
|
|
14
|
+
# "cal_com_v2", # not seeded
|
|
16
15
|
"calendly",
|
|
17
16
|
"canva",
|
|
18
17
|
"clickup",
|
|
19
18
|
"coda",
|
|
20
19
|
"confluence", # not seeded
|
|
21
|
-
"contentful",
|
|
20
|
+
"contentful", # not seeded
|
|
22
21
|
"crustdata",
|
|
23
|
-
"dialpad",
|
|
22
|
+
"dialpad", # not seeded
|
|
24
23
|
"digitalocean",
|
|
25
24
|
"domain_checker",
|
|
26
25
|
"e2b",
|
|
@@ -66,14 +65,14 @@ ALL_APPS = [
|
|
|
66
65
|
"rocketlane",
|
|
67
66
|
"scraper",
|
|
68
67
|
"semanticscholar",
|
|
69
|
-
"semrush",
|
|
68
|
+
"semrush", # not seeded
|
|
70
69
|
"sendgrid",
|
|
71
70
|
"sentry",
|
|
72
71
|
"serpapi",
|
|
73
72
|
"sharepoint", # not seeded
|
|
74
73
|
"shopify",
|
|
75
74
|
"shortcut",
|
|
76
|
-
"slack",
|
|
75
|
+
"slack", # not seeded
|
|
77
76
|
"spotify",
|
|
78
77
|
"supabase",
|
|
79
78
|
"tavily",
|
|
@@ -83,7 +82,7 @@ ALL_APPS = [
|
|
|
83
82
|
"unipile",
|
|
84
83
|
"whatsapp",
|
|
85
84
|
"whatsapp_business",
|
|
86
|
-
"wrike",
|
|
85
|
+
"wrike", # not seeded
|
|
87
86
|
"yahoo_finance",
|
|
88
87
|
"youtube",
|
|
89
88
|
"zenquotes",
|