universal-mcp-applications 0.1.21__tar.gz → 0.1.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/PKG-INFO +2 -1
  2. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/bump_and_release.sh +3 -4
  3. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/pyproject.toml +6 -9
  4. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/scripts/docgen.py +80 -70
  5. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/scripts/prompts.py +1 -1
  6. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/scripts/readme.py +13 -12
  7. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/scripts/run_docgen.py +8 -18
  8. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/tests/test_applications.py +8 -9
  9. universal_mcp_applications-0.1.23/src/universal_mcp/applications/BEST_PRACTICES.md +166 -0
  10. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/airtable/app.py +0 -1
  11. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/apollo/app.py +0 -1
  12. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/aws_s3/app.py +40 -39
  13. universal_mcp_applications-0.1.23/src/universal_mcp/applications/browser_use/README.md +1 -0
  14. universal_mcp_applications-0.1.23/src/universal_mcp/applications/browser_use/app.py +71 -0
  15. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/calendly/app.py +125 -125
  16. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/canva/app.py +95 -99
  17. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/confluence/app.py +0 -1
  18. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/contentful/app.py +4 -5
  19. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/domain_checker/app.py +11 -15
  20. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/e2b/app.py +4 -4
  21. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/elevenlabs/app.py +18 -15
  22. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/exa/app.py +17 -17
  23. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/falai/app.py +28 -29
  24. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/file_system/app.py +9 -9
  25. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/firecrawl/app.py +36 -36
  26. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fireflies/app.py +55 -56
  27. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/app.py +49 -50
  28. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ghost_content/app.py +0 -1
  29. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/github/app.py +41 -43
  30. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_calendar/app.py +40 -39
  31. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_docs/app.py +168 -232
  32. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_drive/app.py +212 -215
  33. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_gemini/app.py +1 -5
  34. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_mail/app.py +91 -90
  35. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_searchconsole/app.py +29 -29
  36. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_sheet/app.py +115 -115
  37. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hashnode/README.md +6 -3
  38. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hashnode/app.py +174 -25
  39. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/http_tools/app.py +10 -11
  40. universal_mcp_applications-0.1.23/src/universal_mcp/applications/hubspot/__init__.py +1 -0
  41. universal_mcp_applications-0.1.23/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +54 -0
  42. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hubspot/api_segments/crm_api.py +368 -368
  43. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hubspot/api_segments/marketing_api.py +115 -115
  44. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hubspot/app.py +131 -72
  45. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/jira/app.py +0 -1
  46. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/linkedin/app.py +20 -20
  47. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/markitdown/app.py +10 -5
  48. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ms_teams/app.py +123 -123
  49. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/openai/app.py +40 -39
  50. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/outlook/app.py +32 -32
  51. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/perplexity/app.py +4 -4
  52. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/reddit/app.py +69 -70
  53. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/resend/app.py +116 -117
  54. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/rocketlane/app.py +0 -1
  55. universal_mcp_applications-0.1.23/src/universal_mcp/applications/scraper/__init__.py +1 -0
  56. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/scraper/app.py +80 -81
  57. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/serpapi/app.py +14 -14
  58. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sharepoint/app.py +19 -20
  59. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shopify/app.py +0 -1
  60. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/slack/app.py +48 -48
  61. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/tavily/app.py +4 -4
  62. universal_mcp_applications-0.1.23/src/universal_mcp/applications/twitter/api_segments/__init__.py +0 -0
  63. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/compliance_api.py +13 -15
  64. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +20 -20
  65. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/dm_events_api.py +12 -12
  66. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/likes_api.py +12 -12
  67. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/lists_api.py +37 -39
  68. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/spaces_api.py +24 -24
  69. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/trends_api.py +4 -4
  70. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/tweets_api.py +105 -105
  71. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/usage_api.py +4 -4
  72. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/users_api.py +136 -136
  73. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/app.py +6 -2
  74. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/unipile/app.py +90 -97
  75. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp/app.py +53 -54
  76. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp/audio.py +39 -35
  77. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp/whatsapp.py +176 -154
  78. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp_business/app.py +92 -92
  79. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/yahoo_finance/app.py +105 -63
  80. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/youtube/app.py +193 -196
  81. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/zenquotes/__init__.py +2 -0
  82. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/zenquotes/app.py +5 -5
  83. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/uv.lock +19 -2
  84. universal_mcp_applications-0.1.21/examples/children_story_builder.py +0 -146
  85. universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/__init__.py +0 -1
  86. universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -25
  87. universal_mcp_applications-0.1.21/src/universal_mcp/applications/scraper/__init__.py +0 -1
  88. universal_mcp_applications-0.1.21/test.py +0 -41
  89. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/.gitignore +0 -0
  90. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/GEMINI.md +0 -0
  91. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/LICENSE +0 -0
  92. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/README.md +0 -0
  93. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ahrefs/README.md +0 -0
  94. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ahrefs/__init__.py +0 -0
  95. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ahrefs/app.py +0 -0
  96. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/airtable/README.md +0 -0
  97. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/airtable/__init__.py +0 -0
  98. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/apollo/README.md +0 -0
  99. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/apollo/__init__.py +0 -0
  100. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/asana/README.md +0 -0
  101. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/asana/__init__.py +0 -0
  102. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/asana/app.py +0 -0
  103. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/aws_s3/README.md +0 -0
  104. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/aws_s3/__init__.py +0 -0
  105. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/bill/README.md +0 -0
  106. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/bill/__init__.py +0 -0
  107. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/bill/app.py +0 -0
  108. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/box/README.md +0 -0
  109. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/box/__init__.py +0 -0
  110. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/box/app.py +0 -0
  111. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/braze/README.md +0 -0
  112. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/braze/__init__.py +0 -0
  113. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/braze/app.py +0 -0
  114. {universal_mcp_applications-0.1.21/src/universal_mcp/applications/hubspot/api_segments → universal_mcp_applications-0.1.23/src/universal_mcp/applications/browser_use}/__init__.py +0 -0
  115. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/cal_com_v2/README.md +0 -0
  116. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
  117. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/cal_com_v2/app.py +0 -0
  118. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/calendly/README.md +0 -0
  119. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/calendly/__init__.py +0 -0
  120. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/canva/README.md +0 -0
  121. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/canva/__init__.py +0 -0
  122. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/clickup/README.md +0 -0
  123. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/clickup/__init__.py +0 -0
  124. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/clickup/app.py +0 -0
  125. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/coda/README.md +0 -0
  126. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/coda/__init__.py +0 -0
  127. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/coda/app.py +0 -0
  128. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/confluence/README.md +0 -0
  129. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/confluence/__init__.py +0 -0
  130. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/contentful/README.md +0 -0
  131. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/contentful/__init__.py +0 -0
  132. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/crustdata/README.md +0 -0
  133. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/crustdata/__init__.py +0 -0
  134. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/crustdata/app.py +0 -0
  135. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/dialpad/README.md +0 -0
  136. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/dialpad/__init__.py +0 -0
  137. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/dialpad/app.py +0 -0
  138. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/digitalocean/README.md +0 -0
  139. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/digitalocean/__init__.py +0 -0
  140. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/digitalocean/app.py +0 -0
  141. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/domain_checker/README.md +0 -0
  142. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/domain_checker/__init__.py +0 -0
  143. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/e2b/README.md +0 -0
  144. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/e2b/__init__.py +0 -0
  145. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/elevenlabs/README.md +0 -0
  146. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
  147. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/exa/README.md +0 -0
  148. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/exa/__init__.py +0 -0
  149. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/falai/README.md +0 -0
  150. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/falai/__init__.py +0 -0
  151. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/figma/README.md +0 -0
  152. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/figma/__init__.py +0 -0
  153. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/figma/app.py +0 -0
  154. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/file_system/README.md +0 -0
  155. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/file_system/__init__.py +0 -0
  156. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/firecrawl/README.md +0 -0
  157. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/firecrawl/__init__.py +0 -0
  158. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fireflies/README.md +0 -0
  159. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fireflies/__init__.py +0 -0
  160. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/README.md +0 -0
  161. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/__init__.py +0 -0
  162. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/utils/api.py +0 -0
  163. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/utils/fixtures.py +0 -0
  164. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/utils/helper.py +0 -0
  165. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/utils/league_utils.py +0 -0
  166. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/fpl/utils/position_utils.py +0 -0
  167. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ghost_content/README.md +0 -0
  168. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ghost_content/__init__.py +0 -0
  169. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/github/README.md +0 -0
  170. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/github/__init__.py +0 -0
  171. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/gong/README.md +0 -0
  172. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/gong/__init__.py +0 -0
  173. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/gong/app.py +0 -0
  174. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_calendar/README.md +0 -0
  175. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_calendar/__init__.py +0 -0
  176. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_docs/README.md +0 -0
  177. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_docs/__init__.py +0 -0
  178. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_drive/README.md +0 -0
  179. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_drive/__init__.py +0 -0
  180. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_gemini/README.md +0 -0
  181. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_gemini/__init__.py +0 -0
  182. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_mail/README.md +0 -0
  183. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_mail/__init__.py +0 -0
  184. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_searchconsole/README.md +0 -0
  185. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_searchconsole/__init__.py +0 -0
  186. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_sheet/README.md +0 -0
  187. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_sheet/__init__.py +0 -0
  188. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/google_sheet/helper.py +0 -0
  189. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hashnode/__init__.py +0 -0
  190. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/heygen/README.md +0 -0
  191. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/heygen/__init__.py +0 -0
  192. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/heygen/app.py +0 -0
  193. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/http_tools/README.md +0 -0
  194. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/http_tools/__init__.py +0 -0
  195. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/hubspot/README.md +0 -0
  196. {universal_mcp_applications-0.1.21/src/universal_mcp/applications/twitter → universal_mcp_applications-0.1.23/src/universal_mcp/applications/hubspot}/api_segments/__init__.py +0 -0
  197. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/jira/README.md +0 -0
  198. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/jira/__init__.py +0 -0
  199. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/klaviyo/README.md +0 -0
  200. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/klaviyo/__init__.py +0 -0
  201. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/klaviyo/app.py +0 -0
  202. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/linkedin/README.md +0 -0
  203. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/linkedin/__init__.py +0 -0
  204. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/mailchimp/README.md +0 -0
  205. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
  206. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/mailchimp/app.py +0 -0
  207. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/markitdown/README.md +0 -0
  208. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/markitdown/__init__.py +0 -0
  209. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/miro/README.md +0 -0
  210. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/miro/__init__.py +0 -0
  211. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/miro/app.py +0 -0
  212. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ms_teams/README.md +0 -0
  213. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/ms_teams/__init__.py +0 -0
  214. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/neon/README.md +0 -0
  215. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/neon/__init__.py +0 -0
  216. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/neon/app.py +0 -0
  217. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/notion/README.md +0 -0
  218. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/notion/__init__.py +0 -0
  219. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/notion/app.py +0 -0
  220. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/openai/README.md +0 -0
  221. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/openai/__init__.py +0 -0
  222. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/outlook/README.md +0 -0
  223. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/outlook/__init__.py +0 -0
  224. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/perplexity/README.md +0 -0
  225. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/perplexity/__init__.py +0 -0
  226. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/pipedrive/README.md +0 -0
  227. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/pipedrive/__init__.py +0 -0
  228. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/pipedrive/app.py +0 -0
  229. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/posthog/README.md +0 -0
  230. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/posthog/__init__.py +0 -0
  231. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/posthog/app.py +0 -0
  232. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/reddit/README.md +0 -0
  233. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/reddit/__init__.py +0 -0
  234. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/resend/README.md +0 -0
  235. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/resend/__init__.py +0 -0
  236. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/retell/README.md +0 -0
  237. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/retell/__init__.py +0 -0
  238. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/retell/app.py +0 -0
  239. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/rocketlane/README.md +0 -0
  240. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
  241. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/scraper/README.md +0 -0
  242. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semanticscholar/README.md +0 -0
  243. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semanticscholar/__init__.py +0 -0
  244. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semanticscholar/app.py +0 -0
  245. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semrush/README.md +0 -0
  246. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semrush/__init__.py +0 -0
  247. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/semrush/app.py +0 -0
  248. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sendgrid/README.md +0 -0
  249. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sendgrid/__init__.py +0 -0
  250. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sendgrid/app.py +0 -0
  251. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sentry/README.md +0 -0
  252. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sentry/__init__.py +0 -0
  253. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sentry/app.py +0 -0
  254. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/serpapi/README.md +0 -0
  255. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/serpapi/__init__.py +0 -0
  256. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sharepoint/README.md +0 -0
  257. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/sharepoint/__init__.py +0 -0
  258. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shopify/README.md +0 -0
  259. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shopify/__init__.py +0 -0
  260. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shortcut/README.md +0 -0
  261. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shortcut/__init__.py +0 -0
  262. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/shortcut/app.py +0 -0
  263. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/slack/README.md +0 -0
  264. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/slack/__init__.py +0 -0
  265. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/spotify/README.md +0 -0
  266. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/spotify/__init__.py +0 -0
  267. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/spotify/app.py +0 -0
  268. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/supabase/README.md +0 -0
  269. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/supabase/__init__.py +0 -0
  270. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/supabase/app.py +0 -0
  271. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/tavily/README.md +0 -0
  272. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/tavily/__init__.py +0 -0
  273. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/trello/README.md +0 -0
  274. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/trello/__init__.py +0 -0
  275. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/trello/app.py +0 -0
  276. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twilio/README.md +0 -0
  277. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twilio/__init__.py +0 -0
  278. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twilio/app.py +0 -0
  279. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/README.md +0 -0
  280. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/__init__.py +0 -0
  281. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/api_segment_base.py +0 -0
  282. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/twitter/api_segments/openapi_json_api.py +0 -0
  283. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/unipile/README.md +0 -0
  284. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/unipile/__init__.py +0 -0
  285. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp/README.md +0 -0
  286. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp/__init__.py +0 -0
  287. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp_business/README.md +0 -0
  288. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/whatsapp_business/__init__.py +0 -0
  289. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/wrike/README.md +0 -0
  290. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/wrike/__init__.py +0 -0
  291. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/wrike/app.py +0 -0
  292. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/yahoo_finance/README.md +0 -0
  293. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/yahoo_finance/__init__.py +0 -0
  294. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/youtube/README.md +0 -0
  295. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/src/universal_mcp/applications/youtube/__init__.py +0 -0
  296. {universal_mcp_applications-0.1.21 → universal_mcp_applications-0.1.23}/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.21
