universal-mcp 0.1.9rc1__py3-none-any.whl → 0.1.10__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 (29) hide show
  1. universal_mcp/applications/application.py +19 -30
  2. universal_mcp/applications/cal_com_v2/app.py +1676 -1021
  3. universal_mcp/applications/clickup/app.py +1496 -846
  4. universal_mcp/applications/falai/README.md +42 -0
  5. universal_mcp/applications/falai/__init__.py +0 -0
  6. universal_mcp/applications/falai/app.py +332 -0
  7. universal_mcp/applications/gong/README.md +88 -0
  8. universal_mcp/applications/gong/__init__.py +0 -0
  9. universal_mcp/applications/gong/app.py +2297 -0
  10. universal_mcp/applications/hashnode/app.py +12 -8
  11. universal_mcp/applications/hashnode/prompt.md +2 -0
  12. universal_mcp/applications/heygen/README.md +69 -0
  13. universal_mcp/applications/heygen/__init__.py +0 -0
  14. universal_mcp/applications/heygen/app.py +956 -0
  15. universal_mcp/applications/mailchimp/app.py +3848 -1794
  16. universal_mcp/applications/replicate/README.md +47 -35
  17. universal_mcp/applications/replicate/__init__.py +0 -0
  18. universal_mcp/applications/replicate/app.py +215 -204
  19. universal_mcp/applications/retell_ai/app.py +84 -67
  20. universal_mcp/applications/rocketlane/app.py +49 -35
  21. universal_mcp/applications/spotify/app.py +723 -428
  22. universal_mcp/applications/supabase/app.py +909 -583
  23. universal_mcp/servers/server.py +50 -0
  24. universal_mcp/stores/store.py +2 -3
  25. universal_mcp/utils/docstring_parser.py +67 -36
  26. {universal_mcp-0.1.9rc1.dist-info → universal_mcp-0.1.10.dist-info}/METADATA +5 -1
  27. {universal_mcp-0.1.9rc1.dist-info → universal_mcp-0.1.10.dist-info}/RECORD +29 -19
  28. {universal_mcp-0.1.9rc1.dist-info → universal_mcp-0.1.10.dist-info}/WHEEL +0 -0
  29. {universal_mcp-0.1.9rc1.dist-info → universal_mcp-0.1.10.dist-info}/entry_points.txt +0 -0
@@ -6,23 +6,23 @@ from universal_mcp.integrations import Integration
6
6
 
7
7
  class RetellAiApp(APIApplication):
8
8
  def __init__(self, integration: Integration = None, **kwargs) -> None:
9
- super().__init__(name='retell-ai', integration=integration, **kwargs)
9
+ super().__init__(name="retell-ai", integration=integration, **kwargs)
10
10
  self.base_url = "https://api.retellai.com"
11
11
 
12
12
  def get_v2_get_call_by_call_id(self, call_id) -> dict[str, Any]:
13
13
  """
14
14
  Retrieve detailed information about a specific call using its call ID.
15
-
15
+
16
16
  Args:
17
17
  call_id: The unique identifier of the call to retrieve. Must not be None.
18
-
18
+
19
19
  Returns:
20
20
  A dictionary containing the details of the requested call as returned by the API.
21
-
21
+
22
22
  Raises:
23
23
  ValueError: If the 'call_id' parameter is None.
24
24
  HTTPError: If the HTTP request to the API fails or returns an unsuccessful status code.
25
-
25
+
26
26
  Tags:
27
27
  get, call, api, important
28
28
  """
@@ -34,23 +34,30 @@ class RetellAiApp(APIApplication):
34
34
  response.raise_for_status()
35
35
  return response.json()
36
36
 
