universal-mcp 0.1.8rc2__py3-none-any.whl → 0.1.8rc3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. universal_mcp/__init__.py +0 -2
  2. universal_mcp/analytics.py +75 -0
  3. universal_mcp/applications/application.py +27 -5
  4. universal_mcp/applications/calendly/app.py +413 -160
  5. universal_mcp/applications/coda/README.md +133 -0
  6. universal_mcp/applications/coda/__init__.py +0 -0
  7. universal_mcp/applications/coda/app.py +3704 -0
  8. universal_mcp/applications/e2b/app.py +6 -7
  9. universal_mcp/applications/firecrawl/app.py +1 -1
  10. universal_mcp/applications/github/app.py +41 -42
  11. universal_mcp/applications/google_calendar/app.py +20 -20
  12. universal_mcp/applications/google_docs/app.py +22 -29
  13. universal_mcp/applications/google_drive/app.py +53 -59
  14. universal_mcp/applications/google_mail/app.py +40 -40
  15. universal_mcp/applications/google_sheet/app.py +44 -51
  16. universal_mcp/applications/markitdown/app.py +4 -4
  17. universal_mcp/applications/notion/app.py +93 -83
  18. universal_mcp/applications/perplexity/app.py +5 -5
  19. universal_mcp/applications/reddit/app.py +32 -32
  20. universal_mcp/applications/resend/app.py +4 -4
  21. universal_mcp/applications/serpapi/app.py +4 -4
  22. universal_mcp/applications/tavily/app.py +4 -4
  23. universal_mcp/applications/wrike/app.py +566 -226
  24. universal_mcp/applications/youtube/app.py +626 -166
  25. universal_mcp/applications/zenquotes/app.py +3 -3
  26. universal_mcp/exceptions.py +1 -0
  27. universal_mcp/integrations/__init__.py +11 -2
  28. universal_mcp/integrations/integration.py +2 -2
  29. universal_mcp/logger.py +3 -56
  30. universal_mcp/servers/__init__.py +2 -1
  31. universal_mcp/servers/server.py +76 -77
  32. universal_mcp/stores/store.py +5 -3
  33. universal_mcp/tools/__init__.py +1 -1
  34. universal_mcp/tools/adapters.py +4 -1
  35. universal_mcp/tools/func_metadata.py +5 -6
  36. universal_mcp/tools/tools.py +108 -51
  37. universal_mcp/utils/docgen.py +121 -69
  38. universal_mcp/utils/docstring_parser.py +44 -21
  39. universal_mcp/utils/dump_app_tools.py +33 -23
  40. universal_mcp/utils/openapi.py +121 -47
  41. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/METADATA +2 -2
  42. universal_mcp-0.1.8rc3.dist-info/RECORD +75 -0
  43. universal_mcp-0.1.8rc2.dist-info/RECORD +0 -71
  44. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/WHEEL +0 -0
  45. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/entry_points.txt +0 -0
@@ -12,11 +12,11 @@ class GoogleSheetApp(APIApplication):
12
12
  Application for interacting with Google Sheets API.
13
13
  Provides tools to create and manage Google Spreadsheets.
14
14
  """
15
-
15
+
16
16
  def __init__(self, integration: Integration | None = None) -> None:
17
17
  super().__init__(name="google-sheet", integration=integration)
18
18
  self.base_api_url = "https://sheets.googleapis.com/v4/spreadsheets"
19
-
19
+
20
20
  def _get_headers(self):
21
21
  if not self.integration:
22
22
  raise ValueError("Integration not configured for GoogleSheetsApp")
@@ -31,70 +31,68 @@ class GoogleSheetApp(APIApplication):
31
31
  "Authorization": f"Bearer {credentials['access_token']}",
32
32
  "Content-Type": "application/json",
33
33
  }
34
-
34
+
35
35
  def create_spreadsheet(self, title: str) -> dict[str, Any]:
36
36
  """
37
37
  Creates a new blank Google Spreadsheet with the specified title and returns the API response.