3
+ Version: 0.1.23
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
@@ -20,9 +20,8 @@ BRANCH=$(git branch --show-current)
20
20
  CURRENT_VERSION=$(grep -E '^version = "[0-9]+\.[0-9]+\.[0-9]+.*"' pyproject.toml | cut -d'"' -f2)
21
21
 
22
22
  # Split version into major, minor, patch
23
- MAJOR=$(echo "$CURRENT_VERSION" | cut -d'.' -f1)
24
- MINOR=$(echo "$CURRENT_VERSION" | cut -d'.' -f2)
25
- PATCH=$(echo "$CURRENT_VERSION" | cut -d'.' -f3)
23
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
24
+
26
25
  # Remove any rc suffix from PATCH if it exists
27
26
  PATCH_NUM=$(echo $PATCH | sed 's/-rc[0-9]*//')
28
27
 
@@ -51,7 +50,7 @@ else
51
50
  fi
52
51
 
53
52
  # Update version in pyproject.toml
54
- sed -i "s/^version = \".*\"/version = \"$NEW_VERSION\"/" pyproject.toml
53
+ sed -i '' "s/^version = ".*"/version = \"$NEW_VERSION\"/" pyproject.toml
55
54
 
56
55
  echo "Version bumped from $CURRENT_VERSION to $NEW_VERSION"