37
- def post_v2_create_phone_call(self, from_number, to_number, override_agent_id=None, metadata=None, retell_llm_dynamic_variables=None) -> dict[str, Any]:
37
+ def post_v2_create_phone_call(
38
+ self,
39
+ from_number,
40
+ to_number,
41
+ override_agent_id=None,
42
+ metadata=None,
43
+ retell_llm_dynamic_variables=None,
44
+ ) -> dict[str, Any]:
38
45
  """
39
46
  Initiates a phone call using a JSON payload with specified parameters.
40
-
47
+
41
48
  Args:
42
49
  from_number: The source number for the call.
43
50
  to_number: The destination number for the call.
44
51
  override_agent_id: Optional ID for overriding the default agent.
45
52
  metadata: Optional metadata to be included with the call request.
46
53
  retell_llm_dynamic_variables: Optional dynamic variables for LLM (Large Language Model) processing.
47
-
54
+
48
55
  Returns:
49
56
  A dictionary containing the response data for the created phone call.
50
-
57
+
51
58
  Raises:
52
59
  ValueError: Raised if either 'from_number' or 'to_number' is missing.
53
-
60
+
54
61
  Tags:
55
62
  initiate, create-call, async_job, management, important
56
63
  """
@@ -59,11 +66,11 @@ class RetellAiApp(APIApplication):
59
66
  if to_number is None:
60
67
  raise ValueError("Missing required parameter 'to_number'")
61
68
  request_body = {
62
- 'from_number': from_number,
63
- 'to_number': to_number,
64
- 'override_agent_id': override_agent_id,
65
- 'metadata': metadata,
66
- 'retell_llm_dynamic_variables': retell_llm_dynamic_variables,
69
+ "from_number": from_number,
70
+ "to_number": to_number,
71
+ "override_agent_id": override_agent_id,
72
+ "metadata": metadata,
73
+ "retell_llm_dynamic_variables": retell_llm_dynamic_variables,
67
74
  }
68
75
  request_body = {k: v for k, v in request_body.items() if v is not None}
69
76
  url = f"{self.base_url}/v2/create-phone-call"
@@ -72,30 +79,32 @@ class RetellAiApp(APIApplication):
72
79
  response.raise_for_status()
73
80
  return response.json()
74
81
 
75
- def post_v2_create_web_call(self, agent_id, metadata=None, retell_llm_dynamic_variables=None) -> dict[str, Any]:
82
+ def post_v2_create_web_call(
83
+ self, agent_id, metadata=None, retell_llm_dynamic_variables=None
84
+ ) -> dict[str, Any]:
76
85
  """
77
86
  Creates a web call via a POST request to the v2 endpoint with specified agent ID and optional metadata or dynamic variables.
78
-
87
+
79
88
  Args:
80
89
  agent_id: Required identifier of the agent initiating the web call.
81
90
  metadata: Optional metadata to include in the web call request.
82
91
  retell_llm_dynamic_variables: Optional dynamic variables for LLN model customization.
83
-
92
+
84
93
  Returns:
85
94
  A dictionary containing the response details from the web call creation request.
86
-
95
+
87
96
  Raises:
88
97
  ValueError: Raised when the required 'agent_id' parameter is missing.
89
-
98
+
90
99
  Tags:
91
100
  create, web-calls, api-call, important
92
101
  """
93
102
  if agent_id is None:
94
103
  raise ValueError("Missing required parameter 'agent_id'")
95
104
  request_body = {
96
- 'agent_id': agent_id,
97
- 'metadata': metadata,
98
- 'retell_llm_dynamic_variables': retell_llm_dynamic_variables,
105
+ "agent_id": agent_id,
106
+ "metadata": metadata,
107
+ "retell_llm_dynamic_variables": retell_llm_dynamic_variables,
99
108
  }
100
109
  request_body = {k: v for k, v in request_body.items() if v is not None}
101
110
  url = f"{self.base_url}/v2/create-web-call"
@@ -107,16 +116,16 @@ class RetellAiApp(APIApplication):
107
116
  def get_get_voice_by_voice_id(self, voice_id) -> dict[str, Any]:
108
117
  """
109
118
  Fetches voice details based on the provided voice ID.
110
-
119
+
111
120
  Args:
112
121
  voice_id: The unique identifier of the voice to retrieve.
113
-
122
+
114
123
  Returns:
115
124
  A dictionary containing voice details.
116
-
125
+
117
126
  Raises:
118
127
  ValueError: Raised when the 'voice_id' parameter is missing or None.
119
-
128
+
120
129
  Tags:
121
130
  retrieve, voice, important, data-fetched
122
131
  """