38
-
38
+
39
39
  Args:
40
40
  title: String representing the desired title for the new spreadsheet
41
-
41
+
42
42
  Returns:
43
43
  Dictionary containing the full response from the Google Sheets API, including the spreadsheet's metadata and properties
44
-
44
+
45
45
  Raises:
46
46
  HTTPError: When the API request fails due to invalid authentication, network issues, or API limitations
47
47
  ValueError: When the title parameter is empty or contains invalid characters
48
-
48
+
49
49
  Tags:
50
50
  create, spreadsheet, google-sheets, api, important
51
51
  """
52
52
  url = self.base_api_url
53
- spreadsheet_data = {
54
- "properties": {
55
- "title": title
56
- }
57
- }
53
+ spreadsheet_data = {"properties": {"title": title}}
58
54
  response = self._post(url, data=spreadsheet_data)
59
55
  return response.json()
60
-
56
+
61
57
  def get_spreadsheet(self, spreadsheet_id: str) -> dict[str, Any]:
62
58
  """
63
59
  Retrieves detailed information about a specific Google Spreadsheet using its ID.
64
-
60
+
65
61
  Args:
66
62
  spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve (found in the spreadsheet's URL)
67
-
63
+
68
64
  Returns:
69
65
  A dictionary containing the full spreadsheet metadata and contents, including properties, sheets, named ranges, and other spreadsheet-specific information from the Google Sheets API
70
-
66
+
71
67
  Raises:
72
68
  HTTPError: When the API request fails due to invalid spreadsheet_id or insufficient permissions
73
69
  ConnectionError: When there's a network connectivity issue
74
70
  ValueError: When the response cannot be parsed as JSON
75
-
71
+
76
72
  Tags:
77
73
  get, retrieve, spreadsheet, api, metadata, read, important
78
74
  """
79
75
  url = f"{self.base_api_url}/{spreadsheet_id}"
80
76
  response = self._get(url)
81
77
  return response.json()
82
-
83
- def batch_get_values(self, spreadsheet_id: str, ranges: list[str] = None) -> dict[str, Any]:
78
+
79
+ def batch_get_values(
80
+ self, spreadsheet_id: str, ranges: list[str] = None
81
+ ) -> dict[str, Any]:
84
82
  """
85
83
  Retrieves multiple ranges of values from a Google Spreadsheet in a single batch request.
86
-
84
+
87
85
  Args:
88
86
  spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve values from
89
87
  ranges: Optional list of A1 notation or R1C1 notation range strings (e.g., ['Sheet1!A1:B2', 'Sheet2!C3:D4']). If None, returns values from the entire spreadsheet
90
-
88
+
91
89
  Returns:
92
90
  A dictionary containing the API response with the requested spreadsheet values and metadata
93
-
91
+
94
92
  Raises:
95
93
  HTTPError: If the API request fails due to invalid spreadsheet_id, insufficient permissions, or invalid range format
96
94
  ValueError: If the spreadsheet_id is empty or invalid
97
-
95
+
98
96
  Tags:
99
97
  get, batch, read, spreadsheet, values, important
100
98
  """
@@ -104,72 +102,67 @@ class GoogleSheetApp(APIApplication):
104
102
  params["ranges"] = ranges
105
103
  response = self._get(url, params=params)
106
104
  return response.json()
107
-
105
+
108
106
  def clear_values(self, spreadsheet_id: str, range: str) -> dict[str, Any]:
109
107
  """
110
108
  Clears all values from a specified range in a Google Spreadsheet while preserving cell formatting and other properties
111
-
109
+
112
110
  Args:
113
111
  spreadsheet_id: The unique identifier of the Google Spreadsheet to modify
114
112
  range: The A1 or R1C1 notation range of cells to clear (e.g., 'Sheet1!A1:B2')
115
-
113
+
116
114
  Returns:
117
115
  A dictionary containing the Google Sheets API response
118
-
116
+
119
117
  Raises:
120
118
  HttpError: When the API request fails due to invalid spreadsheet_id, invalid range format, or insufficient permissions
121
119
  ValueError: When spreadsheet_id is empty or range is in invalid format
122
-
120
+
123
121
  Tags:
124
122
  clear, modify, spreadsheet, api, sheets, data-management, important
125
123
  """
126
124
  url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}:clear"
127
125
  response = self._post(url, data={})
128
126
  return response.json()
129
-
127
+
130
128
  def update_values(
131
- self,
132
- spreadsheet_id: str,
133
- range: str,
134
- values: list[list[Any]],
135
- value_input_option: str = "RAW"
129
+ self,
130
+ spreadsheet_id: str,
131
+ range: str,
132
+ values: list[list[Any]],
133
+ value_input_option: str = "RAW",
136
134
  ) -> dict[str, Any]:
137
135
  """
138
136
  Updates cell values in a specified range of a Google Spreadsheet using the Sheets API
139
-
137
+
140
138
  Args:
141
139
  spreadsheet_id: The unique identifier of the target Google Spreadsheet
142
140
  range: The A1 notation range where values will be updated (e.g., 'Sheet1!A1:B2')
143
141
  values: A list of lists containing the data to write, where each inner list represents a row of values
144
142
  value_input_option: Determines how input data should be interpreted: 'RAW' (as-is) or 'USER_ENTERED' (parsed as UI input). Defaults to 'RAW'
145
-
143
+
146
144
  Returns:
147
145
  A dictionary containing the Google Sheets API response with update details
148
-
146
+
149
147
  Raises:
150
148
  RequestError: When the API request fails due to invalid parameters or network issues
151
149
  AuthenticationError: When authentication with the Google Sheets API fails
152
-
150
+
153
151
  Tags:
154
152
  update, write, sheets, api, important, data-modification, google-sheets
155
153
  """
156
154
  url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}"
157
- params = {
158
- "valueInputOption": value_input_option
159
- }
160
- data = {
161
- "range": range,
162
- "values": values
163
- }
155
+ params = {"valueInputOption": value_input_option}
156
+ data = {"range": range, "values": values}
164
157
  response = self._put(url, data=data, params=params)
165
158
  return response.json()
166
-
159
+
167
160
  def list_tools(self):
168
161
  """Returns a list of methods exposed as tools."""
169
162
  return [
170
- self.create_spreadsheet,
171
- self.get_spreadsheet,
172
- self.batch_get_values,
173
- self.clear_values,
174
- self.update_values
163
+ self.create_spreadsheet,
164
+ self.get_spreadsheet,
165
+ self.batch_get_values,
166
+ self.clear_values,
167
+ self.update_values,
175
168
  ]
@@ -11,7 +11,7 @@ class MarkitdownApp(Application):
11
11
  async def convert_to_markdown(self, uri: str) -> str:
12
12
  """
13
13
  Asynchronously converts a URI to markdown format using the markitdown converter.
14
-
14
+
15
15
  This tool aims to extract the main text content from various sources. It supports:
16
16
  - Web Pages: General HTML, specific handlers for RSS/Atom feeds, Wikipedia articles (main content), YouTube (transcripts if available), Bing SERPs.
17
17
  - Documents: PDF (attempts OCR), DOCX, XLSX, PPTX, XLS, EPUB, Outlook MSG, IPYNB notebooks.
@@ -25,14 +25,14 @@ class MarkitdownApp(Application):
25
25
  - http:// or https:// (Web pages, feeds, APIs)
26
26
  - file:// (Local or accessible network files)
27
27
  - data: (Embedded data)
28
-
28
+
29
29
  Returns:
30
30
  A string containing the markdown representation of the content at the specified URI
31
-
31
+
32
32
  Raises:
33
33
  ValueError: If the URI is invalid or empty
34
34
  ConnectionError: If the URI cannot be accessed or content cannot be retrieved
35
-
35
+
36
36
  Tags:
37
37
  convert, markdown, async, uri, transform, document
38
38
  """