57
56
 
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "universal-mcp-applications"
9
- version = "0.1.21"
9
+ version = "0.1.23"
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 = 88
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
-
@@ -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 typing import Optional
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(description="A clear, detailed description of what the function does")
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[tuple[str, str]] = [] # Store tuples of (function_name, function_source)
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 as e:
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 as e:
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 as e:
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 as e:
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
- print("Warning: No functions found in the file.")
111
+ pass
116
112
 
117
113
  return extractor.functions
118
- except Exception as e:
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('\n')
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 not summary_done and stripped_line and not stripped_line.startswith(section_markers):
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
- # A section starts immediately after the summary
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("description", "No description available."),
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 as e:
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
- print(f" - Max retries reached. Error generating description: {e}", file=sys.stderr)
263
- return DescriptionOutput(description=f"Error generating description after {max_retries} retries: {e}")
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(description="Failed to generate description after all retries.")
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(tree.body[0], (ast.FunctionDef, ast.AsyncFunctionDef)):
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[: len(first_body_line_str) - len(first_body_line_str.lstrip())]
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([f"{body_indent}{line}\n" for line in docstring.splitlines()])
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 and
312
- isinstance(func_node.body[0], ast.Expr) and
313
- isinstance(func_node.body[0].value, ast.Constant) and
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 = func_node.body[0].lineno - 1 if func_node.body else func_node.lineno
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 = pre_insertion_lines + new_docstring_lines_formatted + post_insertion_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) # Validate syntax
339
+ ast.parse(final_code) # Validate syntax
331
340
  return final_code