@@ -128,30 +137,32 @@ class RetellAiApp(APIApplication):
128
137
  response.raise_for_status()
129
138
  return response.json()
130
139
 
131
- def post_v2_list_calls(self, filter_criteria=None, sort_order=None, limit=None, pagination_key=None) -> list[Any]:
140
+ def post_v2_list_calls(
141
+ self, filter_criteria=None, sort_order=None, limit=None, pagination_key=None
142
+ ) -> list[Any]:
132
143
  """
133
144
  Sends a POST request to list call records with optional filtering, sorting, pagination, and limits.
134
-
145
+
135
146
  Args:
136
147
  filter_criteria: Optional dictionary specifying filter conditions for returned call records.
137
148
  sort_order: Optional sorting instructions (e.g., by date or status) for the call records.
138
149
  limit: Optional integer specifying the maximum number of call records to return.
139
150
  pagination_key: Optional key indicating where to continue fetching records for paginated results.
140
-
151
+
141
152
  Returns:
142
153
  A list of call record objects returned from the API.
143
-
154
+
144
155
  Raises:
145
156
  HTTPError: If the HTTP request to the remote service fails or returns an error status code.
146
-
157
+
147
158
  Tags:
148
159
  list, calls, api, batch, management, important
149
160
  """
150
161
  request_body = {
151
- 'filter_criteria': filter_criteria,
152
- 'sort_order': sort_order,
153
- 'limit': limit,
154
- 'pagination_key': pagination_key,
162
+ "filter_criteria": filter_criteria,
163
+ "sort_order": sort_order,
164
+ "limit": limit,
165
+ "pagination_key": pagination_key,
155
166
  }
156
167
  request_body = {k: v for k, v in request_body.items() if v is not None}
157
168
  url = f"{self.base_url}/v2/list-calls"
@@ -160,33 +171,35 @@ class RetellAiApp(APIApplication):
160
171
  response.raise_for_status()
161
172
  return response.json()
162
173
 
163
- def post_create_phone_number(self, area_code, inbound_agent_id=None, outbound_agent_id=None, nickname=None) -> dict[str, Any]:
174
+ def post_create_phone_number(
175
+ self, area_code, inbound_agent_id=None, outbound_agent_id=None, nickname=None
176
+ ) -> dict[str, Any]:
164
177
  """
165
178
  Creates a phone number with the specified area code and optional parameters.
166
-
179
+
167
180
  Args:
168
181
  area_code: The area code for the phone number (required).
169
182
  inbound_agent_id: The ID of the agent to handle inbound calls (optional).
170
183
  outbound_agent_id: The ID of the agent to handle outbound calls (optional).
171
184
  nickname: A user-friendly name for the phone number (optional).
172
-
185
+
173
186
  Returns:
174
187
  A dictionary containing the created phone number details and any associated metadata.
175
-
188
+
176
189
  Raises:
177
190
  ValueError: When the required parameter 'area_code' is None or not provided.
178
191
  HTTPError: When the API request fails with an error status code.
179
-
192
+
180
193
  Tags:
181
194
  create, phone, post, communication, important
182
195
  """
183
196
  if area_code is None:
184
197
  raise ValueError("Missing required parameter 'area_code'")
185
198
  request_body = {
186
- 'inbound_agent_id': inbound_agent_id,
187
- 'outbound_agent_id': outbound_agent_id,
188
- 'area_code': area_code,
189
- 'nickname': nickname,
199
+ "inbound_agent_id": inbound_agent_id,
200
+ "outbound_agent_id": outbound_agent_id,
201
+ "area_code": area_code,
202
+ "nickname": nickname,
190
203
  }
191
204
  request_body = {k: v for k, v in request_body.items() if v is not None}
192
205
  url = f"{self.base_url}/create-phone-number"
@@ -198,17 +211,17 @@ class RetellAiApp(APIApplication):
198
211
  def get_get_phone_number_by_phone_number(self, phone_number) -> dict[str, Any]:
199
212
  """
200
213
  Retrieves phone number details by making a GET request to the API endpoint using the provided phone number.
201
-
214
+
202
215
  Args:
203
216
  phone_number: str. The phone number to look up. Must not be None.
204
-
217
+
205
218
  Returns:
206
219
  dict[str, Any]: A dictionary containing the details associated with the given phone number as returned by the API.
207
-
220
+
208
221
  Raises:
209
222
  ValueError: If the 'phone_number' parameter is None.
210
223
  requests.HTTPError: If the HTTP request fails or an error response is returned from the API.
211
-
224
+
212
225
  Tags:
213
226
  get, phone-number, api, lookup, important
214
227
  """
@@ -220,19 +233,21 @@ class RetellAiApp(APIApplication):
220
233
  response.raise_for_status()
221
234
  return response.json()
222
235
 
223
- def get_list_phone_numbers(self, ) -> list[Any]:
236
+ def get_list_phone_numbers(
237
+ self,
238
+ ) -> list[Any]:
224
239
  """
225
240
  Retrieves a list of phone numbers from the remote API.
226
-
241
+
227
242
  Args:
228
243
  None: This function takes no arguments
229
-
244
+
230
245
  Returns:
231
246
  A list containing the phone numbers returned by the API.
232
-
247
+
233
248
  Raises:
234
249
  requests.HTTPError: If the HTTP request to the API fails or returns an unsuccessful status code.
235
-
250
+
236
251
  Tags:
237
252
  get, list, phone-numbers, api, synchronous, important
238
253
  """
@@ -242,32 +257,34 @@ class RetellAiApp(APIApplication):
242
257
  response.raise_for_status()
243
258
  return response.json()
244
259
 
245
- def patch_update_phone_number_by_phone_number(self, phone_number, inbound_agent_id=None, outbound_agent_id=None, nickname=None) -> dict[str, Any]:
260
+ def patch_update_phone_number_by_phone_number(
261
+ self, phone_number, inbound_agent_id=None, outbound_agent_id=None, nickname=None
262
+ ) -> dict[str, Any]:
246
263
  """
247
264
  Updates the information of a phone number by its number, allowing optional modification of inbound and outbound agent IDs and nickname.
248
-
265
+
249
266
  Args:
250
267
  phone_number: str. The phone number to update. This parameter is required.
251
268
  inbound_agent_id: Optional[str]. The ID of the inbound agent to associate with the phone number. If None, this field will not be updated.
252
269
  outbound_agent_id: Optional[str]. The ID of the outbound agent to associate with the phone number. If None, this field will not be updated.
253
270
  nickname: Optional[str]. The nickname to assign to the phone number. If None, this field will not be updated.
254
-
271
+
255
272
  Returns:
256
273
  dict[str, Any]: A dictionary containing the updated phone number information as returned by the API.
257
-
274
+
258
275
  Raises:
259
276
  ValueError: If the required parameter 'phone_number' is not provided.
260
277
  requests.HTTPError: If the HTTP PATCH request fails or the response has an error status.
261
-
278
+
262
279
  Tags:
263
280
  update, phone-number, api, patch, management
264
281
  """
265
282
  if phone_number is None:
266
283
  raise ValueError("Missing required parameter 'phone_number'")
267
284
  request_body = {
268
- 'inbound_agent_id': inbound_agent_id,
269
- 'outbound_agent_id': outbound_agent_id,
270
- 'nickname': nickname,
285
+ "inbound_agent_id": inbound_agent_id,
286
+ "outbound_agent_id": outbound_agent_id,
287
+ "nickname": nickname,
271
288
  }
272
289
  request_body = {k: v for k, v in request_body.items() if v is not None}
273
290
  url = f"{self.base_url}/update-phone-number/{phone_number}"
@@ -279,17 +296,17 @@ class RetellAiApp(APIApplication):
279
296
  def delete_delete_phone_number_by_phone_number(self, phone_number) -> Any:
280
297
  """
281
298
  Deletes a phone number resource by its phone number identifier via an HTTP DELETE request.
282
-
299
+
283
300
  Args:
284
301
  phone_number: The phone number (str or compatible type) identifying the resource to be deleted.
285
-
302
+
286
303
  Returns:
287
304
  The server's JSON response as a Python object upon successful deletion.
288
-
305
+
289
306
  Raises:
290
307
  ValueError: If 'phone_number' is None.
291
308
  requests.HTTPError: If the HTTP DELETE request results in an error status code.
292
-
309
+
293
310
  Tags:
294
311
  delete, phone-number, api, management, important
295
312
  """
@@ -312,5 +329,5 @@ class RetellAiApp(APIApplication):
312
329
  self.get_get_phone_number_by_phone_number,
313
330
  self.get_list_phone_numbers,
314
331
  self.patch_update_phone_number_by_phone_number,
315
- self.delete_delete_phone_number_by_phone_number
332
+ self.delete_delete_phone_number_by_phone_number,
316
333
  ]
@@ -6,8 +6,8 @@ from universal_mcp.integrations import Integration
6
6
 
7
7
  class RocketlaneApp(APIApplication):
8
8
  def __init__(self, integration: Integration = None, **kwargs) -> None:
9
- super().__init__(name='rocketlane', integration=integration, **kwargs)
10
- subdomain= self.integration.get_credentials().get("subdomain")
9
+ super().__init__(name="rocketlane", integration=integration, **kwargs)
10
+ subdomain = self.integration.get_credentials().get("subdomain")
11
11
  self.base_url = f"https://{subdomain}.api.rocketlane.com/api/v1"
12
12
 
13
13
  def _get_headers(self) -> dict[str, Any]:
@@ -18,19 +18,21 @@ class RocketlaneApp(APIApplication):
18
18
  "Accept": "application/json",
19
19
  }
20
20
 
21
- def get_subscription(self, ) -> Any:
21
+ def get_subscription(
22
+ self,
23
+ ) -> Any:
22
24
  """
23
25
  Retrieves subscription details from the server.
24
-
26
+
25
27
  Args:
26
28
  None: This function does not take any parameters.
27
-
29
+
28
30
  Returns:
29
31
  A JSON response containing subscription details.
30
-
32
+
31
33
  Raises:
32
34
  requests.HTTPError: Raised if an HTTP error occurs during the request
33
-
35
+
34
36
  Tags:
35
37
  fetch, subscription, management, important
36
38
  """
@@ -40,16 +42,18 @@ class RocketlaneApp(APIApplication):
40
42
  response.raise_for_status()
41
43
  return response.json()
42
44
 
43
- def get_home(self, ) -> Any:
45
+ def get_home(
46
+ self,
47
+ ) -> Any:
44
48
  """
45
49
  Retrieves the JSON response from the '/home' endpoint of the configured API.
46
-
50
+
47
51
  Returns:
48
52
  Any: Parsed JSON data returned by the '/home' endpoint.
49
-
53
+
50
54
  Raises:
51
55
  requests.HTTPError: If the HTTP request to the '/home' endpoint returns an unsuccessful status code.
52
-
56
+
53
57
  Tags:
54
58
  get, home, api, request, important
55
59
  """
@@ -59,19 +63,21 @@ class RocketlaneApp(APIApplication):
59
63
  response.raise_for_status()
60
64
  return response.json()
61
65
 
62
- def get_all_projects(self, ) -> dict[str, Any]:
66
+ def get_all_projects(
67
+ self,
68
+ ) -> dict[str, Any]:
63
69
  """
64
70
  Retrieves a list of all projects from the remote service.
65
-
71
+
66
72
  Args:
67
73
  None: This function takes no arguments
68
-
74
+
69
75
  Returns:
70
76
  A dictionary containing the JSON response data representing all available projects.
71
-
77
+
72
78
  Raises:
73
79
  HTTPError: If the HTTP request to retrieve the projects fails or returns an unsuccessful status code.
74
-
80
+
75
81
  Tags:
76
82
  list, projects, api, important
77
83
  """
@@ -84,17 +90,17 @@ class RocketlaneApp(APIApplication):
84
90
  def get_projects_by_projectid(self, projectId) -> Any:
85
91
  """
86
92
  Retrieves project details for a given project ID from the server.
87
-
93
+
88
94
  Args:
89
95
  projectId: The unique identifier of the project to retrieve.
90
-
96
+
91
97
  Returns:
92
98
  A JSON-deserialized object containing the project's details as returned by the server.
93
-
99
+
94
100
  Raises:
95
101
  ValueError: Raised if 'projectId' is None.
96
102
  requests.HTTPError: Raised if the HTTP request to retrieve the project fails (e.g., 4xx or 5xx response).
97
-
103
+
98
104
  Tags:
99
105
  get, project, fetch, management, important
100
106
  """
@@ -109,17 +115,17 @@ class RocketlaneApp(APIApplication):
109
115
  def get_projects_by_projectid_tasks(self, projectId) -> Any:
110
116
  """
111
117
  Retrieves a list of tasks associated with a given project ID.
112
-
118
+
113
119
  Args:
114
120
  projectId: str. The unique identifier of the project whose tasks are to be retrieved.
115
-
121
+
116
122
  Returns:
117
123
  dict. A JSON object containing the list of tasks for the specified project.
118
-
124
+
119
125
  Raises:
120
126
  ValueError: If the projectId parameter is None.
121
127
  requests.HTTPError: If the HTTP request to retrieve tasks fails (i.e., non-2xx response).
122
-
128
+
123
129
  Tags:
124
130
  get, list, project-tasks, management, important
125
131
  """
@@ -131,10 +137,18 @@ class RocketlaneApp(APIApplication):
131
137
  response.raise_for_status()
132
138
  return response.json()
133
139
 
134
- def create_task(self, projectId, taskDescription=None, taskName=None, assignee=None, startDate=None, dueDate=None) -> dict[str, Any]:
140
+ def create_task(
141
+ self,
142
+ projectId,
143
+ taskDescription=None,
144
+ taskName=None,
145
+ assignee=None,
146
+ startDate=None,
147
+ dueDate=None,
148
+ ) -> dict[str, Any]:
135
149
  """
136
150
  Creates a new task within the specified project, assigning optional details such as description, name, assignee, start date, and due date.
137
-
151
+
138
152
  Args:
139
153
  projectId: str. The unique identifier of the project in which to create the task. Required.
140
154
  taskDescription: Optional[str]. A description of the task to be created.
@@ -142,25 +156,25 @@ class RocketlaneApp(APIApplication):
142
156
  assignee: Optional[str]. The user to whom the task is assigned.
143
157
  startDate: Optional[str]. The starting date for the task, formatted as an ISO 8601 string.
144
158
  dueDate: Optional[str]. The due date for task completion, formatted as an ISO 8601 string.
145
-
159
+
146
160
  Returns:
147
161
  dict[str, Any]: A dictionary containing the details of the created task as returned by the API.
148
-
162
+
149
163
  Raises:
150
164
  ValueError: If 'projectId' is not provided.
151
165
  requests.HTTPError: If the API request fails and returns a non-success HTTP status code.
152
-
166
+
153
167
  Tags:
154
168
  create, task, management, project, api, important
155
169
  """
156
170
  if projectId is None:
157
171
  raise ValueError("Missing required parameter 'projectId'")
158
172
  request_body = {
159
- 'taskDescription': taskDescription,
160
- 'taskName': taskName,
161
- 'assignee': assignee,
162
- 'startDate': startDate,
163
- 'dueDate': dueDate,
173
+ "taskDescription": taskDescription,
174
+ "taskName": taskName,
175
+ "assignee": assignee,
176
+ "startDate": startDate,
177
+ "dueDate": dueDate,
164
178
  }
165
179
  request_body = {k: v for k, v in request_body.items() if v is not None}
166
180
  url = f"{self.base_url}/projects/{projectId}/tasks"
@@ -176,5 +190,5 @@ class RocketlaneApp(APIApplication):
176
190
  self.get_all_projects,
177
191
  self.get_projects_by_projectid,
178
192
  self.get_projects_by_projectid_tasks,
179
- self.create_task
193
+ self.create_task,
180
194
  ]