332
341
 
333
- except Exception as e:
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(pattern, replacement, function_code, 1)
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(r"def\s+list_tools\s*\([^)]*\):\s*return\s*\[[^\]]*\]", content, re.DOTALL)
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(pattern, replacement, list_tools_code)
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(code_to_update, reconstructed_docstring)
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(function_code, updated_function_block)
476
+ updated_content = updated_content.replace(
477
+ function_code, updated_function_block
478
+ )
470
479
  count += 1
471
- print(f" - Updated function block for '{function_name}'.")
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
- print("\nNo changes made to the file.")
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()
@@ -23,4 +23,4 @@ Respond ONLY in the following JSON format.
23
23
  {{
24
24
  "description": "A clear and detailed description of what the function does, taking into account the full script context.",
25
25
  }}
26
- """
26
+ """
@@ -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(os.path.join(os.path.dirname(__file__), '..', 'universal_mcp', 'applications'))
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
- result = subprocess.run(["uv", "run"] + command, check=True, capture_output=True, text=True)
104
- print(f"Successfully generated readme for: {app}")
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 as e:
107
- print(f"Error generating readme for {app}: {e}")
108
- print(f"Stderr: {e.stderr}")
109
- print(f"Stdout: {e.stdout}")
109
+ except subprocess.CalledProcessError:
110
+ pass
110
111
  except FileNotFoundError:
111
- print(f"Error: Could not find app file for {app} at {app_path}")
112
- print("-" * 20)
112
+ pass
113
+
113
114
 
114
115
  if __name__ == "__main__":
115
116
  main()
@@ -1,39 +1,29 @@
1
-
2
1
  import os
3
2
  import subprocess
4
3
 
5
4
  APPS = [
6
- "google_mail",
7
- "google_calendar",
8
- "google_docs",
9
- "google_drive",
10
- "google_searchconsole",
11
- "google_sheet",
12
- "linkedin",
13
- "ms_teams",
14
- "outlook",
5
+ "google_docs"
15
6
  ]
16
7
 
8
+
17
9
  def main():
18
10
  """
19
11
  Runs the docgen.py script for a predefined list of applications.
20
12
  """
21
13
  script_path = "src/scripts/docgen.py"
22
14
  base_path = "/Users/ankitranjan/Work/applications/src/universal_mcp/applications"
23
-
15
+
24
16
  for app in APPS:
25
17
  app_path = os.path.join(base_path, app, "app.py")
26
18
  command = ["python", script_path, app_path]
27
-
28
- print(f"Running docgen for: {app}")
19
+
29
20
  try:
30
21
  subprocess.run(command, check=True)
31
- print(f"Successfully generated docs for: {app}")
32
- except subprocess.CalledProcessError as e:
33
- print(f"Error generating docs for {app}: {e}")
22
+ except subprocess.CalledProcessError:
23
+ pass
34
24
  except FileNotFoundError:
35
- print(f"Error: Could not find app file for {app} at {app_path}")
36
- print("-" * 20)
25
+ pass
26
+
37
27
 
38
28
  if __name__ == "__main__":
39
29
  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", # not seeded
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", # not seeded
22
+ "dialpad", # not seeded
24
23
  "digitalocean",
25
24
  "domain_checker",
26
25
  "e2b",
@@ -66,15 +65,15 @@ ALL_APPS = [
66
65
  "rocketlane",
67
66
  "scraper",
68
67
  "semanticscholar",
69
- "semrush", # not seeded
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", # not seeded
77
- "spotify",
75
+ "slack", # not seeded
76
+ "spotify", # not seeded
78
77
  "supabase",
79
78
  "tavily",
80
79
  "trello",
@@ -83,7 +82,7 @@ ALL_APPS = [
83
82
  "unipile",
84
83
  "whatsapp",
85
84
  "whatsapp_business",
86
- "wrike", # not seeded
85
+ "wrike", # not seeded
87
86
  "yahoo_finance",
88
87
  "youtube",
89
88
  "zenquotes",